/* eslint-disable @typescript-eslint/naming-convention */
/* eslint-disable @typescript-eslint/no-unused-vars */
declare module "babylonjs-gltf2interface" {
    export = BABYLON.GLTF2;
}

/**
 * Module for glTF 2.0 Interface
 */
declare namespace BABYLON.GLTF2 {
    /**
     * The datatype of the components in the attribute
     */
    const enum AccessorComponentType {
        /**
         * Byte
         */
        BYTE = 5120,
        /**
         * Unsigned Byte
         */
        UNSIGNED_BYTE = 5121,
        /**
         * Short
         */
        SHORT = 5122,
        /**
         * Unsigned Short
         */
        UNSIGNED_SHORT = 5123,
        /**
         * Unsigned Int
         */
        UNSIGNED_INT = 5125,
        /**
         * Float
         */
        FLOAT = 5126,
    }

    /**
     * Specifies if the attirbute is a scalar, vector, or matrix
     */
    const enum AccessorType {
        /**
         * Scalar
         */
        SCALAR = "SCALAR",
        /**
         * Vector2
         */
        VEC2 = "VEC2",
        /**
         * Vector3
         */
        VEC3 = "VEC3",
        /**
         * Vector4
         */
        VEC4 = "VEC4",
        /**
         * Matrix2x2
         */
        MAT2 = "MAT2",
        /**
         * Matrix3x3
         */
        MAT3 = "MAT3",
        /**
         * Matrix4x4
         */
        MAT4 = "MAT4",
    }

    /**
     * The name of the node's TRS property to modify,
     * or the weights of the Morph Targets it instantiates,
     * or pointer is use of KHR_animation_pointer extension
     */
    const enum AnimationChannelTargetPath {
        /**
         * Translation
         */
        TRANSLATION = "translation",
        /**
         * Rotation
         */
        ROTATION = "rotation",
        /**
         * Scale
         */
        SCALE = "scale",
        /**
         * Weights
         */
        WEIGHTS = "weights",
        /**
         * Pointer
         */
        POINTER = "pointer",
    }

    /**
     * Interpolation algorithm
     */
    const enum AnimationSamplerInterpolation {
        /**
         * The animated values are linearly interpolated between keyframes
         */
        LINEAR = "LINEAR",
        /**
         * The animated values remain constant to the output of the first keyframe, until the next keyframe
         */
        STEP = "STEP",
        /**
         * The animation's interpolation is computed using a cubic spline with specified tangents
         */
        CUBICSPLINE = "CUBICSPLINE",
    }

    /**
     * A camera's projection.  A node can reference a camera to apply a transform to place the camera in the scene
     */
    const enum CameraType {
        /**
         * A perspective camera containing properties to create a perspective projection matrix
         */
        PERSPECTIVE = "perspective",
        /**
         * An orthographic camera containing properties to create an orthographic projection matrix
         */
        ORTHOGRAPHIC = "orthographic",
    }

    /**
     * The mime-type of the image
     */
    const enum ImageMimeType {
        /**
         * JPEG Mime-type
         */
        JPEG = "image/jpeg",
        /**
         * PNG Mime-type
         */
        PNG = "image/png",
        /**
         * WEBP Mime-type, available via EXT_texture_webp
         */
        WEBP = "image/webp",
        /**
         * AVIF Mime-type, available via EXT_texture_avif
         */
        AVIF = "image/avif",
        /**
         * KTX2 Mime-type, available via KHR_texture_basisu
         */
        KTX2 = "image/ktx2",
    }

    /**
     * The alpha rendering mode of the material
     */
    const enum MaterialAlphaMode {
        /**
         * The alpha value is ignored and the rendered output is fully opaque
         */
        OPAQUE = "OPAQUE",
        /**
         * The rendered output is either fully opaque or fully transparent depending on the alpha value and the specified alpha cutoff value
         */
        MASK = "MASK",
        /**
         * The alpha value is used to composite the source and destination areas. The rendered output is combined with the background using the normal painting operation (i.e. the Porter and Duff over operator)
         */
        BLEND = "BLEND",
    }

    /**
     * The type of the primitives to render
     */
    const enum MeshPrimitiveMode {
        /**
         * Points
         */
        POINTS = 0,
        /**
         * Lines
         */
        LINES = 1,
        /**
         * Line Loop
         */
        LINE_LOOP = 2,
        /**
         * Line Strip
         */
        LINE_STRIP = 3,
        /**
         * Triangles
         */
        TRIANGLES = 4,
        /**
         * Triangle Strip
         */
        TRIANGLE_STRIP = 5,
        /**
         * Triangle Fan
         */
        TRIANGLE_FAN = 6,
    }

    /**
     * Magnification filter.  Valid values correspond to WebGL enums: 9728 (NEAREST) and 9729 (LINEAR)
     */
    const enum TextureMagFilter {
        /**
         * Nearest
         */
        NEAREST = 9728,
        /**
         * Linear
         */
        LINEAR = 9729,
    }

    /**
     * Minification filter.  All valid values correspond to WebGL enums
     */
    const enum TextureMinFilter {
        /**
         * Nearest
         */
        NEAREST = 9728,
        /**
         * Linear
         */
        LINEAR = 9729,
        /**
         * Nearest Mip-Map Nearest
         */
        NEAREST_MIPMAP_NEAREST = 9984,
        /**
         * Linear Mipmap Nearest
         */
        LINEAR_MIPMAP_NEAREST = 9985,
        /**
         * Nearest Mipmap Linear
         */
        NEAREST_MIPMAP_LINEAR = 9986,
        /**
         * Linear Mipmap Linear
         */
        LINEAR_MIPMAP_LINEAR = 9987,
    }

    /**
     * S (U) wrapping mode.  All valid values correspond to WebGL enums
     */
    const enum TextureWrapMode {
        /**
         * Clamp to Edge
         */
        CLAMP_TO_EDGE = 33071,
        /**
         * Mirrored Repeat
         */
        MIRRORED_REPEAT = 33648,
        /**
         * Repeat
         */
        REPEAT = 10497,
    }

    /**
     * glTF Property
     */
    interface IProperty {
        /**
         * Dictionary object with extension-specific objects
         */
        extensions?: {
            [key: string]: any;
        };
        /**
         * Application-Specific data
         */
        extras?: any;
    }

    /**
     * glTF Child of Root Property
     */
    interface IChildRootProperty extends IProperty {
        /**
         * The user-defined name of this object
         */
        name?: string;
    }

    /**
     * Indices of those attributes that deviate from their initialization value
     */
    interface IAccessorSparseIndices extends IProperty {
        /**
         * The index of the bufferView with sparse indices. Referenced bufferView can't have ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER target
         */
        bufferView: number;
        /**
         * The offset relative to the start of the bufferView in bytes. Must be aligned
         */
        byteOffset?: number;
        /**
         * The indices data type.  Valid values correspond to WebGL enums: 5121 (UNSIGNED_BYTE), 5123 (UNSIGNED_SHORT), 5125 (UNSIGNED_INT)
         */
        componentType: AccessorComponentType;
    }

    /**
     * Array of size accessor.sparse.count times number of components storing the displaced accessor attributes pointed by accessor.sparse.indices
     */
    interface IAccessorSparseValues extends IProperty {
        /**
         * The index of the bufferView with sparse values. Referenced bufferView can't have ARRAY_BUFFER or ELEMENT_ARRAY_BUFFER target
         */
        bufferView: number;
        /**
         * The offset relative to the start of the bufferView in bytes. Must be aligned
         */
        byteOffset?: number;
    }

    /**
     * Sparse storage of attributes that deviate from their initialization value
     */
    interface IAccessorSparse extends IProperty {
        /**
         * The number of attributes encoded in this sparse accessor
         */
        count: number;
        /**
         * Index array of size count that points to those accessor attributes that deviate from their initialization value. Indices must strictly increase
         */
        indices: IAccessorSparseIndices;
        /**
         * Array of size count times number of components, storing the displaced accessor attributes pointed by indices. Substituted values must have the same componentType and number of components as the base accessor
         */
        values: IAccessorSparseValues;
    }

    /**
     * A typed view into a bufferView.  A bufferView contains raw binary data.  An accessor provides a typed view into a bufferView or a subset of a bufferView similar to how WebGL's vertexAttribPointer() defines an attribute in a buffer
     */
    interface IAccessor extends IChildRootProperty {
        /**
         * The index of the bufferview
         */
        bufferView?: number;
        /**
         * The offset relative to the start of the bufferView in bytes
         */
        byteOffset?: number;
        /**
         * The datatype of components in the attribute
         */
        componentType: AccessorComponentType;
        /**
         * Specifies whether integer data values should be normalized
         */
        normalized?: boolean;
        /**
         * The number of attributes referenced by this accessor
         */
        count: number;
        /**
         * Specifies if the attribute is a scalar, vector, or matrix
         */
        type: AccessorType;
        /**
         * Maximum value of each component in this attribute
         */
        max?: number[];
        /**
         * Minimum value of each component in this attribute
         */
        min?: number[];
        /**
         * Sparse storage of attributes that deviate from their initialization value
         */
        sparse?: IAccessorSparse;
    }

    /**
     * Targets an animation's sampler at a node's property
     */
    interface IAnimationChannel extends IProperty {
        /**
         * The index of a sampler in this animation used to compute the value for the target
         */
        sampler: number;
        /**
         * The index of the node and TRS property to target
         */
        target: IAnimationChannelTarget;
    }

    /**
     * The index of the node and TRS property that an animation channel targets
     */
    interface IAnimationChannelTarget extends IProperty {
        /**
         * The index of the node to target
         */
        node?: number;
        /**
         * The name of the node's TRS property to modify, or the weights of the Morph Targets it instantiates
         */
        path: AnimationChannelTargetPath;
    }

    /**
     * Combines input and output accessors with an interpolation algorithm to define a keyframe graph (but not its target)
     */
    interface IAnimationSampler extends IProperty {
        /**
         * The index of an accessor containing keyframe input values, e.g., time
         */
        input: number;
        /**
         * Interpolation algorithm
         */
        interpolation?: AnimationSamplerInterpolation;
        /**
         * The index of an accessor, containing keyframe output values
         */
        output: number;
    }

    /**
     * A keyframe animation
     */
    interface IAnimation extends IChildRootProperty {
        /**
         * An array of channels, each of which targets an animation's sampler at a node's property
         */
        channels: IAnimationChannel[];
        /**
         * An array of samplers that combines input and output accessors with an interpolation algorithm to define a keyframe graph (but not its target)
         */
        samplers: IAnimationSampler[];
    }

    /**
     * Metadata about the glTF asset
     */
    interface IAsset extends IChildRootProperty {
        /**
         * A copyright message suitable for display to credit the content creator
         */
        copyright?: string;
        /**
         * Tool that generated this glTF model.  Useful for debugging
         */
        generator?: string;
        /**
         * The glTF version that this asset targets
         */
        version: string;
        /**
         * The minimum glTF version that this asset targets
         */
        minVersion?: string;
    }

    /**
     * A buffer points to binary geometry, animation, or skins
     */
    interface IBuffer extends IChildRootProperty {
        /**
         * The uri of the buffer.  Relative paths are relative to the .gltf file.  Instead of referencing an external file, the uri can also be a data-uri
         */
        uri?: string;
        /**
         * The length of the buffer in bytes
         */
        byteLength: number;
    }

    /**
     * A view into a buffer generally representing a subset of the buffer
     */
    interface IBufferView extends IChildRootProperty {
        /**
         * The index of the buffer
         */
        buffer: number;
        /**
         * The offset into the buffer in bytes
         */
        byteOffset?: number;
        /**
         * The lenth of the bufferView in bytes
         */
        byteLength: number;
        /**
         * The stride, in bytes
         */
        byteStride?: number;
    }

    /**
     * An orthographic camera containing properties to create an orthographic projection matrix
     */
    interface ICameraOrthographic extends IProperty {
        /**
         * The floating-point horizontal magnification of the view. Must not be zero
         */
        xmag: number;
        /**
         * The floating-point vertical magnification of the view. Must not be zero
         */
        ymag: number;
        /**
         * The floating-point distance to the far clipping plane. zfar must be greater than znear
         */
        zfar: number;
        /**
         * The floating-point distance to the near clipping plane
         */
        znear: number;
    }

    /**
     * A perspective camera containing properties to create a perspective projection matrix
     */
    interface ICameraPerspective extends IProperty {
        /**
         * The floating-point aspect ratio of the field of view
         */
        aspectRatio?: number;
        /**
         * The floating-point vertical field of view in radians
         */
        yfov: number;
        /**
         * The floating-point distance to the far clipping plane
         */
        zfar?: number;
        /**
         * The floating-point distance to the near clipping plane
         */
        znear: number;
    }

    /**
     * A camera's projection.  A node can reference a camera to apply a transform to place the camera in the scene
     */
    interface ICamera extends IChildRootProperty {
        /**
         * An orthographic camera containing properties to create an orthographic projection matrix
         */
        orthographic?: ICameraOrthographic;
        /**
         * A perspective camera containing properties to create a perspective projection matrix
         */
        perspective?: ICameraPerspective;
        /**
         * Specifies if the camera uses a perspective or orthographic projection
         */
        type: CameraType;
    }

    /**
     * Image data used to create a texture. Image can be referenced by URI or bufferView index. mimeType is required in the latter case
     */
    interface IImage extends IChildRootProperty {
        /**
         * The uri of the image.  Relative paths are relative to the .gltf file.  Instead of referencing an external file, the uri can also be a data-uri.  The image format must be jpg or png
         */
        uri?: string;
        /**
         * The image's MIME type
         */
        mimeType?: ImageMimeType;
        /**
         * The index of the bufferView that contains the image. Use this instead of the image's uri property
         */
        bufferView?: number;
    }

    /**
     * Material Normal Texture Info
     */
    interface IMaterialNormalTextureInfo extends ITextureInfo {
        /**
         * The scalar multiplier applied to each normal vector of the normal texture
         */
        scale?: number;
    }

    /**
     * Material Occlusion Texture Info
     */
    interface IMaterialOcclusionTextureInfo extends ITextureInfo {
        /**
         * A scalar multiplier controlling the amount of occlusion applied
         */
        strength?: number;
    }

    /**
     * A set of parameter values that are used to define the metallic-roughness material model from Physically-Based Rendering (PBR) methodology
     */
    interface IMaterialPbrMetallicRoughness {
        /**
         * The material's base color factor
         */
        baseColorFactor?: number[];
        /**
         * The base color texture
         */
        baseColorTexture?: ITextureInfo;
        /**
         * The metalness of the material
         */
        metallicFactor?: number;
        /**
         * The roughness of the material
         */
        roughnessFactor?: number;
        /**
         * The metallic-roughness texture
         */
        metallicRoughnessTexture?: ITextureInfo;
    }

    /**
     * The material appearance of a primitive
     */
    interface IMaterial extends IChildRootProperty {
        /**
         * A set of parameter values that are used to define the metallic-roughness material model from Physically-Based Rendering (PBR) methodology. When not specified, all the default values of pbrMetallicRoughness apply
         */
        pbrMetallicRoughness?: IMaterialPbrMetallicRoughness;
        /**
         * The normal map texture
         */
        normalTexture?: IMaterialNormalTextureInfo;
        /**
         * The occlusion map texture
         */
        occlusionTexture?: IMaterialOcclusionTextureInfo;
        /**
         * The emissive map texture
         */
        emissiveTexture?: ITextureInfo;
        /**
         * The RGB components of the emissive color of the material. These values are linear. If an emissiveTexture is specified, this value is multiplied with the texel values
         */
        emissiveFactor?: number[];
        /**
         * The alpha rendering mode of the material
         */
        alphaMode?: MaterialAlphaMode;
        /**
         * The alpha cutoff value of the material
         */
        alphaCutoff?: number;
        /**
         * Specifies whether the material is double sided
         */
        doubleSided?: boolean;
    }

    /**
     * Geometry to be rendered with the given material
     */
    interface IMeshPrimitive extends IProperty {
        /**
         * A dictionary object, where each key corresponds to mesh attribute semantic and each value is the index of the accessor containing attribute's data
         */
        attributes: {
            [name: string]: number;
        };
        /**
         * The index of the accessor that contains the indices
         */
        indices?: number;
        /**
         * The index of the material to apply to this primitive when rendering
         */
        material?: number;
        /**
         * The type of primitives to render. All valid values correspond to WebGL enums
         */
        mode?: MeshPrimitiveMode;
        /**
         * An array of Morph Targets, each  Morph Target is a dictionary mapping attributes (only POSITION, NORMAL, and TANGENT supported) to their deviations in the Morph Target
         */
        targets?: {
            [name: string]: number;
        }[];
    }

    /**
     * A set of primitives to be rendered.  A node can contain one mesh.  A node's transform places the mesh in the scene
     */
    interface IMesh extends IChildRootProperty {
        /**
         * An array of primitives, each defining geometry to be rendered with a material
         */
        primitives: IMeshPrimitive[];
        /**
         * Array of weights to be applied to the Morph Targets
         */
        weights?: number[];
    }

    /**
     * A node in the node hierarchy
     */
    interface INode extends IChildRootProperty {
        /**
         * The index of the camera referenced by this node
         */
        camera?: number;
        /**
         * The indices of this node's children
         */
        children?: number[];
        /**
         * The index of the skin referenced by this node
         */
        skin?: number;
        /**
         * A floating-point 4x4 transformation matrix stored in column-major order
         */
        matrix?: number[];
        /**
         * The index of the mesh in this node
         */
        mesh?: number;
        /**
         * The node's unit quaternion rotation in the order (x, y, z, w), where w is the scalar
         */
        rotation?: number[];
        /**
         * The node's non-uniform scale, given as the scaling factors along the x, y, and z axes
         */
        scale?: number[];
        /**
         * The node's translation along the x, y, and z axes
         */
        translation?: number[];
        /**
         * The weights of the instantiated Morph Target. Number of elements must match number of Morph Targets of used mesh
         */
        weights?: number[];
    }

    /**
     * Texture sampler properties for filtering and wrapping modes
     */
    interface ISampler extends IChildRootProperty {
        /**
         * Magnification filter.  Valid values correspond to WebGL enums: 9728 (NEAREST) and 9729 (LINEAR)
         */
        magFilter?: TextureMagFilter;
        /**
         * Minification filter.  All valid values correspond to WebGL enums
         */
        minFilter?: TextureMinFilter;
        /**
         * S (U) wrapping mode.  All valid values correspond to WebGL enums
         */
        wrapS?: TextureWrapMode;
        /**
         * T (V) wrapping mode.  All valid values correspond to WebGL enums
         */
        wrapT?: TextureWrapMode;
    }

    /**
     * The root nodes of a scene
     */
    interface IScene extends IChildRootProperty {
        /**
         * The indices of each root node
         */
        nodes: number[];
    }

    /**
     * Joints and matrices defining a skin
     */
    interface ISkin extends IChildRootProperty {
        /**
         * The index of the accessor containing the floating-point 4x4 inverse-bind matrices.  The default is that each matrix is a 4x4 identity matrix, which implies that inverse-bind matrices were pre-applied
         */
        inverseBindMatrices?: number;
        /**
         * The index of the node used as a skeleton root. When undefined, joints transforms resolve to scene root
         */
        skeleton?: number;
        /**
         * Indices of skeleton nodes, used as joints in this skin.  The array length must be the same as the count property of the inverseBindMatrices accessor (when defined)
         */
        joints: number[];
    }

    /**
     * A texture and its sampler
     */
    interface ITexture extends IChildRootProperty {
        /**
         * The index of the sampler used by this texture. When undefined, a sampler with repeat wrapping and auto filtering should be used
         */
        sampler?: number;
        /**
         * The index of the image used by this texture. When undefined, an extension or other mechanism should supply an alternate texture source, otherwise behavior is undefined.
         */
        source?: number;
    }

    /**
     * Reference to a texture
     */
    interface ITextureInfo extends IProperty {
        /**
         * The index of the texture
         */
        index: number;
        /**
         * The set index of texture's TEXCOORD attribute used for texture coordinate mapping
         */
        texCoord?: number;
    }

    /**
     * The root object for a glTF asset
     */
    interface IGLTF extends IProperty {
        /**
         * An array of accessors. An accessor is a typed view into a bufferView
         */
        accessors?: IAccessor[];
        /**
         * An array of keyframe animations
         */
        animations?: IAnimation[];
        /**
         * Metadata about the glTF asset
         */
        asset: IAsset;
        /**
         * An array of buffers.  A buffer points to binary geometry, animation, or skins
         */
        buffers?: IBuffer[];
        /**
         * An array of bufferViews.  A bufferView is a view into a buffer generally representing a subset of the buffer
         */
        bufferViews?: IBufferView[];
        /**
         * An array of cameras
         */
        cameras?: ICamera[];
        /**
         * Names of glTF extensions used somewhere in this asset
         */
        extensionsUsed?: string[];
        /**
         * Names of glTF extensions required to properly load this asset
         */
        extensionsRequired?: string[];
        /**
         * An array of images.  An image defines data used to create a texture
         */
        images?: IImage[];
        /**
         * An array of materials.  A material defines the appearance of a primitive
         */
        materials?: IMaterial[];
        /**
         * An array of meshes.  A mesh is a set of primitives to be rendered
         */
        meshes?: IMesh[];
        /**
         * An array of nodes
         */
        nodes?: INode[];
        /**
         * An array of samplers.  A sampler contains properties for texture filtering and wrapping modes
         */
        samplers?: ISampler[];
        /**
         * The index of the default scene
         */
        scene?: number;
        /**
         * An array of scenes
         */
        scenes?: IScene[];
        /**
         * An array of skins.  A skin is defined by joints and matrices
         */
        skins?: ISkin[];
        /**
         * An array of textures
         */
        textures?: ITexture[];
    }

    /**
     * The glTF validation results
     * @ignore
     */
    interface IGLTFValidationResults {
        info: {
            generator: string;
            hasAnimations: boolean;
            hasDefaultScene: boolean;
            hasMaterials: boolean;
            hasMorphTargets: boolean;
            hasSkins: boolean;
            hasTextures: boolean;
            maxAttributesUsed: number;
            primitivesCount: number;
        };
        issues: {
            messages: Array<string>;
            numErrors: number;
            numHints: number;
            numInfos: number;
            numWarnings: number;
            truncated: boolean;
        };
        mimeType: string;
        uri: string;
        validatedAt: string;
        validatorVersion: string;
    }

    /**
     * The glTF validation options
     */
    interface IGLTFValidationOptions {
        /** Uri to use */
        uri?: string;
        /** Function used to load external resources */
        externalResourceFunction?: (uri: string) => Promise<Uint8Array>;
        /** Boolean indicating that we need to validate accessor data */
        validateAccessorData?: boolean;
        /** max number of issues allowed */
        maxIssues?: number;
        /** Ignored issues */
        ignoredIssues?: Array<string>;
        /** Value to override severy settings */
        severityOverrides?: Object;
    }

    /**
     * The glTF validator object
     * @internal
     */
    interface IGLTFValidator {
        validateBytes: (data: Uint8Array, options?: IGLTFValidationOptions) => Promise<IGLTFValidationResults>;
        validateString: (json: string, options?: IGLTFValidationOptions) => Promise<IGLTFValidationResults>;
    }

    /**
     * Interfaces from the EXT_lights_image_based extension
     */

    /** @internal */
    interface IEXTLightsImageBased_LightReferenceImageBased {
        light: number;
    }

    /** @internal */
    interface IEXTLightsImageBased_LightImageBased extends IChildRootProperty {
        intensity: number;
        rotation: number[];
        specularImageSize: number;
        specularImages: number[][];
        irradianceCoefficients: number[][];
    }

    /** @internal */
    interface IEXTLightsImageBased {
        lights: IEXTLightsImageBased_LightImageBased[];
    }

    /**
     * Interfaces from the EXT_mesh_gpu_instancing extension
     * !!! Experimental Extension Subject to Changes !!!
     */

    /** @internal */
    interface IEXTMeshGpuInstancing {
        mesh?: number;
        attributes: { [name: string]: number };
    }

    /**
     * Interfaces from the KHR_draco_mesh_compression extension
     */

    /** @internal */
    interface IKHRDracoMeshCompression {
        bufferView: number;
        attributes: { [name: string]: number };
    }

    /**
     * Interfaces from the EXT_lights_ies extension
     */

    /** @internal */
    interface IEXTLightsIES_LightReference {
        light: number;
        color?: number[];
        multiplier?: number;
    }

    /** @internal */
    interface IEXTLightsIES_Light extends IChildRootProperty {
        uri?: string;
        bufferView?: number;
        mimeType?: string;
    }

    /**
     * Interfaces from the KHR_lights_punctual extension
     */

    /** @internal */
    const enum KHRLightsPunctual_LightType {
        DIRECTIONAL = "directional",
        POINT = "point",
        SPOT = "spot",
    }

    /** @internal */
    interface IKHRLightsPunctual_LightReference {
        light: number;
    }

    /** @internal */
    interface IKHRLightsPunctual_Light extends IChildRootProperty {
        type: KHRLightsPunctual_LightType;
        color?: number[];
        intensity?: number;
        range?: number;
        spot?: {
            innerConeAngle?: number;
            outerConeAngle?: number;
        };
    }

    /** @internal */
    interface IKHRLightsPunctual {
        lights: IKHRLightsPunctual_Light[];
    }

    /**
     * Interfaces from the KHR_materials_clearcoat extension
     */
    /** @internal */
    interface IKHRMaterialsClearcoat {
        clearcoatFactor?: number;
        clearcoatTexture?: ITextureInfo;
        clearcoatRoughnessFactor?: number;
        clearcoatRoughnessTexture?: ITextureInfo;
        clearcoatNormalTexture?: IMaterialNormalTextureInfo;
        /**
         * Dictionary object with extension-specific objects
         */
        extensions?: {
            [key: string]: any;
        };
    }

    /**
     * Interfaces from the KHR_materials_clearcoat extension
     */
    /** @internal */
    interface IKHRMaterialsCoat {
        coatFactor?: number;
        coatTexture?: ITextureInfo;
        coatRoughnessFactor?: number;
        coatRoughnessTexture?: ITextureInfo;
        coatNormalTexture?: IMaterialNormalTextureInfo;
        coatIor?: number;
        coatDarkeningFactor?: number;
        coatColorFactor?: number[];
        coatColorTexture?: ITextureInfo;
        coatAnisotropyStrength?: number;
        coatAnisotropyRotation?: number;
        coatAnisotropyTexture?: ITextureInfo;
        /**
         * Dictionary object with extension-specific objects
         */
        extensions?: {
            [key: string]: any;
        };
    }

    /** @internal */
    interface IKHRMaterialsClearcoatAnisotropy {
        clearcoatAnisotropyStrength?: number;
        clearcoatAnisotropyRotation?: number;
        clearcoatAnisotropyTexture?: ITextureInfo;
        extensions?: {
            [key: string]: any;
        };
    }

    /** @internal */
    interface IKHRMaterialsIridescence {
        iridescenceFactor?: number;
        iridescenceIor?: number;
        iridescenceThicknessMinimum?: number;
        iridescenceThicknessMaximum?: number;
        iridescenceTexture?: ITextureInfo;
        iridescenceThicknessTexture?: ITextureInfo;
    }

    /** @internal */
    interface IKHRMaterialsAnisotropy {
        anisotropyStrength?: number;
        anisotropyRotation?: number;
        anisotropyTexture?: ITextureInfo;
        extensions?: {
            [key: string]: any;
        };
    }

    /** @internal */
    interface IKHRMaterialsAnisotropyOpenPbr {
        anisotropyOpenPbrEnabled: boolean;
    }

    /**
     * Interfaces from the KHR_materials_ior extension
     */

    /** @internal */
    interface IKHRMaterialsIor {
        ior?: number;
    }

    /**
     * Interfaces from the KHR_materials_volume extension
     */

    /** @internal */
    interface IKHRMaterialsVolume {
        thicknessFactor?: number;
        thicknessTexture?: ITextureInfo;
        attenuationDistance?: number;
        attenuationColor?: number[];
    }

    /**
     * Interfaces from the KHR_materials_volume_scatter extension
     */

    /** @internal */
    interface IKHRMaterialsVolumeScatter {
        scatterAnisotropy?: number;
        multiscatterColorFactor?: number[];
        multiscatterColorTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_dispersion extension
     */

    /** @internal */
    interface IKHRMaterialsDispersion {
        dispersion?: number;
    }

    /**
     * Interfaces from the KHR_materials_specular extension
     */

    /** @internal */
    interface IKHRMaterialsSpecular {
        specularFactor?: number;
        specularColorFactor?: number[];
        specularTexture?: ITextureInfo;
        specularColorTexture?: ITextureInfo;
        /**
         * Dictionary object with extension-specific objects
         */
        extensions?: {
            [key: string]: any;
        };
    }

    /**
     * Interfaces from the EXT_materials_specular_edge_color extension
     */

    /** @internal */
    interface IEXTMaterialsSpecularEdgeColor {
        specularEdgeColorEnabled?: boolean;
    }

    /**
     * Interfaces from the KHR_materials_transmission extension
     */

    /** @internal */
    interface IKHRMaterialsTransmission {
        transmissionFactor?: number;
        transmissionTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_emissive_strength extension
     */

    /** @internal */
    interface IKHRMaterialsEmissiveStrength {
        emissiveStrength: number;
    }

    /**
     * Interfaces from the KHR_materials_pbrSpecularGlossiness extension
     */

    /** @internal */
    interface IKHRMaterialsPbrSpecularGlossiness {
        diffuseFactor: number[];
        diffuseTexture: ITextureInfo;
        specularFactor: number[];
        glossinessFactor: number;
        specularGlossinessTexture: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_sheen extension
     */

    /** @internal */
    interface IKHRMaterialsSheen {
        sheenColorFactor?: number[];
        sheenColorTexture?: ITextureInfo;
        sheenRoughnessFactor?: number;
        sheenRoughnessTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_fuzz extension
     */

    /** @internal */
    interface IKHRMaterialsFuzz {
        fuzzFactor?: number;
        fuzzTexture?: ITextureInfo;
        fuzzColorFactor?: number[];
        fuzzColorTexture?: ITextureInfo;
        fuzzRoughnessFactor?: number;
        fuzzRoughnessTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_diffuse_transmission extension
     * !!! Experimental Extension Subject to Changes !!!
     */

    /** @internal */
    interface IKHRMaterialsDiffuseTransmission {
        diffuseTransmissionFactor?: number;
        diffuseTransmissionTexture?: ITextureInfo;
        diffuseTransmissionColorFactor?: number[];
        diffuseTransmissionColorTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the EXT_materials_diffuse_roughness extension
     */
    /** @internal */
    interface IKHRMaterialsDiffuseRoughness {
        diffuseRoughnessFactor?: number;
        diffuseRoughnessTexture?: ITextureInfo;
    }

    /**
     * Interfaces from the KHR_materials_variants extension
     */

    /** @internal */
    interface IKHRMaterialVariants_Mapping extends IProperty {
        mappings: Array<{
            variants: number[];
            material: number;
        }>;
    }

    /** @internal */
    interface IKHRMaterialVariants_Variant extends IProperty {
        name: string;
    }

    /** @internal */
    interface IKHRMaterialVariants_Variants extends IChildRootProperty {
        variants: Array<IKHRMaterialVariants_Variant>;
    }

    /**
     * Interfaces from the KHR_texture_basisu extension
     */

    /** @internal */
    interface IKHRTextureBasisU {
        source: number;
    }

    /**
     * Interfaces from the EXT_texture_webp extension
     */

    /** @internal */
    interface IEXTTextureWebP {
        source: number;
    }

    /**
     * Interfaces from the EXT_texture_avif extension
     */

    /** @internal */
    interface IEXTTextureAVIF {
        source: number;
    }

    /**
     * Interfaces from the KHR_texture_transform extension
     */

    /** @internal */
    interface IKHRTextureTransform {
        offset?: number[];
        rotation?: number;
        scale?: number[];
        texCoord?: number;
    }

    /**
     * Interfaces from the KHR_xmp_json_ld extension
     */

    /** @internal */
    interface IKHRXmpJsonLd_Gltf {
        packets: Array<{
            [key: string]: unknown;
        }>;
    }

    /** @internal */
    interface IKHRXmpJsonLd_Node {
        packet: number;
    }

    /**
     * Interfaces from the KHR_animation_pointer extension
     * !!! Experimental Extension Subject to Changes !!!
     */

    /** @hidden */
    interface IKHRAnimationPointer {
        pointer: string;
    }

    /**
     * Interfaces from the MSFT_audio_emitter extension
     */

    /** @internal */
    interface IMSFTAudioEmitter_ClipReference {
        clip: number;
        weight?: number;
    }

    /** @internal */
    interface IMSFTAudioEmitter_EmittersReference {
        emitters: number[];
    }

    /** @internal */
    const enum IMSFTAudioEmitter_DistanceModel {
        linear = "linear",
        inverse = "inverse",
        exponential = "exponential",
    }

    /** @internal */
    interface IMSFTAudioEmitter_Emitter {
        name?: string;
        distanceModel?: IMSFTAudioEmitter_DistanceModel;
        refDistance?: number;
        maxDistance?: number;
        rolloffFactor?: number;
        innerAngle?: number;
        outerAngle?: number;
        loop?: boolean;
        volume?: number;
        clips: IMSFTAudioEmitter_ClipReference[];
    }

    /** @internal */
    const enum IMSFTAudioEmitter_AudioMimeType {
        WAV = "audio/wav",
    }

    /** @internal */
    interface IMSFTAudioEmitter_Clip extends IProperty {
        uri?: string;
        bufferView?: number;
        mimeType?: IMSFTAudioEmitter_AudioMimeType;
    }

    /** @internal */
    const enum IMSFTAudioEmitter_AnimationEventAction {
        play = "play",
        pause = "pause",
        stop = "stop",
    }

    /** @internal */
    interface IMSFTAudioEmitter_AnimationEvent {
        action: IMSFTAudioEmitter_AnimationEventAction;
        emitter: number;
        time: number;
        startOffset?: number;
    }

    /**
     * Interfaces from the MSFT_lod extension
     */

    /** @internal */
    interface IMSFTLOD {
        ids: number[];
    }

    /**
     * Interfaces from the EXT_meshopt_compression extension
     */

    /** @internal */
    interface IEXTMeshoptCompression {
        buffer: number;
        byteOffset?: number;
        byteLength: number;
        byteStride: number;
        count: number;
        mode: "ATTRIBUTES" | "TRIANGLES" | "INDICES";
        filter?: "NONE" | "OCTAHEDRAL" | "QUATERNION" | "EXPONENTIAL";
    }

    /**
     * Interfaces from the EXT_lights_area extension
     */

    /** @internal */
    const enum EXTLightsArea_LightType {
        RECT = "rect",
        DISK = "disk",
    }

    /** @internal */
    interface IEXTLightsArea_LightReference {
        light: number;
    }

    /** @internal */
    interface IEXTLightsArea_Light extends IChildRootProperty {
        type: EXTLightsArea_LightType;
        color?: number[];
        intensity?: number;
        size?: number;
        rect?: {
            aspect: number;
        };
    }

    /** @internal */
    interface IEXTLightsArea {
        lights: IEXTLightsArea_Light[];
    }

    /**
     * Interfaces for the KHR_interactivity extension
     */
    interface IKHRInteractivity {
        /**
         * Holding all of the graphs in the glTF
         */
        graphs: IKHRInteractivity_Graph[];
        /**
         * The graph to run. Defaults to index 0
         */
        graph?: number;
    }

    interface IKHRInteractivity_Graph {
        types?: IKHRInteractivity_Type /* | IKHRInteractivity_CustomType */[]; // should technically behave as a set - no two signatures should match
        variables?: IKHRInteractivity_Variable[];
        events?: IKHRInteractivity_Event[];
        declarations?: IKHRInteractivity_Declaration[];
        nodes?: IKHRInteractivity_Node[];
    }

    /**
     * An index of the types array
     */
    type TypeIndex = number;
    /**
     * An index of the declaration array
     */
    type DeclarationIndex = number;

    /**
     * An index of the nodes array
     */
    type NodeIndex = number;
    /**
     * Value types supported (in js it is either boolean or number)
     */
    type ValueType = (boolean | number)[];

    type ValueSignature = "bool" | "float" | "float2" | "float3" | "float4" | "float2x2" | "float3x3" | "float4x4" | "int" | "custom";

    type ConfigurationValueType = (boolean | number | string)[];

    interface IKHRInteractivity_Event {
        /**
         * The event id is an application-specific event identifier recognized by the execution environment. If the id property is undefined, the event is considered internal to the graph.
         */
        id?: string;
        /**
         * The properties of the values object define ids and the values of those properties define types and optional initial values of the value sockets associated with the event.
         */
        values?:
            | {
                  [id: string]: IKHRInteractivity_Variable;
              }
            | undefined;
    }

    interface IKHRInteractivity_Type {
        /**
         * A signature of this type or custom if defined by an external extension
         */
        signature: ValueSignature;
    }

    // interface IKHRInteractivity_CustomType {
    //     signature: string;
    // }

    interface IKHRInteractivity_Variable {
        /**
         * Array size depends on the type. primitives have array size 1, rest depending on the object type (2,3,4,16)
         * if value is not provided it should be initialized to the default value of the type according to the specs - NaN for floats, 0 for integers, false for booleans.
         */
        value?: ValueType;
        /**
         * An index in the types array
         */
        type: TypeIndex;
    }

    /**
     * a KHR_Interactivity operation declaration.
     * Declarations are considered equal when their op, extension and input values are equal.
     * If stating an external extension it is possible the declaration is not supported by the engine. In this case the operation will be a no-op
     */
    interface IKHRInteractivity_Declaration {
        /**
         * the operation identifier.
         * Either defined by the interactivity extension or a custom operation by an external extension
         */
        op: string;
        /**
         * If the op is not defined by the interactivity specs, this states the extension that defines the operation
         */
        extension?: string;
        /**
         * If custom operation, this is the output values signatures of the event
         * if undefined the custom operation has no outputs
         */
        outputValueSockets?: { [id: string]: { type: TypeIndex } };
        /**
         * if custom operation, this is the input values signatures of the event
         * If undefined the custom operation has no inputs
         */
        inputValueSockets?: { [id: string]: { type: TypeIndex } };
    }

    interface IKHRInteractivity_Node {
        /**
         * An index in the declarations array
         */
        declaration: DeclarationIndex;
        /**
         * Input value sockets
         */
        values?: { [id: string]: IKHRInteractivity_Variable | IKHRInteractivity_OutputSocketReference };

        /**
         * Output Flow Socket Pointers
         */
        flows?: { [id: string]: IKHRInteractivity_OutputFlow };
        configuration?: { [id: string]: IKHRInteractivity_Configuration };
    }

    interface IKHRInteractivity_OutputSocketReference {
        /**
         * An index in the nodes array
         */
        node: NodeIndex;
        /**
         * Must be defined if the node doesn't have a "value" output socket
         */
        socket?: string;
        /**
         * An optional type that must match the type of the output socket of the target node
         */
        type?: TypeIndex;
    }

    interface IKHRInteractivity_OutputFlow {
        /**
         * An index in the nodes array
         */
        node: NodeIndex;
        /**
         * The socket to connect to in the target node
         * defaults to "in" when undefined.
         */
        socket?: string;
    }

    interface IKHRInteractivity_Configuration {
        /**
         * Array size depends on the type. primitives have array size 1, rest depending on the object type (2,3,4,16)
         */
        value?: ConfigurationValueType;
    }
}


declare namespace BABYLON {
    /** Alias type for value that can be null */
    export type Nullable<T> = T | null;
    /**
     * Alias type for number that are floats
     */
    export type float = number;
    /**
     * Alias type for number that are doubles.
     */
    export type double = number;
    /**
     * Alias type for number that are integer
     */
    export type int = number;
    /**
     * Empty
     */
    export type Empty = [];
    /**
     * Removes the first element of T and shifts
     */
    export type Shift<T> = T extends unknown[] ? (((...x: T) => void) extends (h: any, ...t: infer I) => void ? I : []) : unknown;
    /**
     * Gets the first element of T
     */
    export type First<T> = T extends unknown[] ? (((...x: T) => void) extends (h: infer I, ...t: any) => void ? I : []) : never;
    /**
     * Inserts A into T at the start of T
     */
    export type Unshift<T, A> = T extends unknown[] ? (((h: A, ...t: T) => void) extends (...i: infer I) => void ? I : unknown) : never;
    /**
     * Removes the last element of T
     */
    export type Pop<T> = T extends unknown[] ? (((...x: T) => void) extends (...i: [...infer I, any]) => void ? I : unknown) : never;
    /**
     * Gets the last element of T
     */
    export type Last<T> = T extends unknown[] ? (((...x: T) => void) extends (...i: [...infer H, infer I]) => void ? I : unknown) : never;
    /**
     * Appends A to T
     */
    export type Push<T, A> = T extends unknown[] ? (((...a: [...T, A]) => void) extends (...i: infer I) => void ? I : unknown) : never;
    /**
     * Concats A and B
     */
    export type Concat<A, B> = {
        0: A;
        1: Concat<Unshift<A, 0>, Shift<B>>;
    }[Empty extends B ? 0 : 1];
    /**
     * Extracts from A what is not B
     *
     * @remarks
     * It does not remove duplicates (so Remove\<[0, 0, 0], [0, 0]\> yields [0]). This is intended and necessary behavior.
     */
    export type Remove<A, B> = {
        0: A;
        1: Remove<Shift<A>, Shift<B>>;
    }[Empty extends B ? 0 : 1];
    /**
     * The length of T
     */
    export type Length<T> = T extends {
        length: number;
    } ? T["length"] : never;
    type _FromLength<N extends number, R = Empty> = {
        0: R;
        1: _FromLength<N, Unshift<R, 0>>;
    }[Length<R> extends N ? 0 : 1];
    /**
     * Creates a tuple of length N
     */
    export type FromLength<N extends number> = _FromLength<N>;
    /**
     * Increments N
     */
    export type Increment<N extends number> = Length<Unshift<_FromLength<N>, 0>>;
    /**
     * Decrements N
     */
    export type Decrement<N extends number> = Length<Shift<_FromLength<N>>>;
    /**
     * Gets the sum of A and B
     */
    export type Add<A extends number, B extends number> = Length<Concat<_FromLength<A>, _FromLength<B>>>;
    /**
     * Subtracts B from A
     */
    export type Subtract<A extends number, B extends number> = Length<Remove<_FromLength<A>, _FromLength<B>>>;
    /**
     * Gets the type of an array's members
     */
    export type Member<T, D = null> = D extends 0 ? T : T extends (infer U)[] ? Member<U, D extends number ? Decrement<D> : null> : T;
    /**
     * Flattens an array
     */
    export type FlattenArray<A extends unknown[], D = null> = A extends (infer U)[] ? Member<Exclude<U, A>, D>[] : A extends unknown[] ? {
        [K in keyof A]: Member<A[K], D>;
    } : A;
    /**
     * Whether T is a tuple
     */
    export type IsTuple<T> = T extends [] ? false : T extends [infer Head, ...infer Rest] ? true : false;
    /**
     * Flattens a tuple
     */
    export type FlattenTuple<A extends unknown[]> = A extends [infer U, ...infer Rest] ? (U extends unknown[] ? [...U, ...FlattenTuple<Rest>] : [U, ...FlattenTuple<Rest>]) : [];
    /**
     * Flattens an array or tuple
     */
    export type Flatten<A extends unknown[]> = IsTuple<A> extends true ? FlattenTuple<A> : FlattenArray<A>;
    type _Tuple<T, N extends number, R extends unknown[] = Empty> = R["length"] extends N ? R : _Tuple<T, N, [T, ...R]>;
    /**
     * Creates a tuple of T with length N
     */
    export type Tuple<T, N extends number> = _Tuple<T, N>;
    /** Alias type for number array or Float32Array */
    export type FloatArray = number[] | Float32Array;
    /** Alias type for number array or Float32Array or Int32Array or Uint32Array or Uint16Array */
    export type IndicesArray = number[] | Int32Array | Uint32Array | Uint16Array;
    /**
     * Alias type for all TypedArrays
     */
    export type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array;
    /**
     * Alias for types that can be used by a Buffer or VertexBuffer.
     */
    export type DataArray = number[] | ArrayBufferLike | ArrayBufferView;
    /**
     * Alias type for primitive types
     */
    type Primitive = undefined | null | boolean | string | number | Function | Element;
    /**
     * Type modifier to make all the properties of an object Readonly
     */
    export type Immutable<T> = T extends Primitive ? T : T extends Array<infer U> ? ReadonlyArray<U> : DeepImmutable<T>;
    /**
     * Type modifier to make all the properties of an object Readonly recursively
     */
    export type DeepImmutable<T> = T extends Primitive ? T : T extends Array<infer U> ? DeepImmutableArray<U> : DeepImmutableObject<T>;
    /**
     * Type modifier to make all the properties of an object NonNullable
     */
    export type NonNullableFields<T> = {
        [P in keyof T]: NonNullable<T[P]>;
    };
    /**
     * Type modifier to make all the properties of an object Writable (remove "readonly")
     */
    export type WritableObject<T> = {
        -readonly [P in keyof T]: T[P];
    };
    /**
     * Type modifier to make object properties readonly.
     */
    export type DeepImmutableObject<T> = {
        readonly [K in keyof T]: DeepImmutable<T[K]>;
    };
    /** @internal */
    interface DeepImmutableArray<T> extends ReadonlyArray<DeepImmutable<T>> {
    }
    /** @internal */
    export type Constructor<C extends new (...args: any[]) => any, I extends InstanceType<C> = InstanceType<C>> = {
        new (...args: ConstructorParameters<C>): I;
    };
    /**
     * Alias type for image sources
     */
    export type ImageSource = ImageBitmap | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | OffscreenCanvas;
    /**
     * Type for typed array like objects
     */
    export interface TypedArrayLike extends ArrayBufferView {
        /**
         * The size in bytes of the array.
         */
        readonly length: number;
        [n: number]: number;
    }
    /**
     * Interface for a constructor of a TypedArray.
     */
    export interface TypedArrayConstructor<T extends TypedArray = TypedArray> {
        new (length: number): T;
        new (elements: Iterable<number>): T;
        new (buffer: ArrayBufferLike, byteOffset?: number, length?: number): T;
        /**
         * The size in bytes of each element in the array.
         */
        readonly BYTES_PER_ELEMENT: number;
    }


    /**
     * Groups all the scene component constants in one place to ease maintenance.
     * @internal
     */
    export class SceneComponentConstants {
        static readonly NAME_EFFECTLAYER = "EffectLayer";
        static readonly NAME_LAYER = "Layer";
        static readonly NAME_LENSFLARESYSTEM = "LensFlareSystem";
        static readonly NAME_BOUNDINGBOXRENDERER = "BoundingBoxRenderer";
        static readonly NAME_PARTICLESYSTEM = "ParticleSystem";
        static readonly NAME_GAMEPAD = "Gamepad";
        static readonly NAME_SIMPLIFICATIONQUEUE = "SimplificationQueue";
        static readonly NAME_GEOMETRYBUFFERRENDERER = "GeometryBufferRenderer";
        static readonly NAME_PREPASSRENDERER = "PrePassRenderer";
        static readonly NAME_DEPTHRENDERER = "DepthRenderer";
        static readonly NAME_DEPTHPEELINGRENDERER = "DepthPeelingRenderer";
        static readonly NAME_POSTPROCESSRENDERPIPELINEMANAGER = "PostProcessRenderPipelineManager";
        static readonly NAME_SPRITE = "Sprite";
        static readonly NAME_SUBSURFACE = "SubSurface";
        static readonly NAME_OUTLINERENDERER = "Outline";
        static readonly NAME_PROCEDURALTEXTURE = "ProceduralTexture";
        static readonly NAME_SHADOWGENERATOR = "ShadowGenerator";
        static readonly NAME_OCTREE = "Octree";
        static readonly NAME_PHYSICSENGINE = "PhysicsEngine";
        static readonly NAME_AUDIO = "Audio";
        static readonly NAME_FLUIDRENDERER = "FluidRenderer";
        static readonly NAME_IBLCDFGENERATOR = "iblCDFGenerator";
        static readonly NAME_CLUSTEREDLIGHTING = "ClusteredLighting";
        static readonly STEP_ISREADYFORMESH_EFFECTLAYER = 0;
        static readonly STEP_ISREADYFORMESH_DEPTHRENDERER = 1;
        static readonly STEP_BEFOREEVALUATEACTIVEMESH_BOUNDINGBOXRENDERER = 0;
        static readonly STEP_EVALUATESUBMESH_BOUNDINGBOXRENDERER = 0;
        static readonly STEP_PREACTIVEMESH_BOUNDINGBOXRENDERER = 0;
        static readonly STEP_CAMERADRAWRENDERTARGET_EFFECTLAYER = 1;
        static readonly STEP_BEFORECAMERADRAW_PREPASS = 0;
        static readonly STEP_BEFORECAMERADRAW_EFFECTLAYER = 1;
        static readonly STEP_BEFORECAMERADRAW_LAYER = 2;
        static readonly STEP_BEFORERENDERTARGETDRAW_PREPASS = 0;
        static readonly STEP_BEFORERENDERTARGETDRAW_LAYER = 1;
        static readonly STEP_BEFORERENDERINGMESH_PREPASS = 0;
        static readonly STEP_BEFORERENDERINGMESH_OUTLINE = 1;
        static readonly STEP_AFTERRENDERINGMESH_PREPASS = 0;
        static readonly STEP_AFTERRENDERINGMESH_OUTLINE = 1;
        static readonly STEP_AFTERRENDERINGGROUPDRAW_EFFECTLAYER_DRAW = 0;
        static readonly STEP_AFTERRENDERINGGROUPDRAW_BOUNDINGBOXRENDERER = 1;
        static readonly STEP_BEFORECAMERAUPDATE_SIMPLIFICATIONQUEUE = 0;
        static readonly STEP_BEFORECLEAR_PROCEDURALTEXTURE = 0;
        static readonly STEP_BEFORECLEAR_PREPASS = 1;
        static readonly STEP_BEFORERENDERTARGETCLEAR_PREPASS = 0;
        static readonly STEP_AFTERRENDERTARGETDRAW_PREPASS = 0;
        static readonly STEP_AFTERRENDERTARGETDRAW_LAYER = 1;
        static readonly STEP_AFTERCAMERADRAW_PREPASS = 0;
        static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER = 1;
        static readonly STEP_AFTERCAMERADRAW_LENSFLARESYSTEM = 2;
        static readonly STEP_AFTERCAMERADRAW_EFFECTLAYER_DRAW = 3;
        static readonly STEP_AFTERCAMERADRAW_LAYER = 4;
        static readonly STEP_AFTERCAMERADRAW_FLUIDRENDERER = 5;
        static readonly STEP_AFTERCAMERAPOSTPROCESS_LAYER = 0;
        static readonly STEP_AFTERRENDERTARGETPOSTPROCESS_LAYER = 0;
        static readonly STEP_AFTERRENDER_AUDIO = 0;
        static readonly STEP_GATHERRENDERTARGETS_DEPTHRENDERER = 0;
        static readonly STEP_GATHERRENDERTARGETS_GEOMETRYBUFFERRENDERER = 1;
        static readonly STEP_GATHERRENDERTARGETS_SHADOWGENERATOR = 2;
        static readonly STEP_GATHERRENDERTARGETS_POSTPROCESSRENDERPIPELINEMANAGER = 3;
        static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_DEPTHRENDERER = 0;
        static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_FLUIDRENDERER = 1;
        static readonly STEP_GATHERACTIVECAMERARENDERTARGETS_CLUSTEREDLIGHTING = 2;
        static readonly STEP_POINTERMOVE_SPRITE = 0;
        static readonly STEP_POINTERDOWN_SPRITE = 0;
        static readonly STEP_POINTERUP_SPRITE = 0;
    }
    /**
     * This represents a scene component.
     *
     * This is used to decouple the dependency the scene is having on the different workloads like
     * layers, post processes...
     */
    export interface ISceneComponent {
        /**
         * The name of the component. Each component must have a unique name.
         */
        name: string;
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Register the component to one instance of a scene.
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
    }
    /**
     * This represents a SERIALIZABLE scene component.
     *
     * This extends Scene Component to add Serialization methods on top.
     */
    export interface ISceneSerializableComponent extends ISceneComponent {
        /**
         * Adds all the elements from the container to the scene
         * @param container the container holding the elements
         */
        addFromContainer(container: IAssetContainer): void;
        /**
         * Removes all the elements in the container from the scene
         * @param container contains the elements to remove
         * @param dispose if the removed element should be disposed (default: false)
         */
        removeFromContainer(container: IAssetContainer, dispose?: boolean): void;
        /**
         * Serializes the component data to the specified json object
         * @param serializationObject The object to serialize to
         */
        serialize(serializationObject: any): void;
    }
    /**
     * Strong typing of a Mesh related stage step action
     */
    export type MeshStageAction = (mesh: AbstractMesh, hardwareInstancedRendering: boolean) => boolean;
    /**
     * Strong typing of a Evaluate Sub Mesh related stage step action
     */
    export type EvaluateSubMeshStageAction = (mesh: AbstractMesh, subMesh: SubMesh) => void;
    /**
     * Strong typing of a pre active Mesh related stage step action
     */
    export type PreActiveMeshStageAction = (mesh: AbstractMesh) => void;
    /**
     * Strong typing of a Camera related stage step action
     */
    export type CameraStageAction = (camera: Camera) => void;
    /**
     * Strong typing of a Camera Frame buffer related stage step action
     */
    export type CameraStageFrameBufferAction = (camera: Camera) => boolean;
    /**
     * Strong typing of a Render Target related stage step action
     */
    export type RenderTargetStageAction = (renderTarget: RenderTargetTexture, faceIndex?: number, layer?: number) => void;
    /**
     * Strong typing of a RenderingGroup related stage step action
     */
    export type RenderingGroupStageAction = (renderingGroupId: number) => void;
    /**
     * Strong typing of a Mesh Render related stage step action
     */
    export type RenderingMeshStageAction = (mesh: Mesh, subMesh: SubMesh, batch: any, effect: Nullable<Effect>) => void;
    /**
     * Strong typing of a simple stage step action
     */
    export type SimpleStageAction = () => void;
    /**
     * Strong typing of a render target action.
     */
    export type RenderTargetsStageAction = (renderTargets: SmartArrayNoDuplicate<RenderTargetTexture>) => void;
    /**
     * Strong typing of a pointer move action.
     */
    export type PointerMoveStageAction = (unTranslatedPointerX: number, unTranslatedPointerY: number, pickResult: Nullable<PickingInfo>, isMeshPicked: boolean, element: Nullable<HTMLElement>) => Nullable<PickingInfo>;
    /**
     * Strong typing of a pointer up/down action.
     */
    export type PointerUpDownStageAction = (unTranslatedPointerX: number, unTranslatedPointerY: number, pickResult: Nullable<PickingInfo>, evt: IPointerEvent, doubleClick: boolean) => Nullable<PickingInfo>;
    /**
     * Representation of a stage in the scene (Basically a list of ordered steps)
     * @internal
     */
    export class Stage<T extends Function> extends Array<{
        index: number;
        component: ISceneComponent;
        action: T;
    }> {
        /**
         * Hide ctor from the rest of the world.
         * @param items The items to add.
         */
        private constructor();
        /**
         * Creates a new Stage.
         * @returns A new instance of a Stage
         */
        static Create<T extends Function>(): Stage<T>;
        /**
         * Registers a step in an ordered way in the targeted stage.
         * @param index Defines the position to register the step in
         * @param component Defines the component attached to the step
         * @param action Defines the action to launch during the step
         */
        registerStep(index: number, component: ISceneComponent, action: T): void;
        /**
         * Clears all the steps from the stage.
         */
        clear(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Options for creating a scene uniform buffer
     */
    export interface ICreateSceneUboOptions {
        /** Define if the UBOs should be tracked in the frame (default: undefined - will use the value from Engine._features.trackUbosInFrame) */
        trackUBOsInFrame?: boolean;
        /** When true, always creates a mono (non-multiview) UBO, bypassing any multiview override */
        forceMono?: boolean;
    }
    /**
     * Define an interface for all classes that will hold resources
     */
    export interface IDisposable {
        /**
         * Releases all held resources
         */
        dispose(): void;
    }
    /** Interface defining initialization parameters for Scene class */
    export interface SceneOptions {
        /**
         * Defines that scene should keep up-to-date a map of geometry to enable fast look-up by uniqueId
         * It will improve performance when the number of geometries becomes important.
         */
        useGeometryUniqueIdsMap?: boolean;
        /**
         * Defines that each material of the scene should keep up-to-date a map of referencing meshes for fast disposing
         * It will improve performance when the number of mesh becomes important, but might consume a bit more memory
         */
        useMaterialMeshMap?: boolean;
        /**
         * Defines that each mesh of the scene should keep up-to-date a map of referencing cloned meshes for fast disposing
         * It will improve performance when the number of mesh becomes important, but might consume a bit more memory
         */
        useClonedMeshMap?: boolean;
        /**
         * When enabled, the scene can handle large world coordinate rendering without jittering caused by floating point imprecision on the GPU.
         * This mode offsets matrices and position-related attribute values before passing to shaders, centering camera at origin and offsetting other scene objects by camera active position.
         *
         * IMPORTANT: Only use this scene-level option if you intend to enable floating origin on a per-scene basis. Must use in conjunction with engine creation option 'useHighPrecisionMatrix' to fix CPU-side floating point imprecision.
         * HOWEVER if you want largeWorldRendering on ALL scenes, set the useLargeWorldRendering flag on the engine instead of this scene-level flag. Doing so will automatically set useHighPrecisionMatrix on the engine as well.
         */
        useFloatingOrigin?: boolean;
        /** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */
        virtual?: boolean;
        /**
         * Defines the default layerMask used when creating cameras in the scene (default: 0x0fffffff)
         */
        defaultCameraLayerMask?: number;
        /**
         * Defines the default layerMask used when creating renderable objects in the scene (default: 0x0fffffff)
         */
        defaultRenderableLayerMask?: number;
    }
    /**
     * Define how the scene should favor performance over ease of use
     */
    export enum ScenePerformancePriority {
        /** Default mode. No change. Performance will be treated as less important than backward compatibility */
        BackwardCompatible = 0,
        /** Some performance options will be turned on trying to strike a balance between perf and ease of use */
        Intermediate = 1,
        /** Performance will be top priority */
        Aggressive = 2
    }
    /**
     * Represents a scene to be rendered by the engine.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene
     */
    export class Scene implements IAnimatable, IClipPlanesHolder, IAssetContainer {
        /** The fog is deactivated */
        static readonly FOGMODE_NONE: number;
        /** The fog density is following an exponential function */
        static readonly FOGMODE_EXP: number;
        /** The fog density is following an exponential function faster than FOGMODE_EXP */
        static readonly FOGMODE_EXP2: number;
        /** The fog density is following a linear function. */
        static readonly FOGMODE_LINEAR: number;
        /**
         * Gets or sets the minimum deltatime when deterministic lock step is enabled
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep
         */
        static MinDeltaTime: number;
        /**
         * Gets or sets the maximum deltatime when deterministic lock step is enabled
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep
         */
        static MaxDeltaTime: number;
        /**
         * Factory used to create the default material.
         * @param scene The scene to create the material for
         * @returns The default material
         */
        static DefaultMaterialFactory(scene: Scene): Material;
        private static readonly _OriginalDefaultMaterialFactory;
        /**
         * Factory used to create the a collision coordinator.
         * @returns The collision coordinator
         */
        static CollisionCoordinatorFactory(): ICollisionCoordinator;
        /** @internal */
        _tempPickingRay: Nullable<Ray>;
        /** @internal */
        _cachedRayForTransform: Ray;
        /** @internal */
        _pickWithRayInverseMatrix: Matrix;
        /** @internal */
        _inputManager: InputManager;
        /** Define this parameter if you are using multiple cameras and you want to specify which one should be used for pointer position */
        cameraToUseForPointers: Nullable<Camera>;
        /** @internal */
        readonly _isScene = true;
        /** @internal */
        _blockEntityCollection: boolean;
        /**
         * Gets or sets a boolean that indicates if the scene must clear the render buffer before rendering a frame
         */
        autoClear: boolean;
        /**
         * Gets or sets a boolean that indicates if the scene must clear the depth and stencil buffers before rendering a frame
         */
        autoClearDepthAndStencil: boolean;
        private _clearColor;
        /**
         * Observable triggered when the performance priority is changed
         */
        onClearColorChangedObservable: Observable<Color4>;
        /**
         * Defines the color used to clear the render buffer (Default is (0.2, 0.2, 0.3, 1.0))
         */
        get clearColor(): Color4;
        set clearColor(value: Color4);
        /**
         * Defines the color used to simulate the ambient color (Default is (0, 0, 0))
         */
        ambientColor: Color3;
        /**
         * This is use to store the default BRDF lookup for PBR materials in your scene.
         * It should only be one of the following (if not the default embedded one):
         * * For uncorrelated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = false) : https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds
         * * For correlated BRDF (pbr.brdf.useEnergyConservation = false and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedBRDF.dds
         * * For correlated multi scattering BRDF (pbr.brdf.useEnergyConservation = true and pbr.brdf.useSmithVisibilityHeightCorrelated = true) : https://assets.babylonjs.com/environments/correlatedMSBRDF.dds
         * The material properties need to be setup according to the type of texture in use.
         */
        environmentBRDFTexture: BaseTexture;
        /**
         * This stores the brdf lookup for the fuzz layer of PBR materials in your scene.
         */
        environmentFuzzBRDFTexture: BaseTexture;
        /**
         * Intensity of the environment (i.e. all indirect lighting) in all pbr material.
         * This dims or reinforces the indirect lighting overall (reflection and diffuse).
         * As in the majority of the scene they are the same (exception for multi room and so on),
         * this is easier to reference from here than from all the materials.
         * Note that this is more of a debugging parameter and is not physically accurate.
         * If you want to modify the intensity of the IBL texture, you should update iblIntensity instead.
         */
        environmentIntensity: number;
        /**
         * Overall intensity of the IBL texture.
         * This value is multiplied with the reflectionTexture.level value to calculate the final IBL intensity.
         */
        iblIntensity: number;
        /** @internal */
        protected _imageProcessingConfiguration: ImageProcessingConfiguration;
        /**
         * Default image processing configuration used either in the rendering
         * Forward main pass or through the imageProcessingPostProcess if present.
         * As in the majority of the scene they are the same (exception for multi camera),
         * this is easier to reference from here than from all the materials and post process.
         *
         * No setter as we it is a shared configuration, you can set the values instead.
         */
        get imageProcessingConfiguration(): ImageProcessingConfiguration;
        private _performancePriority;
        /**
         * Observable triggered when the performance priority is changed
         */
        onScenePerformancePriorityChangedObservable: Observable<ScenePerformancePriority>;
        /**
         * Gets or sets a value indicating how to treat performance relatively to ease of use and backward compatibility
         */
        get performancePriority(): ScenePerformancePriority;
        set performancePriority(value: ScenePerformancePriority);
        private _forceWireframe;
        /**
         * Gets or sets a boolean indicating if all rendering must be done in wireframe
         */
        set forceWireframe(value: boolean);
        get forceWireframe(): boolean;
        private _skipFrustumClipping;
        /**
         * Gets or sets a boolean indicating if we should skip the frustum clipping part of the active meshes selection
         */
        set skipFrustumClipping(value: boolean);
        get skipFrustumClipping(): boolean;
        private _forcePointsCloud;
        /**
         * Gets or sets a boolean indicating if all rendering must be done in point cloud
         */
        set forcePointsCloud(value: boolean);
        get forcePointsCloud(): boolean;
        /**
         * Gets or sets the active clipplane 1
         */
        clipPlane: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 2
         */
        clipPlane2: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 3
         */
        clipPlane3: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 4
         */
        clipPlane4: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 5
         */
        clipPlane5: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 6
         */
        clipPlane6: Nullable<Plane>;
        /**
         * Gets the list of root nodes (ie. nodes with no parent)
         */
        rootNodes: Node[];
        /** All of the cameras added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras
         */
        cameras: Camera[];
        /**
         * All of the lights added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         */
        lights: Light[];
        /**
         * All of the (abstract) meshes added to this scene
         */
        meshes: AbstractMesh[];
        /**
         * The list of skeletons added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons
         */
        skeletons: Skeleton[];
        /**
         * All of the particle systems added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
         */
        particleSystems: IParticleSystem[];
        /**
         * Gets the current delta time used by animation engine
         */
        deltaTime: number;
        /**
         * Gets a list of Animations associated with the scene
         */
        animations: Animation[];
        /**
         * All of the animation groups added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations
         */
        animationGroups: AnimationGroup[];
        /**
         * All of the multi-materials added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
         */
        multiMaterials: MultiMaterial[];
        /**
         * All of the materials added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addMaterial and removeMaterial Scene methods.
         * Note also that the order of the Material within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
         */
        materials: Material[];
        /**
         * The list of morph target managers added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph
         */
        morphTargetManagers: MorphTargetManager[];
        /**
         * The list of geometries used in the scene.
         */
        geometries: Geometry[];
        /**
         * All of the transform nodes added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addTransformNode and removeTransformNode Scene methods.
         * Note also that the order of the TransformNode within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node
         */
        transformNodes: TransformNode[];
        /**
         * ActionManagers available on the scene.
         */
        actionManagers: AbstractActionManager[];
        /**
         * Object renderers available on the scene.
         */
        objectRenderers: ObjectRenderer[];
        /**
         * Textures to keep.
         */
        textures: BaseTexture[];
        /** @internal */
        protected _environmentTexture: Nullable<BaseTexture>;
        /**
         * Texture used in all pbr material as the reflection texture.
         * As in the majority of the scene they are the same (exception for multi room and so on),
         * this is easier to reference from here than from all the materials.
         */
        get environmentTexture(): Nullable<BaseTexture>;
        /**
         * Texture used in all pbr material as the reflection texture.
         * As in the majority of the scene they are the same (exception for multi room and so on),
         * this is easier to set here than in all the materials.
         */
        set environmentTexture(value: Nullable<BaseTexture>);
        /**
         * The list of postprocesses added to the scene
         */
        postProcesses: PostProcess[];
        /**
         * The list of effect layers (highlights/glow) added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/highlightLayer
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/glowLayer
         */
        effectLayers: Array<EffectLayer>;
        /**
         * The list of sounds used in the scene.
         * @deprecated please use AudioEngineV2 instead
         */
        sounds: Nullable<Array<Sound>>;
        /**
         * The list of layers (background and foreground) of the scene
         */
        layers: Array<Layer>;
        /**
         * The list of lens flare system added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
         */
        lensFlareSystems: Array<LensFlareSystem>;
        /**
         * The list of procedural textures added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures
         */
        proceduralTextures: Array<ProceduralTexture>;
        /**
         * @returns all meshes, lights, cameras, transformNodes and bones
         */
        getNodes(): Array<Node>;
        /**
         * Gets or sets a boolean indicating if animations are enabled
         */
        animationsEnabled: boolean;
        private _animationPropertiesOverride;
        /**
         * Gets or sets the animation properties override
         */
        get animationPropertiesOverride(): Nullable<AnimationPropertiesOverride>;
        set animationPropertiesOverride(value: Nullable<AnimationPropertiesOverride>);
        /**
         * Gets or sets a boolean indicating if a constant deltatime has to be used
         * This is mostly useful for testing purposes when you do not want the animations to scale with the framerate
         */
        useConstantAnimationDeltaTime: boolean;
        /**
         * Gets or sets a boolean indicating if the scene must keep the meshUnderPointer property updated
         * Please note that it requires to run a ray cast through the scene on every frame
         */
        constantlyUpdateMeshUnderPointer: boolean;
        /**
         * Defines the HTML cursor to use when hovering over interactive elements
         */
        hoverCursor: string;
        /**
         * Defines the HTML default cursor to use (empty by default)
         */
        defaultCursor: string;
        /**
         * Defines whether cursors are handled by the scene.
         */
        doNotHandleCursors: boolean;
        /**
         * This is used to call preventDefault() on pointer down
         * in order to block unwanted artifacts like system double clicks
         */
        preventDefaultOnPointerDown: boolean;
        /**
         * This is used to call preventDefault() on pointer up
         * in order to block unwanted artifacts like system double clicks
         */
        preventDefaultOnPointerUp: boolean;
        /**
         * Gets or sets user defined metadata
         */
        metadata: any;
        /**
         * For internal use only. Please do not use.
         */
        reservedDataStore: any;
        /**
         * Gets the name of the plugin used to load this scene (null by default)
         */
        loadingPluginName: string;
        /**
         * Use this array to add regular expressions used to disable offline support for specific urls
         */
        disableOfflineSupportExceptionRules: RegExp[];
        /**
         * An event triggered when the scene is disposed.
         */
        onDisposeObservable: Observable<Scene>;
        private _onDisposeObserver;
        /** Sets a function to be executed when this scene is disposed. */
        set onDispose(callback: () => void);
        /**
         * An event triggered before rendering the scene (right after animations and physics)
         */
        onBeforeRenderObservable: Observable<Scene>;
        private _onBeforeRenderObserver;
        /** Sets a function to be executed before rendering this scene */
        set beforeRender(callback: Nullable<() => void>);
        /**
         * An event triggered after rendering the scene
         */
        onAfterRenderObservable: Observable<Scene>;
        /**
         * An event triggered after rendering the scene for an active camera (When scene.render is called this will be called after each camera)
         * This is triggered for each "sub" camera in a Camera Rig unlike onAfterCameraRenderObservable
         */
        onAfterRenderCameraObservable: Observable<Camera>;
        private _onAfterRenderObserver;
        /** Sets a function to be executed after rendering this scene */
        set afterRender(callback: Nullable<() => void>);
        /**
         * An event triggered before animating the scene
         */
        onBeforeAnimationsObservable: Observable<Scene>;
        /**
         * An event triggered after animations processing
         */
        onAfterAnimationsObservable: Observable<Scene>;
        /**
         * An event triggered before draw calls are ready to be sent
         */
        onBeforeDrawPhaseObservable: Observable<Scene>;
        /**
         * An event triggered after draw calls have been sent
         */
        onAfterDrawPhaseObservable: Observable<Scene>;
        /**
         * An event triggered when the scene is ready
         */
        onReadyObservable: Observable<Scene>;
        /**
         * An event triggered before rendering a camera
         */
        onBeforeCameraRenderObservable: Observable<Camera>;
        private _onBeforeCameraRenderObserver;
        /** Sets a function to be executed before rendering a camera*/
        set beforeCameraRender(callback: () => void);
        /**
         * An event triggered after rendering a camera
         * This is triggered for the full rig Camera only unlike onAfterRenderCameraObservable
         */
        onAfterCameraRenderObservable: Observable<Camera>;
        private _onAfterCameraRenderObserver;
        /** Sets a function to be executed after rendering a camera*/
        set afterCameraRender(callback: () => void);
        /**
         * An event triggered when active meshes evaluation is about to start
         */
        onBeforeActiveMeshesEvaluationObservable: Observable<Scene>;
        /**
         * An event triggered when active meshes evaluation is done
         */
        onAfterActiveMeshesEvaluationObservable: Observable<Scene>;
        /**
         * An event triggered when particles rendering is about to start
         * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)
         */
        onBeforeParticlesRenderingObservable: Observable<Scene>;
        /**
         * An event triggered when particles rendering is done
         * Note: This event can be trigger more than once per frame (because particles can be rendered by render target textures as well)
         */
        onAfterParticlesRenderingObservable: Observable<Scene>;
        /**
         * An event triggered when SceneLoader.Append or SceneLoader.Load or SceneLoader.ImportMesh were successfully executed
         */
        onDataLoadedObservable: Observable<Scene>;
        /**
         * An event triggered when a camera is created
         */
        onNewCameraAddedObservable: Observable<Camera>;
        /**
         * An event triggered when a camera is removed
         */
        onCameraRemovedObservable: Observable<Camera>;
        /**
         * An event triggered when a light is created
         */
        onNewLightAddedObservable: Observable<Light>;
        /**
         * An event triggered when a light is removed
         */
        onLightRemovedObservable: Observable<Light>;
        /**
         * An event triggered when a geometry is created
         */
        onNewGeometryAddedObservable: Observable<Geometry>;
        /**
         * An event triggered when a geometry is removed
         */
        onGeometryRemovedObservable: Observable<Geometry>;
        /**
         * An event triggered when a transform node is created
         */
        onNewTransformNodeAddedObservable: Observable<TransformNode>;
        /**
         * An event triggered when a transform node is removed
         */
        onTransformNodeRemovedObservable: Observable<TransformNode>;
        /**
         * An event triggered when a mesh is created
         */
        onNewMeshAddedObservable: Observable<AbstractMesh>;
        /**
         * An event triggered when a mesh is removed
         */
        onMeshRemovedObservable: Observable<AbstractMesh>;
        /**
         * An event triggered when a skeleton is created
         */
        onNewSkeletonAddedObservable: Observable<Skeleton>;
        /**
         * An event triggered when a skeleton is removed
         */
        onSkeletonRemovedObservable: Observable<Skeleton>;
        /**
         * An event triggered when a particle system is created
         */
        onNewParticleSystemAddedObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when a particle system is removed
         */
        onParticleSystemRemovedObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when an animation group is created
         */
        onNewAnimationGroupAddedObservable: Observable<AnimationGroup>;
        /**
         * An event triggered when an animation group is removed
         */
        onAnimationGroupRemovedObservable: Observable<AnimationGroup>;
        /**
         * An event triggered when a material is created
         */
        onNewMaterialAddedObservable: Observable<Material>;
        /**
         * An event triggered when a multi material is created
         */
        onNewMultiMaterialAddedObservable: Observable<MultiMaterial>;
        /**
         * An event triggered when a material is removed
         */
        onMaterialRemovedObservable: Observable<Material>;
        /**
         * An event triggered when a multi material is removed
         */
        onMultiMaterialRemovedObservable: Observable<MultiMaterial>;
        /**
         * An event triggered when a texture is created
         */
        onNewTextureAddedObservable: Observable<BaseTexture>;
        /**
         * An event triggered when a texture is removed
         */
        onTextureRemovedObservable: Observable<BaseTexture>;
        /**
         * An event triggered when a frame graph is created
         */
        onNewFrameGraphAddedObservable: Observable<FrameGraph>;
        /**
         * An event triggered when a frame graph is removed
         */
        onFrameGraphRemovedObservable: Observable<FrameGraph>;
        /**
         * An event triggered when an object renderer is created
         */
        onNewObjectRendererAddedObservable: Observable<ObjectRenderer>;
        /**
         * An event triggered when an object renderer is removed
         */
        onObjectRendererRemovedObservable: Observable<ObjectRenderer>;
        /**
         * An event triggered when a post process is created
         */
        onNewPostProcessAddedObservable: Observable<PostProcess>;
        /**
         * An event triggered when a post process is removed
         */
        onPostProcessRemovedObservable: Observable<PostProcess>;
        /**
         * An event triggered when an effect layer is created
         */
        onNewEffectLayerAddedObservable: Observable<EffectLayer>;
        /**
         * An event triggered when an effect layer is removed
         */
        onEffectLayerRemovedObservable: Observable<EffectLayer>;
        /**
         * An event triggered when render targets are about to be rendered
         * Can happen multiple times per frame.
         */
        onBeforeRenderTargetsRenderObservable: Observable<Scene>;
        /**
         * An event triggered when render targets were rendered.
         * Can happen multiple times per frame.
         */
        onAfterRenderTargetsRenderObservable: Observable<Scene>;
        /**
         * An event triggered before calculating deterministic simulation step
         */
        onBeforeStepObservable: Observable<Scene>;
        /**
         * An event triggered after calculating deterministic simulation step
         */
        onAfterStepObservable: Observable<Scene>;
        /**
         * An event triggered when the activeCamera property is updated
         */
        onActiveCameraChanged: Observable<Scene>;
        /**
         * An event triggered when the activeCameras property is updated
         */
        onActiveCamerasChanged: Observable<Scene>;
        /**
         * This Observable will be triggered before rendering each renderingGroup of each rendered camera.
         * The RenderingGroupInfo class contains all the information about the context in which the observable is called
         * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)
         */
        onBeforeRenderingGroupObservable: Observable<RenderingGroupInfo>;
        /**
         * This Observable will be triggered after rendering each renderingGroup of each rendered camera.
         * The RenderingGroupInfo class contains all the information about the context in which the observable is called
         * If you wish to register an Observer only for a given set of renderingGroup, use the mask with a combination of the renderingGroup index elevated to the power of two (1 for renderingGroup 0, 2 for renderingrOup1, 4 for 2 and 8 for 3)
         */
        onAfterRenderingGroupObservable: Observable<RenderingGroupInfo>;
        /**
         * This Observable will when a mesh has been imported into the scene.
         */
        onMeshImportedObservable: Observable<AbstractMesh>;
        /**
         * This Observable will when an animation file has been imported into the scene.
         */
        onAnimationFileImportedObservable: Observable<Scene>;
        /**
         * An event triggered when the environmentTexture is changed.
         */
        onEnvironmentTextureChangedObservable: Observable<Nullable<BaseTexture>>;
        /**
         * An event triggered when the state of mesh under pointer, for a specific pointerId, changes.
         */
        onMeshUnderPointerUpdatedObservable: Observable<{
            mesh: Nullable<AbstractMesh>;
            pointerId: number;
        }>;
        /**
         * Gets or sets a user defined funtion to select LOD from a mesh and a camera.
         * By default this function is undefined and Babylon.js will select LOD based on distance to camera
         */
        customLODSelector: (mesh: AbstractMesh, camera: Camera) => Nullable<AbstractMesh>;
        /** @internal */
        _registeredForLateAnimationBindings: SmartArrayNoDuplicate<any>;
        private _pointerPickingConfiguration;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer down event
         */
        get pointerDownPredicate(): (Mesh: AbstractMesh) => boolean;
        set pointerDownPredicate(value: (Mesh: AbstractMesh) => boolean);
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer up event
         */
        get pointerUpPredicate(): (Mesh: AbstractMesh) => boolean;
        set pointerUpPredicate(value: (Mesh: AbstractMesh) => boolean);
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer move event
         */
        get pointerMovePredicate(): (Mesh: AbstractMesh) => boolean;
        set pointerMovePredicate(value: (Mesh: AbstractMesh) => boolean);
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer down event
         */
        get pointerDownFastCheck(): boolean;
        set pointerDownFastCheck(value: boolean);
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer up event
         */
        get pointerUpFastCheck(): boolean;
        set pointerUpFastCheck(value: boolean);
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer move event
         */
        get pointerMoveFastCheck(): boolean;
        set pointerMoveFastCheck(value: boolean);
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.
         */
        get skipPointerMovePicking(): boolean;
        set skipPointerMovePicking(value: boolean);
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.
         */
        get skipPointerDownPicking(): boolean;
        set skipPointerDownPicking(value: boolean);
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs.  Off by default.
         */
        get skipPointerUpPicking(): boolean;
        set skipPointerUpPicking(value: boolean);
        /** Callback called when a pointer move is detected */
        onPointerMove?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;
        /** Callback called when a pointer down is detected  */
        onPointerDown?: (evt: IPointerEvent, pickInfo: PickingInfo, type: PointerEventTypes) => void;
        /** Callback called when a pointer up is detected  */
        onPointerUp?: (evt: IPointerEvent, pickInfo: Nullable<PickingInfo>, type: PointerEventTypes) => void;
        /** Callback called when a pointer pick is detected */
        onPointerPick?: (evt: IPointerEvent, pickInfo: PickingInfo) => void;
        /**
         * Gets or sets a predicate used to select candidate faces for a pointer move event
         */
        pointerMoveTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;
        /**
         * Gets or sets a predicate used to select candidate faces for a pointer down event
         */
        pointerDownTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;
        /**
         * Gets or sets a predicate used to select candidate faces for a pointer up event
         */
        pointerUpTrianglePredicate: ((p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean) | undefined;
        /**
         * This observable event is triggered when any ponter event is triggered. It is registered during Scene.attachControl() and it is called BEFORE the 3D engine process anything (mesh/sprite picking for instance).
         * You have the possibility to skip the process and the call to onPointerObservable by setting PointerInfoPre.skipOnPointerObservable to true
         */
        onPrePointerObservable: Observable<PointerInfoPre>;
        /**
         * Observable event triggered each time an input event is received from the rendering canvas
         */
        onPointerObservable: Observable<PointerInfo>;
        /**
         * Gets the pointer coordinates without any translation (ie. straight out of the pointer event)
         */
        get unTranslatedPointer(): Vector2;
        /**
         * Gets or sets the distance in pixel that you have to move to prevent some events. Default is 10 pixels
         */
        static get DragMovementThreshold(): number;
        static set DragMovementThreshold(value: number);
        /**
         * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 500 ms
         */
        static get LongPressDelay(): number;
        static set LongPressDelay(value: number);
        /**
         * Time in milliseconds to wait to raise long press events if button is still pressed. Default is 300 ms
         */
        static get DoubleClickDelay(): number;
        static set DoubleClickDelay(value: number);
        /** If you need to check double click without raising a single click at first click, enable this flag */
        static get ExclusiveDoubleClickMode(): boolean;
        static set ExclusiveDoubleClickMode(value: boolean);
        /**
         * Gets the current eye position in order of forcedViewPosition, activeCamera world position, Vector3.ZeroReadOnly
         */
        private get _eyePosition();
        /**
         * Bind the current view position to an effect.
         * @param effect The effect to be bound
         * @param variableName name of the shader variable that will hold the eye position
         * @param isVector3 true to indicates that variableName is a Vector3 and not a Vector4
         * @returns the computed eye position in a temp vector, caller can copy values as needed
         */
        bindEyePosition(effect: Nullable<Effect>, variableName?: string, isVector3?: boolean): Vector4;
        /**
         * Update the scene ubo before it can be used in rendering processing
         * @returns the scene UniformBuffer
         */
        finalizeSceneUbo(): UniformBuffer;
        /** @internal */
        _mirroredCameraPosition: Nullable<Vector3>;
        /**
         * This observable event is triggered when any keyboard event si raised and registered during Scene.attachControl()
         * You have the possibility to skip the process and the call to onKeyboardObservable by setting KeyboardInfoPre.skipOnPointerObservable to true
         */
        onPreKeyboardObservable: Observable<KeyboardInfoPre>;
        /**
         * Observable event triggered each time an keyboard event is received from the hosting window
         */
        onKeyboardObservable: Observable<KeyboardInfo>;
        private _useRightHandedSystem;
        /**
         * Gets or sets a boolean indicating if the scene must use right-handed coordinates system
         */
        set useRightHandedSystem(value: boolean);
        get useRightHandedSystem(): boolean;
        private _timeAccumulator;
        private _currentStepId;
        private _currentInternalStep;
        /**
         * Sets the step Id used by deterministic lock step
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep
         * @param newStepId defines the step Id
         */
        setStepId(newStepId: number): void;
        /**
         * Gets the step Id used by deterministic lock step
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep
         * @returns the step Id
         */
        getStepId(): number;
        /**
         * Gets the internal step used by deterministic lock step
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/advanced_animations#deterministic-lockstep
         * @returns the internal step
         */
        getInternalStep(): number;
        private _fogEnabled;
        /**
         * Gets or sets a boolean indicating if fog is enabled on this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * (Default is true)
         */
        set fogEnabled(value: boolean);
        get fogEnabled(): boolean;
        private _fogMode;
        /**
         * Gets or sets the fog mode to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * | mode | value |
         * | --- | --- |
         * | FOGMODE_NONE | 0 |
         * | FOGMODE_EXP | 1 |
         * | FOGMODE_EXP2 | 2 |
         * | FOGMODE_LINEAR | 3 |
         */
        set fogMode(value: number);
        get fogMode(): number;
        /**
         * Gets or sets the fog color to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * (Default is Color3(0.2, 0.2, 0.3))
         */
        fogColor: Color3;
        /**
         * Gets or sets the fog density to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * (Default is 0.1)
         */
        fogDensity: number;
        /**
         * Gets or sets the fog start distance to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * (Default is 0)
         */
        fogStart: number;
        /**
         * Gets or sets the fog end distance to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/environment_introduction#fog
         * (Default is 1000)
         */
        fogEnd: number;
        /**
         * Flag indicating that the frame buffer binding is handled by another component
         */
        get prePass(): boolean;
        /**
         * Flag indicating if we need to store previous matrices when rendering
         */
        needsPreviousWorldMatrices: boolean;
        private _shadowsEnabled;
        /**
         * Gets or sets a boolean indicating if shadows are enabled on this scene
         */
        set shadowsEnabled(value: boolean);
        get shadowsEnabled(): boolean;
        private _lightsEnabled;
        /**
         * Gets or sets a boolean indicating if lights are enabled on this scene
         */
        set lightsEnabled(value: boolean);
        get lightsEnabled(): boolean;
        private _activeCameras;
        private _unObserveActiveCameras;
        /** All of the active cameras added to this scene. */
        get activeCameras(): Nullable<Camera[]>;
        set activeCameras(cameras: Nullable<Camera[]>);
        /** @internal */
        _activeCamera: Nullable<Camera>;
        /** Gets or sets the current active camera */
        get activeCamera(): Nullable<Camera>;
        set activeCamera(value: Nullable<Camera>);
        /** @internal */
        get _hasDefaultMaterial(): boolean;
        private _defaultMaterial;
        /** The default material used on meshes when no material is affected */
        get defaultMaterial(): Material;
        /** The default material used on meshes when no material is affected */
        set defaultMaterial(value: Material);
        private _texturesEnabled;
        /**
         * Gets or sets a boolean indicating if textures are enabled on this scene
         */
        set texturesEnabled(value: boolean);
        get texturesEnabled(): boolean;
        private _frameGraph;
        private _currentCustomRenderFunction?;
        /**
         * Gets or sets the frame graph used to render the scene. If set, the scene will use the frame graph to render the scene instead of the default render loop.
         */
        get frameGraph(): Nullable<FrameGraph>;
        set frameGraph(value: Nullable<FrameGraph>);
        /**
         * List of frame graphs associated with the scene
         */
        frameGraphs: FrameGraph[];
        /**
         * Gets or sets a boolean indicating if physic engines are enabled on this scene
         */
        physicsEnabled: boolean;
        /**
         * Gets or sets a boolean indicating if particles are enabled on this scene
         */
        particlesEnabled: boolean;
        /**
         * Gets or sets a boolean indicating if sprites are enabled on this scene
         */
        spritesEnabled: boolean;
        private _skeletonsEnabled;
        /**
         * Gets or sets a boolean indicating if skeletons are enabled on this scene
         */
        set skeletonsEnabled(value: boolean);
        get skeletonsEnabled(): boolean;
        /**
         * Gets or sets a boolean indicating if lens flares are enabled on this scene
         */
        lensFlaresEnabled: boolean;
        /**
         * Gets or sets a boolean indicating if collisions are enabled on this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        collisionsEnabled: boolean;
        private _collisionCoordinator;
        /** @internal */
        get collisionCoordinator(): ICollisionCoordinator;
        /**
         * Defines the gravity applied to this scene (used only for collisions)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        gravity: Vector3;
        /**
         * Gets or sets a boolean indicating if postprocesses are enabled on this scene
         */
        postProcessesEnabled: boolean;
        /**
         * Gets the current postprocess manager
         */
        postProcessManager: PostProcessManager;
        /**
         * Gets or sets a boolean indicating if render targets are enabled on this scene
         */
        renderTargetsEnabled: boolean;
        /**
         * Gets or sets a boolean indicating if next render targets must be dumped as image for debugging purposes
         * We recommend not using it and instead rely on Spector.js: http://spector.babylonjs.com
         */
        dumpNextRenderTargets: boolean;
        /**
         * The list of user defined render targets added to the scene
         */
        customRenderTargets: RenderTargetTexture[];
        /**
         * Defines if texture loading must be delayed
         * If true, textures will only be loaded when they need to be rendered
         */
        useDelayedTextureLoading: boolean;
        /**
         * Gets the list of meshes imported to the scene through SceneLoader
         */
        importedMeshesFiles: string[];
        /**
         * Gets or sets a boolean indicating if probes are enabled on this scene
         */
        probesEnabled: boolean;
        /**
         * Gets or sets the current offline provider to use to store scene data
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached
         */
        offlineProvider: IOfflineProvider;
        /**
         * Gets or sets the action manager associated with the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions
         */
        actionManager: AbstractActionManager;
        private _meshesForIntersections;
        /**
         * Gets or sets a boolean indicating if procedural textures are enabled on this scene
         */
        proceduralTexturesEnabled: boolean;
        private _engine;
        private _totalVertices;
        /** @internal */
        _activeIndices: PerfCounter;
        /** @internal */
        _activeParticles: PerfCounter;
        /** @internal */
        _activeBones: PerfCounter;
        private _animationRatio;
        /** @internal */
        _animationTimeLast: number;
        /** @internal */
        _animationTime: number;
        /**
         * Gets or sets a general scale for animation speed
         * @see https://www.babylonjs-playground.com/#IBU2W7#3
         */
        animationTimeScale: number;
        /** @internal */
        _cachedMaterial: Nullable<Material>;
        /** @internal */
        _cachedEffect: Nullable<Effect>;
        /** @internal */
        _cachedVisibility: Nullable<number>;
        private _renderId;
        private _frameId;
        private _executeWhenReadyTimeoutId;
        /** @internal */
        _intermediateRendering: boolean;
        private _defaultFrameBufferCleared;
        private _viewUpdateFlag;
        private _projectionUpdateFlag;
        /** @internal */
        _toBeDisposed: Nullable<IDisposable>[];
        private _activeRequests;
        /** @internal */
        _pendingData: any[];
        private _isDisposed;
        private _isReadyChecks;
        /**
         * Gets or sets a boolean indicating that all submeshes of active meshes must be rendered
         * Use this boolean to avoid computing frustum clipping on submeshes (This could help when you are CPU bound)
         */
        dispatchAllSubMeshesOfActiveMeshes: boolean;
        private _activeMeshes;
        private _processedMaterials;
        private _renderTargets;
        private _materialsRenderTargets;
        /** @internal */
        _activeParticleSystems: SmartArray<IParticleSystem>;
        private _activeSkeletons;
        private _softwareSkinnedMeshes;
        private _renderingManager;
        /**
         * Gets the scene's rendering manager
         */
        get renderingManager(): RenderingManager;
        /** @internal */
        _activeAnimatables: Animatable[];
        private _transformMatrix;
        private _sceneUbo;
        /** @internal */
        _viewMatrix: Matrix;
        /** @internal */
        _projectionMatrix: Matrix;
        /** @internal */
        _inverseProjectionMatrix: Matrix;
        /** @internal */
        _forcedViewPosition: Nullable<Vector3>;
        /** @internal */
        _frustumPlanes: Plane[];
        /**
         * Gets the list of frustum planes (built from the active camera)
         */
        get frustumPlanes(): Plane[];
        /**
         * Gets or sets a boolean indicating if lights must be sorted by priority (off by default)
         * This is useful if there are more lights that the maximum simulteanous authorized
         */
        requireLightSorting: boolean;
        /** @internal */
        readonly useMaterialMeshMap: boolean;
        /** @internal */
        readonly useClonedMeshMap: boolean;
        private _externalData;
        private _uid;
        /**
         * Gets or sets the default layerMask used for cameras created in this scene.
         */
        defaultCameraLayerMask: number;
        /**
         * Gets or sets the default layerMask used for renderable objects created in this scene.
         */
        defaultRenderableLayerMask: number;
        /**
         * @internal
         * Backing store of defined scene components.
         */
        _components: ISceneComponent[];
        /**
         * @internal
         * Backing store of defined scene components.
         */
        _serializableComponents: ISceneSerializableComponent[];
        /**
         * List of components to register on the next registration step.
         */
        private _transientComponents;
        /**
         * Registers the transient components if needed.
         */
        private _registerTransientComponents;
        /**
         * @internal
         * Add a component to the scene.
         * Note that the ccomponent could be registered on th next frame if this is called after
         * the register component stage.
         * @param component Defines the component to add to the scene
         */
        _addComponent(component: ISceneComponent): void;
        /**
         * @internal
         * Gets a component from the scene.
         * @param name defines the name of the component to retrieve
         * @returns the component or null if not present
         */
        _getComponent(name: string): Nullable<ISceneComponent>;
        /**
         * @internal
         * Defines the actions happening before camera updates.
         */
        _beforeCameraUpdateStage: Stage<SimpleStageAction>;
        /**
         * @internal
         * Defines the actions happening before clear the canvas.
         */
        _beforeClearStage: Stage<SimpleStageAction>;
        /**
         * @internal
         * Defines the actions happening before clear the canvas.
         */
        _beforeRenderTargetClearStage: Stage<RenderTargetStageAction>;
        /**
         * @internal
         * Defines the actions when collecting render targets for the frame.
         */
        _gatherRenderTargetsStage: Stage<RenderTargetsStageAction>;
        /**
         * @internal
         * Defines the actions happening for one camera in the frame.
         */
        _gatherActiveCameraRenderTargetsStage: Stage<RenderTargetsStageAction>;
        /**
         * @internal
         * Defines the actions happening during the per mesh ready checks.
         */
        _isReadyForMeshStage: Stage<MeshStageAction>;
        /**
         * @internal
         * Defines the actions happening before evaluate active mesh checks.
         */
        _beforeEvaluateActiveMeshStage: Stage<SimpleStageAction>;
        /**
         * @internal
         * Defines the actions happening during the evaluate sub mesh checks.
         */
        _evaluateSubMeshStage: Stage<EvaluateSubMeshStageAction>;
        /**
         * @internal
         * Defines the actions happening during the active mesh stage.
         */
        _preActiveMeshStage: Stage<PreActiveMeshStageAction>;
        /**
         * @internal
         * Defines the actions happening during the per camera render target step.
         */
        _cameraDrawRenderTargetStage: Stage<CameraStageFrameBufferAction>;
        /**
         * @internal
         * Defines the actions happening just before the active camera is drawing.
         */
        _beforeCameraDrawStage: Stage<CameraStageAction>;
        /**
         * @internal
         * Defines the actions happening just before a render target is drawing.
         */
        _beforeRenderTargetDrawStage: Stage<RenderTargetStageAction>;
        /**
         * @internal
         * Defines the actions happening just before a rendering group is drawing.
         */
        _beforeRenderingGroupDrawStage: Stage<RenderingGroupStageAction>;
        /**
         * @internal
         * Defines the actions happening just before a mesh is drawing.
         */
        _beforeRenderingMeshStage: Stage<RenderingMeshStageAction>;
        /**
         * @internal
         * Defines the actions happening just after a mesh has been drawn.
         */
        _afterRenderingMeshStage: Stage<RenderingMeshStageAction>;
        /**
         * @internal
         * Defines the actions happening just after a rendering group has been drawn.
         */
        _afterRenderingGroupDrawStage: Stage<RenderingGroupStageAction>;
        /**
         * @internal
         * Defines the actions happening just after the active camera has been drawn.
         */
        _afterCameraDrawStage: Stage<CameraStageAction>;
        /**
         * @internal
         * Defines the actions happening just after the post processing
         */
        _afterCameraPostProcessStage: Stage<CameraStageAction>;
        /**
         * @internal
         * Defines the actions happening just after a render target has been drawn.
         */
        _afterRenderTargetDrawStage: Stage<RenderTargetStageAction>;
        /**
         * Defines the actions happening just after the post processing on a render target
         */
        _afterRenderTargetPostProcessStage: Stage<RenderTargetStageAction>;
        /**
         * @internal
         * Defines the actions happening just after rendering all cameras and computing intersections.
         */
        _afterRenderStage: Stage<SimpleStageAction>;
        /**
         * @internal
         * Defines the actions happening when a pointer move event happens.
         */
        _pointerMoveStage: Stage<PointerMoveStageAction>;
        /**
         * @internal
         * Defines the actions happening when a pointer down event happens.
         */
        _pointerDownStage: Stage<PointerUpDownStageAction>;
        /**
         * @internal
         * Defines the actions happening when a pointer up event happens.
         */
        _pointerUpStage: Stage<PointerUpDownStageAction>;
        /**
         * an optional map from Geometry Id to Geometry index in the 'geometries' array
         */
        private _geometriesByUniqueId;
        private _uniqueId;
        /**
         * Gets the unique id of the scene
         */
        get uniqueId(): number;
        /**
         * Creates a new Scene
         * @param engine defines the engine to use to render this scene
         * @param options defines the scene options
         */
        constructor(engine: AbstractEngine, options?: SceneOptions);
        /**
         * Gets a string identifying the name of the class
         * @returns "Scene" string
         */
        getClassName(): string;
        private _defaultMeshCandidates;
        /**
         * @internal
         */
        _getDefaultMeshCandidates(): ISmartArrayLike<AbstractMesh>;
        private _defaultSubMeshCandidates;
        /**
         * @internal
         */
        _getDefaultSubMeshCandidates(mesh: AbstractMesh): ISmartArrayLike<SubMesh>;
        /**
         * Sets the default candidate providers for the scene.
         * This sets the getActiveMeshCandidates, getActiveSubMeshCandidates, getIntersectingSubMeshCandidates
         * and getCollidingSubMeshCandidates to their default function
         */
        setDefaultCandidateProviders(): void;
        /**
         * Gets the mesh that is currently under the pointer
         */
        get meshUnderPointer(): Nullable<AbstractMesh>;
        /**
         * Gets or sets the current on-screen X position of the pointer
         */
        get pointerX(): number;
        set pointerX(value: number);
        /**
         * Gets or sets the current on-screen Y position of the pointer
         */
        get pointerY(): number;
        set pointerY(value: number);
        /**
         * Gets the cached material (ie. the latest rendered one)
         * @returns the cached material
         */
        getCachedMaterial(): Nullable<Material>;
        /**
         * Gets the cached effect (ie. the latest rendered one)
         * @returns the cached effect
         */
        getCachedEffect(): Nullable<Effect>;
        /**
         * Gets the cached visibility state (ie. the latest rendered one)
         * @returns the cached visibility state
         */
        getCachedVisibility(): Nullable<number>;
        /**
         * Gets a boolean indicating if the current material / effect / visibility must be bind again
         * @param material defines the current material
         * @param effect defines the current effect
         * @param visibility defines the current visibility state
         * @returns true if one parameter is not cached
         */
        isCachedMaterialInvalid(material: Material, effect: Effect, visibility?: number): boolean;
        /**
         * Gets the engine associated with the scene
         * @returns an Engine
         */
        getEngine(): AbstractEngine;
        /**
         * Gets the total number of vertices rendered per frame
         * @returns the total number of vertices rendered per frame
         */
        getTotalVertices(): number;
        /**
         * Gets the performance counter for total vertices
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation
         */
        get totalVerticesPerfCounter(): PerfCounter;
        /**
         * Gets the total number of active indices rendered per frame (You can deduce the number of rendered triangles by dividing this number by 3)
         * @returns the total number of active indices rendered per frame
         */
        getActiveIndices(): number;
        /**
         * Gets the performance counter for active indices
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation
         */
        get totalActiveIndicesPerfCounter(): PerfCounter;
        /**
         * Gets the total number of active particles rendered per frame
         * @returns the total number of active particles rendered per frame
         */
        getActiveParticles(): number;
        /**
         * Gets the performance counter for active particles
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation
         */
        get activeParticlesPerfCounter(): PerfCounter;
        /**
         * Gets the total number of active bones rendered per frame
         * @returns the total number of active bones rendered per frame
         */
        getActiveBones(): number;
        /**
         * Gets the performance counter for active bones
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#instrumentation
         */
        get activeBonesPerfCounter(): PerfCounter;
        /**
         * Gets the array of active meshes
         * @returns an array of AbstractMesh
         */
        getActiveMeshes(): SmartArray<AbstractMesh>;
        /**
         * Gets the animation ratio (which is 1.0 is the scene renders at 60fps and 2 if the scene renders at 30fps, etc.)
         * @returns a number
         */
        getAnimationRatio(): number;
        /**
         * Gets an unique Id for the current render phase
         * @returns a number
         */
        getRenderId(): number;
        /**
         * Gets an unique Id for the current frame
         * @returns a number
         */
        getFrameId(): number;
        /** Call this function if you want to manually increment the render Id*/
        incrementRenderId(): void;
        private _createUbo;
        /**
         * Use this method to simulate a pointer move on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         * @returns the current scene
         */
        simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene;
        /**
         * Use this method to simulate a pointer down on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         * @returns the current scene
         */
        simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): Scene;
        /**
         * Use this method to simulate a pointer up on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         * @param doubleTap indicates that the pointer up event should be considered as part of a double click (false by default)
         * @returns the current scene
         */
        simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): Scene;
        /**
         * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)
         * @param pointerId defines the pointer id to use in a multi-touch scenario (0 by default)
         * @returns true if the pointer was captured
         */
        isPointerCaptured(pointerId?: number): boolean;
        /**
         * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp
         * @param attachUp defines if you want to attach events to pointerup
         * @param attachDown defines if you want to attach events to pointerdown
         * @param attachMove defines if you want to attach events to pointermove
         */
        attachControl(attachUp?: boolean, attachDown?: boolean, attachMove?: boolean): void;
        /** Detaches all event handlers*/
        detachControl(): void;
        /**
         * This function will check if the scene can be rendered (textures are loaded, shaders are compiled)
         * Delay loaded resources are not taking in account
         * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: true)
         * @returns true if all required resources are ready
         */
        isReady(checkRenderTargets?: boolean): boolean;
        /** Resets all cached information relative to material (including effect and visibility) */
        resetCachedMaterial(): void;
        /**
         * Registers a function to be called before every frame render
         * @param func defines the function to register
         */
        registerBeforeRender(func: () => void): void;
        /**
         * Unregisters a function called before every frame render
         * @param func defines the function to unregister
         */
        unregisterBeforeRender(func: () => void): void;
        /**
         * Registers a function to be called after every frame render
         * @param func defines the function to register
         */
        registerAfterRender(func: () => void): void;
        /**
         * Unregisters a function called after every frame render
         * @param func defines the function to unregister
         */
        unregisterAfterRender(func: () => void): void;
        private _executeOnceBeforeRender;
        /**
         * The provided function will run before render once and will be disposed afterwards.
         * A timeout delay can be provided so that the function will be executed in N ms.
         * The timeout is using the browser's native setTimeout so time percision cannot be guaranteed.
         * @param func The function to be executed.
         * @param timeout optional delay in ms
         */
        executeOnceBeforeRender(func: () => void, timeout?: number): void;
        /**
         * This function can help adding any object to the list of data awaited to be ready in order to check for a complete scene loading.
         * @param data defines the object to wait for
         */
        addPendingData(data: any): void;
        /**
         * Remove a pending data from the loading list which has previously been added with addPendingData.
         * @param data defines the object to remove from the pending list
         */
        removePendingData(data: any): void;
        /**
         * Returns the number of items waiting to be loaded
         * @returns the number of items waiting to be loaded
         */
        getWaitingItemsCount(): number;
        /**
         * Returns a boolean indicating if the scene is still loading data
         */
        get isLoading(): boolean;
        /**
         * Registers an object whose {@link isReady} method will be checked during {@link Scene.isReady}.
         * Call {@link removeIsReadyCheck} to remove the object.
         * @param isReadyCheck defines the object to add.
         */
        addIsReadyCheck(isReadyCheck: {
            isReady(): boolean;
        }): void;
        /**
         * Removes an object previously registered with {@link addIsReadyCheck}.
         * @param isReadyCheck defines the object to remove.
         */
        removeIsReadyCheck(isReadyCheck: {
            isReady(): boolean;
        }): void;
        /**
         * Registers a function to be executed when the scene is ready
         * @param func - the function to be executed
         * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)
         */
        executeWhenReady(func: () => void, checkRenderTargets?: boolean): void;
        /**
         * Returns a promise that resolves when the scene is ready
         * @param checkRenderTargets true to also check that the meshes rendered as part of a render target are ready (default: false)
         * @returns A promise that resolves when the scene is ready
         */
        whenReadyAsync(checkRenderTargets?: boolean): Promise<void>;
        /**
         * An event triggered when the scene ready checks has timed out.
         */
        onReadyTimeoutObservable: Observable<Scene>;
        /**
         * Duration in milliseconds to wait before triggering the onReadyTimeoutObservable event.
         */
        onReadyTimeoutDuration: number;
        private _timeoutChecksStartTime;
        private _clearReadynessChecksData;
        /**
         * @internal
         */
        _checkIsReady(checkRenderTargets?: boolean): void;
        /**
         * Gets all animatable attached to the scene
         */
        get animatables(): Animatable[];
        /**
         * Resets the last animation time frame.
         * Useful to override when animations start running when loading a scene for the first time.
         */
        resetLastAnimationTimeFrame(): void;
        /**
         * Gets the current view matrix
         * @returns a Matrix
         */
        getViewMatrix(): Matrix;
        /**
         * Gets the current projection matrix
         * @returns a Matrix
         */
        getProjectionMatrix(): Matrix;
        /**
         * Gets the current inverse projection matrix
         * @returns a Matrix
         */
        getInverseProjectionMatrix(): Matrix;
        /**
         * Gets the current transform matrix
         * @returns a Matrix made of View * Projection
         */
        getTransformMatrix(): Matrix;
        /**
         * Sets the current transform matrix
         * @param viewL defines the View matrix to use
         * @param projectionL defines the Projection matrix to use
         * @param viewR defines the right View matrix to use (if provided)
         * @param projectionR defines the right Projection matrix to use (if provided)
         */
        setTransformMatrix(viewL: Matrix, projectionL: Matrix, viewR?: Matrix, projectionR?: Matrix): void;
        /**
         * Gets the uniform buffer used to store scene data
         * @returns a UniformBuffer
         */
        getSceneUniformBuffer(): UniformBuffer;
        /**
         * Creates a scene UBO
         * @param name name of the uniform buffer (optional, for debugging purpose only)
         * @param trackUBOsInFrame define if the UBOs should be tracked in the frame (default: undefined - will use the value from Engine._features.trackUbosInFrame)
         * @returns a new ubo
         */
        createSceneUniformBuffer(name?: string, trackUBOsInFrame?: boolean): UniformBuffer;
        /**
         * Creates a scene UBO
         * @param name name of the uniform buffer (optional, for debugging purpose only)
         * @param options options for creating the scene uniform buffer
         * @returns a new ubo
         */
        createSceneUniformBuffer(name?: string, options?: ICreateSceneUboOptions): UniformBuffer;
        /**
         * Sets the scene ubo
         * @param ubo the ubo to set for the scene
         */
        setSceneUniformBuffer(ubo: UniformBuffer): void;
        private _floatingOriginScene;
        /**
         * True if floatingOriginMode was passed to engine or this scene creation otions.
         * This mode avoids floating point imprecision in huge coordinate system by offsetting uniform values before passing to shader, centering camera at origin and displacing rest of scene by camera position
         */
        get floatingOriginMode(): boolean;
        /**
         * When floatingOriginMode is enabled, offset is equal to the eye position. Default to ZeroReadonly when mode is disabled.
         */
        get floatingOriginOffset(): Vector3;
        /**
         * Gets an unique (relatively to the current scene) Id
         * @returns an unique number for the scene
         */
        getUniqueId(): number;
        /**
         * Add a mesh to the list of scene's meshes
         * @param newMesh defines the mesh to add
         * @param recursive if all child meshes should also be added to the scene
         */
        addMesh(newMesh: AbstractMesh, recursive?: boolean): void;
        /**
         * Remove a mesh for the list of scene's meshes
         * @param toRemove defines the mesh to remove
         * @param recursive if all child meshes should also be removed from the scene
         * @returns the index where the mesh was in the mesh list
         */
        removeMesh(toRemove: AbstractMesh, recursive?: boolean): number;
        /**
         * Add a transform node to the list of scene's transform nodes
         * @param newTransformNode defines the transform node to add
         */
        addTransformNode(newTransformNode: TransformNode): void;
        /**
         * Remove a transform node for the list of scene's transform nodes
         * @param toRemove defines the transform node to remove
         * @returns the index where the transform node was in the transform node list
         */
        removeTransformNode(toRemove: TransformNode): number;
        /**
         * Remove a skeleton for the list of scene's skeletons
         * @param toRemove defines the skeleton to remove
         * @returns the index where the skeleton was in the skeleton list
         */
        removeSkeleton(toRemove: Skeleton): number;
        /**
         * Remove a morph target for the list of scene's morph targets
         * @param toRemove defines the morph target to remove
         * @returns the index where the morph target was in the morph target list
         */
        removeMorphTargetManager(toRemove: MorphTargetManager): number;
        /**
         * Remove a light for the list of scene's lights
         * @param toRemove defines the light to remove
         * @returns the index where the light was in the light list
         */
        removeLight(toRemove: Light): number;
        /**
         * Remove a camera for the list of scene's cameras
         * @param toRemove defines the camera to remove
         * @returns the index where the camera was in the camera list
         */
        removeCamera(toRemove: Camera): number;
        /**
         * Remove a particle system for the list of scene's particle systems
         * @param toRemove defines the particle system to remove
         * @returns the index where the particle system was in the particle system list
         */
        removeParticleSystem(toRemove: IParticleSystem): number;
        /**
         * Remove a animation for the list of scene's animations
         * @param toRemove defines the animation to remove
         * @returns the index where the animation was in the animation list
         */
        removeAnimation(toRemove: Animation): number;
        /**
         * Will stop the animation of the given target
         * @param target - the target
         * @param animationName - the name of the animation to stop (all animations will be stopped if both this and targetMask are empty)
         * @param targetMask - a function that determines if the animation should be stopped based on its target (all animations will be stopped if both this and animationName are empty)
         */
        stopAnimation(target: any, animationName?: string, targetMask?: (target: any) => boolean): void;
        /**
         * Removes the given animation group from this scene.
         * @param toRemove The animation group to remove
         * @returns The index of the removed animation group
         */
        removeAnimationGroup(toRemove: AnimationGroup): number;
        /**
         * Removes the given multi-material from this scene.
         * @param toRemove The multi-material to remove
         * @returns The index of the removed multi-material
         */
        removeMultiMaterial(toRemove: MultiMaterial): number;
        /**
         * Removes the given material from this scene.
         * @param toRemove The material to remove
         * @returns The index of the removed material
         */
        removeMaterial(toRemove: Material): number;
        /**
         * Removes the given action manager from this scene.
         * @deprecated
         * @param toRemove The action manager to remove
         * @returns The index of the removed action manager
         */
        removeActionManager(toRemove: AbstractActionManager): number;
        /**
         * Removes the given texture from this scene.
         * @param toRemove The texture to remove
         * @returns The index of the removed texture
         */
        removeTexture(toRemove: BaseTexture): number;
        /**
         * Removes the given frame graph from this scene.
         * @param toRemove The frame graph to remove
         * @returns The index of the removed frame graph
         */
        removeFrameGraph(toRemove: FrameGraph): number;
        /**
         * Removes the given object renderer from this scene.
         * @param toRemove The object renderer to remove
         * @returns The index of the removed object renderer
         */
        removeObjectRenderer(toRemove: ObjectRenderer): number;
        /**
         * Removes the given post-process from this scene.
         * @param toRemove The post-process to remove
         * @returns The index of the removed post-process
         */
        removePostProcess(toRemove: PostProcess): number;
        /**
         * Removes the given layer from this scene.
         * @param toRemove The layer to remove
         * @returns The index of the removed layer
         */
        removeEffectLayer(toRemove: EffectLayer): number;
        /**
         * Adds the given light to this scene
         * @param newLight The light to add
         */
        addLight(newLight: Light): void;
        /**
         * Sorts the list list based on light priorities
         */
        sortLightsByPriority(): void;
        /**
         * Adds the given camera to this scene
         * @param newCamera The camera to add
         */
        addCamera(newCamera: Camera): void;
        /**
         * Adds the given skeleton to this scene
         * @param newSkeleton The skeleton to add
         */
        addSkeleton(newSkeleton: Skeleton): void;
        /**
         * Adds the given particle system to this scene
         * @param newParticleSystem The particle system to add
         */
        addParticleSystem(newParticleSystem: IParticleSystem): void;
        /**
         * Adds the given animation to this scene
         * @param newAnimation The animation to add
         */
        addAnimation(newAnimation: Animation): void;
        /**
         * Adds the given animation group to this scene.
         * @param newAnimationGroup The animation group to add
         */
        addAnimationGroup(newAnimationGroup: AnimationGroup): void;
        /**
         * Adds the given multi-material to this scene
         * @param newMultiMaterial The multi-material to add
         */
        addMultiMaterial(newMultiMaterial: MultiMaterial): void;
        /**
         * Adds the given material to this scene
         * @param newMaterial The material to add
         */
        addMaterial(newMaterial: Material): void;
        /**
         * Adds the given morph target to this scene
         * @param newMorphTargetManager The morph target to add
         */
        addMorphTargetManager(newMorphTargetManager: MorphTargetManager): void;
        /**
         * Adds the given geometry to this scene
         * @param newGeometry The geometry to add
         */
        addGeometry(newGeometry: Geometry): void;
        /**
         * Adds the given action manager to this scene
         * @deprecated
         * @param newActionManager The action manager to add
         */
        addActionManager(newActionManager: AbstractActionManager): void;
        /**
         * Adds the given texture to this scene.
         * @param newTexture The texture to add
         */
        addTexture(newTexture: BaseTexture): void;
        /**
         * Adds the given frame graph to this scene.
         * @param newFrameGraph The frame graph to add
         */
        addFrameGraph(newFrameGraph: FrameGraph): void;
        /**
         * Adds the given object renderer to this scene.
         * @param objectRenderer The object renderer to add
         */
        addObjectRenderer(objectRenderer: ObjectRenderer): void;
        /**
         * Adds the given post process to this scene.
         * @param newPostProcess The post process to add
         */
        addPostProcess(newPostProcess: PostProcess): void;
        /**
         * Adds the given effect layer to this scene.
         * @param newEffectLayer The effect layer to add
         */
        addEffectLayer(newEffectLayer: EffectLayer): void;
        /**
         * Switch active camera
         * @param newCamera defines the new active camera
         * @param attachControl defines if attachControl must be called for the new active camera (default: true)
         */
        switchActiveCamera(newCamera: Camera, attachControl?: boolean): void;
        /**
         * sets the active camera of the scene using its Id
         * @param id defines the camera's Id
         * @returns the new active camera or null if none found.
         */
        setActiveCameraById(id: string): Nullable<Camera>;
        /**
         * sets the active camera of the scene using its name
         * @param name defines the camera's name
         * @returns the new active camera or null if none found.
         */
        setActiveCameraByName(name: string): Nullable<Camera>;
        /**
         * get an animation group using its name
         * @param name defines the material's name
         * @returns the animation group or null if none found.
         */
        getAnimationGroupByName(name: string): Nullable<AnimationGroup>;
        private _getMaterial;
        /**
         * Get a material using its unique id
         * @param uniqueId defines the material's unique id
         * @param allowMultiMaterials determines whether multimaterials should be considered
         * @returns the material or null if none found.
         * @deprecated Please use getMaterialByUniqueId instead.
         */
        getMaterialByUniqueID(uniqueId: number, allowMultiMaterials?: boolean): Nullable<Material>;
        /**
         * Get a material using its unique id
         * @param uniqueId defines the material's unique id
         * @param allowMultiMaterials determines whether multimaterials should be considered
         * @returns the material or null if none found.
         */
        getMaterialByUniqueId(uniqueId: number, allowMultiMaterials?: boolean): Nullable<Material>;
        /**
         * get a material using its id
         * @param id defines the material's Id
         * @param allowMultiMaterials determines whether multimaterials should be considered
         * @returns the material or null if none found.
         */
        getMaterialById(id: string, allowMultiMaterials?: boolean): Nullable<Material>;
        /**
         * Gets a material using its name
         * @param name defines the material's name
         * @param allowMultiMaterials determines whether multimaterials should be considered
         * @returns the material or null if none found.
         */
        getMaterialByName(name: string, allowMultiMaterials?: boolean): Nullable<Material>;
        /**
         * Gets a last added material using a given id
         * @param id defines the material's id
         * @param allowMultiMaterials determines whether multimaterials should be considered
         * @returns the last material with the given id or null if none found.
         */
        getLastMaterialById(id: string, allowMultiMaterials?: boolean): Nullable<Material>;
        /**
         * Get a texture using its unique id
         * @param uniqueId defines the texture's unique id
         * @returns the texture or null if none found.
         */
        getTextureByUniqueId(uniqueId: number): Nullable<BaseTexture>;
        /**
         * Gets a texture using its name
         * @param name defines the texture's name
         * @returns the texture or null if none found.
         */
        getTextureByName(name: string): Nullable<BaseTexture>;
        /**
         * Gets a camera using its Id
         * @param id defines the Id to look for
         * @returns the camera or null if not found
         */
        getCameraById(id: string): Nullable<Camera>;
        /**
         * Gets a camera using its unique Id
         * @param uniqueId defines the unique Id to look for
         * @returns the camera or null if not found
         */
        getCameraByUniqueId(uniqueId: number): Nullable<Camera>;
        /**
         * Gets a camera using its name
         * @param name defines the camera's name
         * @returns the camera or null if none found.
         */
        getCameraByName(name: string): Nullable<Camera>;
        /**
         * Gets a bone using its Id
         * @param id defines the bone's Id
         * @returns the bone or null if not found
         */
        getBoneById(id: string): Nullable<Bone>;
        /**
         * Gets a bone using its id
         * @param name defines the bone's name
         * @returns the bone or null if not found
         */
        getBoneByName(name: string): Nullable<Bone>;
        /**
         * Gets a light node using its name
         * @param name defines the light's name
         * @returns the light or null if none found.
         */
        getLightByName(name: string): Nullable<Light>;
        /**
         * Gets a light node using its Id
         * @param id defines the light's Id
         * @returns the light or null if none found.
         */
        getLightById(id: string): Nullable<Light>;
        /**
         * Gets a light node using its scene-generated unique Id
         * @param uniqueId defines the light's unique Id
         * @returns the light or null if none found.
         */
        getLightByUniqueId(uniqueId: number): Nullable<Light>;
        /**
         * Gets a particle system by Id
         * @param id defines the particle system Id
         * @returns the corresponding system or null if none found
         */
        getParticleSystemById(id: string): Nullable<IParticleSystem>;
        /**
         * Gets a geometry using its Id
         * @param id defines the geometry's Id
         * @returns the geometry or null if none found.
         */
        getGeometryById(id: string): Nullable<Geometry>;
        private _getGeometryByUniqueId;
        /**
         * Gets a frame graph using its name
         * @param name defines the frame graph's name
         * @returns the frame graph or null if none found.
         */
        getFrameGraphByName(name: string): Nullable<FrameGraph>;
        /**
         * Add a new geometry to this scene
         * @param geometry defines the geometry to be added to the scene.
         * @param force defines if the geometry must be pushed even if a geometry with this id already exists
         * @returns a boolean defining if the geometry was added or not
         */
        pushGeometry(geometry: Geometry, force?: boolean): boolean;
        /**
         * Removes an existing geometry
         * @param geometry defines the geometry to be removed from the scene
         * @returns a boolean defining if the geometry was removed or not
         */
        removeGeometry(geometry: Geometry): boolean;
        /**
         * Gets the list of geometries attached to the scene
         * @returns an array of Geometry
         */
        getGeometries(): Geometry[];
        /**
         * Gets the first added mesh found of a given Id
         * @param id defines the Id to search for
         * @returns the mesh found or null if not found at all
         */
        getMeshById(id: string): Nullable<AbstractMesh>;
        /**
         * Gets a list of meshes using their Id
         * @param id defines the Id to search for
         * @returns a list of meshes
         */
        getMeshesById(id: string): Array<AbstractMesh>;
        /**
         * Gets the first added transform node found of a given Id
         * @param id defines the Id to search for
         * @returns the found transform node or null if not found at all.
         */
        getTransformNodeById(id: string): Nullable<TransformNode>;
        /**
         * Gets a transform node with its auto-generated unique Id
         * @param uniqueId defines the unique Id to search for
         * @returns the found transform node or null if not found at all.
         */
        getTransformNodeByUniqueId(uniqueId: number): Nullable<TransformNode>;
        /**
         * Gets a list of transform nodes using their Id
         * @param id defines the Id to search for
         * @returns a list of transform nodes
         */
        getTransformNodesById(id: string): Array<TransformNode>;
        /**
         * Gets a mesh with its auto-generated unique Id
         * @param uniqueId defines the unique Id to search for
         * @returns the found mesh or null if not found at all.
         */
        getMeshByUniqueId(uniqueId: number): Nullable<AbstractMesh>;
        /**
         * Gets a the last added mesh using a given Id
         * @param id defines the Id to search for
         * @returns the found mesh or null if not found at all.
         */
        getLastMeshById(id: string): Nullable<AbstractMesh>;
        /**
         * Gets a the last transform node using a given Id
         * @param id defines the Id to search for
         * @returns the found mesh or null if not found at all.
         */
        getLastTransformNodeById(id: string): Nullable<TransformNode>;
        /**
         * Gets a the last added node (Mesh, Camera, Light, Bone) using a given Id
         * @param id defines the Id to search for
         * @returns the found node or null if not found at all
         */
        getLastEntryById(id: string): Nullable<Node>;
        /**
         * Gets a node (Mesh, Camera, Light, Bone) using a given Id
         * @param id defines the Id to search for
         * @returns the found node or null if not found at all
         */
        getNodeById(id: string): Nullable<Node>;
        /**
         * Gets a node (Mesh, Camera, Light) using a given name
         * @param name defines the name to search for
         * @returns the found node or null if not found at all.
         */
        getNodeByName(name: string): Nullable<Node>;
        /**
         * Gets a mesh using a given name
         * @param name defines the name to search for
         * @returns the found mesh or null if not found at all.
         */
        getMeshByName(name: string): Nullable<AbstractMesh>;
        /**
         * Gets a transform node using a given name
         * @param name defines the name to search for
         * @returns the found transform node or null if not found at all.
         */
        getTransformNodeByName(name: string): Nullable<TransformNode>;
        /**
         * Gets a skeleton using a given Id (if many are found, this function will pick the last one)
         * @param id defines the Id to search for
         * @returns the found skeleton or null if not found at all.
         */
        getLastSkeletonById(id: string): Nullable<Skeleton>;
        /**
         * Gets a skeleton using a given auto generated unique id
         * @param  uniqueId defines the unique id to search for
         * @returns the found skeleton or null if not found at all.
         */
        getSkeletonByUniqueId(uniqueId: number): Nullable<Skeleton>;
        /**
         * Gets a skeleton using a given id (if many are found, this function will pick the first one)
         * @param id defines the id to search for
         * @returns the found skeleton or null if not found at all.
         */
        getSkeletonById(id: string): Nullable<Skeleton>;
        /**
         * Gets a skeleton using a given name
         * @param name defines the name to search for
         * @returns the found skeleton or null if not found at all.
         */
        getSkeletonByName(name: string): Nullable<Skeleton>;
        /**
         * Gets a morph target manager  using a given id (if many are found, this function will pick the last one)
         * @param id defines the id to search for
         * @returns the found morph target manager or null if not found at all.
         */
        getMorphTargetManagerById(id: number): Nullable<MorphTargetManager>;
        /**
         * Gets a morph target using a given id (if many are found, this function will pick the first one)
         * @param id defines the id to search for
         * @returns the found morph target or null if not found at all.
         */
        getMorphTargetById(id: string): Nullable<MorphTarget>;
        /**
         * Gets a morph target using a given name (if many are found, this function will pick the first one)
         * @param name defines the name to search for
         * @returns the found morph target or null if not found at all.
         */
        getMorphTargetByName(name: string): Nullable<MorphTarget>;
        /**
         * Gets a post process using a given name (if many are found, this function will pick the first one)
         * @param name defines the name to search for
         * @returns the found post process or null if not found at all.
         */
        getPostProcessByName(name: string): Nullable<PostProcess>;
        /**
         * Gets a boolean indicating if the given mesh is active
         * @param mesh defines the mesh to look for
         * @returns true if the mesh is in the active list
         */
        isActiveMesh(mesh: AbstractMesh): boolean;
        /**
         * Return a unique id as a string which can serve as an identifier for the scene
         */
        get uid(): string;
        /**
         * Add an externally attached data from its key.
         * This method call will fail and return false, if such key already exists.
         * If you don't care and just want to get the data no matter what, use the more convenient getOrAddExternalDataWithFactory() method.
         * @param key the unique key that identifies the data
         * @param data the data object to associate to the key for this Engine instance
         * @returns true if no such key were already present and the data was added successfully, false otherwise
         */
        addExternalData<T extends object>(key: string, data: T): boolean;
        /**
         * Get an externally attached data from its key
         * @param key the unique key that identifies the data
         * @returns the associated data, if present (can be null), or undefined if not present
         */
        getExternalData<T>(key: string): Nullable<T>;
        /**
         * Get an externally attached data from its key, create it using a factory if it's not already present
         * @param key the unique key that identifies the data
         * @param factory the factory that will be called to create the instance if and only if it doesn't exists
         * @returns the associated data, can be null if the factory returned null.
         */
        getOrAddExternalDataWithFactory<T extends object>(key: string, factory: (k: string) => T): T;
        /**
         * Remove an externally attached data from the Engine instance
         * @param key the unique key that identifies the data
         * @returns true if the data was successfully removed, false if it doesn't exist
         */
        removeExternalData(key: string): boolean;
        private _evaluateSubMesh;
        /**
         * Clear the processed materials smart array preventing retention point in material dispose.
         */
        freeProcessedMaterials(): void;
        private _preventFreeActiveMeshesAndRenderingGroups;
        /** Gets or sets a boolean blocking all the calls to freeActiveMeshes and freeRenderingGroups
         * It can be used in order to prevent going through methods freeRenderingGroups and freeActiveMeshes several times to improve performance
         * when disposing several meshes in a row or a hierarchy of meshes.
         * When used, it is the responsibility of the user to blockfreeActiveMeshesAndRenderingGroups back to false.
         */
        get blockfreeActiveMeshesAndRenderingGroups(): boolean;
        set blockfreeActiveMeshesAndRenderingGroups(value: boolean);
        /**
         * Clear the active meshes smart array preventing retention point in mesh dispose.
         */
        freeActiveMeshes(): void;
        /**
         * Clear the info related to rendering groups preventing retention points during dispose.
         */
        freeRenderingGroups(): void;
        /** @internal */
        _isInIntermediateRendering(): boolean;
        /**
         * Lambda returning the list of potentially active meshes.
         */
        getActiveMeshCandidates: () => ISmartArrayLike<AbstractMesh>;
        /**
         * Lambda returning the list of potentially active sub meshes.
         */
        getActiveSubMeshCandidates: (mesh: AbstractMesh) => ISmartArrayLike<SubMesh>;
        /**
         * Lambda returning the list of potentially intersecting sub meshes.
         */
        getIntersectingSubMeshCandidates: (mesh: AbstractMesh, localRay: Ray) => ISmartArrayLike<SubMesh>;
        /**
         * Lambda returning the list of potentially colliding sub meshes.
         */
        getCollidingSubMeshCandidates: (mesh: AbstractMesh, collider: Collider) => ISmartArrayLike<SubMesh>;
        /** @internal */
        _activeMeshesFrozen: boolean;
        /** @internal */
        _activeMeshesFrozenButKeepClipping: boolean;
        private _skipEvaluateActiveMeshesCompletely;
        private _freezeActiveMeshesCancel;
        /**
         * Use this function to stop evaluating active meshes. The current list will be keep alive between frames
         * @param skipEvaluateActiveMeshes defines an optional boolean indicating that the evaluate active meshes step must be completely skipped
         * @param onSuccess optional success callback
         * @param onError optional error callback
         * @param freezeMeshes defines if meshes should be frozen (true by default)
         * @param keepFrustumCulling defines if you want to keep running the frustum clipping (false by default)
         * @returns the current scene
         */
        freezeActiveMeshes(skipEvaluateActiveMeshes?: boolean, onSuccess?: () => void, onError?: (message: string) => void, freezeMeshes?: boolean, keepFrustumCulling?: boolean): Scene;
        /**
         * Use this function to restart evaluating active meshes on every frame
         * @returns the current scene
         */
        unfreezeActiveMeshes(): Scene;
        private _executeActiveContainerCleanup;
        private _evaluateActiveMeshes;
        /** @internal */
        _prepareSkeleton(mesh: AbstractMesh): void;
        private _activeMesh;
        /**
         * Update the transform matrix to update from the current active camera
         * @param force defines a boolean used to force the update even if cache is up to date
         */
        updateTransformMatrix(force?: boolean): void;
        /** @internal */
        _useCurrentFrameBuffer: boolean;
        private _bindFrameBuffer;
        private _clearFrameBuffer;
        /** @internal */
        _allowPostProcessClearColor: boolean;
        /**
         * @internal
         */
        _renderForCamera(camera: Camera, rigParent?: Camera, bindFrameBuffer?: boolean): void;
        private _processSubCameras;
        private _checkIntersections;
        /**
         * @internal
         */
        _advancePhysicsEngineStep(step: number): void;
        /**
         * User updatable function that will return a deterministic frame time when engine is in deterministic lock step mode
         * @returns the frame time
         */
        getDeterministicFrameTime: () => number;
        /** @internal */
        _animate(customDeltaTime?: number): void;
        /** Execute all animations (for a frame) */
        animate(): void;
        private _clear;
        private _checkCameraRenderTarget;
        /**
         * Resets the draw wrappers cache of all meshes
         * @param passId If provided, releases only the draw wrapper corresponding to this render pass id
         */
        resetDrawCache(passId?: number): void;
        /**
         * If this function is defined it will take precedence over the standard render() function.
         */
        customRenderFunction?: (updateCameras: boolean, ignoreAnimations: boolean) => void;
        private _renderWithFrameGraph;
        /**
         * @internal
         */
        _renderRenderTarget(renderTarget: RenderTargetTexture, activeCamera: Nullable<Camera>, useCameraPostProcess?: boolean, dumpForDebug?: boolean): void;
        private _getFloatingOriginScene;
        /**
         * Render the scene
         * @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)
         * @param ignoreAnimations defines a boolean indicating if animations should not be executed (false by default)
         */
        render(updateCameras?: boolean, ignoreAnimations?: boolean): void;
        /**
         * Freeze all materials
         * A frozen material will not be updatable but should be faster to render
         * Note: multimaterials will not be frozen, but their submaterials will
         */
        freezeMaterials(): void;
        /**
         * Unfreeze all materials
         * A frozen material will not be updatable but should be faster to render
         */
        unfreezeMaterials(): void;
        /**
         * Releases all held resources
         */
        dispose(): void;
        private _disposeList;
        /**
         * Gets if the scene is already disposed
         */
        get isDisposed(): boolean;
        /**
         * Call this function to reduce memory footprint of the scene.
         * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)
         */
        clearCachedVertexData(): void;
        /**
         * This function will remove the local cached buffer data from texture.
         * It will save memory but will prevent the texture from being rebuilt
         */
        cleanCachedTextureBuffer(): void;
        /**
         * Get the world extend vectors with an optional filter
         *
         * @param filterPredicate the predicate - which meshes should be included when calculating the world size
         * @returns {{ min: Vector3; max: Vector3 }} min and max vectors
         */
        getWorldExtends(filterPredicate?: (mesh: AbstractMesh) => boolean): {
            min: Vector3;
            max: Vector3;
        };
        /**
         * Creates a ray that can be used to pick in the scene
         * @param x defines the x coordinate of the origin (on-screen)
         * @param y defines the y coordinate of the origin (on-screen)
         * @param world defines the world matrix to use if you want to pick in object space (instead of world space)
         * @param camera defines the camera to use for the picking
         * @param cameraViewSpace defines if picking will be done in view space (false by default)
         * @returns a Ray
         */
        createPickingRay(x: number, y: number, world: Nullable<Matrix>, camera: Nullable<Camera>, cameraViewSpace?: boolean): Ray;
        /**
         * Creates a ray that can be used to pick in the scene
         * @param x defines the x coordinate of the origin (on-screen)
         * @param y defines the y coordinate of the origin (on-screen)
         * @param world defines the world matrix to use if you want to pick in object space (instead of world space)
         * @param result defines the ray where to store the picking ray
         * @param camera defines the camera to use for the picking
         * @param cameraViewSpace defines if picking will be done in view space (false by default)
         * @param enableDistantPicking defines if picking should handle large values for mesh position/scaling (false by default)
         * @returns the current scene
         */
        createPickingRayToRef(x: number, y: number, world: Nullable<Matrix>, result: Ray, camera: Nullable<Camera>, cameraViewSpace?: boolean, enableDistantPicking?: boolean): Scene;
        /**
         * Creates a ray that can be used to pick in the scene
         * @param x defines the x coordinate of the origin (on-screen)
         * @param y defines the y coordinate of the origin (on-screen)
         * @param camera defines the camera to use for the picking
         * @returns a Ray
         */
        createPickingRayInCameraSpace(x: number, y: number, camera?: Camera): Ray;
        /**
         * Creates a ray that can be used to pick in the scene
         * @param x defines the x coordinate of the origin (on-screen)
         * @param y defines the y coordinate of the origin (on-screen)
         * @param result defines the ray where to store the picking ray
         * @param camera defines the camera to use for the picking
         * @returns the current scene
         */
        createPickingRayInCameraSpaceToRef(x: number, y: number, result: Ray, camera?: Camera): Scene;
        /** @internal */
        _registeredActions: number;
        /** Launch a ray to try to pick a mesh in the scene
         * @param x position on screen
         * @param y position on screen
         * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true. thinInstanceIndex is -1 when the mesh is non-instanced
         * @param fastCheck defines if the first intersection will be used (and not the closest)
         * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @returns a PickingInfo
         */
        pick(x: number, y: number, predicate?: MeshPredicate, fastCheck?: boolean, camera?: Nullable<Camera>, trianglePredicate?: TrianglePickingPredicate): PickingInfo;
        /** Launch a ray to try to pick a mesh in the scene using only bounding information of the main mesh (not using submeshes)
         * @param x position on screen
         * @param y position on screen
         * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true. thinInstanceIndex is -1 when the mesh is non-instanced
         * @param fastCheck defines if the first intersection will be used (and not the closest)
         * @param camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
         * @returns a PickingInfo (Please note that some info will not be set like distance, bv, bu and everything that cannot be capture by only using bounding infos)
         */
        pickWithBoundingInfo(x: number, y: number, predicate?: MeshPredicate, fastCheck?: boolean, camera?: Nullable<Camera>): Nullable<PickingInfo>;
        /**
         * Use the given ray to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,
         * irrespective of orientation.
         * @param ray The ray to use to pick meshes
         * @param predicate Predicate function used to determine eligible meshes. Can be set to null. In this case, a mesh must have isPickable set to true. thinInstanceIndex is -1 when the mesh is non-instanced
         * @param fastCheck defines if the first intersection will be used (and not the closest)
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @returns a PickingInfo
         */
        pickWithRay(ray: Ray, predicate?: MeshPredicate, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo>;
        /**
         * Launch a ray to try to pick a mesh in the scene. A mesh triangle can be picked both from its front and back sides,
         * irrespective of orientation.
         * @param x X position on screen
         * @param y Y position on screen
         * @param predicate Predicate function used to determine eligible meshes and instances. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true. thinInstanceIndex is -1 when the mesh is non-instanced
         * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @returns an array of PickingInfo
         */
        multiPick(x: number, y: number, predicate?: MeshPredicate, camera?: Camera, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]>;
        /**
         * Launch a ray to try to pick a mesh in the scene
         * @param ray Ray to use
         * @param predicate Predicate function used to determine eligible meshes and instances. Can be set to null. In this case, a mesh must be enabled, visible and with isPickable set to true. thinInstanceIndex is -1 when the mesh is non-instanced
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @returns an array of PickingInfo
         */
        multiPickWithRay(ray: Ray, predicate?: MeshPredicate, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]>;
        /**
         * Force the value of meshUnderPointer
         * @param mesh defines the mesh to use
         * @param pointerId optional pointer id when using more than one pointer
         * @param pickResult optional pickingInfo data used to find mesh
         */
        setPointerOverMesh(mesh: Nullable<AbstractMesh>, pointerId?: number, pickResult?: Nullable<PickingInfo>): void;
        /**
         * Gets the mesh under the pointer
         * @returns a Mesh or null if no mesh is under the pointer
         */
        getPointerOverMesh(): Nullable<AbstractMesh>;
        /** @internal */
        _rebuildGeometries(): void;
        /** @internal */
        _rebuildTextures(): void;
        /**
         * Get from a list of objects by tags
         * @param list the list of objects to use
         * @param tagsQuery the query to use
         * @param filter a predicate to filter for tags
         * @returns
         */
        private _getByTags;
        /**
         * Get a list of meshes by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Mesh
         */
        getMeshesByTags(tagsQuery: string, filter?: (mesh: AbstractMesh) => boolean): AbstractMesh[];
        /**
         * Get a list of cameras by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Camera
         */
        getCamerasByTags(tagsQuery: string, filter?: (camera: Camera) => boolean): Camera[];
        /**
         * Get a list of lights by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Light
         */
        getLightsByTags(tagsQuery: string, filter?: (light: Light) => boolean): Light[];
        /**
         * Get a list of materials by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Material
         */
        getMaterialByTags(tagsQuery: string, filter?: (material: Material) => boolean): Material[];
        /**
         * Get a list of transform nodes by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of TransformNode
         */
        getTransformNodesByTags(tagsQuery: string, filter?: (transform: TransformNode) => boolean): TransformNode[];
        /**
         * Overrides the default sort function applied in the rendering group to prepare the meshes.
         * This allowed control for front to back rendering or reversly depending of the special needs.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param opaqueSortCompareFn The opaque queue comparison function use to sort.
         * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.
         * @param transparentSortCompareFn The transparent queue comparison function use to sort.
         */
        setRenderingOrder(renderingGroupId: number, opaqueSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, alphaTestSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, transparentSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>): void;
        /**
         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
         * @param depth Automatically clears depth between groups if true and autoClear is true.
         * @param stencil Automatically clears stencil between groups if true and autoClear is true.
         */
        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth?: boolean, stencil?: boolean): void;
        /**
         * Gets the current auto clear configuration for one rendering group of the rendering
         * manager.
         * @param index the rendering group index to get the information for
         * @returns The auto clear setup for the requested rendering group
         */
        getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup;
        private _blockMaterialDirtyMechanism;
        /** @internal */
        _forceBlockMaterialDirtyMechanism(value: boolean): void;
        /** Gets or sets a boolean blocking all the calls to markAllMaterialsAsDirty (ie. the materials won't be updated if they are out of sync) */
        get blockMaterialDirtyMechanism(): boolean;
        set blockMaterialDirtyMechanism(value: boolean);
        /**
         * Will flag all materials as dirty to trigger new shader compilation
         * @param flag defines the flag used to specify which material part must be marked as dirty
         * @param predicate If not null, it will be used to specify if a material has to be marked as dirty
         */
        markAllMaterialsAsDirty(flag: number, predicate?: (mat: Material) => boolean): void;
        /**
         * @internal
         */
        _loadFile(fileOrUrl: File | string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent) => void, useOfflineSupport?: boolean, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void, onOpened?: (request: WebRequest) => void): IFileRequest;
        _loadFileAsync(fileOrUrl: File | string, onProgress?: (data: any) => void, useOfflineSupport?: boolean, useArrayBuffer?: false, onOpened?: (request: WebRequest) => void): Promise<string>;
        _loadFileAsync(fileOrUrl: File | string, onProgress?: (data: any) => void, useOfflineSupport?: boolean, useArrayBuffer?: true, onOpened?: (request: WebRequest) => void): Promise<ArrayBuffer>;
        /**
         * @internal
         */
        _requestFile(url: string, onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void, onProgress?: (ev: ProgressEvent) => void, useOfflineSupport?: boolean, useArrayBuffer?: boolean, onError?: (error: RequestFileError) => void, onOpened?: (request: WebRequest) => void): IFileRequest;
        /**
         * @internal
         */
        _requestFileAsync(url: string, onProgress?: (ev: ProgressEvent) => void, useOfflineSupport?: boolean, useArrayBuffer?: boolean, onOpened?: (request: WebRequest) => void): Promise<string | ArrayBuffer>;
        /**
         * @internal
         */
        _readFile(file: File, onSuccess: (data: string | ArrayBuffer) => void, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean, onError?: (error: ReadFileError) => void): IFileRequest;
        /**
         * @internal
         */
        _readFileAsync(file: File, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean): Promise<string | ArrayBuffer>;
        /**
         * Internal perfCollector instance used for sharing between inspector and playground.
         * Marked as protected to allow sharing between prototype extensions, but disallow access at toplevel.
         */
        protected _perfCollector: Nullable<PerformanceViewerCollector>;
        /**
         * This method gets the performance collector belonging to the scene, which is generally shared with the inspector.
         * @returns the perf collector belonging to the scene.
         */
        getPerfCollector(): PerformanceViewerCollector;
        /**
         * Sets the active camera of the scene using its Id
         * @param id defines the camera's Id
         * @returns the new active camera or null if none found.
         * @deprecated Please use setActiveCameraById instead
         */
        setActiveCameraByID(id: string): Nullable<Camera>;
        /**
         * Get a material using its id
         * @param id defines the material's Id
         * @returns the material or null if none found.
         * @deprecated Please use getMaterialById instead
         */
        getMaterialByID(id: string): Nullable<Material>;
        /**
         * Gets a the last added material using a given id
         * @param id defines the material's Id
         * @returns the last material with the given id or null if none found.
         * @deprecated Please use getLastMaterialById instead
         */
        getLastMaterialByID(id: string): Nullable<Material>;
        /**
         * Get a texture using its unique id
         * @param uniqueId defines the texture's unique id
         * @returns the texture or null if none found.
         * @deprecated Please use getTextureByUniqueId instead
         */
        getTextureByUniqueID(uniqueId: number): Nullable<BaseTexture>;
        /**
         * Gets a camera using its Id
         * @param id defines the Id to look for
         * @returns the camera or null if not found
         * @deprecated Please use getCameraById instead
         */
        getCameraByID(id: string): Nullable<Camera>;
        /**
         * Gets a camera using its unique Id
         * @param uniqueId defines the unique Id to look for
         * @returns the camera or null if not found
         * @deprecated Please use getCameraByUniqueId instead
         */
        getCameraByUniqueID(uniqueId: number): Nullable<Camera>;
        /**
         * Gets a bone using its Id
         * @param id defines the bone's Id
         * @returns the bone or null if not found
         * @deprecated Please use getBoneById instead
         */
        getBoneByID(id: string): Nullable<Bone>;
        /**
         * Gets a light node using its Id
         * @param id defines the light's Id
         * @returns the light or null if none found.
         * @deprecated Please use getLightById instead
         */
        getLightByID(id: string): Nullable<Light>;
        /**
         * Gets a light node using its scene-generated unique Id
         * @param uniqueId defines the light's unique Id
         * @returns the light or null if none found.
         * @deprecated Please use getLightByUniqueId instead
         */
        getLightByUniqueID(uniqueId: number): Nullable<Light>;
        /**
         * Gets a particle system by Id
         * @param id defines the particle system Id
         * @returns the corresponding system or null if none found
         * @deprecated Please use getParticleSystemById instead
         */
        getParticleSystemByID(id: string): Nullable<IParticleSystem>;
        /**
         * Gets a geometry using its Id
         * @param id defines the geometry's Id
         * @returns the geometry or null if none found.
         * @deprecated Please use getGeometryById instead
         */
        getGeometryByID(id: string): Nullable<Geometry>;
        /**
         * Gets the first added mesh found of a given Id
         * @param id defines the Id to search for
         * @returns the mesh found or null if not found at all
         * @deprecated Please use getMeshById instead
         */
        getMeshByID(id: string): Nullable<AbstractMesh>;
        /**
         * Gets a mesh with its auto-generated unique Id
         * @param uniqueId defines the unique Id to search for
         * @returns the found mesh or null if not found at all.
         * @deprecated Please use getMeshByUniqueId instead
         */
        getMeshByUniqueID(uniqueId: number): Nullable<AbstractMesh>;
        /**
         * Gets a the last added mesh using a given Id
         * @param id defines the Id to search for
         * @returns the found mesh or null if not found at all.
         * @deprecated Please use getLastMeshById instead
         */
        getLastMeshByID(id: string): Nullable<AbstractMesh>;
        /**
         * Gets a list of meshes using their Id
         * @param id defines the Id to search for
         * @returns a list of meshes
         * @deprecated Please use getMeshesById instead
         */
        getMeshesByID(id: string): Array<AbstractMesh>;
        /**
         * Gets the first added transform node found of a given Id
         * @param id defines the Id to search for
         * @returns the found transform node or null if not found at all.
         * @deprecated Please use getTransformNodeById instead
         */
        getTransformNodeByID(id: string): Nullable<TransformNode>;
        /**
         * Gets a transform node with its auto-generated unique Id
         * @param uniqueId defines the unique Id to search for
         * @returns the found transform node or null if not found at all.
         * @deprecated Please use getTransformNodeByUniqueId instead
         */
        getTransformNodeByUniqueID(uniqueId: number): Nullable<TransformNode>;
        /**
         * Gets a list of transform nodes using their Id
         * @param id defines the Id to search for
         * @returns a list of transform nodes
         * @deprecated Please use getTransformNodesById instead
         */
        getTransformNodesByID(id: string): Array<TransformNode>;
        /**
         * Gets a node (Mesh, Camera, Light) using a given Id
         * @param id defines the Id to search for
         * @returns the found node or null if not found at all
         * @deprecated Please use getNodeById instead
         */
        getNodeByID(id: string): Nullable<Node>;
        /**
         * Gets a the last added node (Mesh, Camera, Light) using a given Id
         * @param id defines the Id to search for
         * @returns the found node or null if not found at all
         * @deprecated Please use getLastEntryById instead
         */
        getLastEntryByID(id: string): Nullable<Node>;
        /**
         * Gets a skeleton using a given Id (if many are found, this function will pick the last one)
         * @param id defines the Id to search for
         * @returns the found skeleton or null if not found at all.
         * @deprecated Please use getLastSkeletonById instead
         */
        getLastSkeletonByID(id: string): Nullable<Skeleton>;
    }
    /**
     * Register side effects for scene.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScene(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import scene.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Defines how a node can be built from a string name.
     */
    export type NodeConstructor = (name: string, scene: Scene, options?: any) => () => Node;
    /**
     * Node is the basic class for all scene objects (Mesh, Light, Camera.)
     */
    export class Node implements IBehaviorAware<Node> {
        protected _isDirty: boolean;
        /**
         * @internal
         */
        static _AnimationRangeFactory: (_name: string, _from: number, _to: number) => AnimationRange;
        private static _NodeConstructors;
        /**
         * Add a new node constructor
         * @param type defines the type name of the node to construct
         * @param constructorFunc defines the constructor function
         */
        static AddNodeConstructor(type: string, constructorFunc: NodeConstructor): void;
        /**
         * Returns a node constructor based on type name
         * @param type defines the type name
         * @param name defines the new node name
         * @param scene defines the hosting scene
         * @param options defines optional options to transmit to constructors
         * @returns the new constructor or null
         */
        static Construct(type: string, name: string, scene: Scene, options?: any): Nullable<() => Node>;
        private _nodeDataStorage;
        /**
         * Gets or sets the name of the node
         */
        name: string;
        /**
         * Gets or sets the id of the node
         */
        id: string;
        /**
         * Gets or sets the unique id of the node
         */
        uniqueId: number;
        /**
         * Gets or sets a string used to store user defined state for the node
         */
        state: string;
        /**
         * Gets or sets an object used to store user defined information for the node
         */
        metadata: any;
        /** @internal */
        _internalMetadata: any;
        /**
         * For internal use only. Please do not use.
         */
        reservedDataStore: any;
        /**
         * List of inspectable custom properties (used by the Inspector)
         * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
         */
        inspectableCustomProperties: IInspectable[];
        /**
         * Gets or sets the accessibility tag to describe the node for accessibility purpose.
         */
        set accessibilityTag(value: Nullable<IAccessibilityTag>);
        get accessibilityTag(): Nullable<IAccessibilityTag>;
        protected _accessibilityTag: Nullable<IAccessibilityTag>;
        /**
         * Observable fired when an accessibility tag is changed
         */
        onAccessibilityTagChangedObservable: Observable<Nullable<IAccessibilityTag>>;
        /**
         * Gets or sets a boolean used to define if the node must be serialized
         */
        get doNotSerialize(): boolean;
        set doNotSerialize(value: boolean);
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /**
         * Gets a list of Animations associated with the node
         */
        animations: Animation[];
        protected _ranges: {
            [name: string]: Nullable<AnimationRange>;
        };
        /**
         * Callback raised when the node is ready to be used
         */
        onReady: Nullable<(node: Node) => void>;
        /** @internal */
        _currentRenderId: number;
        private _parentUpdateId;
        /** @internal */
        _childUpdateId: number;
        /** @internal */
        _waitingParentId: Nullable<string>;
        /** @internal */
        _waitingParentInstanceIndex: Nullable<string>;
        /** @internal */
        _waitingParsedUniqueId: Nullable<number>;
        /** @internal */
        _scene: Scene;
        /** @internal */
        _cache: any;
        protected _parentNode: Nullable<Node>;
        /** @internal */
        protected _children: Nullable<Node[]>;
        /** @internal */
        _worldMatrix: Matrix;
        /** @internal */
        _worldMatrixDeterminant: number;
        /** @internal */
        _worldMatrixDeterminantIsDirty: boolean;
        /**
         * Gets a boolean indicating if the node has been disposed
         * @returns true if the node was disposed
         */
        isDisposed(): boolean;
        /**
         * Gets or sets the parent of the node (without keeping the current position in the scene)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent
         */
        set parent(parent: Nullable<Node>);
        get parent(): Nullable<Node>;
        /**
         * If set to true, this node, when renderable, will only be visible if its parent(s) are also visible.
         * @default false
         */
        get inheritVisibility(): boolean;
        set inheritVisibility(value: boolean);
        /**
         * Gets or sets a boolean indicating whether this node is visible, either this node itself when it is renderable or its renderable child nodes when `inheritVisibility` is true.
         * @default true
         */
        get isVisible(): boolean;
        set isVisible(value: boolean);
        /**
         * @internal
         */
        _serializeAsParent(serializationObject: any): void;
        /** @internal */
        _addToSceneRootNodes(): void;
        /** @internal */
        _removeFromSceneRootNodes(): void;
        private _animationPropertiesOverride;
        /**
         * Gets or sets the animation properties override
         */
        get animationPropertiesOverride(): Nullable<AnimationPropertiesOverride>;
        set animationPropertiesOverride(value: Nullable<AnimationPropertiesOverride>);
        /**
         * Gets a string identifying the name of the class
         * @returns "Node" string
         */
        getClassName(): string;
        /** @internal */
        readonly _isNode = true;
        /**
         * An event triggered when the mesh is disposed
         */
        onDisposeObservable: Observable<Node>;
        private _onDisposeObserver;
        /**
         * Sets a callback that will be raised when the node will be disposed
         */
        set onDispose(callback: () => void);
        /**
         * An event triggered when the enabled state of the node changes
         */
        get onEnabledStateChangedObservable(): Observable<boolean>;
        /**
         * An event triggered when the node is cloned
         */
        get onClonedObservable(): Observable<Node>;
        /**
         * Creates a new Node
         * @param name the name and id to be given to this node
         * @param scene the scene this node will be added to
         * @param isPure indicates this Node is just a Node, and not a derived class like Mesh or Camera
         */
        constructor(name: string, scene?: Nullable<Scene>, isPure?: boolean);
        /**
         * Gets the scene of the node
         * @returns a scene
         */
        getScene(): Scene;
        /**
         * Gets the engine of the node
         * @returns a Engine
         */
        getEngine(): AbstractEngine;
        private _behaviors;
        /**
         * Attach a behavior to the node
         * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors
         * @param behavior defines the behavior to attach
         * @param attachImmediately defines that the behavior must be attached even if the scene is still loading
         * @returns the current Node
         */
        addBehavior(behavior: Behavior<Node>, attachImmediately?: boolean): Node;
        /**
         * Remove an attached behavior
         * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors
         * @param behavior defines the behavior to attach
         * @returns the current Node
         */
        removeBehavior(behavior: Behavior<Node>): Node;
        /**
         * Gets the list of attached behaviors
         * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors
         */
        get behaviors(): Behavior<Node>[];
        /**
         * Gets an attached behavior by name
         * @param name defines the name of the behavior to look for
         * @see https://doc.babylonjs.com/features/featuresDeepDive/behaviors
         * @returns null if behavior was not found else the requested behavior
         */
        getBehaviorByName(name: string): Nullable<Behavior<Node>>;
        /**
         * Returns the latest update of the World matrix
         * @returns a Matrix
         */
        getWorldMatrix(): Matrix;
        /** @internal */
        _getWorldMatrixDeterminant(): number;
        /**
         * Returns directly the latest state of the mesh World matrix.
         * A Matrix is returned.
         */
        get worldMatrixFromCache(): Matrix;
        /** @internal */
        _initCache(): void;
        /**
         * @internal
         */
        updateCache(force?: boolean): void;
        /**
         * @internal
         */
        _getActionManagerForTrigger(trigger?: number, _initialCall?: boolean): Nullable<AbstractActionManager>;
        /**
         * @internal
         */
        _updateCache(_ignoreParentClass?: boolean): void;
        /** @internal */
        _isSynchronized(): boolean;
        /** @internal */
        _markSyncedWithParent(): void;
        /** @internal */
        isSynchronizedWithParent(): boolean;
        /** @internal */
        isSynchronized(): boolean;
        /**
         * Is this node ready to be used/rendered
         * @param _completeCheck defines if a complete check (including materials and lights) has to be done (false by default)
         * @returns true if the node is ready
         */
        isReady(_completeCheck?: boolean): boolean;
        /**
         * Flag the  node as dirty (Forcing it to update everything)
         * @param _property helps children apply precise "dirtyfication"
         * @returns this node
         */
        markAsDirty(_property?: string): Node;
        /**
         * Is this node enabled?
         * If the node has a parent, all ancestors will be checked and false will be returned if any are false (not enabled), otherwise will return true
         * @param checkAncestors indicates if this method should check the ancestors. The default is to check the ancestors. If set to false, the method will return the value of this node without checking ancestors
         * @returns whether this node (and its parent) is enabled
         */
        isEnabled(checkAncestors?: boolean): boolean;
        /** @internal */
        protected _syncParentEnabledState(): void;
        /**
         * Set the enabled state of this node
         * @param value defines the new enabled state
         */
        setEnabled(value: boolean): void;
        /**
         * Is this node a descendant of the given node?
         * The function will iterate up the hierarchy until the ancestor was found or no more parents defined
         * @param ancestor defines the parent node to inspect
         * @returns a boolean indicating if this node is a descendant of the given node
         */
        isDescendantOf(ancestor: Node): boolean;
        /**
         * @internal
         */
        _getDescendants(results: Node[], directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): void;
        /**
         * Will return all nodes that have this node as ascendant
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @returns all children nodes of all types
         */
        getDescendants<T extends Node>(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];
        /**
         * Will return all nodes that have this node as ascendant
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @returns all children nodes of all types
         */
        getDescendants(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): Node[];
        /**
         * Get all child-meshes of this node
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered (Default: false)
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @returns an array of AbstractMesh
         */
        getChildMeshes<T extends AbstractMesh>(directDescendantsOnly?: boolean, predicate?: (node: Node) => node is T): T[];
        /**
         * Get all child-meshes of this node
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered (Default: false)
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @returns an array of AbstractMesh
         */
        getChildMeshes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): AbstractMesh[];
        /**
         * Get all direct children of this node
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered (Default: true)
         * @returns an array of Node
         */
        getChildren<T extends Node>(predicate?: (node: Node) => node is T, directDescendantsOnly?: boolean): T[];
        /**
         * Get all direct children of this node
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered (Default: true)
         * @returns an array of Node
         */
        getChildren(predicate?: (node: Node) => boolean, directDescendantsOnly?: boolean): Node[];
        /**
         * @internal
         */
        _setReady(state: boolean): void;
        /**
         * Get an animation by name
         * @param name defines the name of the animation to look for
         * @returns null if not found else the requested animation
         */
        getAnimationByName(name: string): Nullable<Animation>;
        /**
         * Creates an animation range for this node
         * @param name defines the name of the range
         * @param from defines the starting key
         * @param to defines the end key
         */
        createAnimationRange(name: string, from: number, to: number): void;
        /**
         * Delete a specific animation range
         * @param name defines the name of the range to delete
         * @param deleteFrames defines if animation frames from the range must be deleted as well
         */
        deleteAnimationRange(name: string, deleteFrames?: boolean): void;
        /**
         * Get an animation range by name
         * @param name defines the name of the animation range to look for
         * @returns null if not found else the requested animation range
         */
        getAnimationRange(name: string): Nullable<AnimationRange>;
        /**
         * Clone the current node
         * @param name Name of the new clone
         * @param newParent New parent for the clone
         * @param doNotCloneChildren Do not clone children hierarchy
         * @returns the new transform node
         */
        clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<Node>;
        /**
         * Gets the list of all animation ranges defined on this node
         * @returns an array
         */
        getAnimationRanges(): Nullable<AnimationRange>[];
        /**
         * Will start the animation sequence
         * @param name defines the range frames for animation sequence
         * @param loop defines if the animation should loop (false by default)
         * @param speedRatio defines the speed factor in which to run the animation (1 by default)
         * @param onAnimationEnd defines a function to be executed when the animation ended (undefined by default)
         * @returns the object created for this animation. If range does not exist, it will return null
         */
        beginAnimation(name: string, loop?: boolean, speedRatio?: number, onAnimationEnd?: () => void): Nullable<Animatable>;
        /**
         * Serialize animation ranges into a JSON compatible object
         * @returns serialization object
         */
        serializeAnimationRanges(): any;
        /**
         * Computes the world matrix of the node
         * @param _force defines if the cache version should be invalidated forcing the world matrix to be created from scratch
         * @returns the world matrix
         */
        computeWorldMatrix(_force?: boolean): Matrix;
        /**
         * Releases resources associated with this node.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * Parse animation range data from a serialization object and store them into a given node
         * @param node defines where to store the animation ranges
         * @param parsedNode defines the serialization object to read data from
         * @param _scene defines the hosting scene
         */
        static ParseAnimationRanges(node: Node, parsedNode: any, _scene: Scene): void;
        /**
         * Return the minimum and maximum world vectors of the entire hierarchy under current node
         * @param includeDescendants Include bounding info from descendants as well (true by default)
         * @param predicate defines a callback function that can be customize to filter what meshes should be included in the list used to compute the bounding vectors
         * @returns the new bounding vectors
         */
        getHierarchyBoundingVectors(includeDescendants?: boolean, predicate?: Nullable<(abstractMesh: AbstractMesh) => boolean>): {
            min: Vector3;
            max: Vector3;
        };
    }




    /** @internal */
    export class _ImportHelper {
        /** @internal */
        static _IsPickingAvailable: boolean;
    }


    /**
     * Root class for AssetContainer and KeepAssets
     */
    export class AbstractAssetContainer implements IAssetContainer {
        /**
         * Gets the list of root nodes (ie. nodes with no parent)
         */
        rootNodes: Node[];
        /** All of the cameras added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras
         */
        cameras: Camera[];
        /**
         * All of the lights added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         */
        lights: Light[];
        /**
         * All of the (abstract) meshes added to this scene
         */
        meshes: AbstractMesh[];
        /**
         * The list of skeletons added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons
         */
        skeletons: Skeleton[];
        /**
         * All of the particle systems added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
         */
        particleSystems: IParticleSystem[];
        /**
         * Gets a list of Animations associated with the scene
         */
        animations: Animation[];
        /**
         * All of the animation groups added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations
         */
        animationGroups: AnimationGroup[];
        /**
         * All of the multi-materials added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
         */
        multiMaterials: MultiMaterial[];
        /**
         * All of the materials added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addMaterial and removeMaterial Scene methods.
         * Note also that the order of the Material within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
         */
        materials: Material[];
        /**
         * The list of morph target managers added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph
         */
        morphTargetManagers: MorphTargetManager[];
        /**
         * The list of geometries used in the scene.
         */
        geometries: Geometry[];
        /**
         * All of the transform nodes added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addTransformNode and removeTransformNode Scene methods.
         * Note also that the order of the TransformNode within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node
         */
        transformNodes: TransformNode[];
        /**
         * ActionManagers available on the scene.
         * @deprecated
         */
        actionManagers: AbstractActionManager[];
        /**
         * Textures to keep.
         */
        textures: BaseTexture[];
        /** @internal */
        protected _environmentTexture: Nullable<BaseTexture>;
        /**
         * Texture used in all pbr material as the reflection texture.
         * As in the majority of the scene they are the same (exception for multi room and so on),
         * this is easier to reference from here than from all the materials.
         */
        get environmentTexture(): Nullable<BaseTexture>;
        set environmentTexture(value: Nullable<BaseTexture>);
        /**
         * The list of postprocesses added to the scene
         */
        postProcesses: PostProcess[];
        /**
         * The list of sounds
         */
        sounds: Nullable<Sound[]>;
        /**
         * The list of effect layers added to the scene
         */
        effectLayers: EffectLayer[];
        /**
         * The list of layers added to the scene
         */
        layers: Layer[];
        /**
         * The list of reflection probes added to the scene
         */
        reflectionProbes: ReflectionProbe[];
        /**
         * The list of lens flare systems added to the scene
         */
        lensFlareSystems: LensFlareSystem[];
        /**
         * The list of procedural textures added to the scene
         */
        proceduralTextures: ProceduralTexture[];
        /**
         * The list of sprite managers added to the scene
         */
        spriteManagers: SpriteManager[];
        /**
         * @returns all meshes, lights, cameras, transformNodes and bones
         */
        getNodes(): Array<Node>;
    }
    /**
     * Set of assets to keep when moving a scene into an asset container.
     */
    export class KeepAssets extends AbstractAssetContainer {
    }
    /**
     * Class used to store the output of the AssetContainer.instantiateAllMeshesToScene function
     */
    export class InstantiatedEntries {
        /**
         * List of new root nodes (eg. nodes with no parent)
         */
        rootNodes: Node[];
        /**
         * List of new skeletons
         */
        skeletons: Skeleton[];
        /**
         * List of new animation groups
         */
        animationGroups: AnimationGroup[];
        /**
         * Disposes the instantiated entries from the scene
         */
        dispose(): void;
    }
    /**
     * Container with a set of assets that can be added or removed from a scene.
     */
    export class AssetContainer extends AbstractAssetContainer {
        private _wasAddedToScene;
        private _onContextRestoredObserver;
        /**
         * The scene the AssetContainer belongs to.
         */
        scene: Scene;
        /**
         * Instantiates an AssetContainer.
         * @param scene The scene the AssetContainer belongs to.
         */
        constructor(scene?: Nullable<Scene>);
        /**
         * Given a list of nodes, return a topological sorting of them.
         * @param nodes
         * @returns a sorted array of nodes
         */
        private _topologicalSort;
        private _addNodeAndDescendantsToList;
        /**
         * Check if a specific node is contained in this asset container.
         * @param node the node to check
         * @returns true if the node is contained in this container, otherwise false.
         */
        private _isNodeInContainer;
        /**
         * For every node in the scene, check if its parent node is also in the scene.
         * @returns true if every node's parent is also in the scene, otherwise false.
         */
        private _isValidHierarchy;
        /**
         * Instantiate or clone all meshes and add the new ones to the scene.
         * Skeletons and animation groups will all be cloned
         * @param nameFunction defines an optional function used to get new names for clones
         * @param cloneMaterials defines an optional boolean that defines if materials must be cloned as well (false by default)
         * @param options defines an optional list of options to control how to instantiate / clone models
         * @param options.doNotInstantiate defines if the model must be instantiated or just cloned
         * @param options.predicate defines a predicate used to filter whih mesh to instantiate/clone
         * @returns a list of rootNodes, skeletons and animation groups that were duplicated
         */
        instantiateModelsToScene(nameFunction?: (sourceName: string) => string, cloneMaterials?: boolean, options?: {
            doNotInstantiate?: boolean | ((node: Node) => boolean);
            predicate?: (entity: any) => boolean;
        }): InstantiatedEntries;
        /**
         * Adds all the assets from the container to the scene.
         */
        addAllToScene(): void;
        /**
         * Adds assets from the container to the scene.
         * @param predicate defines a predicate used to select which entity will be added (can be null)
         */
        addToScene(predicate?: Nullable<(entity: any) => boolean>): void;
        /**
         * Removes all the assets in the container from the scene
         */
        removeAllFromScene(): void;
        /**
         * Removes assets in the container from the scene
         * @param predicate defines a predicate used to select which entity will be added (can be null)
         */
        removeFromScene(predicate?: Nullable<(entity: any) => boolean>): void;
        /**
         * Disposes all the assets in the container
         */
        dispose(): void;
        private _moveAssets;
        /**
         * Removes all the assets contained in the scene and adds them to the container.
         * @param keepAssets Set of assets to keep in the scene. (default: empty)
         */
        moveAllFromScene(keepAssets?: KeepAssets): void;
        /**
         * Adds all meshes in the asset container to a root mesh that can be used to position all the contained meshes. The root mesh is then added to the front of the meshes in the assetContainer.
         * @returns the root mesh
         */
        createRootMesh(): Mesh;
        /**
         * Merge animations (direct and animation groups) from this asset container into a scene
         * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)
         * @param animatables set of animatables to retarget to a node from the scene
         * @param targetConverter defines a function used to convert animation targets from the asset container to the scene (default: search node by name)
         * @returns an array of the new AnimationGroup added to the scene (empty array if none)
         */
        mergeAnimationsTo(scene: Nullable<Scene> | undefined, animatables: Animatable[], targetConverter?: Nullable<(target: any) => Nullable<Node>>): AnimationGroup[];
        /**
         * @since 6.15.0
         * This method checks for any node that has no parent
         * and is not in the rootNodes array, and adds the node
         * there, if so.
         */
        populateRootNodes(): void;
        /**
         * @since 6.26.0
         * Given a root asset, this method will traverse its hierarchy and add it, its children and any materials/skeletons to the container.
         * @param root root node
         */
        addAllAssetsToContainer(root: Node): void;
        /**
         * Get from a list of objects by tags
         * @param list the list of objects to use
         * @param tagsQuery the query to use
         * @param filter a predicate to filter for tags
         * @returns
         */
        private _getByTags;
        /**
         * Get a list of meshes by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Mesh
         */
        getMeshesByTags(tagsQuery: string, filter?: (mesh: AbstractMesh) => boolean): AbstractMesh[];
        /**
         * Get a list of cameras by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Camera
         */
        getCamerasByTags(tagsQuery: string, filter?: (camera: Camera) => boolean): Camera[];
        /**
         * Get a list of lights by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Light
         */
        getLightsByTags(tagsQuery: string, filter?: (light: Light) => boolean): Light[];
        /**
         * Get a list of materials by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of Material
         */
        getMaterialsByTags(tagsQuery: string, filter?: (material: Material) => boolean): Material[];
        /**
         * Get a list of transform nodes by tags
         * @param tagsQuery defines the tags query to use
         * @param filter defines a predicate used to filter results
         * @returns an array of TransformNode
         */
        getTransformNodesByTags(tagsQuery: string, filter?: (transform: TransformNode) => boolean): TransformNode[];
    }


    /**
     * Interface defining container for the different elements composing a scene.
     * This class is dynamically extended by the different components of the scene increasing
     * flexibility and reducing coupling
     */
    export interface IAssetContainer {
        /**
         * Gets the list of root nodes (ie. nodes with no parent)
         */
        rootNodes: Node[];
        /** All of the cameras added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras
         */
        cameras: Camera[];
        /**
         * All of the lights added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         */
        lights: Light[];
        /**
         * All of the (abstract) meshes added to this scene
         */
        meshes: AbstractMesh[];
        /**
         * The list of skeletons added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons
         */
        skeletons: Skeleton[];
        /**
         * All of the particle systems added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
         */
        particleSystems: IParticleSystem[];
        /**
         * Gets a list of Animations associated with the scene
         */
        animations: Animation[];
        /**
         * All of the animation groups added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/groupAnimations
         */
        animationGroups: AnimationGroup[];
        /**
         * All of the multi-materials added to this scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
         */
        multiMaterials: MultiMaterial[];
        /**
         * All of the materials added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addMaterial and removeMaterial Scene methods.
         * Note also that the order of the Material within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
         */
        materials: Material[];
        /**
         * The list of morph target managers added to the scene
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph
         */
        morphTargetManagers: MorphTargetManager[];
        /**
         * The list of geometries used in the scene.
         */
        geometries: Geometry[];
        /**
         * All of the transform nodes added to this scene
         * In the context of a Scene, it is not supposed to be modified manually.
         * Any addition or removal should be done using the addTransformNode and removeTransformNode Scene methods.
         * Note also that the order of the TransformNode within the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node
         */
        transformNodes: TransformNode[];
        /**
         * ActionManagers available on the scene.
         * @deprecated
         */
        actionManagers: AbstractActionManager[];
        /**
         * Textures to keep.
         */
        textures: BaseTexture[];
        /**
         * Texture used in all pbr material as the reflection texture.
         * As in the majority of the scene they are the same (exception for multi room and so on),
         * this is easier to reference from here than from all the materials.
         */
        environmentTexture: Nullable<BaseTexture>;
        /**
         * The list of postprocesses added to the scene
         */
        postProcesses: PostProcess[];
        /**
         * The list of sound added to the scene
         */
        sounds: Nullable<Sound[]>;
        /**
         * The list of effect layers added to the scene
         */
        effectLayers: EffectLayer[];
        /**
         * The list of layers added to the scene
         */
        layers: Layer[];
        /**
         * The list of reflection probes added to the scene
         */
        reflectionProbes: ReflectionProbe[];
        /**
         * The list of lens flare system added to the scene
         */
        lensFlareSystems: LensFlareSystem[];
        /**
         * The list of procedural textures added to the scene
         */
        proceduralTextures: ProceduralTexture[];
        /**
         * The list of sprite managers added to the scene
         */
        spriteManagers?: ISpriteManager[];
        /**
         * @returns all meshes, lights, cameras, transformNodes and bones
         */
        getNodes(): Array<Node>;
    }


    /**
     * Define an interface for a node to indicate it's info for accessibility.
     * By default, Node type doesn't imply accessibility info unless this tag is assigned. Whereas GUI controls already indicate accessibility info, but one can override the info using this tag.
     */
    export interface IAccessibilityTag {
        /**
         * A string as alt text of the node, describing what the node is/does, for accessibility purpose.
         */
        description?: string;
        /**
         * Customize the event of the accessible object.
         * This will be applied on the generated HTML twin node.
         */
        eventHandler?: {
            [key in keyof HTMLElementEventMap]: (e?: Event) => void;
        };
        /**
         * ARIA roles and attributes to customize accessibility support.
         * If you use BabylonJS's accessibility html twin renderer, and want to override the default behavior (not suggested), this can be your way.
         * Learn more about ARIA: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA
         */
        role?: AcceptedRole;
        aria?: {
            [key in AcceptedARIA]: any;
        };
    }
    type AcceptedRole = "toolbar" | "tooltip" | "feed" | "math" | "presentation" | "none" | "note" | "application" | "article" | "cell" | "columnheader" | "definition" | "directory" | "document" | "figure" | "group" | "heading" | "img" | "list" | "listitem" | "meter" | "row" | "rowgroup" | "rowheader" | "separator" | "table" | "term" | "scrollbar" | "searchbox" | "slider" | "spinbutton" | "switch" | "tab" | "tabpanel" | "treeitem" | "combobox" | "menu" | "menubar" | "tablist" | "tree" | "treegrid" | "banner" | "complementary" | "contentinfo" | "form" | "main" | "navigation" | "region" | "search" | "alert" | "log" | "marquee" | "status" | "timer" | "alertdialog" | "dialog";
    type AcceptedARIA = "aria-autocomplete" | "aria-checked" | "aria-disabled" | "aria-errormessage" | "aria-expanded" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-label" | "aria-level" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-placeholder" | "aria-pressed" | "aria-readonly" | "aria-required" | "aria-selected" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "aria-busy" | "aria-live" | "aria-relevant" | "aria-atomic" | "aria-dropeffect" | "aria-grabbed" | "aria-activedescendant" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-describedby" | "aria-description" | "aria-details" | "aria-flowto" | "aria-labelledby" | "aria-owns" | "aria-posinset" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-setsize";


    /**
     * Wraps xr webgl layers.
     * @internal
     */
    export class WebXRWebGLLayerWrapper extends WebXRLayerWrapper {
        readonly layer: XRWebGLLayer;
        /**
         * @param layer is the layer to be wrapped.
         * @returns a new WebXRLayerWrapper wrapping the provided XRWebGLLayer.
         */
        constructor(layer: XRWebGLLayer);
    }
    /**
     * Provides render target textures and other important rendering information for a given XRWebGLLayer.
     * @internal
     */
    export class WebXRWebGLLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
        readonly layerWrapper: WebXRWebGLLayerWrapper;
        protected _framebufferDimensions: {
            framebufferWidth: number;
            framebufferHeight: number;
        };
        private _rtt;
        private _framebuffer;
        private _layer;
        constructor(scene: Scene, layerWrapper: WebXRWebGLLayerWrapper);
        trySetViewportForView(viewport: Viewport, view: XRView): boolean;
        getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture>;
        getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
    }


    /**
     * States of the webXR experience
     */
    export enum WebXRState {
        /**
         * Transitioning to being in XR mode
         */
        ENTERING_XR = 0,
        /**
         * Transitioning to non XR mode
         */
        EXITING_XR = 1,
        /**
         * In XR mode and presenting
         */
        IN_XR = 2,
        /**
         * Not entered XR mode
         */
        NOT_IN_XR = 3
    }
    /**
     * The state of the XR camera's tracking
     */
    export enum WebXRTrackingState {
        /**
         * No transformation received, device is not being tracked
         */
        NOT_TRACKING = 0,
        /**
         * Tracking lost - using emulated position
         */
        TRACKING_LOST = 1,
        /**
         * Transformation tracking works normally
         */
        TRACKING = 2
    }
    /**
     * Abstraction of the XR render target
     */
    export interface WebXRRenderTarget extends IDisposable {
        /**
         * xrpresent context of the canvas which can be used to display/mirror xr content
         */
        canvasContext: WebGLRenderingContext;
        /**
         * xr layer for the canvas
         */
        xrLayer: Nullable<XRWebGLLayer>;
        /**
         * Initializes a XRWebGLLayer to be used as the session's baseLayer.
         * @param xrSession xr session
         * @returns a promise that will resolve once the XR Layer has been created
         */
        initializeXRLayerAsync(xrSession: XRSession): Promise<XRWebGLLayer>;
    }


    /**
     * Manages an XRSession to work with Babylon's engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRSessionManagers
     */
    export class WebXRSessionManager implements IDisposable, IWebXRRenderTargetTextureProvider {
        /** The scene which the session should be created for */
        scene: Scene;
        private _engine;
        private _referenceSpace;
        private _baseLayerWrapper;
        private _baseLayerRTTProvider;
        private _xrNavigator;
        private _sessionMode;
        private _onEngineDisposedObserver;
        /**
         * The base reference space from which the session started. good if you want to reset your
         * reference space
         */
        baseReferenceSpace: XRReferenceSpace;
        /**
         * Current XR frame
         */
        currentFrame: Nullable<XRFrame>;
        /** WebXR timestamp updated every frame */
        currentTimestamp: number;
        /**
         * Used just in case of a failure to initialize an immersive session.
         * The viewer reference space is compensated using this height, creating a kind of "viewer-floor" reference space
         */
        defaultHeightCompensation: number;
        /**
         * Fires every time a new xrFrame arrives which can be used to update the camera
         */
        onXRFrameObservable: Observable<XRFrame>;
        /**
         * Fires when the reference space changed
         */
        onXRReferenceSpaceChanged: Observable<XRReferenceSpace>;
        /**
         * Fires when the xr session is ended either by the device or manually done
         */
        onXRSessionEnded: Observable<any>;
        /**
         * Fires when the xr session is initialized: right after requestSession was called and returned with a successful result
         */
        onXRSessionInit: Observable<XRSession>;
        /**
         * Fires when the xr reference space has been initialized
         */
        onXRReferenceSpaceInitialized: Observable<XRReferenceSpace>;
        /**
         * Fires when the session manager is rendering the first frame
         */
        onXRReady: Observable<WebXRSessionManager>;
        /**
         * Underlying xr session
         */
        session: XRSession;
        /**
         * The viewer (head position) reference space. This can be used to get the XR world coordinates
         * or get the offset the player is currently at.
         */
        viewerReferenceSpace: XRReferenceSpace;
        /**
         * Are we currently in the XR loop?
         */
        inXRFrameLoop: boolean;
        /**
         * Are we in an XR session?
         */
        inXRSession: boolean;
        private _worldScalingFactor;
        /**
         * Observable raised when the world scale has changed
         */
        onWorldScaleFactorChangedObservable: Observable<{
            previousScaleFactor: number;
            newScaleFactor: number;
        }>;
        /**
         * Scale factor to apply to all XR-related elements (camera, controllers)
         */
        get worldScalingFactor(): number;
        set worldScalingFactor(value: number);
        /**
         * Constructs a WebXRSessionManager, this must be initialized within a user action before usage
         * @param scene The scene which the session should be created for
         */
        constructor(
        /** The scene which the session should be created for */
        scene: Scene);
        /**
         * The current reference space used in this session. This reference space can constantly change!
         * It is mainly used to offset the camera's position.
         */
        get referenceSpace(): XRReferenceSpace;
        /**
         * Set a new reference space and triggers the observable
         */
        set referenceSpace(newReferenceSpace: XRReferenceSpace);
        /**
         * The mode for the managed XR session
         */
        get sessionMode(): XRSessionMode;
        /**
         * Disposes of the session manager
         * This should be called explicitly by the dev, if required.
         */
        dispose(): void;
        /**
         * Stops the xrSession and restores the render loop
         * @returns Promise which resolves after it exits XR
         */
        exitXRAsync(): Promise<void>;
        /**
         * Attempts to set the framebuffer-size-normalized viewport to be rendered this frame for this view.
         * In the event of a failure, the supplied viewport is not updated.
         * @param viewport the viewport to which the view will be rendered
         * @param view the view for which to set the viewport
         * @returns whether the operation was successful
         */
        trySetViewportForView(viewport: Viewport, view: XRView): boolean;
        /**
         * Gets the correct render target texture to be rendered this frame for this eye
         * @param eye the eye for which to get the render target
         * @returns the render target for the specified eye or null if not available
         */
        getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture>;
        /**
         * Gets the correct render target texture to be rendered this frame for this view
         * @param view the view for which to get the render target
         * @returns the render target for the specified view or null if not available
         */
        getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
        /**
         * Creates a WebXRRenderTarget object for the XR session
         * @param options optional options to provide when creating a new render target
         * @returns a WebXR render target to which the session can render
         */
        getWebXRRenderTarget(options?: WebXRManagedOutputCanvasOptions): WebXRRenderTarget;
        /**
         * Initializes the manager
         * After initialization enterXR can be called to start an XR session
         * @returns Promise which resolves after it is initialized
         */
        initializeAsync(): Promise<void>;
        /**
         * Initializes an xr session
         * @param xrSessionMode mode to initialize
         * @param xrSessionInit defines optional and required values to pass to the session builder
         * @returns a promise which will resolve once the session has been initialized
         */
        initializeSessionAsync(xrSessionMode?: XRSessionMode, xrSessionInit?: XRSessionInit): Promise<XRSession>;
        /**
         * Checks if a session would be supported for the creation options specified
         * @param sessionMode session mode to check if supported eg. immersive-vr
         * @returns A Promise that resolves to true if supported and false if not
         */
        isSessionSupportedAsync(sessionMode: XRSessionMode): Promise<boolean>;
        /**
         * Resets the reference space to the one started the session
         */
        resetReferenceSpace(): void;
        /**
         * Starts rendering to the xr layer
         */
        runXRRenderLoop(): void;
        /**
         * Sets the reference space on the xr session
         * @param referenceSpaceType space to set
         * @returns a promise that will resolve once the reference space has been set
         */
        setReferenceSpaceTypeAsync(referenceSpaceType?: XRReferenceSpaceType): Promise<XRReferenceSpace>;
        /**
         * Updates the render state of the session.
         * Note that this is deprecated in favor of WebXRSessionManager.updateRenderState().
         * @param state state to set
         * @returns a promise that resolves once the render state has been updated
         * @deprecated Use updateRenderState() instead.
         */
        updateRenderStateAsync(state: XRRenderState): Promise<void>;
        /**
         * @internal
         */
        _setBaseLayerWrapper(baseLayerWrapper: Nullable<WebXRLayerWrapper>): void;
        /**
         * @internal
         */
        _getBaseLayerWrapper(): Nullable<WebXRLayerWrapper>;
        /**
         * Updates the render state of the session
         * @param state state to set
         */
        updateRenderState(state: XRRenderStateInit): void;
        /**
         * Returns a promise that resolves with a boolean indicating if the provided session mode is supported by this browser
         * @param sessionMode defines the session to test
         * @returns a promise with boolean as final value
         */
        static IsSessionSupportedAsync(sessionMode: XRSessionMode): Promise<boolean>;
        /**
         * Returns true if Babylon.js is using the BabylonNative backend, otherwise false
         */
        get isNative(): boolean;
        /**
         * The current frame rate as reported by the device
         */
        get currentFrameRate(): number | undefined;
        /**
         * A list of supported frame rates (only available in-session!
         */
        get supportedFrameRates(): Float32Array | undefined;
        /**
         * Set the framerate of the session.
         * @param rate the new framerate. This value needs to be in the supportedFrameRates array
         * @returns a promise that resolves once the framerate has been set
         */
        updateTargetFrameRate(rate: number): Promise<void>;
        /**
         * Run a callback in the xr render loop
         * @param callback the callback to call when in XR Frame
         * @param ignoreIfNotInSession if no session is currently running, run it first thing on the next session
         */
        runInXRFrame(callback: () => void, ignoreIfNotInSession?: boolean): void;
        /**
         * Check if fixed foveation is supported on this device
         */
        get isFixedFoveationSupported(): boolean;
        /**
         * Get the fixed foveation currently set, as specified by the webxr specs
         * If this returns null, then fixed foveation is not supported
         */
        get fixedFoveation(): Nullable<number>;
        /**
         * Set the fixed foveation to the specified value, as specified by the webxr specs
         * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation
         */
        set fixedFoveation(value: Nullable<number>);
        /**
         * Get the features enabled on the current session
         * This is only available in-session!
         * @see https://www.w3.org/TR/webxr/#dom-xrsession-enabledfeatures
         */
        get enabledFeatures(): Nullable<string[]>;
    }


    /**
     * An interface for objects that provide render target textures for XR rendering.
     */
    export interface IWebXRRenderTargetTextureProvider extends IDisposable {
        /**
         * Attempts to set the framebuffer-size-normalized viewport to be rendered this frame for this view.
         * In the event of a failure, the supplied viewport is not updated.
         * @param viewport the viewport to which the view will be rendered
         * @param view the view for which to set the viewport
         * @returns whether the operation was successful
         */
        trySetViewportForView(viewport: Viewport, view: XRView): boolean;
        /**
         * Gets the correct render target texture to be rendered this frame for this eye
         * @param eye the eye for which to get the render target
         * @returns the render target for the specified eye or null if not available
         */
        getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture>;
        /**
         * Gets the correct render target texture to be rendered this frame for this view
         * @param view the view for which to get the render target
         * @returns the render target for the specified view or null if not available
         */
        getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
    }
    /**
     * Provides render target textures and other important rendering information for a given XRLayer.
     * @internal
     */
    export abstract class WebXRLayerRenderTargetTextureProvider implements IWebXRRenderTargetTextureProvider {
        private readonly _scene;
        readonly layerWrapper: WebXRLayerWrapper;
        abstract trySetViewportForView(viewport: Viewport, view: XRView): boolean;
        abstract getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture>;
        abstract getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
        protected _renderTargetTextures: RenderTargetTexture[];
        protected _framebufferDimensions: Nullable<{
            framebufferWidth: number;
            framebufferHeight: number;
        }>;
        private _engine;
        constructor(_scene: Scene, layerWrapper: WebXRLayerWrapper);
        private _createInternalTexture;
        protected _createRenderTargetTexture(width: number, height: number, framebuffer: Nullable<WebGLFramebuffer>, colorTexture?: WebGLTexture, depthStencilTexture?: WebGLTexture, multiview?: boolean): RenderTargetTexture;
        protected _destroyRenderTargetTexture(renderTargetTexture: RenderTargetTexture): void;
        getFramebufferDimensions(): Nullable<{
            framebufferWidth: number;
            framebufferHeight: number;
        }>;
        dispose(): void;
    }


    /**
     * Configuration object for WebXR output canvas
     */
    export class WebXRManagedOutputCanvasOptions {
        /**
         * An optional canvas in case you wish to create it yourself and provide it here.
         * If not provided, a new canvas will be created
         */
        canvasElement?: HTMLCanvasElement;
        /**
         * Options for this XR Layer output
         */
        canvasOptions?: XRWebGLLayerInit;
        /**
         * CSS styling for a newly created canvas (if not provided)
         */
        newCanvasCssStyle?: string;
        /**
         * Get the default values of the configuration object
         * @param engine defines the engine to use (can be null)
         * @returns default values of this configuration object
         */
        static GetDefaults(engine?: AbstractEngine): WebXRManagedOutputCanvasOptions;
    }
    /**
     * Creates a canvas that is added/removed from the webpage when entering/exiting XR
     */
    export class WebXRManagedOutputCanvas implements WebXRRenderTarget {
        private _options;
        private _canvas;
        private _engine;
        private _originalCanvasSize;
        /**
         * Rendering context of the canvas which can be used to display/mirror xr content
         */
        canvasContext: WebGL2RenderingContext;
        /**
         * xr layer for the canvas
         */
        xrLayer: Nullable<XRWebGLLayer>;
        private _xrLayerWrapper;
        /**
         * Observers registered here will be triggered when the xr layer was initialized
         */
        onXRLayerInitObservable: Observable<XRWebGLLayer>;
        private _canvasCompatiblePromise;
        /**
         * Initializes the canvas to be added/removed upon entering/exiting xr
         * @param _xrSessionManager The XR Session manager
         * @param _options optional configuration for this canvas output. defaults will be used if not provided
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options?: WebXRManagedOutputCanvasOptions);
        /**
         * Disposes of the object
         */
        dispose(): void;
        private _makeCanvasCompatible;
        /**
         * Initializes a XRWebGLLayer to be used as the session's baseLayer.
         * @param xrSession xr session
         * @returns a promise that will resolve once the XR Layer has been created
         */
        initializeXRLayerAsync(xrSession: XRSession): Promise<XRWebGLLayer>;
        private _addCanvas;
        private _removeCanvas;
        private _setCanvasSize;
        private _setManagedOutputCanvas;
    }


    /** Covers all supported subclasses of WebXR's XRCompositionLayer */
    export type WebXRCompositionLayerType = "XRProjectionLayer";
    export type WebXRQuadLayerType = "XRQuadLayer";
    /** Covers all supported subclasses of WebXR's XRLayer */
    export type WebXRLayerType = "XRWebGLLayer" | WebXRCompositionLayerType | WebXRQuadLayerType;
    /**
     * Wrapper over subclasses of XRLayer.
     * @internal
     */
    export class WebXRLayerWrapper {
        /** The width of the layer's framebuffer. */
        getWidth: () => number;
        /** The height of the layer's framebuffer. */
        getHeight: () => number;
        /** The XR layer that this WebXRLayerWrapper wraps. */
        readonly layer: XRLayer;
        /** The type of XR layer that is being wrapped. */
        readonly layerType: WebXRLayerType;
        /** Create a render target provider for the wrapped layer. */
        private _createRenderTargetTextureProvider;
        private _rttWrapper;
        /**
         * Check if fixed foveation is supported on this device
         */
        get isFixedFoveationSupported(): boolean;
        /**
         * Get the fixed foveation currently set, as specified by the webxr specs
         * If this returns null, then fixed foveation is not supported
         */
        get fixedFoveation(): Nullable<number>;
        /**
         * Set the fixed foveation to the specified value, as specified by the webxr specs
         * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation
         */
        set fixedFoveation(value: Nullable<number>);
        /**
         * Create a render target provider for the wrapped layer.
         * @param xrSessionManager The XR Session Manager
         * @returns A new render target texture provider for the wrapped layer.
         */
        createRenderTargetTextureProvider(xrSessionManager: WebXRSessionManager): WebXRLayerRenderTargetTextureProvider;
        dispose(): void;
        protected constructor(
        /** The width of the layer's framebuffer. */
        getWidth: () => number, 
        /** The height of the layer's framebuffer. */
        getHeight: () => number, 
        /** The XR layer that this WebXRLayerWrapper wraps. */
        layer: XRLayer, 
        /** The type of XR layer that is being wrapped. */
        layerType: WebXRLayerType, 
        /** Create a render target provider for the wrapped layer. */
        _createRenderTargetTextureProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider);
    }


    /**
     * Configuration options for the WebXR controller creation
     */
    export interface IWebXRControllerOptions {
        /**
         * Should the controller mesh be animated when a user interacts with it
         * The pressed buttons / thumbstick and touchpad animations will be disabled
         */
        disableMotionControllerAnimation?: boolean;
        /**
         * Do not load the controller mesh, in case a different mesh needs to be loaded.
         */
        doNotLoadControllerMesh?: boolean;
        /**
         * Force a specific controller type for this controller.
         * This can be used when creating your own profile or when testing different controllers
         */
        forceControllerProfile?: string;
        /**
         * Defines a rendering group ID for meshes that will be loaded.
         * This is for the default controllers only.
         */
        renderingGroupId?: number;
    }
    /**
     * Represents an XR controller
     */
    export class WebXRInputSource {
        private _scene;
        /** The underlying input source for the controller  */
        inputSource: XRInputSource;
        private _options;
        private _tmpVector;
        private _uniqueId;
        private _disposed;
        /**
         * Represents the part of the controller that is held. This may not exist if the controller is the head mounted display itself, if that's the case only the pointer from the head will be available
         */
        grip?: AbstractMesh;
        /**
         * If available, this is the gamepad object related to this controller.
         * Using this object it is possible to get click events and trackpad changes of the
         * webxr controller that is currently being used.
         */
        motionController?: WebXRAbstractMotionController;
        /**
         * Event that fires when the controller is removed/disposed.
         * The object provided as event data is this controller, after associated assets were disposed.
         * uniqueId is still available.
         */
        onDisposeObservable: Observable<WebXRInputSource>;
        /**
         * Will be triggered when the mesh associated with the motion controller is done loading.
         * It is also possible that this will never trigger (!) if no mesh was loaded, or if the developer decides to load a different mesh
         * A shortened version of controller -> motion controller -> on mesh loaded.
         */
        onMeshLoadedObservable: Observable<AbstractMesh>;
        /**
         * Observers registered here will trigger when a motion controller profile was assigned to this xr controller
         */
        onMotionControllerInitObservable: Observable<WebXRAbstractMotionController>;
        /**
         * Pointer which can be used to select objects or attach a visible laser to
         */
        pointer: AbstractMesh;
        /**
         * The last XRPose the was calculated on the current XRFrame
         * @internal
         */
        _lastXRPose?: XRPose;
        /**
         * Creates the input source object
         * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRInputControllerSupport
         * @param _scene the scene which the controller should be associated to
         * @param inputSource the underlying input source for the controller
         * @param _options options for this controller creation
         */
        constructor(_scene: Scene, 
        /** The underlying input source for the controller  */
        inputSource: XRInputSource, _options?: IWebXRControllerOptions);
        /**
         * Get this controllers unique id
         */
        get uniqueId(): string;
        /**
         * Disposes of the object
         */
        dispose(): void;
        /**
         * Gets a world space ray coming from the pointer or grip
         * @param result the resulting ray
         * @param gripIfAvailable use the grip mesh instead of the pointer, if available
         */
        getWorldPointerRayToRef(result: Ray, gripIfAvailable?: boolean): void;
        /**
         * Updates the controller pose based on the given XRFrame
         * @param xrFrame xr frame to update the pose with
         * @param referenceSpace reference space to use
         * @param xrCamera the xr camera, used for parenting
         * @param xrSessionManager the session manager used to get the world reference system
         */
        updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera, xrSessionManager: WebXRSessionManager): void;
    }


    /**
     * The schema for initialization options of the XR Input class
     */
    export interface IWebXRInputOptions {
        /**
         * If set to true no model will be automatically loaded
         */
        doNotLoadControllerMeshes?: boolean;
        /**
         * If set, this profile will be used for all controllers loaded (for example "microsoft-mixed-reality")
         * If not found, the xr input profile data will be used.
         * Profiles are defined here - https://github.com/immersive-web/webxr-input-profiles/
         */
        forceInputProfile?: string;
        /**
         * Do not send a request to the controller repository to load the profile.
         *
         * Instead, use the controllers available in babylon itself.
         */
        disableOnlineControllerRepository?: boolean;
        /**
         * A custom URL for the controllers repository
         */
        customControllersRepositoryURL?: string;
        /**
         * Should the controller model's components not move according to the user input
         */
        disableControllerAnimation?: boolean;
        /**
         * Optional options to pass to the controller. Will be overridden by the Input options where applicable
         */
        controllerOptions?: IWebXRControllerOptions;
    }
    /**
     * XR input used to track XR inputs such as controllers/rays
     */
    export class WebXRInput implements IDisposable {
        /**
         * the xr session manager for this session
         */
        xrSessionManager: WebXRSessionManager;
        /**
         * the WebXR camera for this session. Mainly used for teleportation
         */
        xrCamera: WebXRCamera;
        private readonly _options;
        /**
         * XR controllers being tracked
         */
        controllers: Array<WebXRInputSource>;
        private _frameObserver;
        private _sessionEndedObserver;
        private _sessionInitObserver;
        private _currentXRSession;
        /**
         * Event when a controller has been connected/added
         */
        onControllerAddedObservable: Observable<WebXRInputSource>;
        /**
         * Event when a controller has been removed/disconnected
         */
        onControllerRemovedObservable: Observable<WebXRInputSource>;
        /**
         * Initializes the WebXRInput
         * @param xrSessionManager the xr session manager for this session
         * @param xrCamera the WebXR camera for this session. Mainly used for teleportation
         * @param _options = initialization options for this xr input
         */
        constructor(
        /**
         * the xr session manager for this session
         */
        xrSessionManager: WebXRSessionManager, 
        /**
         * the WebXR camera for this session. Mainly used for teleportation
         */
        xrCamera: WebXRCamera, _options?: IWebXRInputOptions);
        private _onInputSourcesChange;
        private _addAndRemoveControllers;
        /**
         * Disposes of the object
         */
        dispose(): void;
    }


    /**
     * Defining the interface required for a (webxr) feature
     */
    export interface IWebXRFeature extends IDisposable {
        /**
         * Is this feature attached
         */
        attached: boolean;
        /**
         * Should auto-attach be disabled?
         */
        disableAutoAttach: boolean;
        /**
         * Attach the feature to the session
         * Will usually be called by the features manager
         *
         * @param force should attachment be forced (even when already attached)
         * @returns true if successful.
         */
        attach(force?: boolean): boolean;
        /**
         * Detach the feature from the session
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * This function will be executed during before enabling the feature and can be used to not-allow enabling it.
         * Note that at this point the session has NOT started, so this is purely checking if the browser supports it
         *
         * @returns whether or not the feature is compatible in this environment
         */
        isCompatible(): boolean;
        /**
         * Was this feature disposed;
         */
        isDisposed: boolean;
        /**
         * The name of the native xr feature name, if applicable (like anchor, hit-test, or hand-tracking)
         */
        xrNativeFeatureName?: string;
        /**
         * A list of (Babylon WebXR) features this feature depends on
         */
        dependsOn?: string[];
        /**
         * If this feature requires to extend the XRSessionInit object, this function will return the partial XR session init object
         */
        getXRSessionInitExtension?: () => Promise<Partial<XRSessionInit>>;
        /**
         * Triggered when the feature is attached
         */
        onFeatureAttachObservable: Observable<IWebXRFeature>;
        /**
         * Triggered when the feature is detached
         */
        onFeatureDetachObservable: Observable<IWebXRFeature>;
    }
    /**
     * A list of the currently available features without referencing them
     */
    export class WebXRFeatureName {
        /**
         * The name of the anchor system feature
         */
        static readonly ANCHOR_SYSTEM: "xr-anchor-system";
        /**
         * The name of the background remover feature
         */
        static readonly BACKGROUND_REMOVER: "xr-background-remover";
        /**
         * The name of the hit test feature
         */
        static readonly HIT_TEST: "xr-hit-test";
        /**
         * The name of the mesh detection feature
         */
        static readonly MESH_DETECTION: "xr-mesh-detection";
        /**
         * physics impostors for xr controllers feature
         */
        static readonly PHYSICS_CONTROLLERS: "xr-physics-controller";
        /**
         * The name of the plane detection feature
         */
        static readonly PLANE_DETECTION: "xr-plane-detection";
        /**
         * The name of the pointer selection feature
         */
        static readonly POINTER_SELECTION: "xr-controller-pointer-selection";
        /**
         * The name of the teleportation feature
         */
        static readonly TELEPORTATION: "xr-controller-teleportation";
        /**
         * The name of the feature points feature.
         */
        static readonly FEATURE_POINTS: "xr-feature-points";
        /**
         * The name of the hand tracking feature.
         */
        static readonly HAND_TRACKING: "xr-hand-tracking";
        /**
         * The name of the image tracking feature
         */
        static readonly IMAGE_TRACKING: "xr-image-tracking";
        /**
         * The name of the near interaction feature
         */
        static readonly NEAR_INTERACTION: "xr-near-interaction";
        /**
         * The name of the DOM overlay feature
         */
        static readonly DOM_OVERLAY: "xr-dom-overlay";
        /**
         * The name of the movement feature
         */
        static readonly MOVEMENT: "xr-controller-movement";
        /**
         * The name of the light estimation feature
         */
        static readonly LIGHT_ESTIMATION: "xr-light-estimation";
        /**
         * The name of the eye tracking feature
         */
        static readonly EYE_TRACKING: "xr-eye-tracking";
        /**
         * The name of the walking locomotion feature
         */
        static readonly WALKING_LOCOMOTION: "xr-walking-locomotion";
        /**
         * The name of the composition layers feature
         */
        static readonly LAYERS: "xr-layers";
        /**
         * The name of the depth sensing feature
         */
        static readonly DEPTH_SENSING: "xr-depth-sensing";
        /**
         * The name of the WebXR Space Warp feature
         */
        static readonly SPACE_WARP: "xr-space-warp";
        /**
         * The name of the WebXR Raw Camera Access feature
         */
        static readonly RAW_CAMERA_ACCESS: "xr-raw-camera-access";
        /**
         * The name of the body tracking feature
         */
        static readonly BODY_TRACKING: "xr-body-tracking";
    }
    export type WebXRFeatureNameType = (typeof WebXRFeatureName)[Exclude<keyof typeof WebXRFeatureName, "prototype">];
    /**
     * Maps feature names to their corresponding feature implementation classes.
     */
    export interface IWebXRFeatureNameTypeMap {
        /** Anchor system feature implementation. */
        [WebXRFeatureName.ANCHOR_SYSTEM]: WebXRAnchorSystem;
        /** Background remover feature implementation. */
        [WebXRFeatureName.BACKGROUND_REMOVER]: WebXRBackgroundRemover;
        /** Depth sensing feature implementation. */
        [WebXRFeatureName.DEPTH_SENSING]: WebXRDepthSensing;
        /** DOM overlay feature implementation. */
        [WebXRFeatureName.DOM_OVERLAY]: WebXRDomOverlay;
        /** Eye tracking feature implementation. */
        [WebXRFeatureName.EYE_TRACKING]: WebXREyeTracking;
        /** Feature points feature implementation. */
        [WebXRFeatureName.FEATURE_POINTS]: WebXRFeaturePointSystem;
        /** Hand tracking feature implementation. */
        [WebXRFeatureName.HAND_TRACKING]: WebXRHandTracking;
        /** Hit test feature implementation. */
        [WebXRFeatureName.HIT_TEST]: WebXRHitTest;
        /** Image tracking feature implementation. */
        [WebXRFeatureName.IMAGE_TRACKING]: WebXRImageTracking;
        /** Layers feature implementation. */
        [WebXRFeatureName.LAYERS]: WebXRLayers;
        /** Light estimation feature implementation. */
        [WebXRFeatureName.LIGHT_ESTIMATION]: WebXRLightEstimation;
        /** Mesh detection feature implementation. */
        [WebXRFeatureName.MESH_DETECTION]: WebXRMeshDetector;
        /** Controller movement feature implementation. */
        [WebXRFeatureName.MOVEMENT]: WebXRControllerMovement;
        /** Near interaction feature implementation. */
        [WebXRFeatureName.NEAR_INTERACTION]: WebXRNearInteraction;
        /** Physics controllers feature implementation. */
        [WebXRFeatureName.PHYSICS_CONTROLLERS]: WebXRControllerPhysics;
        /** Plane detection feature implementation. */
        [WebXRFeatureName.PLANE_DETECTION]: WebXRPlaneDetector;
        /** Controller pointer selection feature implementation. */
        [WebXRFeatureName.POINTER_SELECTION]: WebXRControllerPointerSelection;
        /** Raw camera access feature implementation. */
        [WebXRFeatureName.RAW_CAMERA_ACCESS]: WebXRRawCameraAccess;
        /** Space warp feature implementation. */
        [WebXRFeatureName.SPACE_WARP]: WebXRSpaceWarp;
        /** Teleportation feature implementation. */
        [WebXRFeatureName.TELEPORTATION]: WebXRMotionControllerTeleportation;
        /** Walking locomotion feature implementation. */
        [WebXRFeatureName.WALKING_LOCOMOTION]: WebXRWalkingLocomotion;
        /** Body tracking feature implementation. */
        [WebXRFeatureName.BODY_TRACKING]: WebXRBodyTracking;
    }
    /**
     * Maps feature names to their corresponding options interfaces.
     */
    export interface IWebXRFeatureNameOptionsMap {
        /** Anchor system feature options. */
        [WebXRFeatureName.ANCHOR_SYSTEM]: IWebXRAnchorSystemOptions;
        /** Background remover feature options. */
        [WebXRFeatureName.BACKGROUND_REMOVER]: IWebXRBackgroundRemoverOptions;
        /** Depth sensing feature options. */
        [WebXRFeatureName.DEPTH_SENSING]: IWebXRDepthSensingOptions;
        /** DOM overlay feature options. */
        [WebXRFeatureName.DOM_OVERLAY]: IWebXRDomOverlayOptions;
        /** Eye tracking feature options. */
        [WebXRFeatureName.EYE_TRACKING]: undefined;
        /** Feature points feature options. */
        [WebXRFeatureName.FEATURE_POINTS]: undefined;
        /** Hand tracking feature options. */
        [WebXRFeatureName.HAND_TRACKING]: IWebXRHandTrackingOptions;
        /** Hit test feature options. */
        [WebXRFeatureName.HIT_TEST]: IWebXRHitTestOptions;
        /** Image tracking feature options. */
        [WebXRFeatureName.IMAGE_TRACKING]: IWebXRImageTrackingOptions;
        /** Layers feature options. */
        [WebXRFeatureName.LAYERS]: IWebXRLayersOptions;
        /** Light estimation feature options. */
        [WebXRFeatureName.LIGHT_ESTIMATION]: IWebXRLightEstimationOptions;
        /** Mesh detection feature options. */
        [WebXRFeatureName.MESH_DETECTION]: IWebXRMeshDetectorOptions;
        /** Controller movement feature options. */
        [WebXRFeatureName.MOVEMENT]: IWebXRControllerMovementOptions;
        /** Near interaction feature options. */
        [WebXRFeatureName.NEAR_INTERACTION]: IWebXRNearInteractionOptions;
        /** Physics controllers feature options. */
        [WebXRFeatureName.PHYSICS_CONTROLLERS]: IWebXRControllerPhysicsOptions;
        /** Plane detection feature options. */
        [WebXRFeatureName.PLANE_DETECTION]: IWebXRPlaneDetectorOptions;
        /** Controller pointer selection feature options. */
        [WebXRFeatureName.POINTER_SELECTION]: IWebXRControllerPointerSelectionOptions;
        /** Raw camera access feature options. */
        [WebXRFeatureName.RAW_CAMERA_ACCESS]: IWebXRRawCameraAccessOptions;
        /** Space warp feature options. */
        [WebXRFeatureName.SPACE_WARP]: undefined;
        /** Teleportation feature options. */
        [WebXRFeatureName.TELEPORTATION]: IWebXRTeleportationOptions;
        /** Walking locomotion feature options. */
        [WebXRFeatureName.WALKING_LOCOMOTION]: IWebXRWalkingLocomotionOptions;
        /** Body tracking feature options. */
        [WebXRFeatureName.BODY_TRACKING]: IWebXRBodyTrackingOptions;
    }
    /**
     * Helper type that expands/flattens a type to show its properties inline in IntelliSense
     */
    type Expand<T> = T extends infer O ? {
        [K in keyof O]: O[K];
    } : never;
    /**
     * Helper type to resolve the specific feature type based on the feature name,
     * or fallback to IWebXRFeature if the feature name is not in the type map.
     */
    export type ResolveWebXRFeature<T extends WebXRFeatureNameType> = T extends keyof IWebXRFeatureNameTypeMap ? IWebXRFeatureNameTypeMap[T] : IWebXRFeature;
    /**
     * Helper type to resolve the options type for a specific feature based on the feature name,
     * or fallback to any if the feature name is not in the type map.
     * The Expand utility type flattens the interface to show properties inline in IntelliSense.
     */
    export type ResolveWebXRFeatureOptions<T extends WebXRFeatureNameType> = T extends keyof IWebXRFeatureNameOptionsMap ? IWebXRFeatureNameOptionsMap[T] extends undefined ? undefined : Expand<IWebXRFeatureNameOptionsMap[T]> : any;
    /**
     * Defining the constructor of a feature. Used to register the modules.
     */
    export type WebXRFeatureConstructor = (xrSessionManager: WebXRSessionManager, options?: any) => () => IWebXRFeature;
    /**
     * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.
     * It is mainly used in AR sessions.
     *
     * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).
     */
    export class WebXRFeaturesManager implements IDisposable {
        private _xrSessionManager;
        private static readonly _AvailableFeatures;
        private _features;
        /**
         * The key is the feature to check and the value is the feature that conflicts.
         */
        private static readonly _ConflictingFeatures;
        /**
         * constructs a new features manages.
         *
         * @param _xrSessionManager an instance of WebXRSessionManager
         */
        constructor(_xrSessionManager: WebXRSessionManager);
        /**
         * Used to register a module. After calling this function a developer can use this feature in the scene.
         * Mainly used internally.
         *
         * @param featureName the name of the feature to register
         * @param constructorFunction the function used to construct the module
         * @param version the (babylon) version of the module
         * @param stable is that a stable version of this module
         */
        static AddWebXRFeature(featureName: string, constructorFunction: WebXRFeatureConstructor, version?: number, stable?: boolean): void;
        /**
         * Returns a constructor of a specific feature.
         *
         * @param featureName the name of the feature to construct
         * @param version the version of the feature to load
         * @param xrSessionManager the xrSessionManager. Used to construct the module
         * @param options optional options provided to the module.
         * @returns a function that, when called, will return a new instance of this feature
         */
        static ConstructFeature(featureName: string, version: number | undefined, xrSessionManager: WebXRSessionManager, options?: any): () => IWebXRFeature;
        /**
         * Can be used to return the list of features currently registered
         *
         * @returns an Array of available features
         */
        static GetAvailableFeatures(): string[];
        /**
         * Gets the versions available for a specific feature
         * @param featureName the name of the feature
         * @returns an array with the available versions
         */
        static GetAvailableVersions(featureName: string): string[];
        /**
         * Return the latest unstable version of this feature
         * @param featureName the name of the feature to search
         * @returns the version number. if not found will return -1
         */
        static GetLatestVersionOfFeature(featureName: string): number;
        /**
         * Return the latest stable version of this feature
         * @param featureName the name of the feature to search
         * @returns the version number. if not found will return -1
         */
        static GetStableVersionOfFeature(featureName: string): number;
        /**
         * Attach a feature to the current session. Mainly used when session started to start the feature effect.
         * Can be used during a session to start a feature
         * @param featureName the name of feature to attach
         */
        attachFeature(featureName: string): void;
        /**
         * Can be used inside a session or when the session ends to detach a specific feature
         * @param featureName the name of the feature to detach
         */
        detachFeature(featureName: string): void;
        /**
         * Used to disable an already-enabled feature
         * The feature will be disposed and will be recreated once enabled.
         * @param featureName the feature to disable
         * @returns true if disable was successful
         */
        disableFeature(featureName: string | {
            Name: string;
        }): boolean;
        /**
         * dispose this features manager
         */
        dispose(): void;
        /**
         * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.
         * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.
         *
         * @param featureName the name of the feature to load or the class of the feature
         * @param version optional version to load. if not provided the latest version will be enabled
         * @param moduleOptions options provided to the module. Ses the module documentation / constructor
         * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible
         * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.
         * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.
         */
        enableFeature<T extends WebXRFeatureNameType>(featureName: T | {
            Name: T;
        }, version?: number | string, moduleOptions?: ResolveWebXRFeatureOptions<T>, attachIfPossible?: boolean, required?: boolean): ResolveWebXRFeature<T>;
        /**
         * get the implementation of an enabled feature.
         * @param featureName the name of the feature to load
         * @returns the feature class, if found
         */
        getEnabledFeature<T extends WebXRFeatureNameType>(featureName: T): ResolveWebXRFeature<T>;
        /**
         * Get the list of enabled features
         * @returns an array of enabled features
         */
        getEnabledFeatures(): string[];
        /**
         * This function will extend the session creation configuration object with enabled features.
         * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,
         * according to the defined "required" variable, provided during enableFeature call
         * @param xrSessionInit the xr Session init object to extend
         *
         * @returns an extended XRSessionInit object
         */
        _extendXRSessionInitObject(xrSessionInit: XRSessionInit): Promise<XRSessionInit>;
    }


    /**
     * Options for setting up XR spectator camera.
     */
    export interface WebXRSpectatorModeOption {
        /**
         * Expected refresh rate (frames per sec) for a spectator camera.
         */
        fps?: number;
        /**
         * The index of rigCameras array in a WebXR camera.
         */
        preferredCameraIndex?: number;
    }
    /**
     * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)
     * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRExperienceHelpers
     */
    export class WebXRExperienceHelper implements IDisposable {
        private _scene;
        private _nonVRCamera;
        private _attachedToElement;
        private _spectatorCamera;
        private _originalSceneAutoClear;
        private _supported;
        private _spectatorMode;
        private _lastTimestamp;
        private _spectatorStateChangedObserver;
        private _spectatorXRFrameObserver;
        private _spectatorAfterRenderObserver;
        /**
         * Camera used to render xr content
         */
        camera: WebXRCamera;
        /** A features manager for this xr session */
        featuresManager: WebXRFeaturesManager;
        /**
         * Observers registered here will be triggered after the camera's initial transformation is set
         * This can be used to set a different ground level or an extra rotation.
         *
         * Note that ground level is considered to be at 0. The height defined by the XR camera will be added
         * to the position set after this observable is done executing.
         */
        onInitialXRPoseSetObservable: Observable<WebXRCamera>;
        /**
         * Fires when the state of the experience helper has changed
         */
        onStateChangedObservable: Observable<WebXRState>;
        /** Session manager used to keep track of xr session */
        sessionManager: WebXRSessionManager;
        /**
         * The current state of the XR experience (eg. transitioning, in XR or not in XR)
         */
        state: WebXRState;
        /**
         * Creates a WebXRExperienceHelper
         * @param _scene The scene the helper should be created in
         */
        private constructor();
        /**
         * Creates the experience helper
         * @param scene the scene to attach the experience helper to
         * @returns a promise for the experience helper
         */
        static CreateAsync(scene: Scene): Promise<WebXRExperienceHelper>;
        /**
         * Disposes of the experience helper
         */
        dispose(): void;
        /**
         * Enters XR mode (This must be done within a user interaction in most browsers eg. button click)
         * @param sessionMode options for the XR session
         * @param referenceSpaceType frame of reference of the XR session
         * @param renderTarget the output canvas that will be used to enter XR mode
         * @param sessionCreationOptions optional XRSessionInit object to init the session with
         * @returns promise that resolves after xr mode has entered
         */
        enterXRAsync(sessionMode: XRSessionMode, referenceSpaceType: XRReferenceSpaceType, renderTarget?: WebXRRenderTarget, sessionCreationOptions?: XRSessionInit): Promise<WebXRSessionManager>;
        /**
         * Exits XR mode and returns the scene to its original state
         * @returns promise that resolves after xr mode has exited
         */
        exitXRAsync(): Promise<void>;
        /**
         * Enable spectator mode for desktop VR experiences.
         * When spectator mode is enabled a camera will be attached to the desktop canvas and will
         * display the first rig camera's view on the desktop canvas.
         * Please note that this will degrade performance, as it requires another camera render.
         * It is also not recommended to enable this in devices like the quest, as it brings no benefit there.
         * @param options giving WebXRSpectatorModeOption for specutator camera to setup when the spectator mode is enabled.
         */
        enableSpectatorMode(options?: WebXRSpectatorModeOption): void;
        /**
         * Disable spectator mode for desktop VR experiences.
         */
        disableSpecatatorMode(): void;
        private _clearSpectatorObservers;
        private _switchSpectatorMode;
        private _nonXRToXRCamera;
        private _setState;
    }


    /**
     * Button which can be used to enter a different mode of XR
     */
    export class WebXREnterExitUIButton {
        /** button element */
        element: HTMLElement;
        /** XR initialization options for the button */
        sessionMode: XRSessionMode;
        /** Reference space type */
        referenceSpaceType: XRReferenceSpaceType;
        /**
         * Creates a WebXREnterExitUIButton
         * @param element button element
         * @param sessionMode XR initialization session mode
         * @param referenceSpaceType the type of reference space to be used
         */
        constructor(
        /** button element */
        element: HTMLElement, 
        /** XR initialization options for the button */
        sessionMode: XRSessionMode, 
        /** Reference space type */
        referenceSpaceType: XRReferenceSpaceType);
        /**
         * Extendable function which can be used to update the button's visuals when the state changes
         * @param activeButton the current active button in the UI
         */
        update(activeButton: Nullable<WebXREnterExitUIButton>): void;
    }
    /**
     * Options to create the webXR UI
     */
    export class WebXREnterExitUIOptions {
        /**
         * User provided buttons to enable/disable WebXR. The system will provide default if not set
         */
        customButtons?: Array<WebXREnterExitUIButton>;
        /**
         * A reference space type to use when creating the default button.
         * Default is local-floor
         */
        referenceSpaceType?: XRReferenceSpaceType;
        /**
         * Context to enter xr with
         */
        renderTarget?: Nullable<WebXRRenderTarget>;
        /**
         * A session mode to use when creating the default button.
         * Default is immersive-vr
         */
        sessionMode?: XRSessionMode;
        /**
         * A list of optional features to init the session with
         */
        optionalFeatures?: string[];
        /**
         * A list of optional features to init the session with
         */
        requiredFeatures?: string[];
        /**
         * If set, the `sessiongranted` event will not be registered. `sessiongranted` is used to move seamlessly between WebXR experiences.
         * If set to true the user will be forced to press the "enter XR" button even if sessiongranted event was triggered.
         * If not set and a sessiongranted event was triggered, the XR session will start automatically.
         */
        ignoreSessionGrantedEvent?: boolean;
        /**
         * If defined, this function will be executed if the UI encounters an error when entering XR
         */
        onError?: (error: any) => void;
    }
    /**
     * UI to allow the user to enter/exit XR mode
     */
    export class WebXREnterExitUI implements IDisposable {
        private _scene;
        /** version of the options passed to this UI */
        options: WebXREnterExitUIOptions;
        private _activeButton;
        private _buttons;
        private _helper;
        private _renderTarget?;
        /**
         * The HTML Div Element to which buttons are added.
         */
        readonly overlay: HTMLDivElement;
        /**
         * Fired every time the active button is changed.
         *
         * When xr is entered via a button that launches xr that button will be the callback parameter
         *
         * When exiting xr the callback parameter will be null)
         */
        activeButtonChangedObservable: Observable<Nullable<WebXREnterExitUIButton>>;
        /**
         * Construct a new EnterExit UI class
         *
         * @param _scene babylon scene object to use
         * @param options (read-only) version of the options passed to this UI
         */
        constructor(_scene: Scene, 
        /** version of the options passed to this UI */
        options: WebXREnterExitUIOptions);
        /**
         * Set the helper to be used with this UI component.
         * The UI is bound to an experience helper. If not provided the UI can still be used but the events should be registered by the developer.
         *
         * @param helper the experience helper to attach
         * @param renderTarget an optional render target (in case it is created outside of the helper scope)
         * @returns a promise that resolves when the ui is ready
         */
        setHelperAsync(helper: WebXRExperienceHelper, renderTarget?: WebXRRenderTarget): Promise<void>;
        /**
         * Creates UI to allow the user to enter/exit XR mode
         * @param scene the scene to add the ui to
         * @param helper the xr experience helper to enter/exit xr with
         * @param options options to configure the UI
         * @returns the created ui
         */
        static CreateAsync(scene: Scene, helper: WebXRExperienceHelper, options: WebXREnterExitUIOptions): Promise<WebXREnterExitUI>;
        private _enterXRWithButtonIndexAsync;
        /**
         * Disposes of the XR UI component
         */
        dispose(): void;
        private _onSessionGranted;
        private _updateButtons;
    }


    /**
     * Options for the default xr helper
     */
    export class WebXRDefaultExperienceOptions {
        /**
         * Enable or disable default UI to enter XR
         */
        disableDefaultUI?: boolean;
        /**
         * Should pointer selection not initialize.
         * Note that disabling pointer selection also disables teleportation.
         * Defaults to false.
         */
        disablePointerSelection?: boolean;
        /**
         * Should teleportation not initialize. Defaults to false.
         */
        disableTeleportation?: boolean;
        /**
         * Should nearInteraction not initialize. Defaults to false.
         */
        disableNearInteraction?: boolean;
        /**
         * Should hand tracking be disabled. Defaults to false.
         */
        disableHandTracking?: boolean;
        /**
         * Floor meshes that will be used for teleport
         */
        floorMeshes?: Array<AbstractMesh>;
        /**
         * If set to true, the first frame will not be used to reset position
         * The first frame is mainly used when copying transformation from the old camera
         * Mainly used in AR
         */
        ignoreNativeCameraTransformation?: boolean;
        /**
         * Optional configuration for the XR input object
         */
        inputOptions?: Partial<IWebXRInputOptions>;
        /**
         * optional configuration for pointer selection
         */
        pointerSelectionOptions?: Partial<IWebXRControllerPointerSelectionOptions>;
        /**
         * optional configuration for near interaction
         */
        nearInteractionOptions?: Partial<IWebXRNearInteractionOptions>;
        /**
         * optional configuration for hand tracking
         */
        handSupportOptions?: Partial<IWebXRHandTrackingOptions>;
        /**
         * optional configuration for teleportation
         */
        teleportationOptions?: Partial<IWebXRTeleportationOptions>;
        /**
         * optional configuration for the output canvas
         */
        outputCanvasOptions?: WebXRManagedOutputCanvasOptions;
        /**
         * optional UI options. This can be used among other to change session mode and reference space type
         */
        uiOptions?: Partial<WebXREnterExitUIOptions>;
        /**
         * When loading teleportation and pointer select, use stable versions instead of latest.
         */
        useStablePlugins?: boolean;
        /**
         * An optional rendering group id that will be set globally for teleportation, pointer selection and default controller meshes
         */
        renderingGroupId?: number;
        /**
         * A list of optional features to init the session with
         * If set to true, all features we support will be added
         */
        optionalFeatures?: boolean | string[];
    }
    /**
     * Default experience for webxr
     */
    export class WebXRDefaultExperience {
        /**
         * Base experience
         */
        baseExperience: WebXRExperienceHelper;
        /**
         * Enables ui for entering/exiting xr
         */
        enterExitUI: WebXREnterExitUI;
        /**
         * Input experience extension
         */
        input: WebXRInput;
        /**
         * Enables laser pointer and selection
         */
        pointerSelection: WebXRControllerPointerSelection;
        /**
         * Default target xr should render to
         */
        renderTarget: WebXRRenderTarget;
        /**
         * Enables teleportation
         */
        teleportation: WebXRMotionControllerTeleportation;
        /**
         * Enables near interaction for hands/controllers
         */
        nearInteraction: WebXRNearInteraction;
        private constructor();
        /**
         * Creates the default xr experience
         * @param scene scene
         * @param options options for basic configuration
         * @returns resulting WebXRDefaultExperience
         */
        static CreateAsync(scene: Scene, options?: WebXRDefaultExperienceOptions): Promise<WebXRDefaultExperience>;
        /**
         * Disposes of the experience helper
         */
        dispose(): void;
    }


    /**
     * WebXR Camera which holds the views for the xrSession
     * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRCamera
     */
    export class WebXRCamera extends FreeCamera {
        private _xrSessionManager;
        private static _ScaleReadOnly;
        private _firstFrame;
        private _referenceQuaternion;
        private _referencedPosition;
        private _trackingState;
        private _onWorldScaleFactorChanged;
        /**
         * This will be triggered after the first XR Frame initialized the camera,
         * including the right number of views and their rendering parameters
         */
        onXRCameraInitializedObservable: Observable<WebXRCamera>;
        /**
         * Observable raised before camera teleportation
         * @deprecated use onBeforeCameraTeleport of the teleportation feature instead
         */
        onBeforeCameraTeleport: Observable<Vector3>;
        /**
         *  Observable raised after camera teleportation
         * @deprecated use onAfterCameraTeleport of the teleportation feature instead
         */
        onAfterCameraTeleport: Observable<Vector3>;
        /**
         * Notifies when the camera's tracking state has changed.
         * Notice - will also be triggered when tracking has started (at the beginning of the session)
         */
        onTrackingStateChanged: Observable<WebXRTrackingState>;
        /**
         * Should position compensation execute on first frame.
         * This is used when copying the position from a native (non XR) camera
         */
        compensateOnFirstFrame: boolean;
        /**
         * The last XRViewerPose from the current XRFrame
         * @internal
         */
        _lastXRViewerPose?: XRViewerPose;
        /**
         * webXRCamera relies on rotationQuaternion and doesn't use camera rotation property
         */
        rotationQuaternion: Quaternion;
        /**
         * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager
         * @param name the name of the camera
         * @param scene the scene to add the camera to
         * @param _xrSessionManager a constructed xr session manager
         */
        constructor(name: string, scene: Scene, _xrSessionManager: WebXRSessionManager);
        /**
         * Get the current XR tracking state of the camera
         */
        get trackingState(): WebXRTrackingState;
        private _setTrackingState;
        /**
         * Return the user's height, unrelated to the current ground.
         * This will be the y position of this camera, when ground level is 0.
         *
         * Note - this value is multiplied by the worldScalingFactor (if set), so it will be in the same units as the scene.
         */
        get realWorldHeight(): number;
        /** @internal */
        _updateForDualEyeDebugging(): void;
        /**
         * Sets this camera's transformation based on a non-vr camera
         * @param otherCamera the non-vr camera to copy the transformation from
         * @param resetToBaseReferenceSpace should XR reset to the base reference space
         */
        setTransformationFromNonVRCamera(otherCamera?: Camera, resetToBaseReferenceSpace?: boolean): void;
        /**
         * Gets the current instance class name ("WebXRCamera").
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Set the target for the camera to look at.
         * Note that this only rotates around the Y axis, as opposed to the default behavior of other cameras
         * @param target the target to set the camera to look at
         */
        setTarget(target: Vector3): void;
        dispose(): void;
        private _updateDepthNearFar;
        private _updateFromXRSession;
        private _updateNumberOfRigCameras;
        private _updateReferenceSpace;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Wraps XRWebGLLayer's created by Babylon Native.
     * @internal
     */
    export class NativeXRLayerWrapper extends WebXRLayerWrapper {
        readonly layer: XRWebGLLayer;
        constructor(layer: XRWebGLLayer);
    }
    /**
     * Provides render target textures for layers created by Babylon Native.
     * @internal
     */
    export class NativeXRLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
        readonly layerWrapper: NativeXRLayerWrapper;
        private _nativeRTTProvider;
        private _nativeLayer;
        constructor(sessionManager: WebXRSessionManager, layerWrapper: NativeXRLayerWrapper);
        trySetViewportForView(viewport: Viewport): boolean;
        getRenderTargetTextureForEye(eye: XREye): Nullable<RenderTargetTexture>;
        getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
        getFramebufferDimensions(): Nullable<{
            framebufferWidth: number;
            framebufferHeight: number;
        }>;
    }
    /**
     * Creates the xr layer that will be used as the xr session's base layer.
     * @internal
     */
    export class NativeXRRenderTarget implements WebXRRenderTarget {
        canvasContext: WebGLRenderingContext;
        xrLayer: Nullable<XRWebGLLayer>;
        private _nativeRenderTarget;
        constructor(_xrSessionManager: WebXRSessionManager);
        initializeXRLayerAsync(xrSession: XRSession): Promise<XRWebGLLayer>;
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /** @internal */
    interface INativeXRFrame extends XRFrame {
        getPoseData: (space: XRSpace, baseSpace: XRReferenceSpace, vectorBuffer: ArrayBufferLike, matrixBuffer: ArrayBufferLike) => XRPose;
        _imageTrackingResults?: XRImageTrackingResult[];
    }
    /** @internal */
    export class NativeXRFrame implements XRFrame {
        private _nativeImpl;
        private readonly _xrTransform;
        private readonly _xrPose;
        private readonly _xrPoseVectorData;
        get session(): XRSession;
        constructor(_nativeImpl: INativeXRFrame);
        getPose(space: XRSpace, baseSpace: XRReferenceSpace): XRPose | undefined;
        readonly fillPoses: (spaces: XRSpace[], baseSpace: XRSpace, transforms: Float32Array) => boolean;
        readonly getViewerPose: (referenceSpace: XRReferenceSpace) => XRViewerPose | undefined;
        readonly getHitTestResults: (hitTestSource: XRHitTestSource) => XRHitTestResult[];
        readonly getHitTestResultsForTransientInput: () => never;
        get trackedAnchors(): XRAnchorSet | undefined;
        readonly createAnchor: (pose: XRRigidTransform, space: XRSpace) => Promise<XRAnchor>;
        get worldInformation(): XRWorldInformation | undefined;
        get detectedPlanes(): XRPlaneSet | undefined;
        readonly getJointPose: (joint: XRJointSpace, baseSpace: XRSpace) => XRJointPose;
        readonly fillJointRadii: (jointSpaces: XRJointSpace[], radii: Float32Array) => boolean;
        readonly getLightEstimate: () => never;
        get featurePointCloud(): number[] | undefined;
        readonly getImageTrackingResults: () => XRImageTrackingResult[];
        getDepthInformation(view: XRView): XRCPUDepthInformation | undefined;
    }
    /**
     * Register side effects for nativeXRFrame.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNativeXRFrame(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import nativeXRFrame.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * A profiled motion controller has its profile loaded from an online repository.
     * The class is responsible of loading the model, mapping the keys and enabling model-animations
     */
    export class WebXRProfiledMotionController extends WebXRAbstractMotionController {
        private _repositoryUrl;
        private controllerCache?;
        private _buttonMeshMapping;
        private _touchDots;
        /**
         * The profile ID of this controller. Will be populated when the controller initializes.
         */
        profileId: string;
        constructor(scene: Scene, xrInput: XRInputSource, _profile: IMotionControllerProfile, _repositoryUrl: string, controllerCache?: Array<{
            filename: string;
            path: string;
            meshes: AbstractMesh[];
        }> | undefined);
        dispose(): void;
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(_xrFrame: XRFrame): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The motion controller class for oculus touch (quest, rift).
     * This class supports legacy mapping as well the standard xr mapping
     */
    export class WebXROculusTouchMotionController extends WebXRAbstractMotionController {
        private _forceLegacyControllers;
        private _modelRootNode;
        /**
         * The base url used to load the left and right controller models
         */
        static MODEL_BASE_URL: string;
        /**
         * The name of the left controller model file
         */
        static MODEL_LEFT_FILENAME: string;
        /**
         * The name of the right controller model file
         */
        static MODEL_RIGHT_FILENAME: string;
        /**
         * Base Url for the Quest controller model.
         */
        static QUEST_MODEL_BASE_URL: string;
        profileId: string;
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness, _legacyMapping?: boolean, _forceLegacyControllers?: boolean);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
        /**
         * Is this the new type of oculus touch. At the moment both have the same profile and it is impossible to differentiate
         * between the touch and touch 2.
         * @returns true if this is the new type of oculus touch controllers.
         */
        private _isQuest;
    }
    /**
     * Register side effects for webXROculusTouchMotionController.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXROculusTouchMotionController(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXROculusTouchMotionController.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Oculus hand controller class that supports microgestures
     */
    export class WebXROculusHandController extends WebXRAbstractMotionController {
        profileId: string;
        /**
         * Create a new hand controller object, without loading a controller model
         * @param scene the scene to use to create this controller
         * @param gamepadObject the corresponding gamepad object
         * @param handedness the handedness of the controller
         */
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
    }
    /**
     * Register side effects for webXROculusHandController.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXROculusHandController(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXROculusHandController.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A construction function type to create a new controller based on an xrInput object
     */
    export type MotionControllerConstructor = (xrInput: XRInputSource, scene: Scene) => WebXRAbstractMotionController;
    /**
     * Motion controller manager is managing the different webxr profiles and makes sure the right
     * controller is being loaded.
     */
    export class WebXRMotionControllerManager {
        private static _AvailableControllers;
        private static _Fallbacks;
        private static _ProfileLoadingPromises;
        private static _ProfilesList;
        /**
         * The base URL of the online controller repository. Can be changed at any time.
         */
        static BaseRepositoryUrl: string;
        /**
         * Which repository gets priority - local or online
         */
        static PrioritizeOnlineRepository: boolean;
        /**
         * Use the online repository, or use only locally-defined controllers
         */
        static UseOnlineRepository: boolean;
        /**
         * Disable the controller cache and load the models each time a new WebXRProfileMotionController is loaded.
         * Defaults to true.
         */
        static DisableControllerCache: boolean;
        /**
         * Clear the cache used for profile loading and reload when requested again
         */
        static ClearProfilesCache(): void;
        /**
         * Register the default fallbacks.
         * This function is called automatically when this file is imported.
         */
        static DefaultFallbacks(): void;
        /**
         * Find a fallback profile if the profile was not found. There are a few predefined generic profiles.
         * @param profileId the profile to which a fallback needs to be found
         * @returns an array with corresponding fallback profiles
         */
        static FindFallbackWithProfileId(profileId: string): string[];
        /**
         * When acquiring a new xrInput object (usually by the WebXRInput class), match it with the correct profile.
         * The order of search:
         *
         * 1) Iterate the profiles array of the xr input and try finding a corresponding motion controller
         * 2) (If not found) search in the gamepad id and try using it (legacy versions only)
         * 3) search for registered fallbacks (should be redundant, nonetheless it makes sense to check)
         * 4) return the generic trigger controller if none were found
         *
         * @param xrInput the xrInput to which a new controller is initialized
         * @param scene the scene to which the model will be added
         * @param forceProfile force a certain profile for this controller
         * @returns A promise that fulfils with the motion controller class for this profile id or the generic standard class if none was found
         */
        static GetMotionControllerWithXRInput(xrInput: XRInputSource, scene: Scene, forceProfile?: string): Promise<WebXRAbstractMotionController>;
        /**
         * Register a new controller based on its profile. This function will be called by the controller classes themselves.
         *
         * If you are missing a profile, make sure it is imported in your source, otherwise it will not register.
         *
         * @param type the profile type to register
         * @param constructFunction the function to be called when loading this profile
         */
        static RegisterController(type: string, constructFunction: MotionControllerConstructor): void;
        /**
         * Register a fallback to a specific profile.
         * @param profileId the profileId that will receive the fallbacks
         * @param fallbacks A list of fallback profiles
         */
        static RegisterFallbacksForProfileId(profileId: string, fallbacks: string[]): void;
        /**
         * Will update the list of profiles available in the repository
         * @returns a promise that resolves to a map of profiles available online
         */
        static UpdateProfilesList(): Promise<{
            [profile: string]: string;
        }>;
        /**
         * Clear the controller's cache (usually happens at the end of a session)
         */
        static ClearControllerCache(): void;
        private static _LoadProfileFromRepositoryAsync;
        private static _LoadProfilesFromAvailableControllersAsync;
    }
    /**
     * Register side effects for webXRMotionControllerManager.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRMotionControllerManager(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXRMotionControllerManager.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The motion controller class for all microsoft mixed reality controllers
     */
    export class WebXRMicrosoftMixedRealityController extends WebXRAbstractMotionController {
        protected readonly _mapping: {
            defaultButton: {
                valueNodeName: string;
                unpressedNodeName: string;
                pressedNodeName: string;
            };
            defaultAxis: {
                valueNodeName: string;
                minNodeName: string;
                maxNodeName: string;
            };
            buttons: {
                "xr-standard-trigger": {
                    rootNodeName: string;
                    componentProperty: string;
                    states: string[];
                };
                "xr-standard-squeeze": {
                    rootNodeName: string;
                    componentProperty: string;
                    states: string[];
                };
                "xr-standard-touchpad": {
                    rootNodeName: string;
                    labelAnchorNodeName: string;
                    touchPointNodeName: string;
                };
                "xr-standard-thumbstick": {
                    rootNodeName: string;
                    componentProperty: string;
                    states: string[];
                };
            };
            axes: {
                "xr-standard-touchpad": {
                    "x-axis": {
                        rootNodeName: string;
                    };
                    "y-axis": {
                        rootNodeName: string;
                    };
                };
                "xr-standard-thumbstick": {
                    "x-axis": {
                        rootNodeName: string;
                    };
                    "y-axis": {
                        rootNodeName: string;
                    };
                };
            };
        };
        /**
         * The base url used to load the left and right controller models
         */
        static MODEL_BASE_URL: string;
        /**
         * The name of the left controller model file
         */
        static MODEL_LEFT_FILENAME: string;
        /**
         * The name of the right controller model file
         */
        static MODEL_RIGHT_FILENAME: string;
        profileId: string;
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
    }
    /**
     * Register side effects for webXRMicrosoftMixedRealityController.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRMicrosoftMixedRealityController(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXRMicrosoftMixedRealityController.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The motion controller class for the standard HTC-Vive controllers
     */
    export class WebXRHTCViveMotionController extends WebXRAbstractMotionController {
        private _modelRootNode;
        /**
         * The base url used to load the left and right controller models
         */
        static MODEL_BASE_URL: string;
        /**
         * File name for the controller model.
         */
        static MODEL_FILENAME: string;
        profileId: string;
        /**
         * Create a new Vive motion controller object
         * @param scene the scene to use to create this controller
         * @param gamepadObject the corresponding gamepad object
         * @param handedness the handedness of the controller
         */
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
    }
    /**
     * Register side effects for webXRHTCViveMotionController.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRHTCViveMotionController(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXRHTCViveMotionController.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * A generic trigger-only motion controller for WebXR
     */
    export class WebXRGenericTriggerMotionController extends WebXRAbstractMotionController {
        /**
         * Static version of the profile id of this controller
         */
        static ProfileId: string;
        profileId: string;
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * A generic hand controller class that supports select and a secondary grasp
     */
    export class WebXRGenericHandController extends WebXRAbstractMotionController {
        profileId: string;
        /**
         * Create a new hand controller object, without loading a controller model
         * @param scene the scene to use to create this controller
         * @param gamepadObject the corresponding gamepad object
         * @param handedness the handedness of the controller
         */
        constructor(scene: Scene, gamepadObject: IMinimalMotionControllerObject, handedness: MotionControllerHandedness);
        protected _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        protected _getModelLoadingConstraints(): boolean;
        protected _processLoadedModel(_meshes: AbstractMesh[]): void;
        protected _setRootMesh(meshes: AbstractMesh[]): void;
        protected _updateModel(): void;
    }
    /**
     * Register side effects for webXRGenericHandController.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRGenericHandController(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webXRGenericHandController.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * X-Y values for axes in WebXR
     */
    export interface IWebXRMotionControllerAxesValue {
        /**
         * The value of the x axis
         */
        x: number;
        /**
         * The value of the y-axis
         */
        y: number;
    }
    /**
     * changed / previous values for the values of this component
     */
    export interface IWebXRMotionControllerComponentChangesValues<T> {
        /**
         * current (this frame) value
         */
        current: T;
        /**
         * previous (last change) value
         */
        previous: T;
    }
    /**
     * Represents changes in the component between current frame and last values recorded
     */
    export interface IWebXRMotionControllerComponentChanges {
        /**
         * will be populated with previous and current values if axes changed
         */
        axes?: IWebXRMotionControllerComponentChangesValues<IWebXRMotionControllerAxesValue>;
        /**
         * will be populated with previous and current values if pressed changed
         */
        pressed?: IWebXRMotionControllerComponentChangesValues<boolean>;
        /**
         * will be populated with previous and current values if touched changed
         */
        touched?: IWebXRMotionControllerComponentChangesValues<boolean>;
        /**
         * will be populated with previous and current values if value changed
         */
        value?: IWebXRMotionControllerComponentChangesValues<number>;
    }
    /**
     * This class represents a single component (for example button or thumbstick) of a motion controller
     */
    export class WebXRControllerComponent implements IDisposable {
        /**
         * the id of this component
         */
        id: string;
        /**
         * the type of the component
         */
        type: MotionControllerComponentType;
        private _buttonIndex;
        private _axesIndices;
        private _axes;
        private _changes;
        private _currentValue;
        private _hasChanges;
        private _pressed;
        private _touched;
        /**
         * button component type
         */
        static BUTTON_TYPE: MotionControllerComponentType;
        /**
         * squeeze component type
         */
        static SQUEEZE_TYPE: MotionControllerComponentType;
        /**
         * Thumbstick component type
         */
        static THUMBSTICK_TYPE: MotionControllerComponentType;
        /**
         * Touchpad component type
         */
        static TOUCHPAD_TYPE: MotionControllerComponentType;
        /**
         * trigger component type
         */
        static TRIGGER_TYPE: MotionControllerComponentType;
        /**
         * If axes are available for this component (like a touchpad or thumbstick) the observers will be notified when
         * the axes data changes
         */
        onAxisValueChangedObservable: Observable<{
            x: number;
            y: number;
        }>;
        /**
         * Observers registered here will be triggered when the state of a button changes
         * State change is either pressed / touched / value
         */
        onButtonStateChangedObservable: Observable<WebXRControllerComponent>;
        /**
         * Creates a new component for a motion controller.
         * It is created by the motion controller itself
         *
         * @param id the id of this component
         * @param type the type of the component
         * @param _buttonIndex index in the buttons array of the gamepad
         * @param _axesIndices indices of the values in the axes array of the gamepad
         */
        constructor(
        /**
         * the id of this component
         */
        id: string, 
        /**
         * the type of the component
         */
        type: MotionControllerComponentType, _buttonIndex?: number, _axesIndices?: number[]);
        /**
         * The current axes data. If this component has no axes it will still return an object { x: 0, y: 0 }
         */
        get axes(): IWebXRMotionControllerAxesValue;
        /**
         * Get the changes. Elements will be populated only if they changed with their previous and current value
         */
        get changes(): IWebXRMotionControllerComponentChanges;
        /**
         * Return whether or not the component changed the last frame
         */
        get hasChanges(): boolean;
        /**
         * is the button currently pressed
         */
        get pressed(): boolean;
        /**
         * is the button currently touched
         */
        get touched(): boolean;
        /**
         * Get the current value of this component
         */
        get value(): number;
        /**
         * Dispose this component
         */
        dispose(): void;
        /**
         * Are there axes correlating to this component
         * @returns true is axes data is available
         */
        isAxes(): boolean;
        /**
         * Is this component a button (hence - pressable)
         * @returns true if can be pressed
         */
        isButton(): boolean;
        /**
         * update this component using the gamepad object it is in. Called on every frame
         * @param nativeController the native gamepad controller object
         */
        update(nativeController: IMinimalMotionControllerObject): void;
    }


    /**
     * Handedness type in xrInput profiles. These can be used to define layouts in the Layout Map.
     */
    export type MotionControllerHandedness = "none" | "left" | "right";
    /**
     * The type of components available in motion controllers.
     * This is not the name of the component.
     */
    export type MotionControllerComponentType = "trigger" | "squeeze" | "touchpad" | "thumbstick" | "button";
    /**
     * The state of a controller component
     */
    export type MotionControllerComponentStateType = "default" | "touched" | "pressed";
    /**
     * The schema of motion controller layout.
     * No object will be initialized using this interface
     * This is used just to define the profile.
     */
    export interface IMotionControllerLayout {
        /**
         * Path to load the assets. Usually relative to the base path
         */
        assetPath: string;
        /**
         * Available components (unsorted)
         */
        components: {
            /**
             * A map of component Ids
             */
            [componentId: string]: {
                /**
                 * The type of input the component outputs
                 */
                type: MotionControllerComponentType;
                /**
                 * The indices of this component in the gamepad object
                 */
                gamepadIndices: {
                    /**
                     * Index of button
                     */
                    button?: number;
                    /**
                     * If available, index of x-axis
                     */
                    xAxis?: number;
                    /**
                     * If available, index of y-axis
                     */
                    yAxis?: number;
                };
                /**
                 * The mesh's root node name
                 */
                rootNodeName: string;
                /**
                 * Animation definitions for this model
                 */
                visualResponses: {
                    [stateKey: string]: {
                        /**
                         * What property will be animated
                         */
                        componentProperty: "xAxis" | "yAxis" | "button" | "state";
                        /**
                         * What states influence this visual response
                         */
                        states: MotionControllerComponentStateType[];
                        /**
                         * Type of animation - movement or visibility
                         */
                        valueNodeProperty: "transform" | "visibility";
                        /**
                         * Base node name to move. Its position will be calculated according to the min and max nodes
                         */
                        valueNodeName?: string;
                        /**
                         * Minimum movement node
                         */
                        minNodeName?: string;
                        /**
                         * Max movement node
                         */
                        maxNodeName?: string;
                    };
                };
                /**
                 * If touch enabled, what is the name of node to display user feedback
                 */
                touchPointNodeName?: string;
            };
        };
        /**
         * Is it xr standard mapping or not
         */
        gamepadMapping: "" | "xr-standard";
        /**
         * Base root node of this entire model
         */
        rootNodeName: string;
        /**
         * Defines the main button component id
         */
        selectComponentId: string;
    }
    /**
     * A definition for the layout map in the input profile
     */
    export interface IMotionControllerLayoutMap {
        /**
         * Layouts with handedness type as a key
         */
        [handedness: string]: IMotionControllerLayout;
    }
    /**
     * The XR Input profile schema
     * Profiles can be found here:
     * https://github.com/immersive-web/webxr-input-profiles/tree/master/packages/registry/profiles
     */
    export interface IMotionControllerProfile {
        /**
         * fallback profiles for this profileId
         */
        fallbackProfileIds: string[];
        /**
         * The layout map, with handedness as key
         */
        layouts: IMotionControllerLayoutMap;
        /**
         * The id of this profile
         * correlates to the profile(s) in the xrInput.profiles array
         */
        profileId: string;
    }
    /**
     * A helper-interface for the 3 meshes needed for controller button animation
     * The meshes are provided to the _lerpButtonTransform function to calculate the current position of the value mesh
     */
    export interface IMotionControllerButtonMeshMap {
        /**
         * the mesh that defines the pressed value mesh position.
         * This is used to find the max-position of this button
         */
        pressedMesh: AbstractMesh;
        /**
         * the mesh that defines the unpressed value mesh position.
         * This is used to find the min (or initial) position of this button
         */
        unpressedMesh: AbstractMesh;
        /**
         * The mesh that will be changed when value changes
         */
        valueMesh: AbstractMesh;
    }
    /**
     * A helper-interface for the 3 meshes needed for controller axis animation.
     * This will be expanded when touchpad animations are fully supported
     * The meshes are provided to the _lerpAxisTransform function to calculate the current position of the value mesh
     */
    export interface IMotionControllerMeshMap {
        /**
         * the mesh that defines the maximum value mesh position.
         */
        maxMesh?: AbstractMesh;
        /**
         * the mesh that defines the minimum value mesh position.
         */
        minMesh?: AbstractMesh;
        /**
         * The mesh that will be changed when axis value changes
         */
        valueMesh?: AbstractMesh;
    }
    /**
     * The elements needed for change-detection of the gamepad objects in motion controllers
     */
    export interface IMinimalMotionControllerObject {
        /**
         * Available axes of this controller
         */
        axes: number[];
        /**
         * An array of available buttons
         */
        buttons: Array<{
            /**
             * Value of the button/trigger
             */
            value: number;
            /**
             * If the button/trigger is currently touched
             */
            touched: boolean;
            /**
             * If the button/trigger is currently pressed
             */
            pressed: boolean;
        }>;
        /**
         * EXPERIMENTAL haptic support.
         */
        hapticActuators?: Array<{
            pulse: (value: number, duration: number) => Promise<boolean>;
        }>;
    }
    /**
     * An Abstract Motion controller
     * This class receives an xrInput and a profile layout and uses those to initialize the components
     * Each component has an observable to check for changes in value and state
     */
    export abstract class WebXRAbstractMotionController implements IDisposable {
        protected scene: Scene;
        protected layout: IMotionControllerLayout;
        /**
         * The gamepad object correlating to this controller
         */
        gamepadObject: IMinimalMotionControllerObject;
        /**
         * handedness (left/right/none) of this controller
         */
        handedness: MotionControllerHandedness;
        /**
         * @internal
         * [false]
         */
        _doNotLoadControllerMesh: boolean;
        private _controllerCache?;
        private _initComponent;
        private _modelReady;
        /**
         * A map of components (WebXRControllerComponent) in this motion controller
         * Components have a ComponentType and can also have both button and axis definitions
         */
        readonly components: {
            [id: string]: WebXRControllerComponent;
        };
        /**
         * Disable the model's animation. Can be set at any time.
         */
        disableAnimation: boolean;
        /**
         * Observers registered here will be triggered when the model of this controller is done loading
         */
        onModelLoadedObservable: Observable<WebXRAbstractMotionController>;
        /**
         * The profile id of this motion controller
         */
        abstract profileId: string;
        /**
         * The root mesh of the model. It is null if the model was not yet initialized
         */
        rootMesh: Nullable<AbstractMesh>;
        /**
         * constructs a new abstract motion controller
         * @param scene the scene to which the model of the controller will be added
         * @param layout The profile layout to load
         * @param gamepadObject The gamepad object correlating to this controller
         * @param handedness handedness (left/right/none) of this controller
         * @param _doNotLoadControllerMesh set this flag to ignore the mesh loading
         * @param _controllerCache a cache holding controller models already loaded in this session
         */
        constructor(scene: Scene, layout: IMotionControllerLayout, 
        /**
         * The gamepad object correlating to this controller
         */
        gamepadObject: IMinimalMotionControllerObject, 
        /**
         * handedness (left/right/none) of this controller
         */
        handedness: MotionControllerHandedness, 
        /**
         * @internal
         * [false]
         */
        _doNotLoadControllerMesh?: boolean, _controllerCache?: Array<{
            filename: string;
            path: string;
            meshes: AbstractMesh[];
        }> | undefined);
        /**
         * Dispose this controller, the model mesh and all its components
         */
        dispose(): void;
        /**
         * Returns all components of specific type
         * @param type the type to search for
         * @returns an array of components with this type
         */
        getAllComponentsOfType(type: MotionControllerComponentType): WebXRControllerComponent[];
        /**
         * get a component based an its component id as defined in layout.components
         * @param id the id of the component
         * @returns the component correlates to the id or undefined if not found
         */
        getComponent(id: string): WebXRControllerComponent;
        /**
         * Get the list of components available in this motion controller
         * @returns an array of strings correlating to available components
         */
        getComponentIds(): string[];
        /**
         * Get the first component of specific type
         * @param type type of component to find
         * @returns a controller component or null if not found
         */
        getComponentOfType(type: MotionControllerComponentType): Nullable<WebXRControllerComponent>;
        /**
         * Get the main (Select) component of this controller as defined in the layout
         * @returns the main component of this controller
         */
        getMainComponent(): WebXRControllerComponent;
        /**
         * Loads the model correlating to this controller
         * When the mesh is loaded, the onModelLoadedObservable will be triggered
         * @returns A promise fulfilled with the result of the model loading
         */
        loadModel(): Promise<boolean>;
        /**
         * Update this model using the current XRFrame
         * @param xrFrame the current xr frame to use and update the model
         */
        updateFromXRFrame(xrFrame: XRFrame): void;
        /**
         * Backwards compatibility due to a deeply-integrated typo
         */
        get handness(): MotionControllerHandedness;
        /**
         * Pulse (vibrate) this controller
         * If the controller does not support pulses, this function will fail silently and return Promise<false> directly after called
         * Consecutive calls to this function will cancel the last pulse call
         *
         * @param value the strength of the pulse in 0.0...1.0 range
         * @param duration Duration of the pulse in milliseconds
         * @param hapticActuatorIndex optional index of actuator (will usually be 0)
         * @returns a promise that will send true when the pulse has ended and false if the device doesn't support pulse or an error accrued
         */
        pulse(value: number, duration: number, hapticActuatorIndex?: number): Promise<boolean>;
        protected _getChildByName(node: AbstractMesh, name: string): AbstractMesh | undefined;
        protected _getImmediateChildByName(node: AbstractMesh, name: string): AbstractMesh | undefined;
        /**
         * Moves the axis on the controller mesh based on its current state
         * @param axisMap
         * @param axisValue the value of the axis which determines the meshes new position
         * @internal
         */
        protected _lerpTransform(axisMap: IMotionControllerMeshMap, axisValue: number, fixValueCoordinates?: boolean): void;
        /**
         * Update the model itself with the current frame data
         * @param xrFrame the frame to use for updating the model mesh
         */
        protected updateModel(xrFrame: XRFrame): void;
        /**
         * Get the filename and path for this controller's model
         * @returns a map of filename and path
         */
        protected abstract _getFilenameAndPath(): {
            filename: string;
            path: string;
        };
        /**
         * This function is called before the mesh is loaded. It checks for loading constraints.
         * For example, this function can check if the GLB loader is available
         * If this function returns false, the generic controller will be loaded instead
         * @returns Is the client ready to load the mesh
         */
        protected abstract _getModelLoadingConstraints(): boolean;
        /**
         * This function will be called after the model was successfully loaded and can be used
         * for mesh transformations before it is available for the user
         * @param meshes the loaded meshes
         */
        protected abstract _processLoadedModel(meshes: AbstractMesh[]): void;
        /**
         * Set the root mesh for this controller. Important for the WebXR controller class
         * @param meshes the loaded meshes
         */
        protected abstract _setRootMesh(meshes: AbstractMesh[]): void;
        /**
         * A function executed each frame that updates the mesh (if needed)
         * @param xrFrame the current xrFrame
         */
        protected abstract _updateModel(xrFrame: XRFrame): void;
        private _getGenericFilenameAndPath;
        private _getGenericParentMesh;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * Options for the walking locomotion feature.
     */
    export interface IWebXRWalkingLocomotionOptions {
        /**
         * The target to be moved by walking locomotion. This should be the transform node
         * which is the root of the XR space (i.e., the WebXRCamera's parent node). However,
         * for simple cases and legacy purposes, articulating the WebXRCamera itself is also
         * supported as a deprecated feature.
         */
        locomotionTarget: WebXRCamera | TransformNode;
    }
    /**
     * A module that will enable VR locomotion by detecting when the user walks in place.
     */
    export class WebXRWalkingLocomotion extends WebXRAbstractFeature {
        /**
         * The module's name.
         */
        static get Name(): string;
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number has no external basis.
         */
        static get Version(): number;
        private _sessionManager;
        private _up;
        private _forward;
        private _position;
        private _movement;
        private _walker;
        private _locomotionTarget;
        private _isLocomotionTargetWebXRCamera;
        /**
         * The target to be articulated by walking locomotion.
         * When the walking locomotion feature detects walking in place, this element's
         * X and Z coordinates will be modified to reflect locomotion. This target should
         * be either the XR space's origin (i.e., the parent node of the WebXRCamera) or
         * the WebXRCamera itself. Note that the WebXRCamera path will modify the position
         * of the WebXRCamera directly and is thus discouraged.
         */
        get locomotionTarget(): WebXRCamera | TransformNode;
        /**
         * The target to be articulated by walking locomotion.
         * When the walking locomotion feature detects walking in place, this element's
         * X and Z coordinates will be modified to reflect locomotion. This target should
         * be either the XR space's origin (i.e., the parent node of the WebXRCamera) or
         * the WebXRCamera itself. Note that the WebXRCamera path will modify the position
         * of the WebXRCamera directly and is thus discouraged.
         */
        set locomotionTarget(locomotionTarget: WebXRCamera | TransformNode);
        /**
         * Construct a new Walking Locomotion feature.
         * @param sessionManager manager for the current XR session
         * @param options creation options, prominently including the vector target for locomotion
         */
        constructor(sessionManager: WebXRSessionManager, options: IWebXRWalkingLocomotionOptions);
        /**
         * Checks whether this feature is compatible with the current WebXR session.
         * Walking locomotion is only compatible with "immersive-vr" sessions.
         * @returns true if compatible, false otherwise
         */
        isCompatible(): boolean;
        /**
         * Attaches the feature.
         * Typically called automatically by the features manager.
         * @returns true if attach succeeded, false otherwise
         */
        attach(): boolean;
        /**
         * Detaches the feature.
         * Typically called automatically by the features manager.
         * @returns true if detach succeeded, false otherwise
         */
        detach(): boolean;
        protected _onXRFrame(frame: XRFrame): void;
    }
    /**
     * Register side effects for webXRWalkingLocomotion.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRWalkingLocomotion(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRWalkingLocomotion.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Used for Space Warp render process
     */
    export class XRSpaceWarpRenderTarget extends RenderTargetTexture {
        private _velocityMaterial;
        private _originalPairing;
        private _previousWorldMatrices;
        private _previousTransforms;
        /**
         * Creates a Space Warp render target
         * @param motionVectorTexture WebGLTexture provided by WebGLSubImage
         * @param depthStencilTexture WebGLTexture provided by WebGLSubImage
         * @param scene scene used with the render target
         * @param size the size of the render target (used for each view)
         */
        constructor(motionVectorTexture: WebGLTexture, depthStencilTexture: WebGLTexture, scene?: Scene, size?: number | {
            width: number;
            height: number;
        } | {
            ratio: number;
        });
        render(useCameraPostProcess?: boolean, dumpForDebug?: boolean): void;
        /**
         * @internal
         */
        _bindFrameBuffer(): void;
        /**
         * Gets the number of views the corresponding to the texture (eg. a SpaceWarpRenderTarget will have > 1)
         * @returns the view count
         */
        getViewCount(): number;
        dispose(): void;
    }
    /**
     * WebXR Space Warp Render Target Texture Provider
     */
    export class WebXRSpaceWarpRenderTargetTextureProvider implements IWebXRRenderTargetTextureProvider {
        protected readonly _scene: Scene;
        protected readonly _xrSessionManager: WebXRSessionManager;
        protected readonly _xrWebGLBinding: XRWebGLBinding;
        protected _lastSubImages: Map<XRView, XRWebGLSubImage>;
        protected _renderTargetTextures: Map<XREye, RenderTargetTexture>;
        protected _framebufferDimensions: Nullable<{
            framebufferWidth: number;
            framebufferHeight: number;
        }>;
        protected _engine: Engine;
        constructor(_scene: Scene, _xrSessionManager: WebXRSessionManager, _xrWebGLBinding: XRWebGLBinding);
        private _getSubImageForView;
        protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage): void;
        protected _createRenderTargetTexture(width: number, height: number, framebuffer: Nullable<WebGLFramebuffer>, motionVectorTexture: WebGLTexture, depthStencilTexture: WebGLTexture): RenderTargetTexture;
        protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, view: XRView): RenderTargetTexture;
        trySetViewportForView(viewport: Viewport, view: XRView): boolean;
        /**
         * Access the motion vector (which will turn on Space Warp)
         * @param view the view to access the motion vector texture for
         */
        accessMotionVector(view: XRView): void;
        /**
         * Gets the render target texture for the specified eye
         * @param _eye the eye to get the render target texture for
         * @returns the render target texture or null
         */
        getRenderTargetTextureForEye(_eye: XREye): Nullable<RenderTargetTexture>;
        getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture>;
        dispose(): void;
    }
    /**
     * the WebXR Space Warp feature.
     */
    export class WebXRSpaceWarp extends WebXRAbstractFeature {
        /**
         * The module's name
         */
        static readonly Name: "xr-space-warp";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * The space warp provider
         */
        spaceWarpRTTProvider: Nullable<WebXRSpaceWarpRenderTargetTextureProvider>;
        private _glContext;
        private _xrWebGLBinding;
        private _renderTargetTexture;
        private _onAfterRenderObserver;
        /**
         * constructor for the space warp feature
         * @param _xrSessionManager the xr session manager for this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager);
        /**
         * Attach this feature.
         * Will usually be called by the features manager.
         *
         * @returns true if successful.
         */
        attach(): boolean;
        detach(): boolean;
        private _onAfterRender;
        dependsOn: string[];
        isCompatible(): boolean;
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
    }
    /**
     * Register side effects for webXRSpaceWarp.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRSpaceWarp(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRSpaceWarp.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options for raw camera access
     */
    export interface IWebXRRawCameraAccessOptions {
        /**
         * Keep the created textures and metadata when detaching the feature.
         */
        doNotDisposeOnDetach?: boolean;
    }
    /**
     * WebXR Feature for WebXR raw camera access
     * @since 6.31.0
     * @see https://immersive-web.github.io/raw-camera-access/
     */
    export class WebXRRawCameraAccess extends WebXRAbstractFeature {
        readonly options: IWebXRRawCameraAccessOptions;
        private _cachedInternalTextures;
        /**
         * This is an array of camera views
         * Note that mostly the array will contain a single view
         * If you want to know the order of the views, use the `viewIndex` array
         */
        texturesData: BaseTexture[];
        /**
         * If needed, this array will contain the eye definition of each texture in `texturesArray`
         */
        viewIndex: string[];
        /**
         * If needed, this array will contain the camera's intrinsics
         * You can use this data to convert from camera space to screen space and vice versa
         */
        cameraIntrinsics: {
            u0: number;
            v0: number;
            ax: number;
            ay: number;
            gamma: number;
            width: number;
            height: number;
            viewportX: number;
            viewportY: number;
        }[];
        /**
         * An observable that will notify when the camera's textures are updated
         */
        onTexturesUpdatedObservable: Observable<BaseTexture[]>;
        private _glBinding?;
        private _glContext;
        /**
         * The module's name
         */
        static readonly Name: "xr-raw-camera-access";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Creates a new instance of the feature
         * @param _xrSessionManager the WebXRSessionManager
         * @param options options for the Feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, options?: IWebXRRawCameraAccessOptions);
        attach(force?: boolean): boolean;
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        /**
         * @see https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md
         * @param view the XRView to update
         * @param index the index of the view in the views array
         */
        private _updateCameraIntrinsics;
        private _updateInternalTextures;
        protected _onXRFrame(_xrFrame: XRFrame): void;
    }
    /**
     * Register side effects for webXRRawCameraAccess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRRawCameraAccess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRRawCameraAccess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options used in the plane detector module
     */
    export interface IWebXRPlaneDetectorOptions {
        /**
         * The node to use to transform the local results to world coordinates
         */
        worldParentNode?: TransformNode;
        /**
         * If set to true a reference of the created planes will be kept until the next session starts
         * If not defined, planes will be removed from the array when the feature is detached or the session ended.
         */
        doNotRemovePlanesOnSessionEnded?: boolean;
        /**
         * Preferred detector configuration, not all preferred options will be supported by all platforms.
         */
        preferredDetectorOptions?: XRGeometryDetectorOptions;
    }
    /**
     * A babylon interface for a WebXR plane.
     * A Plane is actually a polygon, built from N points in space
     *
     * Supported in chrome 79, not supported in canary 81 ATM
     */
    export interface IWebXRPlane {
        /**
         * a babylon-assigned ID for this polygon
         */
        id: number;
        /**
         * an array of vector3 points in babylon space. right/left hand system is taken into account.
         */
        polygonDefinition: Array<Vector3>;
        /**
         * A transformation matrix to apply on the mesh that will be built using the polygonDefinition
         * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module
         */
        transformationMatrix: Matrix;
        /**
         * the native xr-plane object
         */
        xrPlane: XRPlane;
    }
    /**
     * The plane detector is used to detect planes in the real world when in AR
     * For more information see https://github.com/immersive-web/real-world-geometry/
     */
    export class WebXRPlaneDetector extends WebXRAbstractFeature {
        private _options;
        private _detectedPlanes;
        private _enabled;
        private _lastFrameDetected;
        /**
         * The module's name
         */
        static readonly Name: "xr-plane-detection";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Observers registered here will be executed when a new plane was added to the session
         */
        onPlaneAddedObservable: Observable<IWebXRPlane>;
        /**
         * Observers registered here will be executed when a plane is no longer detected in the session
         */
        onPlaneRemovedObservable: Observable<IWebXRPlane>;
        /**
         * Observers registered here will be executed when an existing plane updates (for example - expanded)
         * This can execute N times every frame
         */
        onPlaneUpdatedObservable: Observable<IWebXRPlane>;
        /**
         * construct a new Plane Detector
         * @param _xrSessionManager an instance of xr Session manager
         * @param _options configuration to use when constructing this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options?: IWebXRPlaneDetectorOptions);
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        /**
         * Check if the needed objects are defined.
         * This does not mean that the feature is enabled, but that the objects needed are well defined.
         * @returns true if the initial compatibility test passed
         */
        isCompatible(): boolean;
        /**
         * Enable room capture mode.
         * When enabled and supported by the system,
         * the detectedPlanes array will be populated with the detected room boundaries
         * @see https://immersive-web.github.io/real-world-geometry/plane-detection.html#dom-xrsession-initiateroomcapture
         * @returns true if plane detection is enabled and supported. Will reject if not supported.
         */
        initiateRoomCapture(): Promise<void>;
        protected _onXRFrame(frame: XRFrame): void;
        private _init;
        private _updatePlaneWithXRPlane;
        /**
         * avoiding using Array.find for global support.
         * @param xrPlane the plane to find in the array
         * @returns the index of the plane in the array or -1 if not found
         */
        private _findIndexInPlaneArray;
    }
    /**
     * Register side effects for webXRPlaneDetector.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRPlaneDetector(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRPlaneDetector.pure for tree-shakeable, side-effect-free usage.
     */


    type WebXRNearInteractionPickMeshWithSphereType = typeof WebXRNearInteractionPickMeshWithSphere;
        export namespace WebXRNearInteraction {
            let PickMeshWithSphere: WebXRNearInteractionPickMeshWithSphereType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Where should the near interaction mesh be attached to when using a motion controller for near interaction
     */
    export enum WebXRNearControllerMode {
        /**
         * Motion controllers will not support near interaction
         */
        DISABLED = 0,
        /**
         * The interaction point for motion controllers will be inside of them
         */
        CENTERED_ON_CONTROLLER = 1,
        /**
         * The interaction point for motion controllers will be in front of the controller
         */
        CENTERED_IN_FRONT = 2
    }
    /**
     * Options interface for the near interaction module
     */
    export interface IWebXRNearInteractionOptions {
        /**
         * If provided, this scene will be used to render meshes.
         */
        customUtilityLayerScene?: Scene;
        /**
         * Should meshes created here be added to a utility layer or the main scene
         */
        useUtilityLayer?: boolean;
        /**
         * The xr input to use with this near interaction
         */
        xrInput: WebXRInput;
        /**
         * Enable near interaction on all controllers instead of switching between them
         */
        enableNearInteractionOnAllControllers?: boolean;
        /**
         * The preferred hand to give the near interaction to. This will be prioritized when the controller initialize.
         * If switch is enabled, it will still allow the user to switch between the different controllers
         */
        preferredHandedness?: XRHandedness;
        /**
         * Disable switching the near interaction from one controller to the other.
         * If the preferred hand is set it will be fixed on this hand, and if not it will be fixed on the first controller added to the scene
         */
        disableSwitchOnClick?: boolean;
        /**
         * Far interaction feature to toggle when near interaction takes precedence
         */
        farInteractionFeature?: WebXRControllerPointerSelection;
        /**
         * Near interaction mode for motion controllers
         */
        nearInteractionControllerMode?: WebXRNearControllerMode;
        /**
         * Optional material for the motion controller orb, if enabled
         */
        motionControllerOrbMaterial?: Material;
        /**
         * If provided, this URL will be used by Node Material to generate the material for the motion controller orb
         * If not provided, a snippet will be downloaded from the Babylon.js snippet server CDN.
         * The NME JSON file can be found here - https://github.com/BabylonJS/Assets/blob/master/nme/nearInteractionTouchMaterial.json
         */
        motionControllerTouchMaterialSnippetUrl?: string;
    }
    /**
     * A module that will enable near interaction near interaction for hands and motion controllers of XR Input Sources
     */
    export class WebXRNearInteraction extends WebXRAbstractFeature {
        private readonly _options;
        private static _IdCounter;
        private _tmpRay;
        private _attachController;
        private _controllers;
        private _scene;
        private _attachedController;
        private _farInteractionFeature;
        /**
         * The module's name
         */
        static readonly Name: "xr-near-interaction";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * default color of the selection ring
         */
        selectionMeshDefaultColor: Color3;
        /**
         * This color will be applied to the selection ring when selection is triggered
         */
        selectionMeshPickedColor: Color3;
        /**
         * If set to true, the selection mesh will always be hidden. Otherwise it will be shown only when needed
         */
        alwaysHideSelectionMesh: boolean;
        /**
         * constructs a new background remover module
         * @param _xrSessionManager the session manager for this module
         * @param _options read-only options to be used in this module
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options: IWebXRNearInteractionOptions);
        /**
         * Attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * Detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Will get the mesh under a specific pointer.
         * `scene.meshUnderPointer` will only return one mesh - either left or right.
         * @param controllerId the controllerId to check
         * @returns The mesh under pointer or null if no mesh is under the pointer
         */
        getMeshUnderPointer(controllerId: string): Nullable<AbstractMesh>;
        /**
         * Get the xr controller that correlates to the pointer id in the pointer event
         *
         * @param id the pointer id to search for
         * @returns the controller that correlates to this id or null if not found
         */
        getXRControllerByPointerId(id: number): Nullable<WebXRInputSource>;
        /**
         * This function sets webXRControllerPointerSelection feature that will be disabled when
         * the hover range is reached for a mesh and will be reattached when not in hover range.
         * This is used to remove the selection rays when moving.
         * @param farInteractionFeature the feature to disable when finger is in hover range for a mesh
         */
        setFarInteractionFeature(farInteractionFeature: Nullable<WebXRControllerPointerSelection>): void;
        /**
         * Filter used for near interaction pick and hover
         * @param mesh the mesh candidate to be pick-filtered
         * @returns if the mesh should be included in the list of candidate meshes for near interaction
         */
        private _nearPickPredicate;
        /**
         * Filter used for near interaction grab
         * @param mesh the mesh candidate to be pick-filtered
         * @returns if the mesh should be included in the list of candidate meshes for near interaction
         */
        private _nearGrabPredicate;
        /**
         * Filter used for any near interaction
         * @param mesh the mesh candidate to be pick-filtered
         * @returns if the mesh should be included in the list of candidate meshes for near interaction
         */
        private _nearInteractionPredicate;
        private _controllerAvailablePredicate;
        private _handleTransitionAnimation;
        private readonly _hoverRadius;
        private readonly _pickRadius;
        private readonly _controllerPickRadius;
        private readonly _nearGrabLengthScale;
        private _processTouchPoint;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private get _utilityLayerScene();
        private _generateVisualCue;
        private _isControllerReadyForNearInteraction;
        private _attachNearInteractionMode;
        private _detachController;
        private _generateNewTouchPointMesh;
        private _pickWithSphere;
    }
    /**
     * Picks a mesh with a sphere
     * @param mesh the mesh to pick
     * @param sphere picking sphere in world coordinates
     * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check
     * @returns the picking info
     */
    export function WebXRNearInteractionPickMeshWithSphere(mesh: AbstractMesh, sphere: BoundingSphere, skipBoundingInfo?: boolean): PickingInfo;
    /**
     * Register side effects for webXRNearInteraction.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRNearInteraction(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRNearInteraction.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options used in the mesh detector module
     */
    export interface IWebXRMeshDetectorOptions {
        /**
         * The node to use to transform the local results to world coordinates
         */
        worldParentNode?: TransformNode;
        /**
         * If set to true a reference of the created meshes will be kept until the next session starts
         * If not defined, meshes will be removed from the array when the feature is detached or the session ended.
         */
        doNotRemoveMeshesOnSessionEnded?: boolean;
        /**
         * Preferred detector configuration, not all preferred options will be supported by all platforms.
         * Babylon native only!
         */
        preferredDetectorOptions?: XRGeometryDetectorOptions;
        /**
         * If set to true, WebXRMeshDetector will convert coordinate systems for meshes.
         * If not defined, mesh conversions from right handed to left handed coordinate systems won't be conducted.
         * Right handed mesh data will be available through IWebXRVertexData.xrMesh.
         */
        convertCoordinateSystems?: boolean;
        /**
         * If set to true, the feature will generate meshes for the detected data.
         * Note that this might be time consuming, as the mesh's vertex data will be updated on every change.
         * Setting this to true will also set convertCoordinateSystems to true.
         * Note - the meshes will NOT be disposed automatically when the feature is detached or the session ended.
         */
        generateMeshes?: boolean;
    }
    /**
     * A babylon interface for a XR mesh's vertex data.
     */
    export interface IWebXRVertexData {
        /**
         * A babylon-assigned ID for this mesh
         */
        id: number;
        /**
         * Data required for constructing a mesh in Babylon.js.
         */
        xrMesh: XRMesh;
        /**
         * The node to use to transform the local results to world coordinates.
         * WorldParentNode will only exist if it was declared in the IWebXRMeshDetectorOptions.
         */
        worldParentNode?: TransformNode;
        /**
         * An array of vertex positions in babylon space. right/left hand system is taken into account.
         * Positions will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.
         */
        positions?: Float32Array;
        /**
         * An array of indices in babylon space. Indices have a counterclockwise winding order.
         * Indices will only be populated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.
         */
        indices?: Uint32Array;
        /**
         * An array of vertex normals in babylon space. right/left hand system is taken into account.
         * Normals will not be calculated if convertCoordinateSystems is undefined in the IWebXRMeshDetectorOptions.
         * Different platforms may or may not support mesh normals when convertCoordinateSystems is set to true.
         */
        normals?: Float32Array;
        /**
         * A transformation matrix to apply on the mesh that will be built using the meshDefinition.
         * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module.
         * TransformationMatrix will only be calculated if convertCoordinateSystems is set to true in the IWebXRMeshDetectorOptions.
         */
        transformationMatrix?: Matrix;
        /**
         * If generateMeshes is set to true in the IWebXRMeshDetectorOptions, this will be the generated mesh.
         * This mesh will be updated with the vertex data provided and not regenerated every time.
         */
        mesh?: Mesh;
    }
    /**
     * The mesh detector is used to detect meshes in the real world when in AR
     */
    export class WebXRMeshDetector extends WebXRAbstractFeature {
        private _options;
        private _detectedMeshes;
        /**
         * The module's name
         */
        static readonly Name: "xr-mesh-detection";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Observers registered here will be executed when a new mesh was added to the session
         */
        onMeshAddedObservable: Observable<IWebXRVertexData>;
        /**
         * Observers registered here will be executed when a mesh is no longer detected in the session
         */
        onMeshRemovedObservable: Observable<IWebXRVertexData>;
        /**
         * Observers registered here will be executed when an existing mesh updates
         */
        onMeshUpdatedObservable: Observable<IWebXRVertexData>;
        constructor(_xrSessionManager: WebXRSessionManager, _options?: IWebXRMeshDetectorOptions);
        detach(): boolean;
        dispose(): void;
        protected _onXRFrame(frame: XRFrame): void;
        private _init;
        private _updateVertexDataWithXRMesh;
    }
    /**
     * Register side effects for webXRMeshDetector.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRMeshDetector(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRMeshDetector.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options for Light Estimation feature
     */
    export interface IWebXRLightEstimationOptions {
        /**
         * Disable the cube map reflection feature. In this case only light direction and color will be updated
         */
        disableCubeMapReflection?: boolean;
        /**
         * Should the scene's env texture be set to the cube map reflection texture
         * Note that this doesn't work is disableCubeMapReflection if set to false
         */
        setSceneEnvironmentTexture?: boolean;
        /**
         * How often should the cubemap update in ms.
         * If not set the cubemap will be updated every time the underlying system updates the environment texture.
         */
        cubeMapPollInterval?: number;
        /**
         * How often should the light estimation properties update in ms.
         * If not set the light estimation properties will be updated on every frame (depending on the underlying system)
         */
        lightEstimationPollInterval?: number;
        /**
         * Should a directional light source be created.
         * If created, this light source will be updated whenever the light estimation values change
         */
        createDirectionalLightSource?: boolean;
        /**
         * The scale factor to multiply the intensity of the directional light by. Defaults to 1.0.
         */
        directionalLightIntensityFactor?: number;
        /**
         * Define the format to be used for the light estimation texture.
         */
        reflectionFormat?: XRReflectionFormat;
        /**
         * Should the light estimation's needed vectors be constructed on each frame.
         * Use this when you use those vectors and don't want their values to change outside of the light estimation feature
         */
        disableVectorReuse?: boolean;
        /**
         * disable applying the spherical polynomial to the cube map texture
         */
        disableSphericalPolynomial?: boolean;
        /**
         * disable prefiltering the cube map texture
         */
        disablePreFiltering?: boolean;
    }
    /**
     * An interface describing the result of a light estimation
     */
    export interface IWebXRLightEstimation {
        /**
         * The intensity of the light source
         */
        lightIntensity: number;
        /**
         * Color of light source
         */
        lightColor: Color3;
        /**
         * The direction from the light source
         */
        lightDirection: Vector3;
        /**
         * Spherical harmonics coefficients of the light source
         */
        sphericalHarmonics: SphericalHarmonics;
    }
    /**
     * Light Estimation Feature
     *
     * @since 5.0.0
     */
    export class WebXRLightEstimation extends WebXRAbstractFeature {
        /**
         * options to use when constructing this feature
         */
        readonly options: IWebXRLightEstimationOptions;
        private _canvasContext;
        private _reflectionCubeMap;
        private _xrLightEstimate;
        private _xrLightProbe;
        private _xrWebGLBinding;
        private _lightDirection;
        private _lightColor;
        private _intensity;
        private _sphericalHarmonics;
        private _cubeMapPollTime;
        private _lightEstimationPollTime;
        /**
         * The module's name
         */
        static readonly Name: "xr-light-estimation";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * ARCore's reflection cube map size is 16x16.
         * Once other systems support this feature we will need to change this to be dynamic.
         * see https://github.com/immersive-web/lighting-estimation/blob/main/lighting-estimation-explainer.md#cube-map-open-questions
         */
        private _reflectionCubeMapTextureSize;
        private _hdrFilter;
        /**
         * If createDirectionalLightSource is set to true this light source will be created automatically.
         * Otherwise this can be set with an external directional light source.
         * This light will be updated whenever the light estimation values change.
         */
        directionalLight: Nullable<DirectionalLight>;
        /**
         * The scale factor to multiply the intensity of the directional light by. Defaults to 1.0.
         */
        directionalLightIntensityFactor: number;
        /**
         * This observable will notify when the reflection cube map is updated.
         */
        onReflectionCubeMapUpdatedObservable: Observable<BaseTexture>;
        /**
         * Creates a new instance of the light estimation feature
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param options options to use when constructing this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * options to use when constructing this feature
         */
        options: IWebXRLightEstimationOptions);
        /**
         * While the estimated cube map is expected to update over time to better reflect the user's environment as they move around those changes are unlikely to happen with every XRFrame.
         * Since creating and processing the cube map is potentially expensive, especially if mip maps are needed, you can listen to the onReflectionCubeMapUpdatedObservable to determine
         * when it has been updated.
         */
        get reflectionCubeMapTexture(): Nullable<BaseTexture>;
        /**
         * The most recent light estimate.  Available starting on the first frame where the device provides a light probe.
         */
        get xrLightingEstimate(): Nullable<IWebXRLightEstimation>;
        private _getCanvasContext;
        private _getXRGLBinding;
        /**
         * Event Listener for "reflectionchange" events.
         */
        private _updateReflectionCubeMap;
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
    }
    /**
     * Register side effects for webXRLightEstimation.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRLightEstimation(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRLightEstimation.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Configuration options of the layers feature
     */
    export interface IWebXRLayersOptions {
        /**
         * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.
         * Defaults to false.
         */
        preferMultiviewOnInit?: boolean;
        /**
         * Optional configuration for the base projection layer.
         */
        projectionLayerInit?: Partial<XRProjectionLayerInit>;
    }
    /**
     * Exposes the WebXR Layers API.
     */
    export class WebXRLayers extends WebXRAbstractFeature {
        private readonly _options;
        /**
         * The module's name
         */
        static readonly Name: "xr-layers";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Already-created layers
         */
        private _existingLayers;
        private _glContext;
        private _xrWebGLBinding;
        private _isMultiviewEnabled;
        private _projectionLayerInitialized;
        private _compositionLayerTextureMapping;
        private _layerToRTTProviderMapping;
        constructor(_xrSessionManager: WebXRSessionManager, _options?: IWebXRLayersOptions);
        /**
         * Attach this feature.
         * Will usually be called by the features manager.
         *
         * @returns true if successful.
         */
        attach(): boolean;
        detach(): boolean;
        /**
         * Creates a new XRWebGLLayer.
         * @param params an object providing configuration options for the new XRWebGLLayer
         * @returns the XRWebGLLayer
         */
        createXRWebGLLayer(params?: XRWebGLLayerInit): WebXRWebGLLayerWrapper;
        private _validateLayerInit;
        private _extendXRLayerInit;
        /**
         * Creates a new XRProjectionLayer.
         * @param params an object providing configuration options for the new XRProjectionLayer.
         * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.
         * @returns the projection layer
         */
        createProjectionLayer(params?: XRProjectionLayerInit, multiview?: boolean): WebXRProjectionLayerWrapper;
        /**
         * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options
         * @param options an object providing configuration options for the new XRQuadLayer.
         * @param babylonTexture the texture to display in the layer
         * @returns the quad layer
         */
        private _createQuadLayer;
        /**
         * @experimental
         * This will support full screen ADT when used with WebXR Layers. This API might change in the future.
         * Note that no interaction will be available with the ADT when using this method
         * @param texture the texture to display in the layer
         * @param options optional parameters for the layer
         * @returns a composition layer containing the texture
         */
        addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options?: {
            distanceFromHeadset: number;
        }): WebXRCompositionLayerWrapper;
        /**
         * @experimental
         * This functions allows you to add a lens flare system to the XR scene.
         * Note - this will remove the lens flare system from the scene and add it to the XR scene.
         * This feature is experimental and might change in the future.
         * @param flareSystem the flare system to add
         * @returns a composition layer containing the flare system
         */
        protected _addLensFlareSystem(flareSystem: LensFlareSystem): WebXRCompositionLayerWrapper;
        /**
         * Add a new layer to the already-existing list of layers
         * @param wrappedLayer the new layer to add to the existing ones
         */
        addXRSessionLayer(wrappedLayer: WebXRLayerWrapper): void;
        /**
         * Sets the layers to be used by the XR session.
         * Note that you must call this function with any layers you wish to render to
         * since it adds them to the XR session's render state
         * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).
         * This method also sets up the session manager's render target texture provider
         * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.
         * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.
         */
        setXRSessionLayers(wrappedLayers?: Array<WebXRLayerWrapper>): void;
        isCompatible(): boolean;
        /**
         * Dispose this feature and all of the resources attached.
         */
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
    }
    /**
     * Register side effects for webXRLayers.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRLayers(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRLayers.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options interface for the background remover plugin
     */
    export interface IWebXRImageTrackingOptions {
        /**
         * A required array with images to track
         */
        images: {
            /**
             * The source of the image. can be a URL or an image bitmap
             */
            src: string | ImageBitmap;
            /**
             * The estimated width in the real world (in meters)
             */
            estimatedRealWorldWidth: number;
        }[];
    }
    /**
     * An object representing an image tracked by the system
     */
    export interface IWebXRTrackedImage {
        /**
         * The ID of this image (which is the same as the position in the array that was used to initialize the feature)
         */
        id: number;
        /**
         * Is the transformation provided emulated. If it is, the system "guesses" its real position. Otherwise it can be considered as exact position.
         */
        emulated?: boolean;
        /**
         * Just in case it is needed - the image bitmap that is being tracked
         */
        originalBitmap: ImageBitmap;
        /**
         * The native XR result image tracking result, untouched
         */
        xrTrackingResult?: XRImageTrackingResult;
        /**
         * Width in real world (meters)
         */
        realWorldWidth?: number;
        /**
         * A transformation matrix of this current image in the current reference space.
         */
        transformationMatrix: Matrix;
        /**
         * The width/height ratio of this image. can be used to calculate the size of the detected object/image
         */
        ratio?: number;
    }
    /**
     * Image tracking for immersive AR sessions.
     * Providing a list of images and their estimated widths will enable tracking those images in the real world.
     */
    export class WebXRImageTracking extends WebXRAbstractFeature {
        /**
         * read-only options to be used in this module
         */
        readonly options: IWebXRImageTrackingOptions;
        /**
         * The module's name
         */
        static readonly Name: "xr-image-tracking";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * This will be triggered if the underlying system deems an image untrackable.
         * The index is the index of the image from the array used to initialize the feature.
         */
        onUntrackableImageFoundObservable: Observable<number>;
        /**
         * An image was deemed trackable, and the system will start tracking it.
         */
        onTrackableImageFoundObservable: Observable<IWebXRTrackedImage>;
        /**
         * The image was found and its state was updated.
         */
        onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage>;
        private _trackableScoreStatus;
        private _trackedImages;
        private _originalTrackingRequest;
        /**
         * constructs the image tracking feature
         * @param _xrSessionManager the session manager for this module
         * @param options read-only options to be used in this module
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * read-only options to be used in this module
         */
        options: IWebXRImageTrackingOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Get a tracked image by its ID.
         *
         * @param id the id of the image to load (position in the init array)
         * @returns a trackable image, if exists in this location
         */
        getTrackedImageById(id: number): Nullable<IWebXRTrackedImage>;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        /**
         * Extends the session init object if needed
         * @returns augmentation object fo the xr session init object.
         */
        getXRSessionInitExtension(): Promise<Partial<XRSessionInit>>;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _checkScoresAsync;
    }
    /**
     * Register side effects for webXRImageTracking.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRImageTracking(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRImageTracking.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * An interface for all Hit test features
     */
    export interface IWebXRHitTestFeature<T extends IWebXRLegacyHitResult> extends IWebXRFeature {
        /**
         * Triggered when new babylon (transformed) hit test results are available
         */
        onHitTestResultObservable: Observable<T[]>;
    }
    /**
     * Options used for hit testing
     */
    export interface IWebXRLegacyHitTestOptions {
        /**
         * Only test when user interacted with the scene. Default - hit test every frame
         */
        testOnPointerDownOnly?: boolean;
        /**
         * The node to use to transform the local results to world coordinates
         */
        worldParentNode?: TransformNode;
    }
    /**
     * Interface defining the babylon result of raycasting/hit-test
     */
    export interface IWebXRLegacyHitResult {
        /**
         * Transformation matrix that can be applied to a node that will put it in the hit point location
         */
        transformationMatrix: Matrix;
        /**
         * The native hit test result
         */
        xrHitResult: XRHitResult | XRHitTestResult;
    }
    /**
     * The currently-working hit-test module.
     * Hit test (or Ray-casting) is used to interact with the real world.
     * For further information read here - https://github.com/immersive-web/hit-test
     */
    export class WebXRHitTestLegacy extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRLegacyHitResult> {
        /**
         * [Empty Object] options to use when constructing this feature
         */
        readonly options: IWebXRLegacyHitTestOptions;
        private _direction;
        private _mat;
        private _onSelectEnabled;
        private _origin;
        /**
         * The module's name
         */
        static readonly Name: "xr-hit-test";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Populated with the last native XR Hit Results
         */
        lastNativeXRHitResults: XRHitResult[];
        /**
         * Triggered when new babylon (transformed) hit test results are available
         */
        onHitTestResultObservable: Observable<IWebXRLegacyHitResult[]>;
        /**
         * Creates a new instance of the (legacy version) hit test feature
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param options options to use when constructing this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * [Empty Object] options to use when constructing this feature
         */
        options?: IWebXRLegacyHitTestOptions);
        /**
         * execute a hit test with an XR Ray
         *
         * @param xrSession a native xrSession that will execute this hit test
         * @param xrRay the ray (position and direction) to use for ray-casting
         * @param referenceSpace native XR reference space to use for the hit-test
         * @param filter filter function that will filter the results
         * @returns a promise that resolves with an array of native XR hit result in xr coordinates system
         */
        static XRHitTestWithRay(xrSession: XRSession, xrRay: XRRay, referenceSpace: XRReferenceSpace, filter?: (result: XRHitResult) => boolean): Promise<XRHitResult[]>;
        /**
         * Execute a hit test on the current running session using a select event returned from a transient input (such as touch)
         * @param event the (select) event to use to select with
         * @param referenceSpace the reference space to use for this hit test
         * @returns a promise that resolves with an array of native XR hit result in xr coordinates system
         */
        static XRHitTestWithSelectEvent(event: XRInputSourceEvent, referenceSpace: XRReferenceSpace): Promise<XRHitResult[]>;
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(frame: XRFrame): void;
        private _onHitTestResults;
        private _onSelect;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Options used for hit testing (version 2)
     */
    export interface IWebXRHitTestOptions extends IWebXRLegacyHitTestOptions {
        /**
         * Do not create a permanent hit test. Will usually be used when only
         * transient inputs are needed.
         */
        disablePermanentHitTest?: boolean;
        /**
         * Enable transient (for example touch-based) hit test inspections
         */
        enableTransientHitTest?: boolean;
        /**
         * Override the default transient hit test profile (generic-touchscreen).
         */
        transientHitTestProfile?: string;
        /**
         * Offset ray for the permanent hit test
         */
        offsetRay?: Vector3;
        /**
         * Offset ray for the transient hit test
         */
        transientOffsetRay?: Vector3;
        /**
         * Instead of using viewer space for hit tests, use the reference space defined in the session manager
         */
        useReferenceSpace?: boolean;
        /**
         * Override the default entity type(s) of the hit-test result
         */
        entityTypes?: XRHitTestTrackableType[];
    }
    /**
     * Interface defining the babylon result of hit-test
     */
    export interface IWebXRHitResult extends IWebXRLegacyHitResult {
        /**
         * The input source that generated this hit test (if transient)
         */
        inputSource?: XRInputSource;
        /**
         * Is this a transient hit test
         */
        isTransient?: boolean;
        /**
         * Position of the hit test result
         */
        position: Vector3;
        /**
         * Rotation of the hit test result
         */
        rotationQuaternion: Quaternion;
        /**
         * The native hit test result
         */
        xrHitResult: XRHitTestResult;
    }
    /**
     * The currently-working hit-test module.
     * Hit test (or Ray-casting) is used to interact with the real world.
     * For further information read here - https://github.com/immersive-web/hit-test
     *
     * Tested on chrome (mobile) 80.
     */
    export class WebXRHitTest extends WebXRAbstractFeature implements IWebXRHitTestFeature<IWebXRHitResult> {
        /**
         * [Empty Object] options to use when constructing this feature
         */
        readonly options: IWebXRHitTestOptions;
        private _tmpMat;
        private _tmpPos;
        private _tmpQuat;
        private _transientXrHitTestSource;
        private _xrHitTestSource;
        private _initHitTestSource;
        /**
         * The module's name
         */
        static readonly Name: "xr-hit-test";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 2;
        /**
         * When set to true, each hit test will have its own position/rotation objects
         * When set to false, position and rotation objects will be reused for each hit test. It is expected that
         * the developers will clone them or copy them as they see fit.
         */
        autoCloneTransformation: boolean;
        /**
         * Triggered when new babylon (transformed) hit test results are available
         * Note - this will be called when results come back from the device. It can be an empty array!!
         */
        onHitTestResultObservable: Observable<IWebXRHitResult[]>;
        /**
         * Use this to temporarily pause hit test checks.
         */
        paused: boolean;
        /**
         * Creates a new instance of the hit test feature
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param options options to use when constructing this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * [Empty Object] options to use when constructing this feature
         */
        options?: IWebXRHitTestOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(frame: XRFrame): void;
        private _processWebXRHitTestResult;
    }
    /**
     * Register side effects for webXRHitTest.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRHitTest(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRHitTest.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Configuration interface for the hand tracking feature
     */
    export interface IWebXRHandTrackingOptions {
        /**
         * The xrInput that will be used as source for new hands
         */
        xrInput: WebXRInput;
        /**
         * Configuration object for the joint meshes.
         */
        jointMeshes?: {
            /**
             * Should the meshes created be invisible (defaults to false).
             */
            invisible?: boolean;
            /**
             * A source mesh to be used to create instances. Defaults to an icosphere with two subdivisions and smooth lighting.
             * This mesh will be the source for all other (25) meshes.
             * It should have the general size of a single unit, as the instances will be scaled according to the provided radius.
             */
            sourceMesh?: Mesh;
            /**
             * This function will be called after a mesh was created for a specific joint.
             * Using this function you can either manipulate the instance or return a new mesh.
             * When returning a new mesh the instance created before will be disposed.
             * @param meshInstance An instance of the original joint mesh being used for the joint.
             * @param jointId The joint's index, see https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section for more info.
             * @param hand Which hand ("left", "right") the joint will be on.
             */
            onHandJointMeshGenerated?: (meshInstance: InstancedMesh, jointId: number, hand: XRHandedness) => AbstractMesh | undefined;
            /**
             * Should the source mesh stay visible (defaults to false).
             */
            keepOriginalVisible?: boolean;
            /**
             * Should each instance have its own physics impostor
             */
            enablePhysics?: boolean;
            /**
             * If enabled, override default physics properties
             */
            physicsProps?: {
                friction?: number;
                restitution?: number;
                impostorType?: number;
            };
            /**
             * Scale factor for all joint meshes (defaults to 1)
             */
            scaleFactor?: number;
        };
        /**
         * Configuration object for the hand meshes.
         */
        handMeshes?: {
            /**
             * Should the default hand mesh be disabled. In this case, the spheres will be visible (unless set invisible).
             */
            disableDefaultMeshes?: boolean;
            /**
             * Rigged hand meshes that will be tracked to the user's hands. This will override the default hand mesh.
             */
            customMeshes?: {
                right: AbstractMesh;
                left: AbstractMesh;
            };
            /**
             * Are the meshes prepared for a left-handed system. Default hand meshes are right-handed.
             */
            meshesUseLeftHandedCoordinates?: boolean;
            /**
             * If a hand mesh was provided, this array will define what axis will update which node. This will override the default hand mesh
             */
            customRigMappings?: {
                right: XRHandMeshRigMapping;
                left: XRHandMeshRigMapping;
            };
            /**
             * Override the colors of the hand meshes.
             */
            customColors?: {
                base?: Color3;
                fresnel?: Color3;
                fingerColor?: Color3;
                tipFresnel?: Color3;
            };
            /**
             * Define whether or not the hand meshes should be disposed on just invisible when the session ends.
             * Not setting, or setting to false, will maintain the hand meshes in the scene after the session ends, which will allow q quicker re-entry into XR.
             */
            disposeOnSessionEnd?: boolean;
            /**
             * Setting this will allow the developer to avoid loading the NME material and use the standard material instead.
             */
            disableHandShader?: boolean;
        };
    }
    /**
     * Parts of the hands divided to writs and finger names
     */
    export enum HandPart {
        /**
         * HandPart - Wrist
         */
        WRIST = "wrist",
        /**
         * HandPart - The thumb
         */
        THUMB = "thumb",
        /**
         * HandPart - Index finger
         */
        INDEX = "index",
        /**
         * HandPart - Middle finger
         */
        MIDDLE = "middle",
        /**
         * HandPart - Ring finger
         */
        RING = "ring",
        /**
         * HandPart - Little finger
         */
        LITTLE = "little"
    }
    /**
     * Joints of the hand as defined by the WebXR specification.
     * https://immersive-web.github.io/webxr-hand-input/#skeleton-joints-section
     */
    export enum WebXRHandJoint {
        /** Wrist */
        WRIST = "wrist",
        /** Thumb near wrist */
        THUMB_METACARPAL = "thumb-metacarpal",
        /** Thumb first knuckle */
        THUMB_PHALANX_PROXIMAL = "thumb-phalanx-proximal",
        /** Thumb second knuckle */
        THUMB_PHALANX_DISTAL = "thumb-phalanx-distal",
        /** Thumb tip */
        THUMB_TIP = "thumb-tip",
        /** Index finger near wrist */
        INDEX_FINGER_METACARPAL = "index-finger-metacarpal",
        /** Index finger first knuckle */
        INDEX_FINGER_PHALANX_PROXIMAL = "index-finger-phalanx-proximal",
        /** Index finger second knuckle */
        INDEX_FINGER_PHALANX_INTERMEDIATE = "index-finger-phalanx-intermediate",
        /** Index finger third knuckle */
        INDEX_FINGER_PHALANX_DISTAL = "index-finger-phalanx-distal",
        /** Index finger tip */
        INDEX_FINGER_TIP = "index-finger-tip",
        /** Middle finger near wrist */
        MIDDLE_FINGER_METACARPAL = "middle-finger-metacarpal",
        /** Middle finger first knuckle */
        MIDDLE_FINGER_PHALANX_PROXIMAL = "middle-finger-phalanx-proximal",
        /** Middle finger second knuckle */
        MIDDLE_FINGER_PHALANX_INTERMEDIATE = "middle-finger-phalanx-intermediate",
        /** Middle finger third knuckle */
        MIDDLE_FINGER_PHALANX_DISTAL = "middle-finger-phalanx-distal",
        /** Middle finger tip */
        MIDDLE_FINGER_TIP = "middle-finger-tip",
        /** Ring finger near wrist */
        RING_FINGER_METACARPAL = "ring-finger-metacarpal",
        /** Ring finger first knuckle */
        RING_FINGER_PHALANX_PROXIMAL = "ring-finger-phalanx-proximal",
        /** Ring finger second knuckle */
        RING_FINGER_PHALANX_INTERMEDIATE = "ring-finger-phalanx-intermediate",
        /** Ring finger third knuckle */
        RING_FINGER_PHALANX_DISTAL = "ring-finger-phalanx-distal",
        /** Ring finger tip */
        RING_FINGER_TIP = "ring-finger-tip",
        /** Pinky finger near wrist */
        PINKY_FINGER_METACARPAL = "pinky-finger-metacarpal",
        /** Pinky finger first knuckle */
        PINKY_FINGER_PHALANX_PROXIMAL = "pinky-finger-phalanx-proximal",
        /** Pinky finger second knuckle */
        PINKY_FINGER_PHALANX_INTERMEDIATE = "pinky-finger-phalanx-intermediate",
        /** Pinky finger third knuckle */
        PINKY_FINGER_PHALANX_DISTAL = "pinky-finger-phalanx-distal",
        /** Pinky finger tip */
        PINKY_FINGER_TIP = "pinky-finger-tip"
    }
    /** A type encapsulating a dictionary mapping WebXR joints to bone names in a rigged hand mesh.  */
    export type XRHandMeshRigMapping = {
        [webXRJointName in WebXRHandJoint]: string;
    };
    /**
     * Representing a single hand (with its corresponding native XRHand object)
     */
    export class WebXRHand implements IDisposable {
        /** The controller to which the hand correlates. */
        readonly xrController: WebXRInputSource;
        private readonly _jointMeshes;
        private _handMesh;
        /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),
         * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */
        readonly rigMapping: Nullable<XRHandMeshRigMapping>;
        private readonly _leftHandedMeshes;
        private readonly _jointsInvisible;
        private readonly _jointScaleFactor;
        /**
         * This observable will notify registered observers when the hand object has been set with a new mesh.
         * you can get the hand mesh using `webxrHand.handMesh`
         */
        onHandMeshSetObservable: Observable<WebXRHand>;
        private _scene;
        /**
         * Transform nodes that will directly receive the transforms from the WebXR matrix data.
         */
        private _jointTransforms;
        /**
         * The float array that will directly receive the transform matrix data from WebXR.
         */
        private _jointTransformMatrices;
        private _jointSpaces;
        private _tempJointMatrix;
        /**
         * The float array that will directly receive the joint radii from WebXR.
         */
        private _jointRadii;
        /**
         * The hand mesh's top-most parent, if any.
         */
        private _handMeshRoot;
        /**
         * Get the hand mesh.
         */
        get handMesh(): Nullable<AbstractMesh>;
        /**
         * Get meshes of part of the hand.
         * @param part The part of hand to get.
         * @returns An array of meshes that correlate to the hand part requested.
         */
        getHandPartMeshes(part: HandPart): AbstractMesh[];
        /**
         * Retrieves a mesh linked to a named joint in the hand.
         * @param jointName The name of the joint.
         * @returns An AbstractMesh whose position corresponds with the joint position.
         */
        getJointMesh(jointName: WebXRHandJoint): AbstractMesh;
        /**
         * Construct a new hand object
         * @param xrController The controller to which the hand correlates.
         * @param _jointMeshes The meshes to be used to track the hand joints.
         * @param _handMesh An optional hand mesh.
         * @param rigMapping An optional rig mapping for the hand mesh.
         *                   If not provided (but a hand mesh is provided),
         *                   it will be assumed that the hand mesh's bones are named
         *                   directly after the WebXR bone names.
         * @param _leftHandedMeshes Are the hand meshes left-handed-system meshes
         * @param _jointsInvisible Are the tracked joint meshes visible
         * @param _jointScaleFactor Scale factor for all joint meshes
         */
        constructor(
        /** The controller to which the hand correlates. */
        xrController: WebXRInputSource, _jointMeshes: AbstractMesh[], _handMesh: Nullable<AbstractMesh>, 
        /** An optional rig mapping for the hand mesh. If not provided (but a hand mesh is provided),
         * it will be assumed that the hand mesh's bones are named directly after the WebXR bone names. */
        rigMapping: Nullable<XRHandMeshRigMapping>, _leftHandedMeshes?: boolean, _jointsInvisible?: boolean, _jointScaleFactor?: number);
        /**
         * Sets the current hand mesh to render for the WebXRHand.
         * @param handMesh The rigged hand mesh that will be tracked to the user's hand.
         * @param rigMapping The mapping from XRHandJoint to bone names to use with the mesh.
         * @param _xrSessionManager The XRSessionManager used to initialize the hand mesh.
         */
        setHandMesh(handMesh: AbstractMesh, rigMapping: Nullable<XRHandMeshRigMapping>, _xrSessionManager?: WebXRSessionManager): void;
        /**
         * Update this hand from the latest xr frame.
         * @param xrFrame The latest frame received from WebXR.
         * @param referenceSpace The current viewer reference space.
         * @param xrCamera the xr camera, used for parenting
         */
        updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCamera: WebXRCamera): void;
        /**
         * Dispose this Hand object
         * @param disposeMeshes Should the meshes be disposed as well
         */
        dispose(disposeMeshes?: boolean): void;
    }
    /**
     * WebXR Hand Joint tracking feature, available for selected browsers and devices
     */
    export class WebXRHandTracking extends WebXRAbstractFeature {
        /** Options to use when constructing this feature. */
        readonly options: IWebXRHandTrackingOptions;
        /**
         * The module's name
         */
        static readonly Name: "xr-hand-tracking";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /** The base URL for the default hand model. */
        static DEFAULT_HAND_MODEL_BASE_URL: string;
        /** The filename to use for the default right hand model. */
        static DEFAULT_HAND_MODEL_RIGHT_FILENAME: string;
        /** The filename to use for the default left hand model. */
        static DEFAULT_HAND_MODEL_LEFT_FILENAME: string;
        /** The URL pointing to the default hand model NodeMaterial shader. */
        static DEFAULT_HAND_MODEL_SHADER_URL: string;
        private static readonly _ICOSPHERE_PARAMS;
        private static _RightHandGLB;
        private static _LeftHandGLB;
        private static _GenerateTrackedJointMeshes;
        private static _GenerateDefaultHandMeshesAsync;
        /**
         * Generates a mapping from XRHandJoint to bone name for the default hand mesh.
         * @param handedness The handedness being mapped for.
         * @returns A mapping from XRHandJoint to bone name.
         */
        private static _GenerateDefaultHandMeshRigMapping;
        private _attachedHands;
        private _trackingHands;
        private _handResources;
        private _worldScaleObserver?;
        /**
         * This observable will notify registered observers when a new hand object was added and initialized
         */
        onHandAddedObservable: Observable<WebXRHand>;
        /**
         * This observable will notify its observers right before the hand object is disposed
         */
        onHandRemovedObservable: Observable<WebXRHand>;
        private _originalMesh?;
        /**
         * Check if the needed objects are defined.
         * This does not mean that the feature is enabled, but that the objects needed are well defined.
         * @returns true if the needed objects for this feature are defined
         */
        isCompatible(): boolean;
        /**
         * Get the hand object according to the controller id
         * @param controllerId the controller id to which we want to get the hand
         * @returns null if not found or the WebXRHand object if found
         */
        getHandByControllerId(controllerId: string): Nullable<WebXRHand>;
        /**
         * Get a hand object according to the requested handedness
         * @param handedness the handedness to request
         * @returns null if not found or the WebXRHand object if found
         */
        getHandByHandedness(handedness: XRHandedness): Nullable<WebXRHand>;
        /**
         * Creates a new instance of the XR hand tracking feature.
         * @param _xrSessionManager An instance of WebXRSessionManager.
         * @param options Options to use when constructing this feature.
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /** Options to use when constructing this feature. */
        options: IWebXRHandTrackingOptions);
        /**
         * Attach this feature.
         * Will usually be called by the features manager.
         *
         * @returns true if successful.
         */
        attach(): boolean;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _attachHand;
        private _detachHandById;
        private _detachHand;
        /**
         * Detach this feature.
         * Will usually be called by the features manager.
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached.
         */
        dispose(): void;
    }
    /**
     * Register side effects for webXRHandTracking.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRHandTracking(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRHandTracking.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A babylon interface for a "WebXR" feature point.
     * Represents the position and confidence value of a given feature point.
     */
    export interface IWebXRFeaturePoint {
        /**
         * Represents the position of the feature point in world space.
         */
        position: Vector3;
        /**
         * Represents the confidence value of the feature point in world space. 0 being least confident, and 1 being most confident.
         */
        confidenceValue: number;
    }
    /**
     * The feature point system is used to detect feature points from real world geometry.
     * This feature is currently experimental and only supported on BabylonNative, and should not be used in the browser.
     * The newly introduced API can be seen in webxr.nativeextensions.d.ts and described in FeaturePoints.md.
     */
    export class WebXRFeaturePointSystem extends WebXRAbstractFeature {
        private _enabled;
        private _featurePointCloud;
        /**
         * The module's name
         */
        static readonly Name: "xr-feature-points";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Observers registered here will be executed whenever new feature points are added (on XRFrame while the session is tracking).
         * Will notify the observers about which feature points have been added.
         */
        readonly onFeaturePointsAddedObservable: Observable<number[]>;
        /**
         * Observers registered here will be executed whenever a feature point has been updated (on XRFrame while the session is tracking).
         * Will notify the observers about which feature points have been updated.
         */
        readonly onFeaturePointsUpdatedObservable: Observable<number[]>;
        /**
         * The current feature point cloud maintained across frames.
         */
        get featurePointCloud(): Array<IWebXRFeaturePoint>;
        /**
         * construct the feature point system
         * @param _xrSessionManager an instance of xr Session manager
         */
        constructor(_xrSessionManager: WebXRSessionManager);
        /**
         * Detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        /**
         * On receiving a new XR frame if this feature is attached notify observers new feature point data is available.
         * @param frame
         */
        protected _onXRFrame(frame: XRFrame): void;
        /**
         * Initializes the feature. If the feature point feature is not available for this environment do not mark the feature as enabled.
         */
        private _init;
    }
    /**
     * Register side effects for webXRFeaturePointSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRFeaturePointSystem(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRFeaturePointSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The WebXR Eye Tracking feature grabs eye data from the device and provides it in an easy-access format.
     * Currently only enabled for BabylonNative applications.
     */
    export class WebXREyeTracking extends WebXRAbstractFeature {
        private _latestEyeSpace;
        private _gazeRay;
        /**
         * The module's name
         */
        static readonly Name: "xr-eye-tracking";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * This observable will notify registered observers when eye tracking starts
         */
        readonly onEyeTrackingStartedObservable: Observable<Ray>;
        /**
         * This observable will notify registered observers when eye tracking ends
         */
        readonly onEyeTrackingEndedObservable: Observable<void>;
        /**
         * This observable will notify registered observers on each frame that has valid tracking
         */
        readonly onEyeTrackingFrameUpdateObservable: Observable<Ray>;
        /**
         * Creates a new instance of the XR eye tracking feature.
         * @param _xrSessionManager An instance of WebXRSessionManager.
         */
        constructor(_xrSessionManager: WebXRSessionManager);
        /**
         * Dispose this feature and all of the resources attached.
         */
        dispose(): void;
        /**
         * Returns whether the gaze data is valid or not
         * @returns true if the data is valid
         */
        get isEyeGazeValid(): boolean;
        /**
         * Get a reference to the gaze ray. This data is valid while eye tracking persists, and will be set to null when gaze data is no longer available
         * @returns a reference to the gaze ray if it exists and is valid, returns null otherwise.
         */
        getEyeGaze(): Nullable<Ray>;
        protected _onXRFrame(frame: XRFrame): void;
        private _eyeTrackingStartListener;
        private _eyeTrackingEndListener;
        private _init;
    }
    /**
     * Register side effects for webXREyeTracking.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXREyeTracking(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXREyeTracking.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export type WebXRDepthUsage = "cpu" | "gpu";
    export type WebXRDepthDataFormat = "ushort" | "float" | "luminance-alpha";
    /**
     * Options for Depth Sensing feature
     */
    export interface IWebXRDepthSensingOptions {
        /**
         *  The desired depth sensing usage for the session
         */
        usagePreference: WebXRDepthUsage[];
        /**
         * The desired depth sensing data format for the session
         */
        dataFormatPreference: WebXRDepthDataFormat[];
        /**
         * Depth sensing will be enabled on all materials per default, if the GPU variant is enabled.
         * If you just want to use the texture or the CPU variant instead set this to true.
         */
        disableDepthSensingOnMaterials?: boolean;
        /**
         * If set to true the occluded pixels will not be discarded but the pixel color will be changed based on the occlusion factor
         * Enabling this will lead to worse performance but slightly better outcome.
         * It is possible we will change this in the future to look even better.
         */
        useToleranceFactorForDepthSensing?: boolean;
        /**
         * If set to true the texture will be set to be used for visualization.
         * In this case it will probably NOT work correctly on the materials.
         * So be aware that, for the time being, you can only use one or the other.
         */
        prepareTextureForVisualization?: boolean;
    }
    type GetDepthInMetersType = (x: number, y: number) => number;
    /**
     * WebXR Feature for WebXR Depth Sensing Module
     * @since 5.49.1
     */
    export class WebXRDepthSensing extends WebXRAbstractFeature {
        readonly options: IWebXRDepthSensingOptions;
        private _width;
        private _height;
        private _rawValueToMeters;
        private _textureType;
        private _normDepthBufferFromNormView;
        private _cachedDepthBuffer;
        private _cachedWebGLTexture;
        private _cachedDepthImageTexture;
        private _onCameraObserver;
        /**
         * Width of depth data. If depth data is not exist, returns null.
         */
        get width(): Nullable<number>;
        /**
         * Height of depth data. If depth data is not exist, returns null.
         */
        get height(): Nullable<number>;
        /**
         * Scale factor by which the raw depth values must be multiplied in order to get the depths in meters.
         */
        get rawValueToMeters(): Nullable<number>;
        /**
         * An XRRigidTransform that needs to be applied when indexing into the depth buffer.
         */
        get normDepthBufferFromNormView(): Nullable<XRRigidTransform>;
        /**
         * Describes which depth-sensing usage ("cpu" or "gpu") is used.
         */
        get depthUsage(): WebXRDepthUsage;
        /**
         * Describes which depth sensing data format ("ushort" or "float") is used.
         */
        get depthDataFormat(): WebXRDepthDataFormat;
        /**
         * Latest cached InternalTexture which containing depth buffer information.
         * This can be used when the depth usage is "gpu".
         * @deprecated This will be removed in the future. Use latestDepthImageTexture
         */
        get latestInternalTexture(): Nullable<InternalTexture>;
        /**
         * cached depth buffer
         */
        get latestDepthBuffer(): Nullable<ArrayBufferView>;
        /**
         * Event that notify when `DepthInformation.getDepthInMeters` is available.
         * `getDepthInMeters` method needs active XRFrame (not available for cached XRFrame)
         */
        onGetDepthInMetersAvailable: Observable<GetDepthInMetersType>;
        /**
         * Latest cached Texture of depth image which is made from the depth buffer data.
         */
        get latestDepthImageTexture(): Nullable<RawTexture>;
        /**
         * XRWebGLBinding which is used for acquiring WebGLDepthInformation
         */
        private _glBinding?;
        /**
         * The module's name
         */
        static readonly Name: "xr-depth-sensing";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Creates a new instance of the depth sensing feature
         * @param _xrSessionManager the WebXRSessionManager
         * @param options options for WebXR Depth Sensing Feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, options: IWebXRDepthSensingOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         * @param force should attachment be forced (even when already attached)
         * @returns true if successful.
         */
        attach(force?: boolean): boolean;
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _updateDepthInformationAndTextureCPUDepthUsage;
        private _updateDepthInformationAndTextureWebGLDepthUsage;
        /**
         * Extends the session init object if needed
         * @returns augmentation object for the xr session init object.
         */
        getXRSessionInitExtension(): Promise<Partial<XRSessionInit>>;
        private _getInternalTextureFromDepthInfo;
    }
    /**
     * Register side effects for webXRDepthSensing.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRDepthSensing(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRDepthSensing.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options for DOM Overlay feature
     */
    export interface IWebXRDomOverlayOptions {
        /**
         * DOM Element or document query selector string for overlay.
         *
         * NOTE: UA may make this element background transparent in XR.
         */
        element: Element | string;
        /**
         * Supress XR Select events on container element (DOM blocks interaction to scene).
         */
        supressXRSelectEvents?: boolean;
    }
    /**
     * Type of DOM overlay provided by UA.
     */
    type WebXRDomOverlayType = 
    /**
     * Covers the entire physical screen for a screen-based device, for example handheld AR
     */
    "screen"
    /**
     * Appears as a floating rectangle in space
     */
     | "floating"
    /**
     * Follows the user’s head movement consistently, appearing similar to a HUD
     */
     | "head-locked";
    /**
     * DOM Overlay Feature
     *
     * @since 5.0.0
     */
    export class WebXRDomOverlay extends WebXRAbstractFeature {
        /**
         * options to use when constructing this feature
         */
        readonly options: IWebXRDomOverlayOptions;
        /**
         * Type of overlay - non-null when available
         */
        private _domOverlayType;
        /**
         * Event Listener to supress "beforexrselect" events.
         */
        private _beforeXRSelectListener;
        /**
         * Element used for overlay
         */
        private _element;
        /**
         * The module's name
         */
        static readonly Name: "xr-dom-overlay";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Creates a new instance of the dom-overlay feature
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param options options to use when constructing this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * options to use when constructing this feature
         */
        options: IWebXRDomOverlayOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * The type of DOM overlay (null when not supported).  Provided by UA and remains unchanged for duration of session.
         */
        get domOverlayType(): Nullable<WebXRDomOverlayType>;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        /**
         * Extends the session init object if needed
         * @returns augmentation object for the xr session init object.
         */
        getXRSessionInitExtension(): Promise<Partial<XRSessionInit>>;
    }
    /**
     * Register side effects for webXRDOMOverlay.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRDOMOverlay(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRDOMOverlay.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The options container for the teleportation module
     */
    export interface IWebXRTeleportationOptions {
        /**
         * if provided, this scene will be used to render meshes.
         */
        customUtilityLayerScene?: Scene;
        /**
         * Values to configure the default target mesh
         */
        defaultTargetMeshOptions?: {
            /**
             * Fill color of the teleportation area
             */
            teleportationFillColor?: string;
            /**
             * Border color for the teleportation area
             */
            teleportationBorderColor?: string;
            /**
             * Disable the mesh's animation sequence
             */
            disableAnimation?: boolean;
            /**
             * Disable lighting on the material or the ring and arrow
             */
            disableLighting?: boolean;
            /**
             * Override the default material of the torus and arrow
             */
            torusArrowMaterial?: Material;
            /**
             * Override the default material of the Landing Zone
             */
            teleportationCircleMaterial?: Material;
        };
        /**
         * A list of meshes to use as floor meshes.
         * Meshes can be added and removed after initializing the feature using the
         * addFloorMesh and removeFloorMesh functions
         * If empty, rotation will still work
         */
        floorMeshes?: AbstractMesh[];
        /**
         *  use this rendering group id for the meshes (optional)
         */
        renderingGroupId?: number;
        /**
         * Should teleportation move only to snap points
         */
        snapPointsOnly?: boolean;
        /**
         * An array of points to which the teleportation will snap to.
         * If the teleportation ray is in the proximity of one of those points, it will be corrected to this point.
         */
        snapPositions?: Vector3[];
        /**
         * How close should the teleportation ray be in order to snap to position.
         * Default to 0.8 units (meters)
         */
        snapToPositionRadius?: number;
        /**
         * Provide your own teleportation mesh instead of babylon's wonderful doughnut.
         * If you want to support rotation, make sure your mesh has a direction indicator.
         *
         * When left untouched, the default mesh will be initialized.
         */
        teleportationTargetMesh?: AbstractMesh;
        /**
         * If main component is used (no thumbstick), how long in milliseconds should the "long press" take before teleport. Defaults to 3 seconds
         */
        timeToTeleport?: number;
        /**
         * If the main component is used, how long in milliseconds should the "long press" take before teleport starts. Defaults to 0
         */
        timeToTeleportStart?: number;
        /**
         * Disable using the thumbstick and use the main component (usually trigger) on long press.
         * This will be automatically true if the controller doesn't have a thumbstick or touchpad.
         */
        useMainComponentOnly?: boolean;
        /**
         * Should meshes created here be added to a utility layer or the main scene
         */
        useUtilityLayer?: boolean;
        /**
         * Babylon XR Input class for controller
         */
        xrInput: WebXRInput;
        /**
         * Meshes that the teleportation ray cannot go through
         */
        pickBlockerMeshes?: AbstractMesh[];
        /**
         * define an optional predicate to select which meshes should block the teleportation ray
         */
        blockerMeshesPredicate?: (mesh: AbstractMesh) => boolean;
        /**
         * Should the teleportation ray be blocked by all of the scene's pickable meshes?
         * Defaults to false
         */
        blockAllPickableMeshes?: boolean;
        /**
         * Color of the teleportation ray when it is blocked by a mesh in the pickBlockerMeshes array
         * Defaults to red.
         */
        blockedRayColor?: Color4;
        /**
         * Should teleport work only on a specific hand?
         */
        forceHandedness?: XRHandedness;
        /**
         * If provided, this function will be used to generate the ray mesh instead of the lines mesh being used per default
         */
        generateRayPathMesh?: (points: Vector3[], pickingInfo: PickingInfo) => AbstractMesh;
    }
    /**
     * This is a teleportation feature to be used with WebXR-enabled motion controllers.
     * When enabled and attached, the feature will allow a user to move around and rotate in the scene using
     * the input of the attached controllers.
     */
    export class WebXRMotionControllerTeleportation extends WebXRAbstractFeature {
        private _options;
        private _controllers;
        private _currentTeleportationControllerId;
        private _floorMeshes;
        private _quadraticBezierCurve;
        private _selectionFeature;
        private _snapToPositions;
        private _snappedToPoint;
        private _teleportationRingMaterial?;
        private _blockedRayColor;
        private _cachedColor4White;
        private _tmpRay;
        private _tmpVector;
        private _tmpQuaternion;
        private _worldScaleObserver?;
        /**
         * Skip the next teleportation. This can be controlled by the user to prevent the user from teleportation
         * to sections that are not yet "unlocked", but should still show the teleportation mesh.
         */
        skipNextTeleportation: boolean;
        /**
         * The module's name
         */
        static readonly Name: "xr-controller-teleportation";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the webxr specs version
         */
        static readonly Version = 1;
        /**
         * Is movement backwards enabled
         */
        backwardsMovementEnabled: boolean;
        /**
         * Distance to travel when moving backwards
         */
        backwardsTeleportationDistance: number;
        /**
         * The distance from the user to the inspection point in the direction of the controller
         * A higher number will allow the user to move further
         * defaults to 5 (meters, in xr units)
         */
        parabolicCheckRadius: number;
        /**
         * Should the module support parabolic ray on top of direct ray
         * If enabled, the user will be able to point "at the sky" and move according to predefined radius distance
         * Very helpful when moving between floors / different heights
         */
        parabolicRayEnabled: boolean;
        /**
         * The second type of ray - straight line.
         * Should it be enabled or should the parabolic line be the only one.
         */
        straightRayEnabled: boolean;
        /**
         * How much rotation should be applied when rotating right and left
         */
        rotationAngle: number;
        /**
         * This observable will notify when the target mesh position was updated.
         * The picking info it provides contains the point to which the target mesh will move ()
         */
        onTargetMeshPositionUpdatedObservable: Observable<PickingInfo>;
        /**
         * Is teleportation enabled. Can be used to allow rotation only.
         */
        teleportationEnabled: boolean;
        private _rotationEnabled;
        /**
         * Observable raised before camera rotation
         */
        onBeforeCameraTeleportRotation: Observable<number>;
        /**
         *  Observable raised after camera rotation
         */
        onAfterCameraTeleportRotation: Observable<Quaternion>;
        /**
         * Observable raised before camera teleportation
         */
        onBeforeCameraTeleport: Observable<Vector3>;
        /**
         *  Observable raised after camera teleportation
         */
        onAfterCameraTeleport: Observable<Vector3>;
        /**
         * Is rotation enabled when moving forward?
         * Disabling this feature will prevent the user from deciding the direction when teleporting
         */
        get rotationEnabled(): boolean;
        /**
         * Sets whether rotation is enabled or not
         * @param enabled is rotation enabled when teleportation is shown
         */
        set rotationEnabled(enabled: boolean);
        /**
         * Exposes the currently set teleportation target mesh.
         */
        get teleportationTargetMesh(): Nullable<AbstractMesh>;
        /**
         * constructs a new teleportation system
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param _options configuration object for this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options: IWebXRTeleportationOptions);
        /**
         * Get the snapPointsOnly flag
         */
        get snapPointsOnly(): boolean;
        /**
         * Sets the snapPointsOnly flag
         * @param snapToPoints should teleportation be exclusively to snap points
         */
        set snapPointsOnly(snapToPoints: boolean);
        /**
         * Add a new mesh to the floor meshes array
         * @param mesh the mesh to use as floor mesh
         */
        addFloorMesh(mesh: AbstractMesh): void;
        /**
         * Add a mesh to the list of meshes blocking the teleportation ray
         * @param mesh The mesh to add to the teleportation-blocking meshes
         */
        addBlockerMesh(mesh: AbstractMesh): void;
        /**
         * Add a new snap-to point to fix teleportation to this position
         * @param newSnapPoint The new Snap-To point
         */
        addSnapPoint(newSnapPoint: Vector3): void;
        attach(): boolean;
        detach(): boolean;
        dispose(): void;
        /**
         * Remove a mesh from the floor meshes array
         * @param mesh the mesh to remove
         */
        removeFloorMesh(mesh: AbstractMesh): void;
        /**
         * Remove a mesh from the blocker meshes array
         * @param mesh the mesh to remove
         */
        removeBlockerMesh(mesh: AbstractMesh): void;
        /**
         * Remove a mesh from the floor meshes array using its name
         * @param name the mesh name to remove
         */
        removeFloorMeshByName(name: string): void;
        /**
         * This function will iterate through the array, searching for this point or equal to it. It will then remove it from the snap-to array
         * @param snapPointToRemove the point (or a clone of it) to be removed from the array
         * @returns was the point found and removed or not
         */
        removeSnapPoint(snapPointToRemove: Vector3): boolean;
        /**
         * This function sets a selection feature that will be disabled when
         * the forward ray is shown and will be reattached when hidden.
         * This is used to remove the selection rays when moving.
         * @param selectionFeature the feature to disable when forward movement is enabled
         */
        setSelectionFeature(selectionFeature: Nullable<IWebXRFeature>): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _attachController;
        private _createDefaultTargetMesh;
        private _detachController;
        private _findClosestSnapPointWithRadius;
        private _setTargetMeshPosition;
        private _setTargetMeshVisibility;
        /**
         * Computes the parabolic ray origin and direction for teleportation.
         * The effective radius scales with the horizontal component of the controller direction,
         * so pointing more vertically results in shorter landing distances.
         * Note: the actual landing distance also depends on controller height above the floor;
         * `parabolicCheckRadius` controls the forward offset, not a strict max ground distance.
         * Modifies the ray in place — the new origin serves as both the raycast start
         * and the Bezier control point for the visual arc.
         * @param ray - The controller ray (origin at controller, direction is forward). Modified in place.
         * @param tmpVector - Pre-allocated temporary vector for computation. Modified in place.
         * @returns true if the parabolic ray was computed, false if direction is too vertical
         */
        private _buildParabolicRay;
        private _disposeBezierCurve;
        private _colorArray;
        private _showParabolicPath;
        private _teleportForward;
    }
    /**
     * Register side effects for webXRControllerTeleportation.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRControllerTeleportation(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRControllerTeleportation.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options interface for the pointer selection module
     */
    export interface IWebXRControllerPointerSelectionOptions {
        /**
         * if provided, this scene will be used to render meshes.
         */
        customUtilityLayerScene?: Scene;
        /**
         * Disable the pointer up event when the xr controller in screen and gaze mode is disposed (meaning - when the user removed the finger from the screen)
         * If not disabled, the last picked point will be used to execute a pointer up event
         * If disabled, pointer up event will be triggered right after the pointer down event.
         * Used in screen and gaze target ray mode only
         */
        disablePointerUpOnTouchOut: boolean;
        /**
         * For gaze mode for tracked-pointer / controllers (time to select instead of button press)
         */
        forceGazeMode: boolean;
        /**
         * Factor to be applied to the pointer-moved function in the gaze mode. How sensitive should the gaze mode be when checking if the pointer moved
         * to start a new countdown to the pointer down event.
         * Defaults to 1.
         */
        gazeModePointerMovedFactor?: number;
        /**
         * Different button type to use instead of the main component
         */
        overrideButtonId?: string;
        /**
         *  use this rendering group id for the meshes (optional)
         */
        renderingGroupId?: number;
        /**
         * The amount of time in milliseconds it takes between pick found something to a pointer down event.
         * Used in gaze modes. Tracked pointer uses the trigger, screen uses touch events
         * 3000 means 3 seconds between pointing at something and selecting it
         */
        timeToSelect?: number;
        /**
         * Should meshes created here be added to a utility layer or the main scene
         */
        useUtilityLayer?: boolean;
        /**
         * Optional WebXR camera to be used for gaze selection
         */
        gazeCamera?: WebXRCamera;
        /**
         * the xr input to use with this pointer selection
         */
        xrInput: WebXRInput;
        /**
         * Should the scene pointerX and pointerY update be disabled
         * This is required for fullscreen AR GUI, but might slow down other experiences.
         * Disable in VR, if not needed.
         * The first rig camera (left eye) will be used to calculate the projection
         */
        disableScenePointerVectorUpdate: boolean;
        /**
         * Enable pointer selection on all controllers instead of switching between them
         */
        enablePointerSelectionOnAllControllers?: boolean;
        /**
         * The preferred hand to give the pointer selection to. This will be prioritized when the controller initialize.
         * If switch is enabled, it will still allow the user to switch between the different controllers
         */
        preferredHandedness?: XRHandedness;
        /**
         * Disable switching the pointer selection from one controller to the other.
         * If the preferred hand is set it will be fixed on this hand, and if not it will be fixed on the first controller added to the scene
         */
        disableSwitchOnClick?: boolean;
        /**
         * The maximum distance of the pointer selection feature. Defaults to 100.
         */
        maxPointerDistance?: number;
        /**
         * A function that will be called when a new selection mesh is generated.
         * This function should return a mesh that will be used as the selection mesh.
         * The default is a torus with a 0.01 diameter and 0.0075 thickness .
         */
        customSelectionMeshGenerator?: () => Mesh;
        /**
         * A function that will be called when a new laser pointer mesh is generated.
         * This function should return a mesh that will be used as the laser pointer mesh.
         * The height (y) of the mesh must be 1.
         */
        customLasterPointerMeshGenerator?: () => AbstractMesh;
        /**
         * Use the grip space instead of the pointer space for selection, if available.
         */
        forceGripIfAvailable?: boolean;
        /**
         * If set to true, the hand rays will be disabled and the user will be able to look and pick objects.
         * This requires system support (like in the vision OS) and will not work in all systems.
         * @experimental - this is an experimental feature and might change int he future
         */
        lookAndPickMode?: boolean;
    }
    /**
     * A module that will enable pointer selection for motion controllers of XR Input Sources
     */
    export class WebXRControllerPointerSelection extends WebXRAbstractFeature {
        private readonly _options;
        private static _IdCounter;
        private _attachController;
        private _controllers;
        private _scene;
        private _tmpVectorForPickCompare;
        private _attachedController;
        /**
         * The module's name
         */
        static readonly Name: "xr-controller-pointer-selection";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Disable lighting on the laser pointer (so it will always be visible)
         */
        disablePointerLighting: boolean;
        /**
         * Disable lighting on the selection mesh (so it will always be visible)
         */
        disableSelectionMeshLighting: boolean;
        /**
         * Should the laser pointer be displayed
         */
        displayLaserPointer: boolean;
        /**
         * Should the selection mesh be displayed (The ring at the end of the laser pointer)
         */
        displaySelectionMesh: boolean;
        /**
         * This color will be set to the laser pointer when selection is triggered
         */
        laserPointerPickedColor: Color3;
        /**
         * Default color of the laser pointer
         */
        laserPointerDefaultColor: Color3;
        /**
         * default color of the selection ring
         */
        selectionMeshDefaultColor: Color3;
        /**
         * This color will be applied to the selection ring when selection is triggered
         */
        selectionMeshPickedColor: Color3;
        /**
         * Optional filter to be used for ray selection.  This predicate shares behavior with
         * scene.pointerMovePredicate which takes priority if it is also assigned.
         */
        raySelectionPredicate: (mesh: AbstractMesh) => boolean;
        /**
         * constructs a new background remover module
         * @param _xrSessionManager the session manager for this module
         * @param _options read-only options to be used in this module
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options: IWebXRControllerPointerSelectionOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Will get the mesh under a specific pointer.
         * `scene.meshUnderPointer` will only return one mesh - either left or right.
         * @param controllerId the controllerId to check
         * @returns The mesh under pointer or null if no mesh is under the pointer
         */
        getMeshUnderPointer(controllerId: string): Nullable<AbstractMesh>;
        /**
         * Get the unique id of the currently attached (active) controller for pointer selection.
         * When `enablePointerSelectionOnAllControllers` is true, this value is not meaningful
         * because all controllers are active simultaneously.
         * @returns the unique id of the attached controller, or an empty string if none is attached
         */
        get attachedControllerId(): string;
        /**
         * Set the active controller for pointer selection during an XR session.
         * Accepts either an `XRHandedness` value (`"left"`, `"right"`, `"none"`) to select
         * the first matching controller, or a controller unique id string for precise control.
         *
         * When a matching controller is found, any in-progress pointer-down state on the
         * previously active controller is properly resolved (pointer-up is simulated).
         *
         * This also updates the `preferredHandedness` option so that if controllers are
         * re-initialized (e.g. on disconnect/reconnect), the new preference persists.
         *
         * This method is a no-op when `enablePointerSelectionOnAllControllers` is true,
         * since all controllers are active simultaneously in that mode.
         *
         * @param controllerId the XRHandedness (`"left"`, `"right"`, `"none"`) or the unique id of the controller to attach
         * @returns true if the active controller was changed, false otherwise
         */
        setAttachedController(controllerId: XRHandedness | string): boolean;
        /**
         * Get the xr controller that correlates to the pointer id in the pointer event
         *
         * @param id the pointer id to search for
         * @returns the controller that correlates to this id or null if not found
         */
        getXRControllerByPointerId(id: number): Nullable<WebXRInputSource>;
        /**
         * @internal
         */
        _getPointerSelectionDisabledByPointerId(id: number): boolean;
        /**
         * @internal
         */
        _setPointerSelectionDisabledByPointerId(id: number, state: boolean): void;
        private _identityMatrix;
        private _screenCoordinatesRef;
        private _viewportRef;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private get _utilityLayerScene();
        private _attachGazeMode;
        private _attachScreenRayMode;
        private _attachTrackedPointerRayMode;
        private _convertNormalToDirectionOfRay;
        private _detachController;
        private _generateNewMeshPair;
        private _pickingMoved;
        private _updatePointerDistance;
        private _augmentPointerInit;
        /** @internal */
        get lasterPointerDefaultColor(): Color3;
    }
    /**
     * Register side effects for webXRControllerPointerSelection.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRControllerPointerSelection(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRControllerPointerSelection.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options for the controller physics feature
     */
    export class IWebXRControllerPhysicsOptions {
        /**
         * Should the headset get its own impostor
         */
        enableHeadsetImpostor?: boolean;
        /**
         * Optional parameters for the headset impostor
         */
        headsetImpostorParams?: {
            /**
             * The type of impostor to create. Default is sphere
             */
            impostorType: number;
            /**
             * the size of the impostor. Defaults to 10cm
             */
            impostorSize?: number | {
                width: number;
                height: number;
                depth: number;
            };
            /**
             * Friction definitions
             */
            friction?: number;
            /**
             * Restitution
             */
            restitution?: number;
        };
        /**
         * The physics properties of the future impostors
         */
        physicsProperties?: {
            /**
             * If set to true, a mesh impostor will be created when the controller mesh was loaded
             * Note that this requires a physics engine that supports mesh impostors!
             */
            useControllerMesh?: boolean;
            /**
             * The type of impostor to create. Default is sphere
             */
            impostorType?: number;
            /**
             * the size of the impostor. Defaults to 10cm
             */
            impostorSize?: number | {
                width: number;
                height: number;
                depth: number;
            };
            /**
             * Friction definitions
             */
            friction?: number;
            /**
             * Restitution
             */
            restitution?: number;
        };
        /**
         * the xr input to use with this pointer selection
         */
        xrInput: WebXRInput;
    }
    /**
     * Add physics impostor to your webxr controllers,
     * including naive calculation of their linear and angular velocity
     */
    export class WebXRControllerPhysics extends WebXRAbstractFeature {
        private readonly _options;
        private _attachController;
        private _attachControllerV1;
        private _attachControllerV2;
        private _mapImpostorTypeToShapeType;
        private _createPhysicsImpostor;
        private _createPhysicsAggregate;
        private _controllers;
        private _debugMode;
        private _delta;
        private _headsetImpostor?;
        private _headsetMesh?;
        private _headsetAggregateV2?;
        private _lastTimestamp;
        private _physicsVersion;
        private _tmpQuaternion;
        private _tmpVector;
        /**
         * The module's name
         */
        static readonly Name: "xr-physics-controller";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the webxr specs version
         */
        static readonly Version = 2;
        /**
         * Construct a new Controller Physics Feature
         * @param _xrSessionManager the corresponding xr session manager
         * @param _options options to create this feature with
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options: IWebXRControllerPhysicsOptions);
        /**
         * @internal
         * enable debugging - will show console outputs and the impostor mesh
         */
        _enablePhysicsDebug(): void;
        /**
         * Manually add a controller (if no xrInput was provided or physics engine was not enabled)
         * @param xrController the controller to add
         */
        addController(xrController: WebXRInputSource): void;
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Get the headset impostor, if enabled
         * @returns the impostor
         */
        getHeadsetImpostor(): PhysicsImpostor | undefined;
        /**
         * Get the physics impostor of a specific controller.
         * The impostor is not attached to a mesh because a mesh for each controller is not obligatory
         * @param controller the controller or the controller id of which to get the impostor
         * @returns the impostor or null
         */
        getImpostorForController(controller: WebXRInputSource | string): Nullable<PhysicsImpostor>;
        /**
         * Get the physics aggregate for a controller (v2 only)
         * @param controller the controller or the controller id
         * @returns the aggregate or null
         */
        getPhysicsAggregateForController(controller: WebXRInputSource | string): Nullable<PhysicsAggregate>;
        /**
         * Get the physics body for a controller (v2 only)
         * @param controller the controller or the controller id
         * @returns the physics body or null
         */
        getPhysicsBodyForController(controller: WebXRInputSource | string): Nullable<PhysicsBody>;
        /**
         * Get the headset physics aggregate (v2 only)
         * @returns the physics aggregate or null
         */
        getHeadsetPhysicsAggregate(): Nullable<PhysicsAggregate>;
        /**
         * Update the physics properties provided in the constructor
         * @param newProperties the new properties object
         * @param newProperties.impostorType
         * @param newProperties.impostorSize
         * @param newProperties.friction
         * @param newProperties.restitution
         */
        setPhysicsProperties(newProperties: {
            impostorType?: number;
            impostorSize?: number | {
                width: number;
                height: number;
                depth: number;
            };
            friction?: number;
            restitution?: number;
        }): void;
        protected _onXRFrame(_xrFrame: any): void;
        private _onXRFrameV1;
        private _onXRFrameV2;
        private _enableHeadsetPhysicsV1;
        private _enableHeadsetPhysicsV2;
        private _detachController;
    }
    /**
     * Register side effects for webXRControllerPhysics.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRControllerPhysics(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRControllerPhysics.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The options container for the controller movement module
     */
    export interface IWebXRControllerMovementOptions {
        /**
         * Override default behaviour and provide your own movement controls
         */
        customRegistrationConfigurations?: WebXRControllerMovementRegistrationConfiguration[];
        /**
         * Is movement enabled
         */
        movementEnabled?: boolean;
        /**
         * Camera direction follows view pose and movement by default will move independently of the viewer's pose.
         */
        movementOrientationFollowsViewerPose: boolean;
        /**
         * Movement speed factor (default is 1.0)
         */
        movementSpeed?: number;
        /**
         * Minimum threshold the controller's thumbstick/touchpad must pass before being recognized for movement (avoids jitter/unintentional movement)
         */
        movementThreshold?: number;
        /**
         * Is rotation enabled
         */
        rotationEnabled?: boolean;
        /**
         * Minimum threshold the controller's thumstick/touchpad must pass before being recognized for rotation (avoids jitter/unintentional rotation)
         */
        rotationThreshold?: number;
        /**
         * Movement speed factor (default is 1.0)
         */
        rotationSpeed?: number;
        /**
         * Babylon XR Input class for controller
         */
        xrInput: WebXRInput;
        /**
         * If movement orientation should follow controller orientation instead of viewer pose.
         * Make sure to set movementOrientationFollowsViewerPose to false, otherwise it will be ignored.
         */
        movementOrientationFollowsController: boolean;
        /**
         * If orientation follows the controller, this is the preferred handedness to use for forward movement.
         * If not set (or handedness not found), the handedness will be selected by the controller triggering the movement.
         * Note that this only works if movementOrientationFollowsController is true.
         */
        orientationPreferredHandedness?: XRHandedness;
    }
    /**
     * Feature context is used in handlers and on each XR frame to control the camera movement/direction.
     */
    export type WebXRControllerMovementFeatureContext = {
        movementEnabled: boolean;
        movementOrientationFollowsViewerPose: boolean;
        movementOrientationFollowsController: boolean;
        orientationPreferredHandedness?: XRHandedness;
        movementSpeed: number;
        movementThreshold: number;
        rotationEnabled: boolean;
        rotationSpeed: number;
        rotationThreshold: number;
    };
    /**
     * Current state of Movements shared across components and handlers.
     */
    export type WebXRControllerMovementState = {
        moveX: number;
        moveY: number;
        rotateX: number;
        rotateY: number;
    };
    /**
     * Button of Axis Handler must be specified.
     */
    export type WebXRControllerMovementRegistrationConfiguration = {
        /**
         * handlers are filtered to these types only
         */
        allowedComponentTypes?: MotionControllerComponentType[];
        /**
         * For registering movement to specific hand only.  Useful if your app has a "main hand" and "off hand" for determining the functionality of a controller.
         */
        forceHandedness?: XRHandedness;
        /**
         * For main component only (useful for buttons and may not trigger axis changes).
         */
        mainComponentOnly?: boolean;
        /**
         * Additional predicate to apply to controllers to restrict a handler being added.
         */
        componentSelectionPredicate?: (xrController: WebXRInputSource) => Nullable<WebXRControllerComponent>;
    } & ({
        /**
         * Called when axis changes occur.
         */
        axisChangedHandler: (axes: IWebXRMotionControllerAxesValue, movementState: WebXRControllerMovementState, featureContext: WebXRControllerMovementFeatureContext, xrInput: WebXRInput) => void;
    } | {
        /**
         * Called when the button state changes.
         */
        buttonChangedHandler: (pressed: IWebXRMotionControllerComponentChangesValues<boolean>, movementState: WebXRControllerMovementState, featureContext: WebXRControllerMovementFeatureContext, xrInput: WebXRInput) => void;
    });
    /**
     * This is a movement feature to be used with WebXR-enabled motion controllers.
     * When enabled and attached, the feature will allow a user to move around and rotate in the scene using
     * the input of the attached controllers.
     */
    export class WebXRControllerMovement extends WebXRAbstractFeature {
        private _controllers;
        private _currentRegistrationConfigurations;
        private _featureContext;
        private _movementDirection;
        private _movementState;
        private _xrInput;
        private _tmpRotationMatrix;
        private _tmpTranslationDirection;
        private _tmpMovementTranslation;
        private _tempCacheQuaternion;
        /**
         * The module's name
         */
        static readonly Name: "xr-controller-movement";
        /**
         * Standard controller configurations.
         */
        static readonly REGISTRATIONS: {
            [key: string]: WebXRControllerMovementRegistrationConfiguration[];
        };
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the webxr specs version
         */
        static readonly Version = 1;
        /**
         * Current movement direction.  Will be null before XR Frames have been processed.
         */
        get movementDirection(): Quaternion;
        /**
         * Is movement enabled
         */
        get movementEnabled(): boolean;
        /**
         * Sets whether movement is enabled or not
         * @param enabled is movement enabled
         */
        set movementEnabled(enabled: boolean);
        /**
         * If movement follows viewer pose
         */
        get movementOrientationFollowsViewerPose(): boolean;
        /**
         * Sets whether movement follows viewer pose
         * @param followsPose is movement should follow viewer pose
         */
        set movementOrientationFollowsViewerPose(followsPose: boolean);
        /**
         * Gets movement speed
         */
        get movementSpeed(): number;
        /**
         * Sets movement speed
         * @param movementSpeed movement speed
         */
        set movementSpeed(movementSpeed: number);
        /**
         * Gets minimum threshold the controller's thumbstick/touchpad must pass before being recognized for movement (avoids jitter/unintentional movement)
         */
        get movementThreshold(): number;
        /**
         * Sets minimum threshold the controller's thumbstick/touchpad must pass before being recognized for movement (avoids jitter/unintentional movement)
         * @param movementThreshold new threshold
         */
        set movementThreshold(movementThreshold: number);
        /**
         * Is rotation enabled
         */
        get rotationEnabled(): boolean;
        /**
         * Sets whether rotation is enabled or not
         * @param enabled is rotation enabled
         */
        set rotationEnabled(enabled: boolean);
        /**
         * Gets rotation speed factor
         */
        get rotationSpeed(): number;
        /**
         * Sets rotation speed factor (1.0 is default)
         * @param rotationSpeed new rotation speed factor
         */
        set rotationSpeed(rotationSpeed: number);
        /**
         * Gets minimum threshold the controller's thumbstick/touchpad must pass before being recognized for rotation (avoids jitter/unintentional rotation)
         */
        get rotationThreshold(): number;
        /**
         * Sets minimum threshold the controller's thumbstick/touchpad must pass before being recognized for rotation (avoids jitter/unintentional rotation)
         * @param threshold new threshold
         */
        set rotationThreshold(threshold: number);
        /**
         * constructs a new movement controller system
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param options configuration object for this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, options: IWebXRControllerMovementOptions);
        attach(): boolean;
        detach(): boolean;
        /**
         * Occurs on every XR frame.
         * @param _xrFrame
         */
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _attachController;
        private _detachController;
    }
    /**
     * Register side effects for webXRControllerMovement.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRControllerMovement(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRControllerMovement.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * All 83 body joint names as defined by the WebXR Body Tracking specification.
     * @see https://immersive-web.github.io/body-tracking/#xrbody-interface
     */
    export enum WebXRBodyJoint {
        /** The center of the hips / pelvis */
        HIPS = "hips",
        /** Lower spine (lumbar) */
        SPINE_LOWER = "spine-lower",
        /** Middle spine (thoracic) */
        SPINE_MIDDLE = "spine-middle",
        /** Upper spine */
        SPINE_UPPER = "spine-upper",
        /** Chest */
        CHEST = "chest",
        /** Neck */
        NECK = "neck",
        /** Head */
        HEAD = "head",
        /** Left shoulder */
        LEFT_SHOULDER = "left-shoulder",
        /** Left scapula */
        LEFT_SCAPULA = "left-scapula",
        /** Left upper arm */
        LEFT_ARM_UPPER = "left-arm-upper",
        /** Left forearm (lower arm) */
        LEFT_ARM_LOWER = "left-arm-lower",
        /** Left hand wrist twist (forearm twist) */
        LEFT_HAND_WRIST_TWIST = "left-hand-wrist-twist",
        /** Right shoulder */
        RIGHT_SHOULDER = "right-shoulder",
        /** Right scapula */
        RIGHT_SCAPULA = "right-scapula",
        /** Right upper arm */
        RIGHT_ARM_UPPER = "right-arm-upper",
        /** Right forearm (lower arm) */
        RIGHT_ARM_LOWER = "right-arm-lower",
        /** Right hand wrist twist (forearm twist) */
        RIGHT_HAND_WRIST_TWIST = "right-hand-wrist-twist",
        /** Left palm center */
        LEFT_HAND_PALM = "left-hand-palm",
        /** Left wrist */
        LEFT_HAND_WRIST = "left-hand-wrist",
        /** Left thumb metacarpal */
        LEFT_HAND_THUMB_METACARPAL = "left-hand-thumb-metacarpal",
        /** Left thumb proximal phalanx */
        LEFT_HAND_THUMB_PHALANX_PROXIMAL = "left-hand-thumb-phalanx-proximal",
        /** Left thumb distal phalanx */
        LEFT_HAND_THUMB_PHALANX_DISTAL = "left-hand-thumb-phalanx-distal",
        /** Left thumb tip */
        LEFT_HAND_THUMB_TIP = "left-hand-thumb-tip",
        /** Left index finger metacarpal */
        LEFT_HAND_INDEX_METACARPAL = "left-hand-index-metacarpal",
        /** Left index finger proximal phalanx */
        LEFT_HAND_INDEX_PHALANX_PROXIMAL = "left-hand-index-phalanx-proximal",
        /** Left index finger intermediate phalanx */
        LEFT_HAND_INDEX_PHALANX_INTERMEDIATE = "left-hand-index-phalanx-intermediate",
        /** Left index finger distal phalanx */
        LEFT_HAND_INDEX_PHALANX_DISTAL = "left-hand-index-phalanx-distal",
        /** Left index finger tip */
        LEFT_HAND_INDEX_TIP = "left-hand-index-tip",
        /** Left middle finger metacarpal */
        LEFT_HAND_MIDDLE_METACARPAL = "left-hand-middle-metacarpal",
        /** Left middle finger proximal phalanx */
        LEFT_HAND_MIDDLE_PHALANX_PROXIMAL = "left-hand-middle-phalanx-proximal",
        /** Left middle finger intermediate phalanx */
        LEFT_HAND_MIDDLE_PHALANX_INTERMEDIATE = "left-hand-middle-phalanx-intermediate",
        /** Left middle finger distal phalanx */
        LEFT_HAND_MIDDLE_PHALANX_DISTAL = "left-hand-middle-phalanx-distal",
        /** Left middle finger tip */
        LEFT_HAND_MIDDLE_TIP = "left-hand-middle-tip",
        /** Left ring finger metacarpal */
        LEFT_HAND_RING_METACARPAL = "left-hand-ring-metacarpal",
        /** Left ring finger proximal phalanx */
        LEFT_HAND_RING_PHALANX_PROXIMAL = "left-hand-ring-phalanx-proximal",
        /** Left ring finger intermediate phalanx */
        LEFT_HAND_RING_PHALANX_INTERMEDIATE = "left-hand-ring-phalanx-intermediate",
        /** Left ring finger distal phalanx */
        LEFT_HAND_RING_PHALANX_DISTAL = "left-hand-ring-phalanx-distal",
        /** Left ring finger tip */
        LEFT_HAND_RING_TIP = "left-hand-ring-tip",
        /** Left little finger metacarpal */
        LEFT_HAND_LITTLE_METACARPAL = "left-hand-little-metacarpal",
        /** Left little finger proximal phalanx */
        LEFT_HAND_LITTLE_PHALANX_PROXIMAL = "left-hand-little-phalanx-proximal",
        /** Left little finger intermediate phalanx */
        LEFT_HAND_LITTLE_PHALANX_INTERMEDIATE = "left-hand-little-phalanx-intermediate",
        /** Left little finger distal phalanx */
        LEFT_HAND_LITTLE_PHALANX_DISTAL = "left-hand-little-phalanx-distal",
        /** Left little finger tip */
        LEFT_HAND_LITTLE_TIP = "left-hand-little-tip",
        /** Right palm center */
        RIGHT_HAND_PALM = "right-hand-palm",
        /** Right wrist */
        RIGHT_HAND_WRIST = "right-hand-wrist",
        /** Right thumb metacarpal */
        RIGHT_HAND_THUMB_METACARPAL = "right-hand-thumb-metacarpal",
        /** Right thumb proximal phalanx */
        RIGHT_HAND_THUMB_PHALANX_PROXIMAL = "right-hand-thumb-phalanx-proximal",
        /** Right thumb distal phalanx */
        RIGHT_HAND_THUMB_PHALANX_DISTAL = "right-hand-thumb-phalanx-distal",
        /** Right thumb tip */
        RIGHT_HAND_THUMB_TIP = "right-hand-thumb-tip",
        /** Right index finger metacarpal */
        RIGHT_HAND_INDEX_METACARPAL = "right-hand-index-metacarpal",
        /** Right index finger proximal phalanx */
        RIGHT_HAND_INDEX_PHALANX_PROXIMAL = "right-hand-index-phalanx-proximal",
        /** Right index finger intermediate phalanx */
        RIGHT_HAND_INDEX_PHALANX_INTERMEDIATE = "right-hand-index-phalanx-intermediate",
        /** Right index finger distal phalanx */
        RIGHT_HAND_INDEX_PHALANX_DISTAL = "right-hand-index-phalanx-distal",
        /** Right index finger tip */
        RIGHT_HAND_INDEX_TIP = "right-hand-index-tip",
        /** Right middle finger metacarpal */
        RIGHT_HAND_MIDDLE_METACARPAL = "right-hand-middle-metacarpal",
        /** Right middle finger proximal phalanx */
        RIGHT_HAND_MIDDLE_PHALANX_PROXIMAL = "right-hand-middle-phalanx-proximal",
        /** Right middle finger intermediate phalanx */
        RIGHT_HAND_MIDDLE_PHALANX_INTERMEDIATE = "right-hand-middle-phalanx-intermediate",
        /** Right middle finger distal phalanx */
        RIGHT_HAND_MIDDLE_PHALANX_DISTAL = "right-hand-middle-phalanx-distal",
        /** Right middle finger tip */
        RIGHT_HAND_MIDDLE_TIP = "right-hand-middle-tip",
        /** Right ring finger metacarpal */
        RIGHT_HAND_RING_METACARPAL = "right-hand-ring-metacarpal",
        /** Right ring finger proximal phalanx */
        RIGHT_HAND_RING_PHALANX_PROXIMAL = "right-hand-ring-phalanx-proximal",
        /** Right ring finger intermediate phalanx */
        RIGHT_HAND_RING_PHALANX_INTERMEDIATE = "right-hand-ring-phalanx-intermediate",
        /** Right ring finger distal phalanx */
        RIGHT_HAND_RING_PHALANX_DISTAL = "right-hand-ring-phalanx-distal",
        /** Right ring finger tip */
        RIGHT_HAND_RING_TIP = "right-hand-ring-tip",
        /** Right little finger metacarpal */
        RIGHT_HAND_LITTLE_METACARPAL = "right-hand-little-metacarpal",
        /** Right little finger proximal phalanx */
        RIGHT_HAND_LITTLE_PHALANX_PROXIMAL = "right-hand-little-phalanx-proximal",
        /** Right little finger intermediate phalanx */
        RIGHT_HAND_LITTLE_PHALANX_INTERMEDIATE = "right-hand-little-phalanx-intermediate",
        /** Right little finger distal phalanx */
        RIGHT_HAND_LITTLE_PHALANX_DISTAL = "right-hand-little-phalanx-distal",
        /** Right little finger tip */
        RIGHT_HAND_LITTLE_TIP = "right-hand-little-tip",
        /** Left upper leg (thigh) */
        LEFT_UPPER_LEG = "left-upper-leg",
        /** Left lower leg (shin) */
        LEFT_LOWER_LEG = "left-lower-leg",
        /** Left foot ankle twist */
        LEFT_FOOT_ANKLE_TWIST = "left-foot-ankle-twist",
        /** Left foot ankle */
        LEFT_FOOT_ANKLE = "left-foot-ankle",
        /** Left foot subtalar */
        LEFT_FOOT_SUBTALAR = "left-foot-subtalar",
        /** Left foot transverse */
        LEFT_FOOT_TRANSVERSE = "left-foot-transverse",
        /** Left foot ball */
        LEFT_FOOT_BALL = "left-foot-ball",
        /** Right upper leg (thigh) */
        RIGHT_UPPER_LEG = "right-upper-leg",
        /** Right lower leg (shin) */
        RIGHT_LOWER_LEG = "right-lower-leg",
        /** Right foot ankle twist */
        RIGHT_FOOT_ANKLE_TWIST = "right-foot-ankle-twist",
        /** Right foot ankle */
        RIGHT_FOOT_ANKLE = "right-foot-ankle",
        /** Right foot subtalar */
        RIGHT_FOOT_SUBTALAR = "right-foot-subtalar",
        /** Right foot transverse */
        RIGHT_FOOT_TRANSVERSE = "right-foot-transverse",
        /** Right foot ball */
        RIGHT_FOOT_BALL = "right-foot-ball"
    }
    /**
     * Parent index for each joint in {@link BodyJointReferenceArray} order.
     * -1 means "root" (no parent).  Used to convert world-space XR poses to
     * local-space transforms suitable for skeleton bones.
     *
     * Hierarchy follows the WebXR Body Tracking specification and standard
     * humanoid anatomy.
     */
    export var BodyJointParentIndex: number[];
    /**
     * Logical body parts for convenient grouping of joints.
     */
    export enum BodyPart {
        /** Torso / spine (hips through head) */
        TORSO = "torso",
        /** Left arm (shoulder through wrist twist) */
        LEFT_ARM = "left-arm",
        /** Right arm (shoulder through wrist twist) */
        RIGHT_ARM = "right-arm",
        /** Left hand (palm through finger tips) */
        LEFT_HAND = "left-hand",
        /** Right hand (palm through finger tips) */
        RIGHT_HAND = "right-hand",
        /** Left leg (upper leg through foot ball) */
        LEFT_LEG = "left-leg",
        /** Right leg (upper leg through foot ball) */
        RIGHT_LEG = "right-leg"
    }
    /**
     * A dictionary mapping each {@link WebXRBodyJoint} to a bone name in a rigged body mesh.
     *
     * When you supply a rigged mesh to {@link WebXRTrackedBody.setBodyMesh}, provide
     * a mapping so the feature knows which skeleton bone to drive for each joint.
     *
     * @example
     * ```typescript
     * const rigMapping: XRBodyMeshRigMapping = {
     *   "hips": "Bip01_Pelvis",
     *   "spine-lower": "Bip01_Spine",
     *   "head": "Bip01_Head",
     *   // …remaining joints…
     * };
     * ```
     */
    export type XRBodyMeshRigMapping = {
        [jointName in WebXRBodyJoint]?: string;
    };
    /**
     * Represents the XRBodySpace native interface as defined by the spec.
     * An XRBodySpace is an XRSpace that additionally exposes a jointName.
     * @see https://immersive-web.github.io/body-tracking/#xrjointspace-interface
     */
    interface XRBodySpace extends XRSpace {
        readonly jointName: string;
    }
    /**
     * Represents the native XRBody interface as defined by the spec.
     * An XRBody is an iterable map of XRBodyJoint → XRBodySpace.
     * @see https://immersive-web.github.io/body-tracking/#xrbody-interface
     */
    interface XRBody {
        readonly size: number;
        get(key: string): XRBodySpace | undefined;
        forEach(callbackfn: (value: XRBodySpace, key: string, map: XRBody) => void): void;
        [Symbol.iterator](): IterableIterator<[string, XRBodySpace]>;
        entries(): IterableIterator<[string, XRBodySpace]>;
        keys(): IterableIterator<string>;
        values(): IterableIterator<XRBodySpace>;
    }
   }

        interface XRFrame {
            body?: XRBody;
        }
    declare namespace BABYLON {
        /**
     * Configuration options for the WebXR body tracking feature.
     */
    export interface IWebXRBodyTrackingOptions {
        /**
         * A pre-existing rigged body mesh to drive with tracked joint poses.
         * If provided, skeleton bones will be linked to tracked joints automatically.
         * The mesh should contain a skeleton whose bones can be mapped via `rigMapping`.
         */
        bodyMesh?: AbstractMesh;
        /**
         * A mapping from {@link WebXRBodyJoint} names to skeleton bone names.
         * Required when the skeleton's bone names do not match the WebXR joint names.
         * If omitted and a body mesh is provided, the feature assumes bones are
         * named identically to the WebXR joint names (e.g. `"hips"`, `"left-arm-upper"`, etc.).
         */
        rigMapping?: XRBodyMeshRigMapping;
        /**
         * Scale factor applied to the local-space position of every joint.
         *
         * This uniformly scales the distances between parent and child joints,
         * allowing you to fit XR body tracking data to meshes that are larger or
         * smaller than the tracked user.
         *
         * - `1.0` (default): no scaling — real-world proportions.
         * - `> 1.0`: stretches the skeleton (makes it taller / wider).
         * - `< 1.0`: compresses the skeleton.
         *
         * Only affects local joint offsets, not the root (hips) position.
         */
        jointScaleFactor?: number;
        /**
         * Preserve bind-pose local translations for mapped bones and only retarget rotations.
         *
         * When `false` (default), mapped bones are translated directly to the tracked joint
         * positions. This reproduces the tracked skeleton exactly, but can distort avatars whose
         * proportions differ from the tracked user.
         *
         * When `true`, mapped child bones keep their bind-pose local translation offsets while
         * still using the tracked joint rotations. This is the typical retargeting mode for
         * driving arbitrary skinned characters without forcing them to the tracked skeleton's
         * segment lengths.
         */
        preserveBindPoseBonePositions?: boolean;
        /**
         * Apply a per-bone orientation offset so the avatar bone basis matches the XR joint basis.
         *
         * When enabled, WebXR joint rotations are corrected using the bone's bind-space child axis.
         * This is useful for rigs whose bone local axes do not match the anatomical axes used by
         * the WebXR body-tracking joint orientations.
         */
        useBoneOrientationOffsets?: boolean;
        /**
         * Rotation applied in each tracked joint's local frame to re-base the
         * XR joint axes. Some runtimes (e.g., some Meta Quest builds) emit body
         * joint poses whose +Z axis points along the bone (parent → child), while
         * most avatar rigs expect +Y along the bone. Setting this to
         * `Quaternion.RotationAxis(Vector3.Right(), -Math.PI / 2)` converts
         * "+Z-along-bone" joint data to "+Y-along-bone" before retargeting.
         *
         * Applied as a pre-multiply on each joint's world matrix:
         * `M' = R × M`, which, under Babylon's row-vector convention
         * (`v_world = v_local × M`), effectively re-bases the joint-local axes.
         *
         * Default `undefined` = identity (no re-basing).
         */
        jointLocalRotationOffset?: Quaternion;
        /**
         * Per–XR-joint override for the "aim child" joint used when
         * {@link useBoneOrientationOffsets} is enabled.
         *
         * By default the aim direction for a mapped bone is computed against its
         * nearest mapped descendant in the skeleton. For rigs whose XR-mapped
         * spine chain has very short segments (e.g. WebXR's `hips`→`spine-lower`
         * is typically only ~1 cm), the aim direction becomes noise-dominated and
         * can produce a large incorrect rotation for the parent bone.
         *
         * Use this map to redirect a specific XR joint's aim target to a farther
         * XR joint whose relative position is stable. Both the source and target
         * joint must be present in {@link rigMapping} (i.e. mapped to a bone on the
         * skeleton).
         *
         * Example for a Mixamo-style rig where hips, spine, spine1, spine2 and
         * neck are all mapped:
         * ```ts
         * aimChildOverrides: {
         *   [WebXRBodyJoint.HIPS]: WebXRBodyJoint.SPINE_UPPER,   // skip spine-lower/middle
         *   [WebXRBodyJoint.SPINE_LOWER]: WebXRBodyJoint.NECK,   // long stable segment
         *   [WebXRBodyJoint.SPINE_MIDDLE]: WebXRBodyJoint.NECK,
         * }
         * ```
         */
        aimChildOverrides?: Partial<Record<WebXRBodyJoint, WebXRBodyJoint>>;
        /**
         * Convenience flag for Mixamo-rigged characters.
         *
         * When set to `true`, the feature automatically applies:
         * - {@link MixamoRigMapping} as the `rigMapping` (skipping any explicit
         *   `rigMapping` you provide).
         * - {@link MixamoAimChildOverrides} as `aimChildOverrides` (skipping any
         *   explicit `aimChildOverrides` you provide).
         * - Turns on {@link useBoneOrientationOffsets} by default (you can still
         *   override to `false`).
         *
         * The Mixamo `mixamorig:` bone-name prefix is detected automatically by
         * inspecting the skeleton, so the same mapping works regardless of whether
         * the bones have been renamed to strip the prefix (common when re-exporting).
         */
        isMixamoModel?: boolean;
    }
    /**
     * Default rig mapping for Mixamo-rigged humanoid characters.
     *
     * Maps each supported {@link WebXRBodyJoint} to the corresponding Mixamo bone
     * name, **without** the `mixamorig:` prefix. When the feature applies this
     * mapping, it auto-detects whether the skeleton uses the `mixamorig:` prefix
     * and prepends it as needed, so the same table works for both prefixed and
     * unprefixed exports.
     *
     * @example
     * ```ts
     * xr.featuresManager.enableFeature(WebXRFeatureName.BODY_TRACKING, "latest", {
     *     bodyMesh: myMixamoMesh,
     *     isMixamoModel: true,
     * });
     * ```
     *
     * Or, if you want to extend or customize it:
     * ```ts
     * import { MixamoRigMapping } from "@babylonjs/core";
     * const rigMapping: XRBodyMeshRigMapping = { ...MixamoRigMapping, [WebXRBodyJoint.NECK]: "MyNeckBone" };
     * ```
     */
    export var MixamoRigMapping: XRBodyMeshRigMapping;
    /**
     * Default aim-child overrides for Mixamo-rigged humanoids.
     *
     * Redirects the short / noisy XR spine segments to longer, stable ones so that
     * {@link IWebXRBodyTrackingOptions.useBoneOrientationOffsets} produces clean
     * torso rotations. In WebXR data, `hips`→`spine-lower` is typically only ~1 cm
     * apart — too short to give a stable aim direction — so we reroute Mixamo's
     * Hips/Spine/Spine1 bones to aim at `spine-upper` / `neck` instead.
     */
    export var MixamoAimChildOverrides: Partial<Record<WebXRBodyJoint, WebXRBodyJoint>>;
    /**
     * Resolve the Mixamo rig mapping for a given body mesh, auto-detecting the
     * `mixamorig:` bone-name prefix. Falls back to the unprefixed names.
     * @param bodyMesh The rigged Mixamo body mesh.
     * @returns An {@link XRBodyMeshRigMapping} whose bone names include the
     *          detected prefix (if any).
     * @internal
     */
    export function _ResolveMixamoRigMapping(bodyMesh: AbstractMesh): XRBodyMeshRigMapping;
    /**
     * Represents a tracked body during a WebXR session.
     *
     * This class manages the bridge between the WebXR body pose data and the
     * Babylon.js scene graph.  It creates a set of {@link TransformNode}s — one per
     * body joint — whose transforms are updated every frame from the XR runtime.
     * When a rigged body mesh is attached, its skeleton bones are linked to these
     * transform nodes, causing the mesh to follow the user's body automatically.
     *
     * Coordinate-system handling:
     * - WebXR delivers poses in a right-handed system.
     * - By default, Babylon.js uses a left-handed system.
     * - The class converts the data in-place (negating the Z components of every
     *   4 × 4 joint matrix) before decomposing into Babylon transforms.
     * - If the mesh was authored in a right-handed tool (the common case for glTF),
     *   the bone transforms are un-flipped so the skeleton interprets them correctly.
     */
    export class WebXRTrackedBody implements IDisposable {
        /**
         * Fired when the body mesh is changed via {@link setBodyMesh}.
         */
        readonly onBodyMeshSetObservable: Observable<WebXRTrackedBody>;
        private _scene;
        /**
         * One {@link TransformNode} per joint.  These receive the WebXR matrix data
         * every frame and serve as link targets for skeleton bones.
         */
        private _jointTransforms;
        /**
         * Flat Float32Array that receives transform matrices directly from the
         * WebXR API (via `fillPoses`). 16 floats per joint × 83 joints = 1 328 floats.
         */
        private _jointTransformMatrices;
        /**
         * Copy of the raw RHS XR matrices (before LHS conversion).
         * Used to compute bone-local transforms for glTF skeletons that
         * operate in RHS space.
         */
        private _jointTransformMatricesRHS;
        /**
         * Cached array of XRBodySpace objects extracted from the XRBody, kept in the
         * same order as {@link BodyJointReferenceArray}.
         */
        private _jointSpaces;
        /** Temporary matrix: this joint's XR world-space matrix. */
        private _tempJointMatrix;
        /** Temporary matrix: parent joint's XR world-space matrix. */
        private _tempParentMatrix;
        /** Temporary matrix: computed bone-local matrix. */
        private _tempLocalMatrix;
        /** Temporary vector for scale extracted from decompose. */
        private _tempScaleVector;
        /** Temporary quaternion for decompose. */
        private _tempRotQuat;
        /** Temporary position vector for decompose. */
        private _tempPosVec;
        /** Temporary quaternion for alternate rotation calculations. */
        private _tempRotQuat2;
        /** Temporary vector for desired child direction. */
        private _tempDirection;
        /** Temporary vector for joint-local child direction. */
        private _tempLocalDirection;
        /** Cached desired final positions for mapped joints. */
        private _desiredFinalPositions;
        /**
         * For each joint index, the joint index of the nearest mapped SKELETON
         * ancestor bone.  -1 when the bone has no mapped ancestor (root level).
         * Precomputed in {@link setBodyMesh} by walking the skeleton hierarchy.
         */
        private _jointParentJointIdx;
        /** Tracks which joint indices have a linked bone (for step 4b). */
        private _jointHasBone;
        /** Bone → XR joint index lookup, built in {@link setBodyMesh}. */
        private _boneToJointIdx;
        /** Original bind-pose local matrices for mapped bones. */
        private _mappedBoneBindLocals;
        /** Nearest mapped child bone for each mapped bone. */
        private _mappedChildBones;
        /** Bind-space local child direction for each mapped bone. */
        private _bindLocalAimDirections;
        /** Bind-space local hand-plane normal used to correct wrist/hand twist from tracked finger positions. */
        private _bindLocalTwistNormals;
        /**
         * XR joint index to aim each mapped bone at. This can be a mapped joint
         * (same as `_boneToJointIdx.get(aimChildBone)`) or an **unmapped** XR
         * joint whose tracked position is nonetheless useful for aim correction —
         * e.g. `LEFT_HAND_MIDDLE_METACARPAL` for `mixamorig:LeftHand`, which has
         * no mapped finger descendant but whose tracked position still defines
         * "where the hand is pointing".
         */
        private _boneAimTargetJointIdx;
        /** Per-bone pair of tracked joints that define the hand plane used for twist correction. */
        private _boneTwistReferenceJointIdx;
        /**
         * Per-mapped-bone bind-pose world rotation in mesh-local space
         * (decomposed from `bone.getFinalMatrix()` at bind time). Used by the
         * delta-from-bind retarget path (axis-convention-invariant).
         */
        private _bindBoneWorldRotMeshLocal;
        /**
         * Bind-pose tracked joint rotation in mesh-local space per mapped joint.
         * Captured on the first tracked frame (or on demand via
         * {@link captureTrackedBind}). `null` until captured.
         */
        private _trackedBindDesiredFinalRot;
        /** Bind-pose tracked joint position (mesh-local), captured alongside rotation. */
        private _trackedBindDesiredFinalPos;
        /** True once a tracked-bind snapshot has been taken. */
        private _hasTrackedBind;
        /**
         * When `true` (default), the first tracked frame after the feature
         * attaches is used as the "rest" pose for delta-from-bind retargeting.
         * Set to `false` to require an explicit {@link captureTrackedBind} call.
         */
        autoCaptureBindOnFirstFrame: boolean;
        /** Scratch quaternion for retarget delta composition. */
        private _tempDeltaQuat;
        private _tempBoneWorldRot;
        private _tempParentNewWorldRotInv;
        private _tempTrackedCurRot;
        private _tempTrackedCurPos;
        private _tempBindLocalScale;
        private _tempBindLocalPos;
        /**
         * Per-bone cache of the current frame's computed world rotation.
         * Entries are pooled across frames (values are reused via `copyFrom`)
         * to avoid allocating a fresh Quaternion per mapped bone per frame.
         * A bone is considered "populated this frame" iff it has been visited
         * by the current retarget pass (tracked via `_computedBoneNewWorldRotFrameId`).
         */
        private _computedBoneNewWorldRot;
        /** Per-bone marker: frame id at which the pooled rotation above was last set. */
        private _computedBoneNewWorldRotFrameId;
        private _currentRetargetFrameId;
        /** Scratch quaternion reused for the parent-world accumulation loop. */
        private _tempParentAccumRot;
        /** Scratch quaternion reused for the parent-world intermediate product. */
        private _tempParentAccumTmp;
        /** Scratch vectors reused by hand twist correction. */
        private _tempTwistFirst;
        private _tempTwistSecond;
        private _tempTwistNormal;
        private _tempCurrentTwistNormal;
        private _tempProjectedTwistNormal;
        private _tempProjectedDesiredTwistNormal;
        private _tempTwistAimAxis;
        private _tempTwistCross;
        /** The skeleton reference for iterating bones in parent-first order. */
        private _skeleton;
        /** Cached inverse of the skeleton mesh's world matrix. */
        private _meshWorldMatrixInverse;
        /** Cached inverse of the skeleton mesh pose matrix when initial skinning is used. */
        private _initialSkinMatrixInverse;
        /**
         * Pre-allocated desiredFinal matrices (one per joint slot).
         * `desiredFinal[i] = strip(xrWorld[i] × inv(meshWorld))` — the bone's
         * target skeleton-space final matrix with parasitic scale removed.
         */
        private _desiredFinals;
        /**
         * Standalone TransformNodes created for unmapped skinned bones.
         * These TNs are initialized to the bone's bind-pose local and linked
         * so that `prepare()` reads deterministic values rather than the
         * original glTF scene-graph TNs (which we don't control).
         */
        private _unmappedBoneNodes;
        /** The mesh that owns the skeleton (used for world-matrix inverse). */
        private _skeletonMesh;
        /** The body mesh root (topmost parent), used to parent the mesh to the camera. */
        private _bodyMeshRoot;
        /** The rigged body mesh, if any. */
        private _bodyMesh;
        /** Scale factor for local joint offsets. */
        private _jointScaleFactor;
        /** Whether mapped bones should keep their bind-pose local translations. */
        private readonly _preserveBindPoseBonePositions;
        /** Whether mapped bones should correct WebXR joint rotations using bind-space orientation offsets. */
        private readonly _useBoneOrientationOffsets;
        /** Per–XR-joint override mapping for aim children (used with _useBoneOrientationOffsets). */
        private _aimChildOverrides;
        /**
         * Runtime-mutable rotation applied in each tracked joint's local frame to
         * re-base XR joint axes (e.g., "+Z-along-bone" → "+Y-along-bone").
         * `null` = identity / disabled.
         */
        jointLocalRotationOffset: Nullable<Quaternion>;
        /** Cached 4×4 matrix form of {@link jointLocalRotationOffset} for the fast path. */
        private _jointLocalRotationOffsetMatrix;
        /** Temporary matrix used when applying {@link jointLocalRotationOffset}. */
        private _tempOffsetAppliedMatrix;
        /**
         * When true, bypass skeleton.prepare() and write skin matrices directly.
         * This is a diagnostic flag to help isolate rendering issues. When the
         * standard pipeline (TN → bone → prepare → skin matrices) produces
         * unexpected results, enabling this writes `absInvBind × final` directly
         * into the skeleton's transform matrix buffer.
         * @internal
         */
        _directSkinWrite: boolean;
        /**
         * Debug info string from the last `updateFromXRFrame` call.
         * Useful for diagnosing tracking failures on-device.
         * @internal
         */
        _lastDebugInfo: string;
        /**
         * Get the current body mesh (if any).
         */
        get bodyMesh(): Nullable<AbstractMesh>;
        /**
         * Get or set the scale factor for local joint offsets.
         * @see {@link IWebXRBodyTrackingOptions.jointScaleFactor}
         */
        get jointScaleFactor(): number;
        set jointScaleFactor(value: number);
        /**
         * Returns the array of transform nodes representing each body joint.
         * The order matches {@link WebXRBodyTracking.AllBodyJoints}; use
         * {@link getJointTransform} or {@link getBodyPartTransforms} for
         * name-based lookup.
         *
         * Note: when a body mesh is attached, these transform nodes are also
         * used as the skeleton's link targets for mapped joints. In that case
         * the values held by mapped-joint nodes are skeleton-local (parent bone's
         * frame), not XR world-space. Unmapped-joint nodes always hold world-space
         * pose. If you need world-space poses for every joint regardless of
         * mapping, sample the bone matrices directly via the attached skeleton.
         */
        get jointTransforms(): readonly TransformNode[];
        /**
         * Get the transform node for a specific body joint.
         * @param jointName The name of the body joint (from {@link WebXRBodyJoint}).
         * @returns The transform node corresponding to that joint, or `undefined` if not found.
         */
        getJointTransform(jointName: WebXRBodyJoint): TransformNode | undefined;
        /**
         * Get all joint transform nodes that belong to a given body part.
         * @param part The body part to query.
         * @param result Optional pre-allocated array to fill (avoids per-call allocation).
         *   The array is cleared and populated with the results.
         * @returns An array of TransformNodes for that body part.
         */
        getBodyPartTransforms(part: BodyPart, result?: TransformNode[]): TransformNode[];
        /**
         * Construct a new tracked body instance.
         * @param scene The Babylon.js scene.
         * @param bodyMesh Optional rigged body mesh to attach immediately.
         * @param rigMapping Optional mapping from WebXR joint names to skeleton bone names.
         * @param jointScaleFactor Scale factor for local joint offsets (default 1.0).
         * @param preserveBindPoseBonePositions Whether mapped bones should keep bind-pose local translations.
         * @param useBoneOrientationOffsets Whether mapped bones should correct XR joint rotations using bind-space offsets.
         * @param aimChildOverrides Per–XR-joint override for the aim child used with `useBoneOrientationOffsets`.
         * @param jointLocalRotationOffset Optional rotation re-basing each XR joint's local frame (e.g. Z-along-bone → Y-along-bone).
         */
        constructor(scene: Scene, bodyMesh?: AbstractMesh, rigMapping?: XRBodyMeshRigMapping, jointScaleFactor?: number, preserveBindPoseBonePositions?: boolean, useBoneOrientationOffsets?: boolean, aimChildOverrides?: Partial<Record<WebXRBodyJoint, WebXRBodyJoint>>, jointLocalRotationOffset?: Quaternion);
        /**
         * Attach (or replace) a rigged body mesh.
         *
         * The mesh's skeleton bones are linked to the internal transform nodes
         * that receive WebXR tracking data each frame.  If the mesh has a skeleton,
         * the `rigMapping` (or a direct name match) is used to bind each bone.
         *
         * @param bodyMesh The rigged mesh to drive.
         * @param rigMapping An optional mapping from {@link WebXRBodyJoint} to bone name.
         *   If omitted, bones are expected to be named after the WebXR joint names.
         */
        setBodyMesh(bodyMesh: AbstractMesh, rigMapping?: XRBodyMeshRigMapping): void;
        /**
         * Update joint transforms from the current XR frame.
         *
         * This method is called once per frame by the feature class.  Internally it:
         * 1. Extracts all XRBodySpaces from the XRBody.
         * 2. Fills the transform-matrix buffer via `fillPoses()` (or per-joint fallback).
         * 3. Converts from WebXR right-handed to Babylon left-handed coordinates.
         * 4. Decomposes each matrix into the corresponding TransformNode.
         * 5. Parents the body mesh root to the XR camera so it tracks correctly.
         *
         * @param xrFrame The current XRFrame.
         * @param referenceSpace The XRReferenceSpace to resolve poses against.
         * @param xrCameraParent The parent node of the XR camera (used for parenting).
         * @returns `true` if valid tracking data was processed, `false` otherwise.
         */
        updateFromXRFrame(xrFrame: XRFrame, referenceSpace: XRReferenceSpace, xrCameraParent: Nullable<Node>): boolean;
        /**
         * Replay a pre-captured joint matrix set through the retargeting
         * pipeline as if it had just been delivered by an XR frame.
         *
         * Useful for headset-less testing: call with a snapshot captured via
         * {@link snapshotFrame} (the `jointMatricesRHS` array, or `jointMatricesLHS`
         * already flipped). The matrices are assumed to be RHS unless
         * `isAlreadyLhs=true`, in which case the RHS→LHS flip step is skipped.
         *
         * @param rawMatrices Float32Array of BODY_JOINT_COUNT × 16 (= 1328) floats.
         * @param isAlreadyLhs Set to `true` if matrices are already LHS-converted.
         */
        replayRawJointMatrices(rawMatrices: Float32Array | number[], isAlreadyLhs?: boolean): void;
        /**
         * Run steps 2.5 → 5 of the retargeting pipeline using whatever is
         * currently in `_jointTransformMatrices` (as if the WebXR API just
         * filled it for the current frame).
         * @param xrCameraParent Parent node of the XR camera (used to parent the body mesh root during live XR).
         * @param skipRhsToLhs If true, skip the RHS→LHS flip (matrices are already in the scene's handedness).
         */
        private _processTrackedJointMatrices;
        /**
         * Capture the current tracked-joint desired-final rotations and positions
         * as the "rest pose" for delta-from-bind retargeting.
         *
         * Delta-from-bind is the production retarget path: every subsequent
         * frame is interpreted as a rotation delta from this snapshot, which
         * makes retargeting invariant to the XR-joint axis convention and to
         * any skeletal-proportion differences between the tracked user and the
         * avatar.
         *
         * Call this after the user assumes a known rest pose (e.g. T-pose,
         * A-pose, arms-at-sides). By default the feature auto-captures on the
         * first tracked frame — disable via {@link autoCaptureBindOnFirstFrame}.
         */
        captureTrackedBind(): void;
        /**
         * Clear any captured bind, reverting subsequent frames to the fallback
         * direct-retarget path (or re-triggering auto-capture on the next frame).
         */
        clearTrackedBind(): void;
        private _computeNormalFromJointPositions;
        private _projectOnPlaneToRef;
        private _storeBindLocalTwistNormalFromPositions;
        /** Internal: copy current desiredFinals into the tracked-bind slots. */
        private _captureTrackedBindFromDesiredFinals;
        /**
         * Delta-from-bind retarget: axis-convention-invariant.
         *
         * For each mapped bone in skeleton order (parents first):
         *   let j = joint mapped to this bone
         *   deltaMeshLocalRot  = bindTracked[j]⁻¹ × currentTracked[j]     (right-side in row-vector)
         *   newBoneWorldRot    = bindBoneWorldRot × deltaMeshLocalRot
         *   newBoneLocalRot    = newBoneWorldRot × parentNewBoneWorldRot⁻¹
         *
         * Positions: root bone receives tracked world delta (so the avatar
         * translates with the user). All other mapped bones keep their rig's
         * bind-pose local translation to preserve segment lengths.
         * @param scaleFactor Additional scale applied to joint local positions.
         */
        private _retargetDeltaFromBind;
        /**
         * Legacy direct-retarget path (pre-bind-capture). Kept as fallback.
         * @param useInitialSkinMatrix Skeleton needs initial-skin-matrix chaining for the root.
         * @param useBoneOrientationOffsets Apply aim-direction correction per mapped bone.
         * @param scaleFactor Additional scale applied to joint local positions.
         * @param computedWorldRotations Optional map used by the aim-correction path for parent lookups.
         */
        private _retargetDirect;
        /**
         * Capture a snapshot of the current frame's raw XR joint matrices and
         * skeleton metadata.  Returns a JSON string that can be used offline to
         * replay / debug bone-local computation without a headset.
         *
         * The snapshot includes:
         * - `jointMatricesRHS` – 83 × 16 raw RHS matrices (before LHS conversion)
         * - `jointMatricesLHS` – 83 × 16 LHS-converted matrices (after step 3)
         * - `meshWorldMatrix` – 16 floats, the skeleton mesh's world matrix (if any)
         * - `jointHasBone` – boolean[83], which joints are mapped to bones
         * - `jointParentJointIdx` – number[83], mapped ancestor for each joint
         * - `useRightHandedSystem` – scene handedness setting
         * - `jointNames` – the 83 joint names in order
         *
         * @returns A JSON string with the snapshot data.
         */
        snapshotFrame(): string;
        /**
         * Capture a snapshot and copy it to the system clipboard.
         * Logs to the console on success or failure.
         * @returns A promise that resolves when the copy completes.
         */
        snapshotFrameToClipboardAsync(): Promise<void>;
        /**
         * Dispose of this tracked body and its resources.
         * @param disposeMesh If `true`, the body mesh and its skeleton are disposed as well.
         */
        dispose(disposeMesh?: boolean): void;
    }
    /**
     * WebXR Body Tracking feature.
     *
     * This feature tracks the user's full-body pose using the
     * [WebXR Body Tracking Module](https://immersive-web.github.io/body-tracking/),
     * which exposes 83 articulated joints covering the torso, arms, hands, legs and feet.
     *
     * ## Quick Start
     *
     * ```typescript
     * // Enable body tracking when creating the default XR experience:
     * const xr = await scene.createDefaultXRExperienceAsync();
     * const bodyTracking = xr.baseExperience.featuresManager.enableFeature(
     *     WebXRFeatureName.BODY_TRACKING,
     *     "latest",
     *     {
     *         bodyMesh: myRiggedBodyMesh,
     *         rigMapping: {
     *             "hips": "Bip01_Pelvis",
     *             "spine-lower": "Bip01_Spine",
     *             // … one entry per joint you want to drive …
     *         },
     *     } as IWebXRBodyTrackingOptions,
     * );
     *
     * // React to tracking changes:
     * bodyTracking.onBodyTrackingStartedObservable.add((trackedBody) => {
     *     console.log("Body tracking started");
     * });
     * bodyTracking.onBodyTrackingFrameUpdateObservable.add((trackedBody) => {
     *     // The tracked body's joint transforms are already up-to-date.
     * });
     * ```
     *
     * ## How It Works
     *
     * 1. The feature requests the `"body-tracking"` native WebXR feature at session start.
     * 2. Each frame, if `XRFrame.body` is available, joint poses are filled into a
     *    flat Float32Array via the batch `fillPoses()` API (with a per-joint fallback).
     * 3. The 4 × 4 matrices are converted from WebXR right-handed coordinates to
     *    Babylon.js left-handed coordinates in-place (unless the scene is RHS).
     * 4. Each matrix is decomposed and written to a TransformNode; skeleton bones
     *    linked to those nodes animate the rigged mesh automatically.
     *
     * ## Coordinate System
     *
     * WebXR data arrives in a **right-handed** coordinate system.  Babylon.js
     * defaults to **left-handed**.  The conversion is handled automatically:
     * - Joint matrices are flipped in-place (Z-negation of specific matrix elements).
     * - For meshes authored in a right-handed tool (glTF, Blender, etc.), the bone
     *   data is un-flipped so the skeleton interprets poses correctly.
     * - If you use `scene.useRightHandedSystem = true`, no conversion is applied.
     *
     * @see https://immersive-web.github.io/body-tracking/
     */
    export class WebXRBodyTracking extends WebXRAbstractFeature {
        /** Configuration options for the body tracking feature. */
        readonly options: IWebXRBodyTrackingOptions;
        /**
         * The module's name, used when enabling the feature on the features manager.
         * Value: `"xr-body-tracking"`.
         */
        static readonly Name: "xr-body-tracking";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version.
         */
        static readonly Version = 1;
        /**
         * Observable fired when body tracking starts (i.e. the first frame where
         * `XRFrame.body` returns valid data).
         */
        readonly onBodyTrackingStartedObservable: Observable<WebXRTrackedBody>;
        /**
         * Observable fired when body tracking is lost (i.e. `XRFrame.body` becomes
         * `null` or returns no valid poses after previously tracking).
         */
        readonly onBodyTrackingEndedObservable: Observable<void>;
        /**
         * Observable fired every frame that has valid body tracking data.
         * At the point of notification, all joint transforms are up-to-date.
         */
        readonly onBodyTrackingFrameUpdateObservable: Observable<WebXRTrackedBody>;
        /**
         * Observable fired when the body mesh has been set via {@link setBodyMesh}
         * or during initial configuration.
         */
        readonly onBodyMeshSetObservable: Observable<WebXRTrackedBody>;
        /** The current tracked body, or null when not tracking. */
        private _trackedBody;
        /** True while we have an active body tracking session. */
        private _isTracking;
        /** Observer for world scale changes, so the body mesh can be rescaled. */
        private _worldScaleObserver;
        /**
         * Debug info from the feature-level frame loop.
         * Shows why `_onXRFrame` did or did not call `updateFromXRFrame`.
         * @internal
         */
        _lastFrameDebugInfo: string;
        /**
         * Get the currently tracked body, if any.
         */
        get trackedBody(): Nullable<WebXRTrackedBody>;
        /**
         * Returns `true` while body tracking data is actively being received.
         */
        get isTracking(): boolean;
        /**
         * Construct a new WebXRBodyTracking feature.
         * @param _xrSessionManager The XR session manager.
         * @param options Configuration options.
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /** Configuration options for the body tracking feature. */
        options?: IWebXRBodyTrackingOptions);
        /**
         * Attach a rigged body mesh (or replace the current one) at any time.
         *
         * This is a convenience method that forwards to the underlying
         * {@link WebXRTrackedBody.setBodyMesh}.  The body does not need to be
         * already tracking for this to work — the mesh will be applied once
         * tracking begins.
         *
         * @param bodyMesh The rigged mesh to drive.
         * @param rigMapping Optional mapping from {@link WebXRBodyJoint} names to bone names.
         */
        setBodyMesh(bodyMesh: AbstractMesh, rigMapping?: XRBodyMeshRigMapping): void;
        /**
         * Attach the feature.
         * Called by the features manager when the XR session initialises.
         *
         * Body tracking is a draft WebXR spec.  Some UAs (e.g. Meta Quest) provide
         * body data on `XRFrame.body` but do not list `"body-tracking"` in
         * `session.enabledFeatures`.  To handle this, we temporarily clear
         * {@link xrNativeFeatureName} before calling the base `attach()` so the
         * enabled-features check is skipped, then restore it afterwards.
         * @returns `true` if attachment succeeded.
         */
        attach(): boolean;
        /**
         * Detach the feature.
         * Called by the features manager when the XR session ends.
         * @returns `true` if detachment succeeded.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all resources.
         */
        dispose(): void;
        /**
         * Called every XR frame by the base class.
         * Reads body joint data from the XR runtime and updates transforms.
         * @param xrFrame The current XRFrame.
         */
        protected _onXRFrame(xrFrame: XRFrame): void;
        /**
         * Returns the complete ordered list of body joint names tracked by this feature.
         * Useful for iterating over all joints or building UI.
         */
        static get AllBodyJoints(): readonly WebXRBodyJoint[];
        /**
         * Capture a single-frame snapshot of all 83 joints and copy it to the
         * clipboard.  Call this from a playground button or the console while
         * wearing the headset:
         *
         * ```typescript
         * bodyTracking.snapshotFrameToClipboard();
         * ```
         *
         * The JSON can later be loaded offline to replay the bone-local
         * computation without a headset.
         * @returns A promise that resolves when the copy completes, or rejects
         *   if no body is currently tracked.
         */
        snapshotFrameToClipboardAsync(): Promise<void>;
    }
    /**
     * Register side effects for webXRBodyTracking.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRBodyTracking(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRBodyTracking.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options interface for the background remover plugin
     */
    export interface IWebXRBackgroundRemoverOptions {
        /**
         * Further background meshes to disable when entering AR
         */
        backgroundMeshes?: AbstractMesh[];
        /**
         * flags to configure the removal of the environment helper.
         * If not set, the entire background will be removed. If set, flags should be set as well.
         */
        environmentHelperRemovalFlags?: {
            /**
             * Should the skybox be removed (default false)
             */
            skyBox?: boolean;
            /**
             * Should the ground be removed (default false)
             */
            ground?: boolean;
        };
        /**
         * don't disable the environment helper
         */
        ignoreEnvironmentHelper?: boolean;
    }
    /**
     * A module that will automatically disable background meshes when entering AR and will enable them when leaving AR.
     */
    export class WebXRBackgroundRemover extends WebXRAbstractFeature {
        /**
         * [Empty Object] read-only options to be used in this module
         */
        readonly options: IWebXRBackgroundRemoverOptions;
        /**
         * The module's name
         */
        static readonly Name: "xr-background-remover";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * registered observers will be triggered when the background state changes
         */
        onBackgroundStateChangedObservable: Observable<boolean>;
        /**
         * constructs a new background remover module
         * @param _xrSessionManager the session manager for this module
         * @param options read-only options to be used in this module
         */
        constructor(_xrSessionManager: WebXRSessionManager, 
        /**
         * [Empty Object] read-only options to be used in this module
         */
        options?: IWebXRBackgroundRemoverOptions);
        /**
         * attach this feature
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        attach(): boolean;
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(_xrFrame: XRFrame): void;
        private _setBackgroundState;
    }
    /**
     * Register side effects for webXRBackgroundRemover.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRBackgroundRemover(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRBackgroundRemover.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Configuration options of the anchor system
     */
    export interface IWebXRAnchorSystemOptions {
        /**
         * a node that will be used to convert local to world coordinates
         */
        worldParentNode?: TransformNode;
        /**
         * If set to true a reference of the created anchors will be kept until the next session starts
         * If not defined, anchors will be removed from the array when the feature is detached or the session ended.
         */
        doNotRemoveAnchorsOnSessionEnded?: boolean;
        /**
         * If set to true, all anchor arrays will be cleared when the session initializes
         */
        clearAnchorsOnSessionInit?: boolean;
    }
    /**
     * A babylon container for an XR Anchor
     */
    export interface IWebXRAnchor {
        /**
         * A babylon-assigned ID for this anchor
         */
        id: number;
        /**
         * Transformation matrix to apply to an object attached to this anchor
         */
        transformationMatrix: Matrix;
        /**
         * The native anchor object
         */
        xrAnchor: XRAnchor;
        /**
         * if defined, this object will be constantly updated by the anchor's position and rotation
         */
        attachedNode?: TransformNode;
        /**
         * Remove this anchor from the scene
         */
        remove(): void;
        /**
         * @internal - set to true when the anchor was removed
         */
        _removed: boolean;
    }
    /**
     * An implementation of the anchor system for WebXR.
     * For further information see https://github.com/immersive-web/anchors/
     */
    export class WebXRAnchorSystem extends WebXRAbstractFeature {
        private _options;
        private _lastFrameDetected;
        private _trackedAnchors;
        private _referenceSpaceForFrameAnchors;
        private _futureAnchors;
        /**
         * The module's name
         */
        static readonly Name: "xr-anchor-system";
        /**
         * The (Babylon) version of this module.
         * This is an integer representing the implementation version.
         * This number does not correspond to the WebXR specs version
         */
        static readonly Version = 1;
        /**
         * Observers registered here will be executed when a new anchor was added to the session
         */
        onAnchorAddedObservable: Observable<IWebXRAnchor>;
        /**
         * Observers registered here will be executed when an anchor was removed from the session
         */
        onAnchorRemovedObservable: Observable<IWebXRAnchor>;
        /**
         * Observers registered here will be executed when an existing anchor updates
         * This can execute N times every frame
         */
        onAnchorUpdatedObservable: Observable<IWebXRAnchor>;
        /**
         * Set the reference space to use for anchor creation, when not using a hit test.
         * Will default to the session's reference space if not defined
         */
        set referenceSpaceForFrameAnchors(referenceSpace: XRReferenceSpace);
        /**
         * constructs a new anchor system
         * @param _xrSessionManager an instance of WebXRSessionManager
         * @param _options configuration object for this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager, _options?: IWebXRAnchorSystemOptions);
        private _tmpVector;
        private _tmpQuaternion;
        private _populateTmpTransformation;
        /**
         * Create a new anchor point using a hit test result at a specific point in the scene
         * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.
         * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.
         *
         * @param hitTestResult The hit test result to use for this anchor creation
         * @param position an optional position offset for this anchor
         * @param rotationQuaternion an optional rotation offset for this anchor
         * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun
         */
        addAnchorPointUsingHitTestResultAsync(hitTestResult: IWebXRHitResult, position?: Vector3, rotationQuaternion?: Quaternion): Promise<IWebXRAnchor>;
        /**
         * Add a new anchor at a specific position and rotation
         * This function will add a new anchor per default in the next available frame. Unless forced, the createAnchor function
         * will be called in the next xrFrame loop to make sure that the anchor can be created correctly.
         * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.
         * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.
         *
         * @param position the position in which to add an anchor
         * @param rotationQuaternion an optional rotation for the anchor transformation
         * @param forceCreateInCurrentFrame force the creation of this anchor in the current frame. Must be called inside xrFrame loop!
         * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun
         */
        addAnchorAtPositionAndRotationAsync(position: Vector3, rotationQuaternion?: Quaternion, forceCreateInCurrentFrame?: boolean): Promise<IWebXRAnchor>;
        /**
         * Get the list of anchors currently being tracked by the system
         */
        get anchors(): IWebXRAnchor[];
        /**
         * detach this feature.
         * Will usually be called by the features manager
         *
         * @returns true if successful.
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        protected _onXRFrame(frame: XRFrame): void;
        /**
         * avoiding using Array.find for global support.
         * @param xrAnchor the plane to find in the array
         * @returns the index of the anchor in the array or -1 if not found
         */
        private _findIndexInAnchorArray;
        private _updateAnchorWithXRFrame;
        private _createAnchorAtTransformationAsync;
    }
    /**
     * Register side effects for webXRAnchorSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebXRAnchorSystem(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import WebXRAnchorSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * This is the base class for all WebXR features.
     * Since most features require almost the same resources and callbacks, this class can be used to simplify the development
     * Note that since the features manager is using the `IWebXRFeature` you are in no way obligated to use this class
     */
    export abstract class WebXRAbstractFeature implements IWebXRFeature {
        protected _xrSessionManager: WebXRSessionManager;
        private _attached;
        private _removeOnDetach;
        /**
         * Is this feature disposed?
         */
        isDisposed: boolean;
        /**
         * Should auto-attach be disabled?
         */
        disableAutoAttach: boolean;
        protected _xrNativeFeatureName: string;
        /**
         * The name of the native xr feature name (like anchor, hit-test, or hand-tracking)
         */
        get xrNativeFeatureName(): string;
        set xrNativeFeatureName(name: string);
        /**
         * Observers registered here will be executed when the feature is attached
         */
        onFeatureAttachObservable: Observable<IWebXRFeature>;
        /**
         * Observers registered here will be executed when the feature is detached
         */
        onFeatureDetachObservable: Observable<IWebXRFeature>;
        /**
         * The dependencies of this feature, if any
         */
        dependsOn?: string[];
        /**
         * Construct a new (abstract) WebXR feature
         * @param _xrSessionManager the xr session manager for this feature
         */
        constructor(_xrSessionManager: WebXRSessionManager);
        /**
         * Is this feature attached
         */
        get attached(): boolean;
        /**
         * attach this feature
         *
         * @param force should attachment be forced (even when already attached)
         * @returns true if successful, false is failed or already attached
         */
        attach(force?: boolean): boolean;
        /**
         * detach this feature.
         *
         * @returns true if successful, false if failed or already detached
         */
        detach(): boolean;
        /**
         * Dispose this feature and all of the resources attached
         */
        dispose(): void;
        /**
         * This function will be executed during before enabling the feature and can be used to not-allow enabling it.
         * Note that at this point the session has NOT started, so this is purely checking if the browser supports it
         *
         * @returns whether or not the feature is compatible in this environment
         */
        isCompatible(): boolean;
        /**
         * This is used to register callbacks that will automatically be removed when detach is called.
         * @param observable the observable to which the observer will be attached
         * @param callback the callback to register
         * @param insertFirst should the callback be executed as soon as it is registered
         */
        protected _addNewAttachObserver<T>(observable: Observable<T>, callback: (eventData: T, eventState: EventState) => void, insertFirst?: boolean): void;
        /**
         * Code in this function will be executed on each xrFrame received from the browser.
         * This function will not execute after the feature is detached.
         * @param _xrFrame the current frame
         */
        protected abstract _onXRFrame(_xrFrame: XRFrame): void;
    }


    /**
     * Wraps xr projection layers.
     * @internal
     */
    export class WebXRProjectionLayerWrapper extends WebXRCompositionLayerWrapper {
        readonly layer: XRProjectionLayer;
        constructor(layer: XRProjectionLayer, isMultiview: boolean, xrGLBinding: XRWebGLBinding);
    }
    /**
     * @internal
     */
    export var DefaultXRProjectionLayerInit: XRProjectionLayerInit;


    /**
     * Wraps xr composition layers.
     * @internal
     */
    export class WebXRCompositionLayerWrapper extends WebXRLayerWrapper {
        getWidth: () => number;
        getHeight: () => number;
        readonly layer: XRCompositionLayer;
        readonly layerType: WebXRLayerType;
        readonly isMultiview: boolean;
        createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider;
        _originalInternalTexture: Nullable<InternalTexture>;
        constructor(getWidth: () => number, getHeight: () => number, layer: XRCompositionLayer, layerType: WebXRLayerType, isMultiview: boolean, createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider, _originalInternalTexture?: Nullable<InternalTexture>);
    }
    /**
     * Provides render target textures and other important rendering information for a given XRCompositionLayer.
     * @internal
     */
    export class WebXRCompositionLayerRenderTargetTextureProvider extends WebXRLayerRenderTargetTextureProvider {
        protected readonly _xrSessionManager: WebXRSessionManager;
        protected readonly _xrWebGLBinding: XRWebGLBinding;
        readonly layerWrapper: WebXRCompositionLayerWrapper;
        protected _lastSubImages: Map<XREye, XRWebGLSubImage>;
        private _compositionLayer;
        /**
         * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)
         */
        onRenderTargetTextureCreatedObservable: Observable<{
            texture: RenderTargetTexture;
            eye?: XREye;
        }>;
        constructor(_xrSessionManager: WebXRSessionManager, _xrWebGLBinding: XRWebGLBinding, layerWrapper: WebXRCompositionLayerWrapper);
        protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, eye?: XREye): RenderTargetTexture;
        private _getSubImageForEye;
        getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture>;
        getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture>;
        protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage): void;
        trySetViewportForView(viewport: Viewport, view: XRView): boolean;
    }


    /**
     * @internal
     **/
    export class StencilStateComposer {
        protected _isStencilTestDirty: boolean;
        protected _isStencilMaskDirty: boolean;
        protected _isStencilFuncDirty: boolean;
        protected _isStencilOpDirty: boolean;
        protected _enabled: boolean;
        protected _mask: number;
        protected _func: number;
        protected _funcRef: number;
        protected _funcMask: number;
        protected _opStencilFail: number;
        protected _opDepthFail: number;
        protected _opStencilDepthPass: number;
        protected _backFunc: number;
        protected _backOpStencilFail: number;
        protected _backOpDepthFail: number;
        protected _backOpStencilDepthPass: number;
        stencilGlobal: IStencilState;
        stencilMaterial: IStencilState | undefined;
        useStencilGlobalOnly: boolean;
        get isDirty(): boolean;
        get func(): number;
        set func(value: number);
        get backFunc(): number;
        set backFunc(value: number);
        get funcRef(): number;
        set funcRef(value: number);
        get funcMask(): number;
        set funcMask(value: number);
        get opStencilFail(): number;
        set opStencilFail(value: number);
        get opDepthFail(): number;
        set opDepthFail(value: number);
        get opStencilDepthPass(): number;
        set opStencilDepthPass(value: number);
        get backOpStencilFail(): number;
        set backOpStencilFail(value: number);
        get backOpDepthFail(): number;
        set backOpDepthFail(value: number);
        get backOpStencilDepthPass(): number;
        set backOpStencilDepthPass(value: number);
        get mask(): number;
        set mask(value: number);
        get enabled(): boolean;
        set enabled(value: boolean);
        constructor(reset?: boolean);
        reset(): void;
        apply(gl?: WebGLRenderingContext): void;
    }


    /**
     * @internal
     **/
    export class StencilState implements IStencilState {
        /** Passed to depthFunction or stencilFunction to specify depth or stencil tests will always pass. i.e. Pixels will be drawn in the order they are drawn */
        static readonly ALWAYS = 519;
        /** Passed to stencilOperation to specify that stencil value must be kept */
        static readonly KEEP = 7680;
        /** Passed to stencilOperation to specify that stencil value must be replaced */
        static readonly REPLACE = 7681;
        constructor();
        reset(): void;
        func: number;
        get stencilFunc(): number;
        set stencilFunc(value: number);
        backFunc: number;
        get stencilBackFunc(): number;
        set stencilBackFunc(value: number);
        funcRef: number;
        get stencilFuncRef(): number;
        set stencilFuncRef(value: number);
        funcMask: number;
        get stencilFuncMask(): number;
        set stencilFuncMask(value: number);
        opStencilFail: number;
        get stencilOpStencilFail(): number;
        set stencilOpStencilFail(value: number);
        opDepthFail: number;
        get stencilOpDepthFail(): number;
        set stencilOpDepthFail(value: number);
        opStencilDepthPass: number;
        get stencilOpStencilDepthPass(): number;
        set stencilOpStencilDepthPass(value: number);
        backOpStencilFail: number;
        get stencilBackOpStencilFail(): number;
        set stencilBackOpStencilFail(value: number);
        backOpDepthFail: number;
        get stencilBackOpDepthFail(): number;
        set stencilBackOpDepthFail(value: number);
        backOpStencilDepthPass: number;
        get stencilBackOpStencilDepthPass(): number;
        set stencilBackOpStencilDepthPass(value: number);
        mask: number;
        get stencilMask(): number;
        set stencilMask(value: number);
        enabled: boolean;
        get stencilTest(): boolean;
        set stencilTest(value: boolean);
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * @internal
     **/
    export class DepthCullingState {
        protected _isDepthTestDirty: boolean;
        protected _isDepthMaskDirty: boolean;
        protected _isDepthFuncDirty: boolean;
        protected _isCullFaceDirty: boolean;
        protected _isCullDirty: boolean;
        protected _isZOffsetDirty: boolean;
        protected _isFrontFaceDirty: boolean;
        protected _depthTest: boolean;
        protected _depthMask: boolean;
        protected _depthFunc: Nullable<number>;
        protected _cull: Nullable<boolean>;
        protected _cullFace: Nullable<number>;
        protected _zOffset: number;
        protected _zOffsetUnits: number;
        protected _frontFace: Nullable<number>;
        /**
         * Initializes the state.
         * @param reset
         */
        constructor(reset?: boolean);
        get isDirty(): boolean;
        get zOffset(): number;
        set zOffset(value: number);
        get zOffsetUnits(): number;
        set zOffsetUnits(value: number);
        get cullFace(): Nullable<number>;
        set cullFace(value: Nullable<number>);
        get cull(): Nullable<boolean>;
        set cull(value: Nullable<boolean>);
        get depthFunc(): Nullable<number>;
        set depthFunc(value: Nullable<number>);
        get depthMask(): boolean;
        set depthMask(value: boolean);
        get depthTest(): boolean;
        set depthTest(value: boolean);
        get frontFace(): Nullable<number>;
        set frontFace(value: Nullable<number>);
        reset(): void;
        apply(gl: WebGLRenderingContext): void;
    }


    /**
     * @internal
     **/
    export class AlphaState {
        private _supportBlendParametersPerTarget;
        _blendFunctionParameters: Nullable<number>[];
        _blendEquationParameters: Nullable<number>[];
        _blendConstants: Nullable<number>[];
        _isBlendConstantsDirty: boolean;
        _alphaBlend: any[];
        _numTargetEnabled: number;
        private _isAlphaBlendDirty;
        private _isBlendFunctionParametersDirty;
        private _isBlendEquationParametersDirty;
        /**
         * Initializes the state.
         * @param _supportBlendParametersPerTarget - Whether blend parameters per target is supported
         */
        constructor(_supportBlendParametersPerTarget: boolean);
        get isDirty(): boolean;
        get alphaBlend(): boolean;
        set alphaBlend(value: boolean);
        setAlphaBlend(value: boolean, targetIndex?: number): void;
        setAlphaBlendConstants(r: number, g: number, b: number, a: number): void;
        setAlphaBlendFunctionParameters(srcRGBFactor: number, dstRGBFactor: number, srcAlphaFactor: number, dstAlphaFactor: number, targetIndex?: number): void;
        setAlphaEquationParameters(rgbEquation: number, alphaEquation: number, targetIndex?: number): void;
        reset(): void;
        apply(gl: WebGLRenderingContext, numTargets?: number): void;
        setAlphaMode(mode: number, targetIndex: number): void;
    }


    /**
     * Interface defining the properties of the stencil state.
     */
    export interface IStencilStateProperties {
        /**
         * Whether the stencil test is enabled or not.
         */
        enabled: boolean;
        /**
         * The stencil mask to use for writing.
         */
        mask: number;
        /**
         * The stencil mask to use for reading.
         */
        funcMask: number;
        /**
         * The reference value to use for the stencil test.
         */
        funcRef: number;
        /**
         * The stencil comparison function to use for front faces.
         */
        func: number;
        /**
         * The operation to perform when both the stencil and depth tests pass for front faces.
         */
        opStencilDepthPass: number;
        /**
         * The operation to perform when the stencil test fails for front faces.
         */
        opStencilFail: number;
        /**
         * The operation to perform when the stencil test passes but the depth test fails for front faces.
         */
        opDepthFail: number;
        /**
         * The stencil comparison function to use for back faces.
         */
        backFunc: number;
        /**
         * The operation to perform when both the stencil and depth tests pass for back faces.
         */
        backOpStencilDepthPass: number;
        /**
         * The operation to perform when the stencil test fails for back faces.
         */
        backOpStencilFail: number;
        /**
         * The operation to perform when the stencil test passes but the depth test fails for back faces.
         */
        backOpDepthFail: number;
    }
    /**
     * Interface defining the stencil state.
     */
    export interface IStencilState extends IStencilStateProperties {
        /**
         * Resets the stencil state to default values.
         */
        reset(): void;
    }


    /**
     * ThinSprite Class used to represent a thin sprite
     * This is the base class for sprites but can also directly be used with ThinEngine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites
     */
    export class ThinSprite {
        /** Gets or sets the cell index in the sprite sheet */
        cellIndex: number;
        /** Gets or sets the cell reference in the sprite sheet, uses sprite's filename when added to sprite sheet */
        cellRef: string;
        /** Gets or sets the current world position */
        position: IVector3Like;
        /** Gets or sets the main color */
        color: IColor4Like;
        /** Gets or sets the width */
        width: number;
        /** Gets or sets the height */
        height: number;
        /** Gets or sets rotation angle */
        angle: number;
        /** Gets or sets a boolean indicating if UV coordinates should be inverted in U axis */
        invertU: boolean;
        /** Gets or sets a boolean indicating if UV coordinates should be inverted in B axis */
        invertV: boolean;
        /** Gets or sets a boolean indicating if the sprite is visible (renderable). Default is true */
        isVisible: boolean;
        /**
         * Returns a boolean indicating if the animation is started
         */
        get animationStarted(): boolean;
        /** Gets the initial key for the animation (setting it will restart the animation)  */
        get fromIndex(): number;
        /** Gets or sets the end key for the animation (setting it will restart the animation)  */
        get toIndex(): number;
        /** Gets or sets a boolean indicating if the animation is looping (setting it will restart the animation)  */
        get loopAnimation(): boolean;
        /** Gets or sets the delay between cell changes (setting it will restart the animation)  */
        get delay(): number;
        /** @internal */
        _xOffset: number;
        /** @internal */
        _yOffset: number;
        /** @internal */
        _xSize: number;
        /** @internal */
        _ySize: number;
        private _animationStarted;
        protected _loopAnimation: boolean;
        protected _fromIndex: number;
        protected _toIndex: number;
        protected _delay: number;
        private _direction;
        private _time;
        private _onBaseAnimationEnd;
        /**
         * Creates a new Thin Sprite
         */
        constructor();
        /**
         * Starts an animation
         * @param from defines the initial key
         * @param to defines the end key
         * @param loop defines if the animation must loop
         * @param delay defines the start delay (in ms)
         * @param onAnimationEnd defines a callback for when the animation ends
         */
        playAnimation(from: number, to: number, loop: boolean, delay: number, onAnimationEnd: Nullable<() => void>): void;
        /** Stops current animation (if any) */
        stopAnimation(): void;
        /**
         * @internal
         */
        _animate(deltaTime: number): void;
    }


        interface Scene {
            /** @internal */
            _pointerOverSprite: Nullable<Sprite>;
            /** @internal */
            _pickedDownSprite: Nullable<Sprite>;
            /** @internal */
            _tempSpritePickingRay: Nullable<Ray>;
            /**
             * All of the sprite managers added to this scene
             * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites
             */
            spriteManagers?: Array<ISpriteManager>;
            /**
             * An event triggered when a sprite manager is added to the scene
             */
            readonly onNewSpriteManagerAddedObservable: IReadonlyObservable<ISpriteManager>;
            /**
             * An event triggered when a sprite manager is removed from the scene
             */
            readonly onSpriteManagerRemovedObservable: IReadonlyObservable<ISpriteManager>;
            /**
             * An event triggered when sprites rendering is about to start
             * Note: This event can be trigger more than once per frame (because sprites can be rendered by render target textures as well)
             */
            onBeforeSpritesRenderingObservable: Observable<Scene>;
            /**
             * An event triggered when sprites rendering is done
             * Note: This event can be trigger more than once per frame (because sprites can be rendered by render target textures as well)
             */
            onAfterSpritesRenderingObservable: Observable<Scene>;
            /** @internal */
            _internalPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
            /** Launch a ray to try to pick a sprite in the scene
             * @param x position on screen
             * @param y position on screen
             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
             * @param fastCheck defines if the first intersection will be used (and not the closest)
             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
             * @returns a PickingInfo
             */
            pickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
            /** Use the given ray to pick a sprite in the scene
             * @param ray The ray (in world space) to use to pick meshes
             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
             * @param fastCheck defines if the first intersection will be used (and not the closest)
             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
             * @returns a PickingInfo
             */
            pickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean, camera?: Camera): Nullable<PickingInfo>;
            /** @internal */
            _internalMultiPickSprites(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
            /** Launch a ray to try to pick sprites in the scene
             * @param x position on screen
             * @param y position on screen
             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
             * @param camera camera to use for computing the picking ray. Can be set to null. In this case, the scene.activeCamera will be used
             * @returns a PickingInfo array
             */
            multiPickSprite(x: number, y: number, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
            /** Use the given ray to pick sprites in the scene
             * @param ray The ray (in world space) to use to pick meshes
             * @param predicate Predicate function used to determine eligible sprites. Can be set to null. In this case, a sprite must have isPickable set to true
             * @param camera camera to use. Can be set to null. In this case, the scene.activeCamera will be used
             * @returns a PickingInfo array
             */
            multiPickSpriteWithRay(ray: Ray, predicate?: (sprite: Sprite) => boolean, camera?: Camera): Nullable<PickingInfo[]>;
            /**
             * Force the sprite under the pointer
             * @param sprite defines the sprite to use
             */
            setPointerOverSprite(sprite: Nullable<Sprite>): void;
            /**
             * Gets the sprite under the pointer
             * @returns a Sprite or null if no sprite is under the pointer
             */
            getPointerOverSprite(): Nullable<Sprite>;
        }


    /** This file must only contain pure code and pure imports */
    /** @internal */
    export type InternalSpriteAugmentedScene = Scene & {
        _onNewSpriteManagerAddedObservable?: Observable<ISpriteManager>;
        _onSpriteManagerRemovedObservable?: Observable<ISpriteManager>;
    };
    /**
     * Defines the sprite scene component responsible to manage sprites
     * in a given scene.
     */
    export class SpriteSceneComponent implements ISceneComponent {
        /**
         * The component name helpfull to identify the component in the list of scene components.
         */
        readonly name = "Sprite";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /** @internal */
        private _spritePredicate;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        private _pickSpriteButKeepRay;
        private _pointerMove;
        private _pointerDown;
        private _pointerUp;
    }
    /**
     * Register side effects for spriteSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSpriteSceneComponent(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import spriteSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Options for the SpriteRenderer
     */
    export interface SpriteRendererOptions {
        /**
         * Sets a boolean indicating if the renderer must render sprites with pixel perfect rendering.
         * In this mode, sprites are rendered as "pixel art", which means that they appear as pixelated but remain stable when moving or when rotated or scaled.
         * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!
         * Default is false.
         */
        pixelPerfect?: boolean;
    }
    /**
     * Class used to render sprites.
     *
     * It can be used either to render Sprites or ThinSprites with ThinEngine only.
     */
    export class SpriteRenderer {
        /**
         * Force all the sprites to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Defines the texture of the spritesheet
         */
        texture: Nullable<ThinTexture>;
        /**
         * Defines the default width of a cell in the spritesheet
         */
        cellWidth: number;
        /**
         * Defines the default height of a cell in the spritesheet
         */
        cellHeight: number;
        /**
         * Blend mode use to render the particle, it can be any of
         * the static Constants.ALPHA_x properties provided in this class.
         * Default value is Constants.ALPHA_COMBINE
         */
        blendMode: number;
        /**
         * Gets or sets a boolean indicating if alpha mode is automatically
         * reset.
         */
        autoResetAlpha: boolean;
        /**
         * Disables writing to the depth buffer when rendering the sprites.
         * It can be handy to disable depth writing when using textures without alpha channel
         * and setting some specific blend modes.
         */
        disableDepthWrite: boolean;
        private _fogEnabled;
        /**
         * Gets or sets a boolean indicating if the manager must consider scene fog when rendering
         */
        get fogEnabled(): boolean;
        set fogEnabled(value: boolean);
        protected _useLogarithmicDepth: boolean;
        /**
         * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)
         * You can try switching to logarithmic depth.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer
         */
        get useLogarithmicDepth(): boolean;
        set useLogarithmicDepth(value: boolean);
        /**
         * Gets the capacity of the manager
         */
        get capacity(): number;
        private _pixelPerfect;
        /**
         * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering
         * Note that pixel perfect mode is not supported in WebGL 1
         */
        get pixelPerfect(): boolean;
        set pixelPerfect(value: boolean);
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this renderer.
         */
        get shaderLanguage(): ShaderLanguage;
        private readonly _engine;
        private readonly _useVAO;
        private readonly _useInstancing;
        private readonly _scene;
        private readonly _capacity;
        private readonly _epsilon;
        private _vertexBufferSize;
        private _vertexData;
        private _buffer;
        private _vertexBuffers;
        private _spriteBuffer;
        private _indexBuffer;
        /** @internal */
        _drawWrapperBase: DrawWrapper;
        /** @internal */
        _drawWrapperDepth: DrawWrapper;
        private _vertexArrayObject;
        private _isDisposed;
        /**
         * Creates a new sprite renderer
         * @param engine defines the engine the renderer works with
         * @param capacity defines the maximum allowed number of sprites
         * @param epsilon defines the epsilon value to align texture (0.01 by default)
         * @param scene defines the hosting scene
         * @param rendererOptions options for the sprite renderer
         */
        constructor(engine: AbstractEngine, capacity: number, epsilon?: number, scene?: Nullable<Scene>, rendererOptions?: SpriteRendererOptions);
        private _shadersLoaded;
        private _initShaderSourceAsync;
        private _createEffects;
        /**
         * Render all child sprites
         * @param sprites defines the list of sprites to render
         * @param deltaTime defines the time since last frame
         * @param viewMatrix defines the viewMatrix to use to render the sprites
         * @param projectionMatrix defines the projectionMatrix to use to render the sprites
         * @param customSpriteUpdate defines a custom function to update the sprites data before they render
         */
        render(sprites: ThinSprite[], deltaTime: number, viewMatrix: IMatrixLike, projectionMatrix: IMatrixLike, customSpriteUpdate?: Nullable<(sprite: ThinSprite, baseSize: ISize) => void>): void;
        private _appendSpriteVertex;
        private _buildIndexBuffer;
        /**
         * Rebuilds the renderer (after a context lost, for eg)
         */
        rebuild(): void;
        /**
         * Release associated resources
         */
        dispose(): void;
    }


    /**
     * Class used to manage multiple sprites of different sizes on the same spritesheet
     * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites
     */
    export class SpritePackedManager extends SpriteManager {
        /** defines the packed manager's name */
        name: string;
        /**
         * Creates a new sprite manager from a packed sprite sheet
         * @param name defines the manager's name
         * @param imgUrl defines the sprite sheet url
         * @param capacity defines the maximum allowed number of sprites
         * @param scene defines the hosting scene
         * @param spriteJSON null otherwise a JSON object defining sprite sheet data
         * @param epsilon defines the epsilon value to align texture (0.01 by default)
         * @param samplingMode defines the sampling mode to use with spritesheet
         * @param fromPacked set to true; do not alter
         * @param options options for the sprite manager
         */
        constructor(
        /** defines the packed manager's name */
        name: string, imgUrl: string, capacity: number, scene: Scene, spriteJSON?: string | null, epsilon?: number, samplingMode?: number, options?: SpriteManagerOptions);
    }


    /** This file must only contain pure code and pure imports */
    export enum SpriteMapFrameRotationDirection {
        CCW = 0,
        CW = 1
    }
    /**
     * Defines the basic options interface of a SpriteMap
     */
    export interface ISpriteMapOptions {
        /**
         * Vector2 of the number of cells in the grid.
         */
        stageSize?: Vector2;
        /**
         * Vector2 of the size of the output plane in World Units.
         */
        outputSize?: Vector2;
        /**
         * Vector3 of the position of the output plane in World Units.
         */
        outputPosition?: Vector3;
        /**
         * Vector3 of the rotation of the output plane.
         */
        outputRotation?: Vector3;
        /**
         * number of layers that the system will reserve in resources.
         */
        layerCount?: number;
        /**
         * number of max animation frames a single cell will reserve in resources.
         */
        maxAnimationFrames?: number;
        /**
         * number cell index of the base tile when the system compiles.
         */
        baseTile?: number;
        /**
         * boolean flip the sprite after its been repositioned by the framing data.
         */
        flipU?: boolean;
        /**
         * Vector3 scalar of the global RGB values of the SpriteMap.
         */
        colorMultiply?: Vector3;
        /**
         * Rotation direction of the frame by 90 degrees.
         * Applied when the the frame's "rotated" parameter is true.
         * Default is CCW.
         */
        frameRotationDirection?: SpriteMapFrameRotationDirection;
    }
    /**
     * Defines the IDisposable interface in order to be cleanable from resources.
     */
    export interface ISpriteMap extends IDisposable {
        /**
         * String name of the SpriteMap.
         */
        name: string;
        /**
         * The JSON Array file from a https://www.codeandweb.com/texturepacker export.  Or similar structure.
         */
        atlasJSON: ISpriteJSONAtlas;
        /**
         * Texture of the SpriteMap.
         */
        spriteSheet: Texture;
        /**
         * The parameters to initialize the SpriteMap with.
         */
        options: ISpriteMapOptions;
    }
    /**
     * Class used to manage a grid restricted sprite deployment on an Output plane.
     */
    export class SpriteMap implements ISpriteMap {
        /** The Name of the spriteMap */
        name: string;
        /** The JSON file with the frame and meta data */
        atlasJSON: ISpriteJSONAtlas;
        /** The systems Sprite Sheet Texture */
        spriteSheet: Texture;
        /** Arguments passed with the Constructor */
        options: ISpriteMapOptions;
        /** Public Sprite Storage array, parsed from atlasJSON */
        sprites: Array<ISpriteJSONSprite>;
        /** Returns the Number of Sprites in the System */
        get spriteCount(): number;
        /** Returns the Position of Output Plane*/
        get position(): Vector3;
        /** Returns the Position of Output Plane*/
        set position(v: Vector3);
        /** Returns the Rotation of Output Plane*/
        get rotation(): Vector3;
        /** Returns the Rotation of Output Plane*/
        set rotation(v: Vector3);
        /** Sets the AnimationMap*/
        get animationMap(): RawTexture;
        /** Sets the AnimationMap*/
        set animationMap(v: RawTexture);
        /** Gets or sets a boolean indicating if the sprite map must consider scene fog when rendering */
        get fogEnabled(): boolean;
        set fogEnabled(value: boolean);
        protected _useLogarithmicDepth: boolean;
        /** Gets or sets a boolean indicating if the sprite map must use logarithmic depth when rendering */
        get useLogarithmicDepth(): boolean;
        set useLogarithmicDepth(value: boolean);
        /** Scene that the SpriteMap was created in */
        private _scene;
        /** Texture Buffer of Float32 that holds tile frame data*/
        private _frameMap;
        /** Texture Buffers of Float32 that holds tileMap data*/
        private _tileMaps;
        /** Texture Buffer of Float32 that holds Animation Data*/
        private _animationMap;
        /** Custom ShaderMaterial Central to the System*/
        private _material;
        /** Custom ShaderMaterial Central to the System*/
        private _output;
        /** Systems Time Ticker*/
        private _time;
        /**
         * Creates a new SpriteMap
         * @param name defines the SpriteMaps Name
         * @param atlasJSON is the JSON file that controls the Sprites Frames and Meta
         * @param spriteSheet is the Texture that the Sprites are on.
         * @param options a basic deployment configuration
         * @param scene The Scene that the map is deployed on
         */
        constructor(name: string, atlasJSON: ISpriteJSONAtlas, spriteSheet: Texture, options: ISpriteMapOptions, scene: Scene);
        /**
         * Returns the index of the frame for a given filename
         * @param name filename of the frame
         * @returns index of the frame
         */
        getTileIdxByName(name: string): number;
        /**
         * Returns tileID location
         * @returns Vector2 the cell position ID
         */
        getTileID(): Vector2;
        /**
         * Gets the UV location of the mouse over the SpriteMap.
         * @returns Vector2 the UV position of the mouse interaction
         */
        getMousePosition(): Vector2;
        /**
         * Creates the "frame" texture Buffer
         * -------------------------------------
         * Structure of frames
         *  "filename": "Falling-Water-2.png",
         * "frame": {"x":69,"y":103,"w":24,"h":32},
         * "rotated": true,
         * "trimmed": true,
         * "spriteSourceSize": {"x":4,"y":0,"w":24,"h":32},
         * "sourceSize": {"w":32,"h":32}
         * @returns RawTexture of the frameMap
         */
        private _createFrameBuffer;
        /**
         * Creates the tileMap texture Buffer
         * @param buffer normally and array of numbers, or a false to generate from scratch
         * @param _layer indicates what layer for a logic trigger dealing with the baseTile.  The system uses this
         * @returns RawTexture of the tileMap
         */
        private _createTileBuffer;
        /**
         * Modifies the data of the tileMaps
         * @param _layer is the ID of the layer you want to edit on the SpriteMap
         * @param pos is the iVector2 Coordinates of the Tile
         * @param tile The SpriteIndex of the new Tile
         */
        changeTiles(_layer: number | undefined, pos: Vector2 | Vector2[], tile?: number): void;
        /**
         * Creates the animationMap texture Buffer
         * @param buffer normally and array of numbers, or a false to generate from scratch
         * @returns RawTexture of the animationMap
         */
        private _createTileAnimationBuffer;
        /**
         * Modifies the data of the animationMap
         * @param cellID is the Index of the Sprite
         * @param _frame is the target Animation frame
         * @param toCell is the Target Index of the next frame of the animation
         * @param time is a value between 0-1 that is the trigger for when the frame should change tiles
         * @param speed is a global scalar of the time variable on the map.
         */
        addAnimationToTile(cellID?: number, _frame?: number, toCell?: number, time?: number, speed?: number): void;
        /**
         * Exports the .tilemaps file
         */
        saveTileMaps(): void;
        /**
         * Imports the .tilemaps file
         * @param url of the .tilemaps file
         */
        loadTileMaps(url: string): void;
        /**
         * Release associated resources
         */
        dispose(): void;
    }




    /**
     * Defines the minimum interface to fulfill in order to be a sprite manager.
     */
    export interface ISpriteManager extends IDisposable {
        /**
         * Gets or sets the unique id of the sprite manager
         */
        uniqueId: number;
        /**
         * Gets manager's name
         */
        name: string;
        /**
         * Restricts the camera to viewing objects with the same layerMask.
         * A camera with a layerMask of 1 will render spriteManager.layerMask & camera.layerMask!== 0
         */
        layerMask: number;
        /**
         * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions). Default is true
         */
        isPickable: boolean;
        /**
         * Gets the hosting scene
         */
        scene: Scene;
        /**
         * Specifies the rendering group id for this mesh (0 by default)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups
         */
        renderingGroupId: number;
        /**
         * Defines the list of sprites managed by the manager.
         */
        sprites: Array<Sprite>;
        /**
         * Gets or sets the spritesheet texture
         */
        texture: Texture;
        /** Defines the default width of a cell in the spritesheet */
        cellWidth: number;
        /** Defines the default height of a cell in the spritesheet */
        cellHeight: number;
        /** @internal */
        _wasDispatched: boolean;
        /**
         * Specifies if the sprite manager should be serialized
         */
        doNotSerialize?: boolean;
        /**
         * Tests the intersection of a sprite with a specific ray.
         * @param ray The ray we are sending to test the collision
         * @param camera The camera space we are sending rays in
         * @param predicate A predicate allowing excluding sprites from the list of object to test
         * @param fastCheck defines if the first intersection will be used (and not the closest)
         * @returns picking info or null.
         */
        intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
        /**
         * Intersects the sprites with a ray
         * @param ray defines the ray to intersect with
         * @param camera defines the current active camera
         * @param predicate defines a predicate used to select candidate sprites
         * @returns null if no hit or a PickingInfo array
         */
        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
        /**
         * Renders the list of sprites on screen.
         */
        render(): void;
        /**
         * Rebuilds the manager (after a context lost, for eg)
         */
        rebuild(): void;
        /**
         * Serializes the sprite manager to a JSON object
         * @param serializeTexture defines whether the texture must be serialized as well (false by default)
         */
        serialize(serializeTexture?: boolean): any;
    }
    /**
     * Options for the SpriteManager
     */
    export interface SpriteManagerOptions {
        /** Options for the sprite renderer */
        spriteRendererOptions: SpriteRendererOptions;
    }
    /**
     * Class used to manage multiple sprites on the same spritesheet
     * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites
     */
    export class SpriteManager implements ISpriteManager {
        /** defines the manager's name */
        name: string;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /** Snippet ID if the manager was created from the snippet server */
        snippetId: string;
        /** Gets the list of sprites */
        sprites: Sprite[];
        /** Gets or sets the rendering group id (0 by default) */
        renderingGroupId: number;
        /** Gets or sets camera layer mask */
        layerMask: number;
        /** Gets or sets a boolean indicating if the sprites are pickable */
        isPickable: boolean;
        /**
         * Gets or sets an object used to store user defined information for the sprite manager
         */
        metadata: any;
        /** @internal */
        _wasDispatched: boolean;
        /**
         * An event triggered when the manager is disposed.
         */
        onDisposeObservable: Observable<SpriteManager>;
        /**
         * Callback called when the manager is disposed
         */
        set onDispose(callback: () => void);
        /**
         * Gets or sets the unique id of the sprite
         */
        uniqueId: number;
        /**
         * Specifies if the sprite manager should be serialized
         */
        doNotSerialize: boolean;
        /**
         * Gets the array of sprites
         */
        get children(): Sprite[];
        /**
         * Gets the hosting scene
         */
        get scene(): InternalSpriteAugmentedScene;
        /**
         * Gets the capacity of the manager
         */
        get capacity(): number;
        /**
         * Gets or sets the spritesheet texture
         */
        get texture(): Texture;
        set texture(value: Texture);
        /** Defines the default width of a cell in the spritesheet */
        get cellWidth(): number;
        set cellWidth(value: number);
        /** Defines the default height of a cell in the spritesheet */
        get cellHeight(): number;
        set cellHeight(value: number);
        /** Gets or sets a boolean indicating if the manager must consider scene fog when rendering */
        get fogEnabled(): boolean;
        set fogEnabled(value: boolean);
        /** Gets or sets a boolean indicating if the manager must use logarithmic depth when rendering */
        get useLogarithmicDepth(): boolean;
        set useLogarithmicDepth(value: boolean);
        /**
         * Blend mode use to render the particle, it can be any of
         * the static Constants.ALPHA_x properties provided in this class.
         * Default value is Constants.ALPHA_COMBINE
         */
        get blendMode(): number;
        set blendMode(blendMode: number);
        private _disableDepthWrite;
        /** Disables writing to the depth buffer when rendering the sprites.
         *  It can be handy to disable depth writing when using textures without alpha channel
         *  and setting some specific blend modes.
         */
        get disableDepthWrite(): boolean;
        set disableDepthWrite(value: boolean);
        /**
         * Gets or sets a boolean indicating if the renderer must render sprites with pixel perfect rendering
         * In this mode, sprites are rendered as "pixel art", which means that they appear as pixelated but remain stable when moving or when rotated or scaled.
         * Note that for this mode to work as expected, the sprite texture must use the BILINEAR sampling mode, not NEAREST!
         */
        get pixelPerfect(): boolean;
        set pixelPerfect(value: boolean);
        /**
         * Gets the sprite renderer associated with this manager
         */
        get spriteRenderer(): SpriteRenderer;
        private _spriteRenderer;
        /** Associative array from JSON sprite data file */
        private _cellData;
        /** Array of sprite names from JSON sprite data file */
        private _spriteMap;
        /** True when packed cell data from JSON file is ready*/
        private _packedAndReady;
        private _textureContent;
        private _onDisposeObserver;
        private _fromPacked;
        private _scene;
        /**
         * Creates a new sprite manager
         * @param name defines the manager's name
         * @param imgUrl defines the sprite sheet url
         * @param capacity defines the maximum allowed number of sprites
         * @param cellSize defines the size of a sprite cell
         * @param scene defines the hosting scene
         * @param epsilon defines the epsilon value to align texture (0.01 by default)
         * @param samplingMode defines the sampling mode to use with spritesheet
         * @param fromPacked set to false; do not alter
         * @param spriteJSON null otherwise a JSON object defining sprite sheet data; do not alter
         * @param options options used to create the SpriteManager instance
         */
        constructor(
        /** defines the manager's name */
        name: string, imgUrl: string, capacity: number, cellSize: any, scene: Scene, epsilon?: number, samplingMode?: number, fromPacked?: boolean, spriteJSON?: null | string, options?: SpriteManagerOptions);
        /**
         * Returns the string "SpriteManager"
         * @returns "SpriteManager"
         */
        getClassName(): string;
        private _makePacked;
        private _checkTextureAlpha;
        /**
         * Intersects the sprites with a ray
         * @param ray defines the ray to intersect with
         * @param camera defines the current active camera
         * @param predicate defines a predicate used to select candidate sprites
         * @param fastCheck defines if a fast check only must be done (the first potential sprite is will be used and not the closer)
         * @returns null if no hit or a PickingInfo
         */
        intersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean, fastCheck?: boolean): Nullable<PickingInfo>;
        /**
         * Intersects the sprites with a ray
         * @param ray defines the ray to intersect with
         * @param camera defines the current active camera
         * @param predicate defines a predicate used to select candidate sprites
         * @returns null if no hit or a PickingInfo array
         */
        multiIntersects(ray: Ray, camera: Camera, predicate?: (sprite: Sprite) => boolean): Nullable<PickingInfo[]>;
        /**
         * Render all child sprites
         */
        render(): void;
        private _customUpdate;
        /**
         * Rebuilds the manager (after a context lost, for eg)
         */
        rebuild(): void;
        /**
         * Release associated resources
         */
        dispose(): void;
        /**
         * Serializes the sprite manager to a JSON object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns the JSON object
         */
        serialize(serializeTexture?: boolean): any;
        /**
         * Parses a JSON object to create a new sprite manager.
         * @param parsedManager The JSON object to parse
         * @param scene The scene to create the sprite manager
         * @param rootUrl The root url to use to load external dependencies like texture
         * @returns the new sprite manager
         */
        static Parse(parsedManager: any, scene: Scene, rootUrl: string): SpriteManager;
        /**
         * Creates a sprite manager from a snippet saved in a remote file
         * @param name defines the name of the sprite manager to create (can be null or empty to use the one from the json data)
         * @param url defines the url to load from
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a promise that will resolve to the new sprite manager
         */
        static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl?: string): Promise<SpriteManager>;
        /**
         * Creates a sprite manager from a snippet saved by the sprite editor
         * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a promise that will resolve to the new sprite manager
         */
        static ParseFromSnippetAsync(snippetId: string, scene: Scene, rootUrl?: string): Promise<SpriteManager>;
        /**
         * Creates a sprite manager from a snippet saved by the sprite editor
         * @deprecated Please use ParseFromSnippetAsync instead
         * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a promise that will resolve to the new sprite manager
         */
        static CreateFromSnippetAsync: typeof SpriteManager.ParseFromSnippetAsync;
    }


    /**
     * Class used to represent a sprite
     * @see https://doc.babylonjs.com/features/featuresDeepDive/sprites
     */
    export class Sprite extends ThinSprite implements IAnimatable {
        /** defines the name */
        name: string;
        /** Gets or sets the current world position */
        position: Vector3;
        /** Gets or sets the main color */
        color: Color4;
        /** Gets or sets a boolean indicating that this sprite should be disposed after animation ends */
        disposeWhenFinishedAnimating: boolean;
        /** Gets the list of attached animations */
        animations: Nullable<Array<Animation>>;
        /** Gets or sets a boolean indicating if the sprite can be picked */
        isPickable: boolean;
        /** Gets or sets a boolean indicating that sprite texture alpha will be used for precise picking (false by default) */
        useAlphaForPicking: boolean;
        /**
         * Gets or sets the associated action manager
         */
        actionManager: Nullable<ActionManager>;
        /**
         * An event triggered when the control has been disposed
         */
        onDisposeObservable: Observable<Sprite>;
        private _manager;
        private _onAnimationEnd;
        /**
         * Gets or sets the sprite size
         */
        get size(): number;
        set size(value: number);
        /**
         * Gets or sets the unique id of the sprite
         */
        uniqueId: number;
        /**
         * Gets the manager of this sprite
         */
        get manager(): ISpriteManager;
        /**
         * Creates a new Sprite
         * @param name defines the name
         * @param manager defines the manager
         */
        constructor(
        /** defines the name */
        name: string, manager: ISpriteManager);
        /**
         * Returns the string "Sprite"
         * @returns "Sprite"
         */
        getClassName(): string;
        /** Gets or sets the initial key for the animation (setting it will restart the animation)  */
        get fromIndex(): number;
        set fromIndex(value: number);
        /** Gets or sets the end key for the animation (setting it will restart the animation)  */
        get toIndex(): number;
        set toIndex(value: number);
        /** Gets or sets a boolean indicating if the animation is looping (setting it will restart the animation)  */
        get loopAnimation(): boolean;
        set loopAnimation(value: boolean);
        /** Gets or sets the delay between cell changes (setting it will restart the animation)  */
        get delay(): number;
        set delay(value: number);
        /**
         * Starts an animation
         * @param from defines the initial key
         * @param to defines the end key
         * @param loop defines if the animation must loop
         * @param delay defines the start delay (in ms)
         * @param onAnimationEnd defines a callback to call when animation ends
         */
        playAnimation(from: number, to: number, loop: boolean, delay: number, onAnimationEnd?: Nullable<() => void>): void;
        private _endAnimation;
        /** Release associated resources */
        dispose(): void;
        /**
         * Serializes the sprite to a JSON object
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parses a JSON object to create a new sprite
         * @param parsedSprite The JSON object to parse
         * @param manager defines the hosting manager
         * @returns the new sprite
         */
        static Parse(parsedSprite: any, manager: SpriteManager): Sprite;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * Defines the basic options interface of a Sprite Frame Source Size.
     */
    export interface ISpriteJSONSpriteSourceSize {
        /**
         * number of the original width of the Frame
         */
        w: number;
        /**
         * number of the original height of the Frame
         */
        h: number;
    }
    /**
     * Defines the basic options interface of a Sprite Frame Data.
     */
    export interface ISpriteJSONSpriteFrameData {
        /**
         * number of the x offset of the Frame
         */
        x: number;
        /**
         * number of the y offset of the Frame
         */
        y: number;
        /**
         * number of the width of the Frame
         */
        w: number;
        /**
         * number of the height of the Frame
         */
        h: number;
    }
    /**
     * Defines the basic options interface of a JSON Sprite.
     */
    export interface ISpriteJSONSprite {
        /**
         * string name of the Frame
         */
        filename: string;
        /**
         * ISpriteJSONSpriteFrame basic object of the frame data
         */
        frame: ISpriteJSONSpriteFrameData;
        /**
         * boolean to flag is the frame was rotated.
         */
        rotated: boolean;
        /**
         * boolean to flag is the frame was trimmed.
         */
        trimmed: boolean;
        /**
         * ISpriteJSONSpriteFrame basic object of the source data
         */
        spriteSourceSize: ISpriteJSONSpriteFrameData;
        /**
         * ISpriteJSONSpriteFrame basic object of the source data
         */
        sourceSize: ISpriteJSONSpriteSourceSize;
    }
    /**
     * Defines the basic options interface of a JSON atlas.
     */
    export interface ISpriteJSONAtlas {
        /**
         * Array of objects that contain the frame data.
         */
        frames: Array<ISpriteJSONSprite>;
        /**
         * object basic object containing the sprite meta data.
         */
        meta?: object;
    }


    /**
     * A serialized smart asset entry in the asset map JSON document.
     */
    export interface ISerializedSmartAssetEntry {
        /** URL or path to the asset file. */
        readonly url: string;
        /** Optional loader type hint (e.g., "gltf", "texture"). */
        readonly type?: string;
        /** Optional file extension hint (e.g., ".glb", ".png"). */
        readonly extension?: string;
        /** Optional user-defined metadata. */
        readonly metadata?: Record<string, unknown>;
    }
    /**
     * A versioned JSON document describing a smart asset map.
     * This is the on-disk format for persisting the asset table.
     *
     * Runtime object ownership is intentionally not persisted — it is rebuilt from
     * each loaded `AssetContainer` after load. Persisting it would risk staleness.
     */
    export interface ISerializedSmartAssetMap {
        /** Schema version. Must be 1 for the current version. */
        readonly version: 1;
        /** Map of asset keys to their serialized entries. */
        readonly assets: Record<string, ISerializedSmartAssetEntry>;
    }
    /**
     * Validates and parses a serialized smart asset map document.
     * @param data - The raw data to validate (typically parsed JSON).
     * @returns The validated document.
     * @throws If the data does not conform to the expected schema.
     */
    export function DeserializeSmartAssetMap(data: unknown): ISerializedSmartAssetMap;
    /**
     * Returns true for `data:`, `blob:`, or any URL with an absolute protocol.
     * @param url - The URL to inspect.
     * @returns Whether the URL is absolute or a data/blob URI.
     */
    export function IsAbsoluteOrSpecialUrl(url: string): boolean;
    /**
     * Resolves an asset URL relative to a base URL.
     * Absolute URLs (http://, https://) and data URIs are returned as-is.
     * @param assetUrl - The asset URL to resolve.
     * @param baseUrl - The base URL to resolve against (typically the folder containing the asset map file).
     * @returns The resolved URL.
     */
    export function ResolveAssetUrl(assetUrl: string, baseUrl: string): string;
    /**
     * Makes a URL relative to a base URL by stripping the common folder prefix.
     * If the URL doesn't share a prefix with baseUrl, returns it unchanged.
     * @param url - The URL to relativize.
     * @param baseUrl - The base URL whose folder is the relativization root.
     * @returns The relativized URL, or the original if no common prefix exists.
     */
    export function MakeRelative(url: string, baseUrl: string): string;
    /**
     * Reads a JSON source from a string URL, File object, or pre-parsed object.
     * @param source - The source to read.
     * @returns A promise resolving to the parsed JSON data.
     */
    export function ReadJsonSourceAsync(source: string | File | object): Promise<unknown>;


    /**
     * Stateful handle for a scene's smart asset registry.
     *
     * Smart asset behavior is exposed through module-level functions rather than
     * class methods so callers can import only the operations they need.
     */
    export type SmartAssetManager = {
        /**
         * The scene this manager is attached to.
         */
        readonly scene: Scene;
        /**
         * Fires when the smart asset registry or loaded asset state changes.
         */
        readonly onChangedObservable: Observable<void>;
        /**
         * Optional callback invoked when an asset cannot be found at its registered URL.
         * Return a new URL or File to retry loading, or null to skip the asset.
         */
        onAssetNotFound: ((key: string, expectedUrl: string) => Promise<string | File | null>) | null;
    };
    /**
     * Optional registration data that helps select the correct loader when the URL
     * does not contain a usable file extension, such as blob-backed local files.
     */
    type SmartAssetRegistrationOptions = Pick<ISerializedSmartAssetEntry, "type" | "extension" | "metadata">;
    /**
     * Optional load-time configuration. Includes the persistable {@link SmartAssetRegistrationOptions}
     * fields (type, extension, metadata) plus a transient `reloadSource` callback used by
     * {@link ReloadSmartAssetAsync} to fetch fresh bytes from disk for blob-backed assets.
     */
    export type SmartAssetLoadOptions = SmartAssetRegistrationOptions & {
        /**
         * Optional callback invoked by {@link ReloadSmartAssetAsync} to obtain a fresh File
         * for the asset. Use this when the registered URL is a `blob:` URL backed by a
         * `FileSystemFileHandle` so Reload can re-read the underlying file from disk.
         */
        readonly reloadSource?: () => Promise<File>;
    };
    /**
     * Returns the SmartAssetManager attached to the given scene, creating and
     * attaching one if none exists.
     * @param scene - The scene to look up or attach a manager to.
     * @returns The existing or newly created SmartAssetManager.
     */
    export function GetSmartAssetManager(scene: Scene): SmartAssetManager;
    /**
     * Adds an observer that is notified whenever a SmartAssetManager is created.
     * @param callback - The callback to invoke with each newly created manager.
     * @returns The observer registration.
     */
    export function AddSmartAssetManagerCreatedObserver(callback: (manager: SmartAssetManager) => void): Observer<SmartAssetManager>;
    /**
     * Registers a smart asset entry mapping a key to a URL.
     * @param scene - The scene whose smart asset registry to update.
     * @param key - Unique string identifier for this asset.
     * @param url - URL or path to the asset file.
     * @param options - Optional loader hints and metadata for this asset.
     */
    export function RegisterSmartAsset(scene: Scene, key: string, url: string, options?: SmartAssetRegistrationOptions): void;
    /**
     * Removes a key from the registry. If the asset is loaded, it is unloaded first.
     * @param scene - The scene that owns the smart asset.
     * @param key - The key to remove.
     * @returns A promise that resolves when the asset has been unloaded and removed.
     */
    export function RemoveSmartAssetAsync(scene: Scene, key: string): Promise<void>;
    /**
     * Returns all registered key-to-URL mappings.
     * @param scene - The scene whose smart asset registry to read.
     * @returns A read-only map of keys to URLs.
     */
    export function GetAllSmartAssets(scene: Scene): ReadonlyMap<string, string>;
    /**
     * Loads a scene-file asset by key.
     * @param scene - The scene to load the asset into.
     * @param key - The key to load.
     * @param url - Optional URL. If provided, the key is registered first.
     * @param options - Optional loader hints and metadata for this asset.
     * @returns A promise resolving to the loaded AssetContainer.
     */
    export function LoadSmartAssetAsync(scene: Scene, key: string, url?: string, options?: SmartAssetLoadOptions): Promise<AssetContainer>;
    /**
     * Loads all registered assets concurrently.
     * @param scene - The scene whose registered assets to load.
     * @returns A promise resolving to loaded scene-file containers.
     */
    export function LoadAllSmartAssetsAsync(scene: Scene): Promise<AssetContainer[]>;
    /**
     * Loads a standalone texture by key.
     * @param scene - The scene to load the texture into.
     * @param key - The key to load.
     * @param url - Optional URL. If provided, the key is registered first.
     * @param options - Optional loader hints and metadata for this asset.
     * @returns A promise resolving to the loaded texture.
     */
    export function LoadSmartAssetTextureAsync(scene: Scene, key: string, url?: string, options?: SmartAssetLoadOptions): Promise<BaseTexture>;
    /**
     * Unloads a loaded asset while keeping the key registered.
     * @param scene - The scene whose smart asset to unload.
     * @param key - The key to unload.
     * @returns A promise that resolves once the asset has been unloaded.
     */
    export function UnloadSmartAssetAsync(scene: Scene, key: string): Promise<void>;
    /**
     * Unloads and re-loads an asset.
     * @param scene - The scene whose smart asset to reload.
     * @param key - The key to reload.
     * @returns A promise resolving to the newly loaded AssetContainer or BaseTexture.
     */
    export function ReloadSmartAssetAsync(scene: Scene, key: string): Promise<AssetContainer | BaseTexture>;
    /**
     * Finds which smart asset key owns a scene object.
     * @param scene - The scene whose registry to search.
     * @param object - A scene object.
     * @returns The key, or undefined if the object is not tracked.
     */
    export function FindSmartAssetKeyForObject(scene: Scene, object: Node | Material | BaseTexture | AnimationGroup): string | undefined;
    /**
     * Serializes the registry to a JSON-compatible document.
     * If a baseUrl is provided, asset URLs are stored relative to it for portability.
     * @param scene - The scene whose registry to serialize.
     * @param baseUrl - Optional base URL for making asset paths relative.
     * @returns A serialized asset map document.
     */
    export function SerializeSmartAssetManagerMap(scene: Scene, baseUrl?: string): ISerializedSmartAssetMap;
    /**
     * Loads an asset map from a URL, File, or pre-parsed JSON object.
     * @param scene - The scene to load assets into.
     * @param source - A URL string, File object, or pre-parsed ISerializedSmartAssetMap.
     * @param rootUrl - Optional root URL for resolving relative asset paths.
     * @returns A promise that resolves after the map has been loaded and all registered assets have been attempted.
     */
    export function LoadSmartAssetMapAsync(scene: Scene, source: string | File | ISerializedSmartAssetMap, rootUrl?: string): Promise<void>;
    /**
     * Disposes the manager, unloading all assets and detaching it from its scene.
     * Safe to call multiple times; subsequent calls are no-ops. Automatically invoked when the
     * owning scene is disposed.
     * @param manager - The smart asset manager state.
     */
    export function DisposeSmartAssetManager(manager: SmartAssetManager): void;
    /**
     * Returns the set of file extensions (including the leading dot) that {@link LoadAllSmartAssetsAsync}
     * treats as standalone textures.
     * @returns A read-only set of texture file extensions.
     */
    export function GetSmartAssetTextureExtensions(): ReadonlySet<string>;


    /** Pure barrel — re-exports only side-effect-free modules */




    /** @internal */
    export var vrDistortionCorrectionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingRenderVolumeVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingRenderVolumePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingBlendVolumePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var tonemapPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureProcessorPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureMergerPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var taaPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var subSurfaceScatteringPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ssaoCombinePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ssao2PixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spritesVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spritesPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sharpenPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionOutlinePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2BlurCombinerPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2BlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2PixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceCurvaturePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rsmGlobalIlluminationPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rsmFullGlobalIlluminationPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rgbdEncodePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rgbdDecodePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var proceduralVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var postprocessVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pickingVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pickingPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var passCubePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var passPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var particlesVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var particlesPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var outlineVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var outlinePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFinalSimpleBlendPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFinalPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitBackBlendPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var noisePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var motionBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var minmaxReduxPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererMaskerVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererMaskerPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererFinaliserVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererFinaliserPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lodCubePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lod3DPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lodPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lineVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var linePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightingVolumeComputeShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightProxyVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightProxyPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lensFlareVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lensFlarePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var layerVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var layerPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGrid2dArrayDebugPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGridVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGridPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowsCombinePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowVoxelTracingPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowSpatialBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowGBufferDebugPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowDebugPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowAccumulationPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblScaledLuminancePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblIcdfPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblGenerateVoxelMipPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblDominantDirectionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCombineVoxelGridsPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfyPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfxPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfDebugPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var highlightsPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrIrradianceFilteringVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrIrradianceFilteringPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var greasedLineVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var greasedLinePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var grainPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuUpdateParticlesComputeShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuRenderParticlesVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuRenderParticlesPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapMergeVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapMergePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapGenerationVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapGenerationPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowBlurPostProcessPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVoxelVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVoxelPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingDepthVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingDepthPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fxaaVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fxaaPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingStandardBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingRenderPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleThicknessVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleThicknessPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDiffuseVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDiffusePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDepthVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDepthPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingBilateralBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var filterPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var extractHighlightsPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var displayPassPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthOfFieldMergePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthBoxBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var copyTextureToTexturePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var copyTexture3DLayerToTexturePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var convolutionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorCorrectionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clearQuadVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clearQuadPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var circleOfConfusionPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var chromaticAberrationPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingInfoComputeShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bloomMergePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var blackAndWhitePixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bilateralBlurQualityPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bilateralBlurPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundVertexShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var areaLightTextureProcessingPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var anaglyphPixelShaderWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vertexPullingVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vertexPullingDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vertexColorMixingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var uvVariableDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var uvAttributeDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureRepetitionFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var subSurfaceScatteringFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowsVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowsFragmentFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexNormalBiasWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexMetricWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexExtraDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragmentSoftTransparentShadowWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragmentExtraDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceRayTraceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sceneUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerVertexImplementationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerFragmentAlternateDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var reflectionFunctionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pointCloudVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pointCloudVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrIBLFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrHelperFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentSamplersDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentReflectionDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentExtraDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingSetupFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingFalloffFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDebugWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockSubSurfaceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockSheenWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectivityWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectance0WGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectanceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockPrePassWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockNormalGeometricWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockNormalFinalWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockLightmapInitWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockIridescenceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockImageProcessingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockGeometryInfoWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalUnlitComponentsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalLitComponentsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalColorCompositionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockDirectLightingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockClearcoatWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAnisotropicWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAmbientOcclusionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAlphaFresnelWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAlbedoOpacityWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBRDFFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var packingFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrVolumeFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrTransmissionLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrThinFilmLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrSubsurfaceLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragmentMainFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragmentFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrIblFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrGeometryInfoWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrFuzzLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrFragmentSamplersDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrEnvironmentLightingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDirectLightingInitWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDirectLightingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDielectricReflectanceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrConductorReflectanceWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrCoatLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBlockPrePassWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBlockNormalFinalWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBaseLayerDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBackgroundTransmissionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrAmbientOcclusionFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrAmbientOcclusionDataWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexGlobalDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexGlobalWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var mainUVVaryingDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ltcHelperFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightsFragmentFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightVxUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightVxFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVaryingDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurFragment2WGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var intersectionFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var instancesVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var instancesDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var importanceSamplingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingCompatibilityWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var helperFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var harmonicsFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fresnelFunctionWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fibonacciWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var diffusionProfileWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthPrePassWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clusteredLightingFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneFragmentDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpVertexDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragmentMainFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragmentFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragmentWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bonesVertexWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bonesDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bayerDitherFunctionsWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bakedVertexAnimationDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bakedVertexAnimationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundUboDeclarationWGSL: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vrMultiviewToSingleviewPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vrDistortionCorrectionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingRenderVolumeVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingRenderVolumePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightingBlendVolumePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightScatteringPassVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightScatteringPassPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var volumetricLightScatteringPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var velocityVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var velocityPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var tonemapPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureProcessorPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureMergerPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var taaPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var subSurfaceScatteringPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var stereoscopicInterlacePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var standardPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ssaoCombinePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ssao2PixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ssaoPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spritesVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spritesPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spriteMapVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var spriteMapPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sharpenPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionOutlinePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var selectionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2BlurCombinerPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2BlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflection2PixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceReflectionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceCurvaturePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rsmGlobalIlluminationPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rsmFullGlobalIlluminationPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rgbdEncodePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var rgbdDecodePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var refractionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var proceduralVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var postprocessVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pickingVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pickingPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var passCubePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var passPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var particlesVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var particlesPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var outlineVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var outlinePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFinalSimpleBlendPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFinalPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitBackBlendPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var noisePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var motionBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var minmaxReduxPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererMaskerVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererMaskerPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererFinaliserVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererFinaliserPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUVSpaceRendererPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lodCubePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lod3DPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lodPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lineVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var linePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightProxyVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightProxyPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lensHighlightsPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lensFlareVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lensFlarePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var layerVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var layerPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGrid2dArrayDebugPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGridVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblVoxelGridPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowsCombinePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowVoxelTracingPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowSpatialBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowGBufferDebugPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowDebugPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblShadowAccumulationPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblScaledLuminancePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblIcdfPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblGenerateVoxelMipPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblDominantDirectionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCombineVoxelGridsPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfyPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfxPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var iblCdfDebugPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var highlightsPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrIrradianceFilteringVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrIrradianceFilteringPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var greasedLineVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var greasedLinePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var grainPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuUpdateParticlesVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuUpdateParticlesPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuTransformVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuTransformPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuRenderParticlesVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gpuRenderParticlesPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapMergeVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapMergePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapGenerationVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowMapGenerationPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var glowBlurPostProcessPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVoxelVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVoxelPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingDepthVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingDepthPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fxaaVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fxaaPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingStandardBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingRenderPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleThicknessVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleThicknessPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDiffuseVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDiffusePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDepthVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingParticleDepthPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fluidRenderingBilateralBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var filterPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var extractHighlightsPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var equirectangularPanoramaPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var displayPassPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthOfFieldMergePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthOfFieldPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthBoxBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var copyTextureToTexturePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var copyTexture3DLayerToTexturePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var convolutionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorCorrectionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var colorPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var circleOfConfusionPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var chromaticAberrationPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bloomMergePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var blackAndWhitePixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bilateralBlurQualityPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bilateralBlurPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundVertexShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var areaLightTextureProcessingPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var anaglyphPixelShader: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var vertexColorMixing: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var uvVariableDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var uvAttributeDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var textureRepetitionFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var subSurfaceScatteringFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowsVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowsFragmentFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexNormalBias: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexMetric: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexExtraDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragmentSoftTransparentShadow: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragmentExtraDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var shadowMapFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var screenSpaceRayTrace: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sceneVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sceneUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var sceneFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerVertexImplementation: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var samplerFragmentAlternateDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var reflectionFunction: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var prePassDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pointCloudVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pointCloudVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrIBLFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrHelperFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentSamplersDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentReflectionDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentExtraDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingSetupFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDirectLightingFalloffFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrDebug: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrClusteredLightingFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockSubSurface: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockSheen: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectivity: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflection: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectance0: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockReflectance: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockPrePass: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockNormalGeometric: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockNormalFinal: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockLightmapInit: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockIridescence: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockImageProcessing: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockGeometryInfo: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalUnlitComponents: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalLitComponents: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockFinalColorComposition: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockDirectLighting: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockClearcoat: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAnisotropic: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAmbientOcclusion: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAlphaFresnel: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBlockAlbedoOpacity: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var pbrBRDFFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var packingFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrVolumeFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrTransmissionLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrThinFilmLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrSubsurfaceLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragmentMainFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragmentFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrNormalMapFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrIblFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrGeometryInfo: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrFuzzLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrFragmentSamplersDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrEnvironmentLighting: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDirectLightingShadow: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDirectLightingInit: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDirectLighting: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrDielectricReflectance: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrConductorReflectance: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrCoatLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBlockPrePass: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBlockNormalFinal: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBaseLayerData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrBackgroundTransmission: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrAmbientOcclusionFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var openpbrAmbientOcclusionData: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var oitDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var mrtFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexGlobalDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexGlobal: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var morphTargetsVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var meshFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var mainUVVaryingDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var ltcHelperFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var logDepthDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lineVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lineUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightsFragmentFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightVxUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightVxFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var lightFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurVaryingDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurFragment2: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var kernelBlurFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var intersectionFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var instancesVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var instancesDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var importanceSampling: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var imageProcessingCompatibility: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var helperFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var hdrFilteringFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var harmonicsFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var geometryUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplattingFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var gaussianSplatting: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fresnelFunction: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fogFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var fibonacci: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var diffusionProfile: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var depthPrePass: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var defaultFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var decalFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clusteredLightingFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneVertexDeclaration2: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneFragmentDeclaration2: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var clipPlaneFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragmentMainFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragmentFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bumpFragment: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var boundingBoxRendererFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bonesVertex: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bonesDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bayerDitherFunctions: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bakedVertexAnimationDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var bakedVertexAnimation: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundVertexDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundUboDeclaration: {
        name: string;
        shader: string;
    };


    /** @internal */
    export var backgroundFragmentDeclaration: {
        name: string;
        shader: string;
    };


    /**
     * Renders a layer on top of an existing scene
     */
    export class UtilityLayerRenderer implements IDisposable {
        /** the original scene that will be rendered on top of */
        originalScene: Scene;
        readonly handleEvents: boolean;
        private _pointerCaptures;
        private _lastPointerEvents;
        /** @internal */
        static _DefaultUtilityLayer: Nullable<UtilityLayerRenderer>;
        /** @internal */
        static _DefaultKeepDepthUtilityLayer: Nullable<UtilityLayerRenderer>;
        private _sharedGizmoLight;
        private _renderCamera;
        /**
         * Gets the camera that is used to render the utility layer (when not set, this will be the last active camera)
         * @param getRigParentIfPossible if the current active camera is a rig camera, should its parent camera be returned
         * @returns the camera that is used when rendering the utility layer
         */
        getRenderCamera(getRigParentIfPossible?: boolean): Camera;
        /**
         * Sets the camera that should be used when rendering the utility layer (If set to null the last active camera will be used)
         * @param cam the camera that should be used when rendering the utility layer
         */
        setRenderCamera(cam: Nullable<Camera>): void;
        /**
         * @internal
         * Light which used by gizmos to get light shading
         */
        _getSharedGizmoLight(): HemisphericLight;
        /**
         * If the picking should be done on the utility layer prior to the actual scene (Default: true)
         */
        pickUtilitySceneFirst: boolean;
        /**
         * A shared utility layer that can be used to overlay objects into a scene (Depth map of the previous scene is cleared before drawing on top of it)
         */
        static get DefaultUtilityLayer(): UtilityLayerRenderer;
        /**
         * Creates an utility layer, and set it as a default utility layer
         * @param scene associated scene
         * @internal
         */
        static _CreateDefaultUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer;
        /**
         * A shared utility layer that can be used to embed objects into a scene (Depth map of the previous scene is not cleared before drawing on top of it)
         */
        static get DefaultKeepDepthUtilityLayer(): UtilityLayerRenderer;
        /**
         * Creates an utility layer, and set it as a default utility layer (Depth map of the previous scene is not cleared before drawing on top of it)
         * @param scene associated scene
         * @internal
         */
        static _CreateDefaultKeepUtilityLayerFromScene(scene: Scene): UtilityLayerRenderer;
        /**
         * The scene that is rendered on top of the original scene
         */
        utilityLayerScene: Scene;
        /**
         *  If the utility layer should automatically be rendered on top of existing scene
         */
        shouldRender: boolean;
        /**
         * If set to true, only pointer down onPointerObservable events will be blocked when picking is occluded by original scene
         */
        onlyCheckPointerDownEvents: boolean;
        /**
         * If set to false, only pointerUp, pointerDown and pointerMove will be sent to the utilityLayerScene (false by default)
         */
        processAllEvents: boolean;
        /**
         * Set to false to disable picking
         */
        pickingEnabled: boolean;
        /**
         * Observable raised when the pointer moves from the utility layer scene to the main scene
         */
        onPointerOutObservable: Observable<number>;
        /** Gets or sets a predicate that will be used to indicate utility meshes present in the main scene */
        mainSceneTrackerPredicate: (mesh: Nullable<AbstractMesh>) => boolean;
        private _afterRenderObserver;
        private _sceneDisposeObserver;
        private _originalPointerObserver;
        /**
         * Instantiates a UtilityLayerRenderer
         * @param originalScene the original scene that will be rendered on top of
         * @param handleEvents boolean indicating if the utility layer should handle events
         * @param manualRender boolean indicating if the utility layer should render manually.
         */
        constructor(
        /** the original scene that will be rendered on top of */
        originalScene: Scene, handleEvents?: boolean, manualRender?: boolean);
        private _notifyObservers;
        /**
         * Renders the utility layers scene on top of the original scene
         */
        render(): void;
        /**
         * Disposes of the renderer
         */
        dispose(): void;
        private _updateCamera;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     */
    export class ThinDepthPeelingRenderer {
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        protected _depthMrts: MultiRenderTarget[];
        protected _thinTextures: ThinTexture[];
        protected _colorMrts: MultiRenderTarget[];
        protected _blendBackMrt: MultiRenderTarget;
        protected _blendBackEffectWrapper: EffectWrapper;
        protected _blendBackEffectWrapperPingPong: EffectWrapper;
        protected _finalEffectWrapper: EffectWrapper;
        protected _effectRenderer: EffectRenderer;
        protected _currentPingPongState: number;
        protected _layoutCacheFormat: boolean[][];
        protected _layoutCache: number[][];
        protected _renderPassIds: number[];
        protected _candidateSubMeshes: SmartArray<SubMesh>;
        protected _excludedSubMeshes: SmartArray<SubMesh>;
        protected _excludedMeshes: number[];
        protected static _DEPTH_CLEAR_VALUE: number;
        protected static _MIN_DEPTH: number;
        protected static _MAX_DEPTH: number;
        protected _colorCache: Color4[];
        protected _passCount: number;
        /**
         * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.
         */
        get passCount(): number;
        set passCount(count: number);
        protected _useRenderPasses: boolean;
        /**
         * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.
         */
        get useRenderPasses(): boolean;
        set useRenderPasses(usePasses: boolean);
        /**
         * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer
         * @param mesh The mesh to exclude from the depth peeling renderer
         */
        addExcludedMesh(mesh: AbstractMesh): void;
        /**
         * Remove a mesh from the exclusion list of the depth peeling renderer
         * @param mesh The mesh to remove
         */
        removeExcludedMesh(mesh: AbstractMesh): void;
        /** Shader language used by the renderer */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this renderer
         */
        get shaderLanguage(): ShaderLanguage;
        private _blendOutput;
        /**
         * Sets the render target wrapper we will blend the transparent objects onto
         */
        get blendOutput(): Nullable<RenderTargetWrapper>;
        set blendOutput(blendOutput: Nullable<RenderTargetWrapper>);
        /**
         * Instanciates the depth peeling renderer
         * @param scene Scene to attach to
         * @param passCount Number of depth layers to peel
         * @returns The depth peeling renderer
         */
        constructor(scene: Scene, passCount?: number);
        private _createRenderPassIds;
        private _releaseRenderPassIds;
        protected _getTextureSize(): {
            width: number;
            height: number;
        };
        protected _createTextures(): void;
        protected _disposeTextures(): void;
        protected _createEffects(finalEffectFragmentShaderName: string, finalEffectSamplerNames: string[]): void;
        /**
         * Links to the prepass renderer
         * @param _prePassRenderer The scene PrePassRenderer
         */
        setPrePassRenderer(_prePassRenderer: PrePassRenderer): void;
        /**
         * Binds depth peeling textures on an effect
         * @param effect The effect to bind textures on
         */
        bind(effect: Effect): void;
        private _renderSubMeshes;
        protected _finalCompose(writeId: number): void;
        /**
         * Checks if the depth peeling renderer is ready to render transparent meshes
         * @returns true if the depth peeling renderer is ready to render the transparent meshes
         */
        isReady(): boolean;
        protected _beforeRender(): void;
        protected _afterRender(): void;
        protected _noTransparentMeshes(): void;
        /**
         * Renders transparent submeshes with depth peeling
         * @param transparentSubMeshes List of transparent meshes to render
         * @returns The array of submeshes that could not be handled by this renderer
         */
        render(transparentSubMeshes: SmartArray<SubMesh>): SmartArray<SubMesh>;
        /**
         * Disposes the depth peeling renderer and associated resources
         */
        dispose(): void;
    }




        interface Scene {
            /** @internal (Backing field) */
            _subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;
            /**
             * Gets or Sets the current prepass renderer associated to the scene.
             */
            subSurfaceConfiguration: Nullable<SubSurfaceConfiguration>;
            /**
             * Enables the subsurface effect for prepass
             * @returns the SubSurfaceConfiguration
             */
            enableSubSurfaceForPrePass(): Nullable<SubSurfaceConfiguration>;
            /**
             * Disables the subsurface effect for prepass
             */
            disableSubSurfaceForPrePass(): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful
     * in several rendering techniques.
     */
    export class SubSurfaceSceneComponent implements ISceneSerializableComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "PrePassRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Serializes the component data to the specified json object
         * @param serializationObject The object to serialize to
         */
        serialize(serializationObject: any): void;
        /**
         * Adds all the elements from the container to the scene
         */
        addFromContainer(): void;
        /**
         * Removes all the elements in the container from the scene
         */
        removeFromContainer(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
    }
    /**
     * Register side effects for subSurfaceSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param subSurfaceConfigClass The SubSurfaceConfiguration class to register the component for
     */
    export function RegisterSubSurfaceSceneComponent(subSurfaceConfigClass: typeof SubSurfaceConfiguration): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import subSurfaceSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Contains all parameters needed for the prepass to perform
     * screen space subsurface scattering
     */
    export class SubSurfaceConfiguration implements PrePassEffectConfiguration {
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        private _ssDiffusionS;
        private _ssFilterRadii;
        private _ssDiffusionD;
        /**
         * Post process to attach for screen space subsurface scattering
         */
        postProcess: SubSurfaceScatteringPostProcess;
        /**
         * Diffusion profile color for subsurface scattering
         */
        get ssDiffusionS(): number[];
        /**
         * Diffusion profile max color channel value for subsurface scattering
         */
        get ssDiffusionD(): number[];
        /**
         * Diffusion profile filter radius for subsurface scattering
         */
        get ssFilterRadii(): number[];
        /**
         * Is subsurface enabled
         */
        enabled: boolean;
        /**
         * Does the output of this prepass need to go through imageprocessing
         */
        needsImageProcessing: boolean;
        /**
         * Name of the configuration
         */
        name: string;
        /**
         * Diffusion profile colors for subsurface scattering
         * You can add one diffusion color using `addDiffusionProfile` on `scene.prePassRenderer`
         * See ...
         * Note that you can only store up to 5 of them
         */
        ssDiffusionProfileColors: Color3[];
        /**
         * Defines the ratio real world => scene units.
         * Used for subsurface scattering
         */
        metersPerUnit: number;
        /**
         * Textures that should be present in the MRT for this effect to work
         */
        readonly texturesRequired: number[];
        /**
         * The clear color of the render targets.
         * We need 1 for the alpha channel of the irradiance texture so that we early exit from the SSS post-process if the pixel should not be processed
         */
        clearColor: Color4;
        private _scene;
        /**
         * Builds a subsurface configuration object
         * @param scene The scene
         */
        constructor(scene: Scene);
        /**
         * Adds a new diffusion profile.
         * Useful for more realistic subsurface scattering on diverse materials.
         * @param color The color of the diffusion profile. Should be the average color of the material.
         * @returns The index of the diffusion profile for the material subsurface configuration
         */
        addDiffusionProfile(color: Color3): number;
        /**
         * Creates the sss post process
         * @returns The created post process
         */
        createPostProcess(): SubSurfaceScatteringPostProcess;
        /**
         * Deletes all diffusion profiles.
         * Note that in order to render subsurface scattering, you should have at least 1 diffusion profile.
         */
        clearAllDiffusionProfiles(): void;
        /**
         * Disposes this object
         */
        dispose(): void;
        /**
         * @internal
         * https://zero-radiance.github.io/post/sampling-diffusion/
         *
         * Importance sample the normalized diffuse reflectance profile for the computed value of 's'.
         * ------------------------------------------------------------------------------------
         * R[r, phi, s]   = s * (Exp[-r * s] + Exp[-r * s / 3]) / (8 * Pi * r)
         * PDF[r, phi, s] = r * R[r, phi, s]
         * CDF[r, s]      = 1 - 1/4 * Exp[-r * s] - 3/4 * Exp[-r * s / 3]
         * ------------------------------------------------------------------------------------
         * We importance sample the color channel with the widest scattering distance.
         */
        getDiffusionProfileParameters(color: Color3): number;
        /**
         * Performs sampling of a Normalized Burley diffusion profile in polar coordinates.
         * 'u' is the random number (the value of the CDF): [0, 1).
         * rcp(s) = 1 / ShapeParam = ScatteringDistance.
         * Returns the sampled radial distance, s.t. (u = 0 -> r = 0) and (u = 1 -> r = Inf).
         * @param u
         * @param rcpS
         * @returns The sampled radial distance
         */
        private _sampleBurleyDiffusionProfile;
    }


    /**
     * Contains all parameters needed for the prepass to perform
     * screen space subsurface scattering
     */
    export class SSAO2Configuration implements PrePassEffectConfiguration {
        /**
         * Is subsurface enabled
         */
        enabled: boolean;
        /**
         * Name of the configuration
         */
        name: string;
        /**
         * Textures that should be present in the MRT for this effect to work
         */
        readonly texturesRequired: number[];
    }


    /**
     * Contains all parameters needed for the prepass to perform
     * screen space reflections
     */
    export class ScreenSpaceReflectionsConfiguration implements PrePassEffectConfiguration {
        /**
         * Is ssr enabled
         */
        enabled: boolean;
        /**
         * Name of the configuration
         */
        name: string;
        /**
         * Textures that should be present in the MRT for this effect to work
         */
        readonly texturesRequired: number[];
    }


    /**
     * Contains all parameters needed for the prepass to perform
     * screen space reflections
     */
    export class ScreenSpaceReflections2Configuration implements PrePassEffectConfiguration {
        /**
         * Is ssr enabled
         */
        enabled: boolean;
        /**
         * Name of the configuration
         */
        name: string;
        /**
         * Textures that should be present in the MRT for this effect to work
         */
        readonly texturesRequired: number[];
        /**
         * @param useScreenspaceDepth If the effect should use the screenspace depth texture instead of a linear one
         */
        constructor(useScreenspaceDepth?: boolean);
    }


    /**
     * Interface describing the different options available in the rendering manager
     * regarding Auto Clear between groups.
     */
    export interface IRenderingManagerAutoClearSetup {
        /**
         * Defines whether or not autoclear is enable.
         */
        autoClear: boolean;
        /**
         * Defines whether or not to autoclear the depth buffer.
         */
        depth: boolean;
        /**
         * Defines whether or not to autoclear the stencil buffer.
         */
        stencil: boolean;
    }
    /**
     * This class is used by the onRenderingGroupObservable
     */
    export class RenderingGroupInfo {
        /**
         * The Scene that being rendered
         */
        scene: Scene;
        /**
         * The camera currently used for the rendering pass
         */
        camera: Nullable<Camera>;
        /**
         * The ID of the renderingGroup being processed
         */
        renderingGroupId: number;
        /**
         * The rendering manager
         */
        renderingManager: RenderingManager;
    }
    /**
     * This is the manager responsible of all the rendering for meshes sprites and particles.
     * It is enable to manage the different groups as well as the different necessary sort functions.
     * This should not be used directly aside of the few static configurations
     */
    export class RenderingManager {
        /**
         * The max id used for rendering groups (not included)
         */
        static MAX_RENDERINGGROUPS: number;
        /**
         * The min id used for rendering groups (included)
         */
        static MIN_RENDERINGGROUPS: number;
        /**
         * Used to globally prevent autoclearing scenes.
         */
        static AUTOCLEAR: boolean;
        /**
         * @internal
         */
        _useSceneAutoClearSetup: boolean;
        private _disableDepthPrePass;
        /**
         * Specifies to disable depth pre-pass if true (default: false)
         */
        get disableDepthPrePass(): boolean;
        set disableDepthPrePass(value: boolean);
        private _scene;
        private _renderingGroups;
        private _depthStencilBufferAlreadyCleaned;
        private _autoClearDepthStencil;
        private _customOpaqueSortCompareFn;
        private _customAlphaTestSortCompareFn;
        private _customTransparentSortCompareFn;
        private _renderingGroupInfo;
        private _maintainStateBetweenFrames;
        /**
         * Gets or sets a boolean indicating that the manager will not reset between frames.
         * This means that if a mesh becomes invisible or transparent it will not be visible until this boolean is set to false again.
         * By default, the rendering manager will dispatch all active meshes per frame (moving them to the transparent, opaque or alpha testing lists).
         * By turning this property on, you will accelerate the rendering by keeping all these lists unchanged between frames.
         */
        get maintainStateBetweenFrames(): boolean;
        set maintainStateBetweenFrames(value: boolean);
        /**
         * Restore wasDispatched flags on the lists of elements to render.
         */
        restoreDispachedFlags(): void;
        /**
         * Instantiates a new rendering group for a particular scene
         * @param scene Defines the scene the groups belongs to
         */
        constructor(scene: Scene);
        /**
         * @returns the list of rendering groups managed by the manager.
         */
        get renderingGroups(): Immutable<RenderingGroup[]>;
        /**
         * @returns the rendering group with the specified id.
         * @param id the id of the rendering group (0 by default)
         */
        getRenderingGroup(id: number): RenderingGroup;
        private _clearDepthStencilBuffer;
        /**
         * Renders the entire managed groups. This is used by the scene or the different render targets.
         * @internal
         */
        render(customRenderFunction: Nullable<(opaqueSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>) => void>, activeMeshes: Nullable<AbstractMesh[]>, renderParticles: boolean, renderSprites: boolean, renderDepthOnlyMeshes?: boolean, renderOpaqueMeshes?: boolean, renderAlphaTestMeshes?: boolean, renderTransparentMeshes?: boolean, customRenderTransparentSubMeshes?: (transparentSubMeshes: SmartArray<SubMesh>, renderingGroup?: RenderingGroup) => void): void;
        /**
         * Resets the different information of the group to prepare a new frame
         * @internal
         */
        reset(): void;
        /**
         * Resets the sprites information of the group to prepare a new frame
         * @internal
         */
        resetSprites(): void;
        /**
         * Dispose and release the group and its associated resources.
         * @internal
         */
        dispose(): void;
        /**
         * Clear the info related to rendering groups preventing retention points during dispose.
         */
        freeRenderingGroups(): void;
        private _prepareRenderingGroup;
        /**
         * Add a sprite manager to the rendering manager in order to render it this frame.
         * @param spriteManager Define the sprite manager to render
         */
        dispatchSprites(spriteManager: ISpriteManager): void;
        /**
         * Add a particle system to the rendering manager in order to render it this frame.
         * @param particleSystem Define the particle system to render
         */
        dispatchParticles(particleSystem: IParticleSystem): void;
        /**
         * Add a submesh to the manager in order to render it this frame
         * @param subMesh The submesh to dispatch
         * @param mesh Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.
         * @param material Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.
         */
        dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void;
        /**
         * Overrides the default sort function applied in the rendering group to prepare the meshes.
         * This allowed control for front to back rendering or reversely depending of the special needs.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param opaqueSortCompareFn The opaque queue comparison function use to sort.
         * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.
         * @param transparentSortCompareFn The transparent queue comparison function use to sort.
         */
        setRenderingOrder(renderingGroupId: number, opaqueSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, alphaTestSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, transparentSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>): void;
        /**
         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
         * @param depth Automatically clears depth between groups if true and autoClear is true.
         * @param stencil Automatically clears stencil between groups if true and autoClear is true.
         */
        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth?: boolean, stencil?: boolean): void;
        /**
         * Gets the current auto clear configuration for one rendering group of the rendering
         * manager.
         * @param index the rendering group index to get the information for
         * @returns The auto clear setup for the requested rendering group
         */
        getAutoClearDepthStencilSetup(index: number): IRenderingManagerAutoClearSetup;
    }


    /**
     * This represents the object necessary to create a rendering group.
     * This is exclusively used and created by the rendering manager.
     * To modify the behavior, you use the available helpers in your scene or meshes.
     * @internal
     */
    export class RenderingGroup {
        index: number;
        private static _ZeroVector;
        private _scene;
        private _opaqueSubMeshes;
        /** @internal */
        _transparentSubMeshes: SmartArray<SubMesh>;
        private _alphaTestSubMeshes;
        private _depthOnlySubMeshes;
        private _particleSystems;
        private _spriteManagers;
        private _opaqueSortCompareFn;
        private _alphaTestSortCompareFn;
        private _transparentSortCompareFn;
        private _renderOpaque;
        private _renderAlphaTest;
        /** @internal */
        _renderTransparent: (subMeshes: SmartArray<SubMesh>) => void;
        /** @internal */
        _empty: boolean;
        /** @internal */
        _edgesRenderers: SmartArrayNoDuplicate<IEdgesRenderer>;
        onBeforeTransparentRendering: () => void;
        disableDepthPrePass: boolean;
        /**
         * Set the opaque sort comparison function.
         * If null the sub meshes will be render in the order they were created
         */
        set opaqueSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>);
        /**
         * Set the alpha test sort comparison function.
         * If null the sub meshes will be render in the order they were created
         */
        set alphaTestSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>);
        /**
         * Set the transparent sort comparison function.
         * If null the sub meshes will be render in the order they were created
         */
        set transparentSortCompareFn(value: Nullable<(a: SubMesh, b: SubMesh) => number>);
        /**
         * Creates a new rendering group.
         * @param index The rendering group index
         * @param scene
         * @param opaqueSortCompareFn The opaque sort comparison function. If null no order is applied
         * @param alphaTestSortCompareFn The alpha test sort comparison function. If null no order is applied
         * @param transparentSortCompareFn The transparent sort comparison function. If null back to front + alpha index sort is applied
         */
        constructor(index: number, scene: Scene, opaqueSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, alphaTestSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, transparentSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>);
        /**
         * Render all the sub meshes contained in the group.
         * @param customRenderFunction Used to override the default render behaviour of the group.
         * @param renderSprites
         * @param renderParticles
         * @param activeMeshes
         * @param renderDepthOnlyMeshes
         * @param renderOpaqueMeshes
         * @param renderAlphaTestMeshes
         * @param renderTransparentMeshes
         * @param customRenderTransparentSubMeshes
         */
        render(customRenderFunction: Nullable<(opaqueSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>) => void>, renderSprites: boolean, renderParticles: boolean, activeMeshes: Nullable<AbstractMesh[]>, renderDepthOnlyMeshes?: boolean, renderOpaqueMeshes?: boolean, renderAlphaTestMeshes?: boolean, renderTransparentMeshes?: boolean, customRenderTransparentSubMeshes?: (transparentSubMeshes: SmartArray<SubMesh>, renderingGroup?: RenderingGroup) => void): void;
        /**
         * Renders the opaque submeshes in the order from the opaqueSortCompareFn.
         * @param subMeshes The submeshes to render
         */
        private _renderOpaqueSorted;
        /**
         * Renders the opaque submeshes in the order from the alphatestSortCompareFn.
         * @param subMeshes The submeshes to render
         */
        private _renderAlphaTestSorted;
        /**
         * Renders the opaque submeshes in the order from the transparentSortCompareFn.
         * @param subMeshes The submeshes to render
         */
        private _renderTransparentSorted;
        /**
         * Renders the submeshes in a specified order.
         * @param subMeshes The submeshes to sort before render
         * @param sortCompareFn The comparison function use to sort
         * @param camera The camera position use to preprocess the submeshes to help sorting
         * @param transparent Specifies to activate blending if true
         * @param disableDepthPrePass Specifies to disable depth pre-pass if true (default: false)
         */
        private static _RenderSorted;
        /**
         * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)
         * are rendered back to front if in the same alpha index.
         *
         * @param a The first submesh
         * @param b The second submesh
         * @returns The result of the comparison
         */
        static defaultTransparentSortCompare(a: SubMesh, b: SubMesh): number;
        /**
         * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)
         * are rendered back to front.
         *
         * @param a The first submesh
         * @param b The second submesh
         * @returns The result of the comparison
         */
        static backToFrontSortCompare(a: SubMesh, b: SubMesh): number;
        /**
         * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)
         * are rendered front to back (prevent overdraw).
         *
         * @param a The first submesh
         * @param b The second submesh
         * @returns The result of the comparison
         */
        static frontToBackSortCompare(a: SubMesh, b: SubMesh): number;
        /**
         * Build in function which can be applied to ensure meshes of a special queue (opaque, alpha test, transparent)
         * are grouped by material then geometry.
         *
         * @param a The first submesh
         * @param b The second submesh
         * @returns The result of the comparison
         */
        static PainterSortCompare(a: SubMesh, b: SubMesh): number;
        /**
         * Resets the different lists of submeshes to prepare a new frame.
         */
        prepare(): void;
        /**
         * Resets the different lists of sprites to prepare a new frame.
         */
        prepareSprites(): void;
        dispose(): void;
        /**
         * Inserts the submesh in its correct queue depending on its material.
         * @param subMesh The submesh to dispatch
         * @param [mesh] Optional reference to the submeshes's mesh. Provide if you have an exiting reference to improve performance.
         * @param [material] Optional reference to the submeshes's material. Provide if you have an exiting reference to improve performance.
         */
        dispatch(subMesh: SubMesh, mesh?: AbstractMesh, material?: Nullable<Material>): void;
        dispatchSprites(spriteManager: ISpriteManager): void;
        dispatchParticles(particleSystem: IParticleSystem): void;
        private _renderParticles;
        private _renderSprites;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger
     * The ReflectiveShadowMap class only implements the position / normal / flux texture generation part.
     * For the global illumination effect, see the GIRSMManager class.
     */
    /**
     * Class used to generate the RSM (Reflective Shadow Map) textures for a given light.
     * The textures are: position (in world space), normal (in world space) and flux (light intensity)
     */
    export class ReflectiveShadowMap {
        private _scene;
        private _light;
        private _lightTransformMatrix;
        private _mrt;
        private _textureDimensions;
        private _regularMatToMatWithPlugin;
        private _counters;
        private _enable;
        /**
         * Enables or disables the RSM generation.
         */
        get enable(): boolean;
        set enable(value: boolean);
        /**
         * Gets the position texture generated by the RSM process.
         */
        get positionWorldTexture(): Texture;
        /**
         * Gets the normal texture generated by the RSM process.
         */
        get normalWorldTexture(): Texture;
        /**
         * Gets the flux texture generated by the RSM process.
         */
        get fluxTexture(): Texture;
        /**
         * Gets the render list used to generate the RSM textures.
         */
        get renderList(): Nullable<AbstractMesh[]>;
        /**
         * Gets the light used to generate the RSM textures.
         */
        get light(): DirectionalLight | SpotLight;
        /**
         * Gets or sets a boolean indicating if the light parameters should be recomputed even if the light parameters (position, direction) did not change.
         * You should not set this value to true, except for debugging purpose (if you want to see changes from the inspector, for eg).
         * Instead, you should call updateLightParameters() explicitely at the right time (once the light parameters changed).
         */
        forceUpdateLightParameters: boolean;
        /**
         * Creates a new RSM for the given light.
         * @param scene The scene
         * @param light The light to use to generate the RSM textures
         * @param textureDimensions The dimensions of the textures to generate. Default: \{ width: 512, height: 512 \}
         */
        constructor(scene: Scene, light: DirectionalLight | SpotLight, textureDimensions?: {
            width: number;
            height: number;
        });
        /**
         * Sets the dimensions of the textures to generate.
         * @param dimensions The dimensions of the textures to generate.
         */
        setTextureDimensions(dimensions: {
            width: number;
            height: number;
        }): void;
        /**
         * Adds the given mesh to the render list used to generate the RSM textures.
         * @param mesh The mesh to add to the render list used to generate the RSM textures. If not provided, all scene meshes will be added to the render list.
         */
        addMesh(mesh?: AbstractMesh): void;
        /**
         * Recomputes the light transformation matrix. Call this method if you manually changed the light position / direction / etc. and you want to update the RSM textures accordingly.
         * You should also call this method if you add/remove meshes to/from the render list.
         */
        updateLightParameters(): void;
        /**
         * Gets the light transformation matrix used to generate the RSM textures.
         */
        get lightTransformationMatrix(): Matrix;
        /**
         * Gets the GPU time spent to generate the RSM textures.
         */
        get countersGPU(): Array<{
            name: string;
            value: number;
        }>;
        /**
         * Disposes the RSM.
         */
        dispose(): void;
        protected _createMultiRenderTarget(): void;
        protected _customRenderTarget(add: boolean): void;
        protected _recomputeLightTransformationMatrix(): void;
        protected _addMeshToMRT(mesh: AbstractMesh): void;
        protected _disposeMultiRenderTarget(): void;
    }
    /**
     * @internal
     */
    class MaterialRSMCreateDefines extends MaterialDefines {
        RSMCREATE: boolean;
        RSMCREATE_PROJTEXTURE: boolean;
        RSMCREATE_LIGHT_IS_SPOT: boolean;
    }
    /**
     * Plugin that implements the creation of the RSM textures
     */
    export class RSMCreatePluginMaterial extends MaterialPluginBase {
        private _varAlbedoName;
        private _lightColor;
        private _hasProjectionTexture;
        /**
         * Defines the name of the plugin.
         */
        static readonly Name = "RSMCreate";
        /**
         * Defines the light that should be used to generate the RSM textures.
         */
        light: DirectionalLight | SpotLight;
        private _isEnabled;
        /**
         * Defines if the plugin is enabled in the material.
         */
        isEnabled: boolean;
        protected _markAllSubMeshesAsTexturesDirty(): void;
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /**
         * Gets a boolean indicating that the plugin is compatible with a give shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        /**
         * Create a new RSMCreatePluginMaterial
         * @param material Parent material of the plugin
         */
        constructor(material: Material | StandardMaterial | PBRBaseMaterial);
        /**
         * Prepares the defines used by the plugin
         * @param defines the defines to prepare
         */
        prepareDefines(defines: MaterialRSMCreateDefines): void;
        getClassName(): string;
        getUniforms(): {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            fragment: string;
        };
        /**
         * Gets the samplers used by the plugin
         * @param samplers the list of samplers to update
         */
        getSamplers(samplers: string[]): void;
        /**
         * Binds the material data for a sub mesh
         * @param uniformBuffer the uniform buffer to update
         */
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        /**
         * Gets custom shader code for the plugin
         * @param shaderType the type of shader (vertex or fragment)
         * @param shaderLanguage the shader language
         * @returns the custom shader code or null
         */
        getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
    }
    /**
     * Register side effects for reflectiveShadowMap.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectiveShadowMap(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectiveShadowMap.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


        interface Scene {
            /** @internal (Backing field) */
            _prePassRenderer: Nullable<PrePassRenderer>;
            /**
             * Gets or Sets the current prepass renderer associated to the scene.
             */
            prePassRenderer: Nullable<PrePassRenderer>;
            /**
             * Enables the prepass and associates it with the scene
             * @returns the PrePassRenderer
             */
            enablePrePassRenderer(): Nullable<PrePassRenderer>;
            /**
             * Disables the prepass associated with the scene
             */
            disablePrePassRenderer(): void;
        }
        interface RenderTargetTexture {
            /**
             * Gets or sets a boolean indicating that the prepass renderer should not be used with this render target
             */
            noPrePassRenderer: boolean;
            /** @internal */
            _prePassRenderTarget: Nullable<PrePassRenderTarget>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful
     * in several rendering techniques.
     */
    export class PrePassRendererSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "PrePassRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        private _beforeRenderTargetDraw;
        private _afterRenderTargetDraw;
        private _beforeRenderTargetClearStage;
        private _beforeCameraDraw;
        private _afterCameraDraw;
        private _beforeClearStage;
        private _beforeRenderingMeshStage;
        private _afterRenderingMeshStage;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
    }
    /**
     * Register side effects for prePassRendererSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param prePassRendererClass The PrePassRenderer class to register the component for
     */
    export function RegisterPrePassRendererSceneComponent(prePassRendererClass: typeof PrePassRenderer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import prePassRendererSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Renders a pre pass of the scene
     * This means every mesh in the scene will be rendered to a render target texture
     * And then this texture will be composited to the rendering canvas with post processes
     * It is necessary for effects like subsurface scattering or deferred shading
     */
    export class PrePassRenderer {
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * To save performance, we can excluded skinned meshes from the prepass
         */
        excludedSkinnedMesh: AbstractMesh[];
        /**
         * Force material to be excluded from the prepass
         * Can be useful when `useGeometryBufferFallback` is set to `true`
         * and you don't want a material to show in the effect.
         */
        excludedMaterials: Material[];
        private _scene;
        private _engine;
        /**
         * Number of textures in the multi render target texture where the scene is directly rendered
         */
        mrtCount: number;
        private _mrtTypes;
        private _mrtFormats;
        private _mrtLayout;
        private _mrtNames;
        private _textureIndices;
        private _multiRenderAttachments;
        private _defaultAttachments;
        private _clearAttachments;
        private _clearDepthAttachments;
        private _generateNormalsInWorldSpace;
        /**
         * Indicates if the prepass renderer is generating normals in world space or camera space (default: camera space)
         */
        get generateNormalsInWorldSpace(): boolean;
        set generateNormalsInWorldSpace(value: boolean);
        /**
         * Returns the index of a texture in the multi render target texture array.
         * @param type Texture type
         * @returns The index
         */
        getIndex(type: number): number;
        /**
         * How many samples are used for MSAA of the scene render target
         */
        get samples(): number;
        set samples(n: number);
        private _useSpecificClearForDepthTexture;
        /**
         * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)
         * If set to false, the depth texture is always cleared with 0.
         */
        get useSpecificClearForDepthTexture(): boolean;
        set useSpecificClearForDepthTexture(value: boolean);
        /**
         * Describes the types and formats of the textures used by the pre-pass renderer
         */
        static TextureFormats: {
            purpose: number;
            type: number;
            format: number;
            name: string;
        }[];
        private _isDirty;
        /**
         * The render target where the scene is directly rendered
         */
        defaultRT: PrePassRenderTarget;
        /**
         * Configuration for prepass effects
         */
        private _effectConfigurations;
        /**
         * @returns the prepass render target for the rendering pass.
         * If we are currently rendering a render target, it returns the PrePassRenderTarget
         * associated with that render target. Otherwise, it returns the scene default PrePassRenderTarget
         */
        getRenderTarget(): PrePassRenderTarget;
        /**
         * @internal
         * Managed by the scene component
         * @param prePassRenderTarget
         */
        _setRenderTarget(prePassRenderTarget: Nullable<PrePassRenderTarget>): void;
        /**
         * Returns true if the currently rendered prePassRenderTarget is the one
         * associated with the scene.
         */
        get currentRTisSceneRT(): boolean;
        private _geometryBuffer;
        /**
         * Prevents the PrePassRenderer from using the GeometryBufferRenderer as a fallback
         */
        doNotUseGeometryRendererFallback: boolean;
        private _refreshGeometryBufferRendererLink;
        private _currentTarget;
        /**
         * All the render targets generated by prepass
         */
        renderTargets: PrePassRenderTarget[];
        private readonly _clearColor;
        private readonly _clearDepthColor;
        private _enabled;
        private readonly _geometryBufferRenderList;
        private _needsCompositionForThisPass;
        private readonly _postProcessesSourceForThisPass;
        private readonly _postProcessChainForThisPass;
        private readonly _postProcessesForUpdate;
        /**
         * Indicates if the prepass is enabled
         */
        get enabled(): boolean;
        /**
         * Set to true to disable gamma transform in PrePass.
         * Can be useful in case you already proceed to gamma transform on a material level
         * and your post processes don't need to be in linear color space.
         */
        disableGammaTransform: boolean;
        /**
         * Instantiates a prepass renderer
         * @param scene The scene
         */
        constructor(scene: Scene);
        /**
         * Creates a new PrePassRenderTarget
         * This should be the only way to instantiate a `PrePassRenderTarget`
         * @param name Name of the `PrePassRenderTarget`
         * @param renderTargetTexture RenderTarget the `PrePassRenderTarget` will be attached to.
         * Can be `null` if the created `PrePassRenderTarget` is attached to the scene (default framebuffer).
         * @internal
         */
        _createRenderTarget(name: string, renderTargetTexture: Nullable<RenderTargetTexture>): PrePassRenderTarget;
        /**
         * Indicates if rendering a prepass is supported
         */
        get isSupported(): boolean;
        /**
         * Sets the proper output textures to draw in the engine.
         * @param effect The effect that is drawn. It can be or not be compatible with drawing to several output textures.
         * @param subMesh Submesh on which the effect is applied
         */
        bindAttachmentsForEffect(effect: Effect, subMesh: SubMesh): void;
        private _reinitializeAttachments;
        private _resetLayout;
        private _updateGeometryBufferLayout;
        /**
         * Restores attachments for single texture draw.
         */
        restoreAttachments(): void;
        /**
         * @internal
         */
        _beforeDraw(camera?: Camera, faceIndex?: number, layer?: number): void;
        private _prepareFrame;
        /**
         * Sets an intermediary texture between prepass and postprocesses. This texture
         * will be used as input for post processes
         * @param rt The render target texture to use
         * @returns true if there are postprocesses that will use this texture,
         * false if there is no postprocesses - and the function has no effect
         */
        setCustomOutput(rt: RenderTargetTexture): boolean;
        private _renderPostProcesses;
        /**
         * @internal
         */
        _afterDraw(faceIndex?: number, layer?: number): void;
        /**
         * Clears the current prepass render target (in the sense of settings pixels to the scene clear color value)
         * @internal
         */
        _clear(): void;
        private _bindFrameBuffer;
        private _setEnabled;
        private _setRenderTargetEnabled;
        /**
         * Adds an effect configuration to the prepass render target.
         * If an effect has already been added, it won't add it twice and will return the configuration
         * already present.
         * @param cfg the effect configuration
         * @returns the effect configuration now used by the prepass
         */
        addEffectConfiguration(cfg: PrePassEffectConfiguration): PrePassEffectConfiguration;
        /**
         * Retrieves an effect configuration by name
         * @param name the name of the effect configuration
         * @returns the effect configuration, or null if not present
         */
        getEffectConfiguration(name: string): Nullable<PrePassEffectConfiguration>;
        private _enable;
        private _disable;
        private _getPostProcessesSource;
        private _setupOutputForThisPass;
        private _linkInternalTexture;
        /**
         * @internal
         */
        _unlinkInternalTexture(prePassRenderTarget: PrePassRenderTarget): void;
        private _needsImageProcessing;
        private _hasImageProcessing;
        /**
         * Internal, gets the first post proces.
         * @param postProcesses
         * @returns the first post process to be run on this camera.
         */
        private _getFirstPostProcess;
        /**
         * Marks the prepass renderer as dirty, triggering a check if the prepass is necessary for the next rendering.
         */
        markAsDirty(): void;
        /**
         * Enables a texture on the MultiRenderTarget for prepass
         * @param types
         */
        private _enableTextures;
        /**
         * Makes sure that the prepass renderer is up to date if it has been dirtified.
         */
        update(): void;
        private _update;
        private _markAllMaterialsAsPrePassDirty;
        /**
         * Disposes the prepass renderer.
         */
        dispose(): void;
    }




    /**
     * Interface for defining prepass effects in the prepass post-process pipeline
     */
    export interface PrePassEffectConfiguration {
        /**
         * Name of the effect
         */
        name: string;
        /**
         * Post process to attach for this effect
         */
        postProcess?: PostProcess;
        /**
         * Textures required in the MRT
         */
        texturesRequired: number[];
        /**
         * Is the effect enabled
         */
        enabled: boolean;
        /**
         * Does the output of this prepass need to go through imageprocessing
         */
        needsImageProcessing?: boolean;
        /**
         * The clear color of the render targets. If not provided, defaults to (0, 0, 0, 0)
         */
        clearColor?: Color4;
        /**
         * Disposes the effect configuration
         */
        dispose?: () => void;
        /**
         * Creates the associated post process
         */
        createPostProcess?: () => PostProcess;
    }


        interface Scene {
            /** @internal */
            _outlineRenderer: OutlineRenderer;
            /**
             * Gets the outline renderer associated with the scene
             * @returns a OutlineRenderer
             */
            getOutlineRenderer(): OutlineRenderer;
        }
        interface AbstractMesh {
            /** @internal (Backing field) */
            _renderOutline: boolean;
            /**
             * Gets or sets a boolean indicating if the outline must be rendered as well
             * @see https://www.babylonjs-playground.com/#10WJ5S#3
             */
            renderOutline: boolean;
            /** @internal (Backing field) */
            _renderOverlay: boolean;
            /**
             * Gets or sets a boolean indicating if the overlay must be rendered as well
             * @see https://www.babylonjs-playground.com/#10WJ5S#2
             */
            renderOverlay: boolean;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * This class is responsible to draw the outline/overlay of meshes.
     * It should not be used directly but through the available method on mesh.
     */
    export class OutlineRenderer implements ISceneComponent {
        /**
         * Stencil value used to avoid outline being seen within the mesh when the mesh is transparent
         */
        private static _StencilReference;
        /**
         * The name of the component. Each component must have a unique name.
         */
        name: string;
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Defines a zOffset default Factor to prevent zFighting between the overlay and the mesh.
         */
        zOffset: number;
        /**
         * Defines a zOffset default Unit to prevent zFighting between the overlay and the mesh.
         */
        zOffsetUnits: number;
        /**
         * Gets or sets a boolean indicating if the renderer is enabled
         */
        enabled: boolean;
        private _engine;
        private _savedDepthWrite;
        private _passIdForDrawWrapper;
        /** Shader language used by the Outline renderer. */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in the Outline renderer.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Instantiates a new outline renderer. (There could be only one per scene).
         * @param scene Defines the scene it belongs to
         */
        constructor(scene: Scene);
        /**
         * Register the component to one instance of a scene.
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        /**
         * Renders the outline in the canvas.
         * @param subMesh Defines the sumesh to render
         * @param batch Defines the batch of meshes in case of instances
         * @param useOverlay Defines if the rendering is for the overlay or the outline
         * @param renderPassId Render pass id to use to render the mesh
         */
        render(subMesh: SubMesh, batch: _InstancesBatch, useOverlay?: boolean, renderPassId?: number): void;
        /**
         * Returns whether or not the outline renderer is ready for a given submesh.
         * All the dependencies e.g. submeshes, texture, effect... mus be ready
         * @param subMesh Defines the submesh to check readiness for
         * @param useInstances Defines whether wee are trying to render instances or not
         * @param renderPassId Render pass id to use to render the mesh
         * @returns true if ready otherwise false
         */
        isReady(subMesh: SubMesh, useInstances: boolean, renderPassId?: number): boolean;
        private _beforeRenderingMesh;
        private _afterRenderingMesh;
    }
    /**
     * Register side effects for outlineRenderer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterOutlineRenderer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import outlineRenderer.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Defines the options of the object renderer
     */
    export interface ObjectRendererOptions {
        /** The number of passes the renderer will support (1 by default) */
        numPasses?: number;
        /** True (default) to not change the aspect ratio of the scene in the RTT */
        doNotChangeAspectRatio?: boolean;
        /** True to enable clustered lights (default: false) */
        enableClusteredLights?: boolean;
    }
    /**
     * A class that renders objects to the currently bound render target.
     * This class only renders objects, and is not concerned with the output texture or post-processing.
     */
    export class ObjectRenderer {
        /**
         * Objects will only be rendered once which can be useful to improve performance if everything in your render is static for instance.
         */
        static readonly REFRESHRATE_RENDER_ONCE: number;
        /**
         * Objects will be rendered every frame and is recommended for dynamic contents.
         */
        static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number;
        /**
         * Objects will be rendered every 2 frames which could be enough if your dynamic objects are not
         * the central point of your effect and can save a lot of performances.
         */
        static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number;
        /**
         * Use this predicate to dynamically define the list of mesh you want to render.
         * If set, the renderList property will be overwritten.
         */
        renderListPredicate: (AbstractMesh: AbstractMesh) => boolean;
        private _renderList;
        private _unObserveRenderList;
        /**
         * Use this list to define the list of mesh you want to render.
         */
        get renderList(): Nullable<Array<AbstractMesh>>;
        set renderList(value: Nullable<Array<AbstractMesh>>);
        private _renderListHasChanged;
        /**
         * Define the list of particle systems to render. If not provided, will render all the particle systems of the scene.
         * Note that the particle systems are rendered only if renderParticles is set to true.
         */
        particleSystemList: Nullable<Array<IParticleSystem>>;
        /**
         * Use this function to overload the renderList array at rendering time.
         * Return null to render with the current renderList, else return the list of meshes to use for rendering.
         * For 2DArray, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of
         * the cube (if the RTT is a cube, else layerOrFace=0).
         * The renderList passed to the function is the current render list (the one that will be used if the function returns null).
         * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can
         * hold dummy elements!
         */
        getCustomRenderList: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>>;
        /**
         * Define if meshes should be rendered (default is true).
         */
        renderMeshes: boolean;
        /**
         * Define if depth only meshes should be rendered (default is true). No effect if renderMeshes is false.
         */
        renderDepthOnlyMeshes: boolean;
        /**
         * Define if opaque meshes should be rendered (default is true). No effect if renderMeshes is false.
         */
        renderOpaqueMeshes: boolean;
        /**
         * Define if alpha test meshes should be rendered (default is true). No effect if renderMeshes is false.
         */
        renderAlphaTestMeshes: boolean;
        /**
         * Define if transparent meshes should be rendered (default is true). No effect if renderMeshes is false.
         */
        renderTransparentMeshes: boolean;
        /**
         * Custom render function for transparent submeshes.
         */
        customRenderTransparentSubMeshes?: (transparentSubMeshes: SmartArray<SubMesh>) => void;
        /**
         * Define if particles should be rendered (default is true).
         */
        renderParticles: boolean;
        /**
         * Define if sprites should be rendered (default is false).
         */
        renderSprites: boolean;
        /**
         * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined)
         */
        forceLayerMaskCheck: boolean;
        /**
         * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is false.
         */
        enableBoundingBoxRendering: boolean;
        /**
         * Enables the rendering of outline/overlay for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.
         */
        enableOutlineRendering: boolean;
        /**
         * Define the camera used to render the objects.
         */
        activeCamera: Nullable<Camera>;
        /**
         * Define the camera used to calculate the LOD of the objects.
         * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.
         */
        cameraForLOD: Nullable<Camera>;
        private _disableImageProcessing;
        /**
         * If true, the object renderer will render all objects without any image processing applied.
         * If false (default value), the renderer will use the current setting of the scene's image processing configuration.
         */
        get disableImageProcessing(): boolean;
        set disableImageProcessing(value: boolean);
        /**
         * If true, the object renderer will not set the view/projection/transformation matrices for the active camera (default: false).
         * By default, the view/projection/transformation matrices are set from the active camera (either ObjectRenderer.activeCamera or scene.activeCamera).
         * Sets this property to true if you want to define your own transformation matrices (use the onInitRenderingObservable observable
         * to set your own matrices, to be sure they will be correctly taken into account)
         */
        dontSetTransformationMatrix: boolean;
        private _disableDepthPrePass;
        /**
         * Specifies to disable depth pre-pass if true (default: false)
         */
        get disableDepthPrePass(): boolean;
        set disableDepthPrePass(value: boolean);
        /**
         * Override the mesh isReady function with your own one.
         */
        customIsReadyFunction: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;
        /**
         * Override the render function with your own one.
         */
        customRenderFunction: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
        /**
         * An event triggered before rendering the objects.
         * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),
         * in which case the render target is not bound to the output. Observers should avoid performing
         * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.
         */
        readonly onBeforeRenderObservable: Observable<number>;
        /**
         * An event triggered after rendering the objects.
         * Note: This observable is also triggered during readiness checks (e.g. when calling scene.isReady()),
         * in which case the render target is not bound to the output. Observers should avoid performing
         * GPU state changes (such as clearing or modifying the framebuffer) unless the render target is actually bound.
         */
        readonly onAfterRenderObservable: Observable<number>;
        /**
         * An event triggered before the rendering group is processed
         */
        readonly onBeforeRenderingManagerRenderObservable: Observable<number>;
        /**
         * An event triggered after the rendering group is processed
         */
        readonly onAfterRenderingManagerRenderObservable: Observable<number>;
        /**
         * An event triggered when initRender is called
         */
        readonly onInitRenderingObservable: Observable<ObjectRenderer>;
        /**
         * An event triggered when finishRender is called
         */
        readonly onFinishRenderingObservable: Observable<ObjectRenderer>;
        /**
         * An event triggered when fast path rendering is used
         */
        readonly onFastPathRenderObservable: Observable<number>;
        protected _engine: AbstractEngine;
        protected _scene: Scene;
        protected _renderingManager: RenderingManager;
        /** @internal */
        _waitingRenderList?: string[];
        protected _currentRefreshId: number;
        protected _refreshRate: number;
        protected _currentApplyByPostProcessSetting: boolean;
        protected _activeMeshes: SmartArray<AbstractMesh>;
        protected _activeBoundingBoxes: SmartArray<BoundingBox>;
        protected _useUBO: boolean;
        protected _sceneUBOs: UniformBuffer[];
        protected _sceneUBOIsMultiview: boolean[];
        protected _currentSceneUBO: UniformBuffer;
        protected _currentFrameId: number;
        protected _currentSceneUBOIndex: number;
        /**
         * The options used by the object renderer
         */
        options: Required<ObjectRendererOptions>;
        private _name;
        /**
         * Friendly name of the object renderer
         */
        get name(): string;
        set name(value: string);
        /**
         * Current render pass id. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!
         */
        renderPassId: number;
        private readonly _renderPassIds;
        /**
         * Gets the render pass ids used by the object renderer.
         */
        get renderPassIds(): readonly number[];
        /**
         * Gets the current value of the refreshId counter
         */
        get currentRefreshId(): number;
        /**
         * Gets the array of active meshes
         * @returns an array of AbstractMesh
         */
        getActiveMeshes(): SmartArray<AbstractMesh>;
        /**
         * Sets a specific material to be used to render a mesh/a list of meshes with this object renderer
         * @param mesh mesh or array of meshes
         * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering pass.
         */
        setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void;
        /** @internal */
        _isFrozen: boolean;
        /** @internal */
        _freezeActiveMeshesCancel: Nullable<() => void>;
        /** @internal */
        _freezeActiveMeshes(freezeMeshes: boolean): void;
        /** @internal */
        _unfreezeActiveMeshes(): void;
        /**
         * Instantiates an object renderer.
         * @param name The friendly name of the object renderer
         * @param scene The scene the renderer belongs to
         * @param options The options used to create the renderer (optional)
         */
        constructor(name: string, scene: Scene, options?: ObjectRendererOptions);
        private _releaseRenderPassId;
        private _createRenderPassId;
        private _createSceneUBO;
        private _getSceneUBO;
        /**
         * Resets the refresh counter of the renderer and start back from scratch.
         * Could be useful to re-render if it is setup to render only once.
         */
        resetRefreshCounter(): void;
        /**
         * Defines the refresh rate of the rendering or the rendering frequency.
         * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...
         */
        get refreshRate(): number;
        set refreshRate(value: number);
        /**
         * Indicates if the renderer should render the current frame.
         * The output is based on the specified refresh rate.
         * When snapshot rendering is active, this always returns true to ensure render pass
         * topology stays consistent between the recording frame and playback frames.
         * @returns true if the renderer should render the current frame
         */
        shouldRender(): boolean;
        /**
         * This function will check if the renderer is ready to render (textures are loaded, shaders are compiled)
         * @param viewportWidth defines the width of the viewport
         * @param viewportHeight defines the height of the viewport
         * @returns true if all required resources are ready
         */
        isReadyForRendering(viewportWidth: number, viewportHeight: number): boolean;
        /**
         * Makes sure the list of meshes is ready to be rendered
         * You should call this function before "initRender", but if you know the render list is ok, you may call "initRender" directly
         */
        prepareRenderList(): void;
        private _defaultRenderListPrepared;
        private _currentSceneCamera;
        /**
         * This method makes sure everything is setup before "render" can be called
         * @param viewportWidth Width of the viewport to render to
         * @param viewportHeight Height of the viewport to render to
         */
        initRender(viewportWidth: number, viewportHeight: number): void;
        /**
         * This method must be called after the "render" call(s), to complete the rendering process.
         */
        finishRender(): void;
        /**
         * Renders all the objects (meshes, particles systems, sprites) to the currently bound render target texture.
         * @param passIndex defines the pass index to use (default: 0)
         * @param skipOnAfterRenderObservable defines a flag to skip raising the onAfterRenderObservable
         */
        render(passIndex?: number, skipOnAfterRenderObservable?: boolean): void;
        /** @internal */
        _checkReadiness(): boolean;
        private _prepareRenderingManager;
        /**
         * Gets the rendering manager
         */
        get renderingManager(): RenderingManager;
        /**
         * Overrides the default sort function applied in the rendering group to prepare the meshes.
         * This allowed control for front to back rendering or reversely depending of the special needs.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param opaqueSortCompareFn The opaque queue comparison function use to sort.
         * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.
         * @param transparentSortCompareFn The transparent queue comparison function use to sort.
         */
        setRenderingOrder(renderingGroupId: number, opaqueSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, alphaTestSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, transparentSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>): void;
        /**
         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
         * @param depth Automatically clears depth between groups if true and autoClear is true.
         * @param stencil Automatically clears stencil between groups if true and autoClear is true.
         */
        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean, depth?: boolean, stencil?: boolean): void;
        /**
         * Clones the renderer.
         * @returns the cloned renderer
         */
        clone(): ObjectRenderer;
        /**
         * Dispose the renderer and release its associated resources.
         */
        dispose(): void;
        /** @internal */
        _rebuild(): void;
        /**
         * Clear the info related to rendering groups preventing retention point in material dispose.
         */
        freeRenderingGroups(): void;
    }


    /**
     * Contains all parameters needed for the prepass to perform
     * motion blur
     */
    export class MotionBlurConfiguration implements PrePassEffectConfiguration {
        /**
         * Is motion blur enabled
         */
        enabled: boolean;
        /**
         * Name of the configuration
         */
        name: string;
        /**
         * Textures that should be present in the MRT for this effect to work
         */
        readonly texturesRequired: number[];
    }




        interface Scene {
            /** @internal (Backing field) */
            _iblCdfGenerator: Nullable<IblCdfGenerator>;
            /**
             * Gets or Sets the current CDF generator associated to the scene.
             * The CDF (cumulative distribution function) generator creates CDF maps
             * for a given IBL texture that can then be used for more efficient
             * importance sampling.
             */
            iblCdfGenerator: Nullable<IblCdfGenerator>;
            /**
             * Enables a IblCdfGenerator and associates it with the scene.
             * @returns the IblCdfGenerator
             */
            enableIblCdfGenerator(): Nullable<IblCdfGenerator>;
            /**
             * Disables the GeometryBufferRender associated with the scene
             */
            disableIblCdfGenerator(): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the IBL CDF Generator scene component responsible for generating CDF maps for a given IBL.
     */
    export class IblCdfGeneratorSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "iblCDFGenerator";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
        /**
         * @returns true once the CDF generator's procedural textures and effects are ready.
         * Used by `Scene.isReady` so that `executeWhenReady` waits for the CDF maps to be
         * generated before declaring the scene ready to render.
         */
        isReady(): boolean;
        private _updateIblSource;
        private _newIblObserver;
    }
    /**
     * Register side effects for iblCdfGeneratorSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param iblCdfGeneratorClass The IblCdfGenerator class to register the component for
     */
    export function RegisterIblCdfGeneratorSceneComponent(iblCdfGeneratorClass: typeof IblCdfGenerator): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import iblCdfGeneratorSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Build cdf maps to be used for IBL importance sampling.
     */
    export class IblCdfGenerator {
        private _scene;
        private _engine;
        private _cdfyPT;
        private _cdfxPT;
        private _icdfPT;
        private _scaledLuminancePT;
        private _dominantDirectionPT;
        private _iblSource;
        private _dummyTexture;
        private _iblSourceLoadUnsubscribe;
        private _iblSourceReadyRetryObserver;
        private _cachedDominantDirection;
        /**
         * Returns whether the CDF renderer is supported by the current engine
         */
        get isSupported(): boolean;
        /**
         * Gets the IBL source texture being used by the CDF renderer
         */
        get iblSource(): Nullable<BaseTexture>;
        /**
         * Sets the IBL source texture to be used by the CDF renderer.
         * This will trigger recreation of the CDF assets.
         */
        set iblSource(source: Nullable<BaseTexture>);
        private _isIblSourceReady;
        private _clearIblSourceReadinessObservers;
        private _recreateAssetsFromNewIbl;
        /**
         * Return the cumulative distribution function (CDF) texture
         * @returns Return the cumulative distribution function (CDF) texture
         */
        getIcdfTexture(): Texture;
        /** Enable the debug view for this pass */
        debugEnabled: boolean;
        private _debugPass;
        private _debugSizeParams;
        /**
         * Sets params that control the position and scaling of the debug display on the screen.
         * @param x Screen X offset of the debug display (0-1)
         * @param y Screen Y offset of the debug display (0-1)
         * @param widthScale X scale of the debug display (0-1)
         * @param heightScale Y scale of the debug display (0-1)
         */
        setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number): void;
        /**
         * The name of the debug pass post process
         */
        get debugPassName(): string;
        private _debugPassName;
        /**
         * Gets the debug pass post process
         * @returns The post process
         */
        getDebugPassPP(): PostProcess;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Instanciates the CDF renderer
         * @param sceneOrEngine Scene to attach to
         * @returns The CDF renderer
         */
        constructor(sceneOrEngine: Nullable<Scene | AbstractEngine>);
        /**
         * Observable that triggers when the CDF renderer is ready
         */
        onGeneratedObservable: Observable<void>;
        /**
         * Observable that triggers when CDF texture references change.
         * It is raised after disposing textures (so fallback ICDF can be used)
         * and after creating new textures (so consumers can rebind immediately).
         */
        onTextureChangedObservable: Observable<void>;
        private _createTextures;
        private _disposeTextures;
        private _createDebugPass;
        /**
         * Checks if the CDF renderer is ready
         * @returns true if the CDF renderer is ready
         */
        isReady(): boolean | null;
        /**
         * Explicitly trigger generation of CDF maps when they are ready to render.
         * @returns Promise that resolves when the CDF maps are rendered.
         */
        renderWhenReady(): Promise<void>;
        /**
         * Finds the average direction of the highest intensity areas of the IBL source
         * @returns Async promise that resolves to the dominant direction of the IBL source
         */
        findDominantDirection(): Promise<Vector3>;
        /**
         * Disposes the CDF renderer and associated resources
         */
        dispose(): void;
        private static _IsScene;
    }


        interface Scene {
            /** @internal (Backing field) */
            _geometryBufferRenderer: Nullable<GeometryBufferRenderer>;
            /**
             * Gets or Sets the current geometry buffer associated to the scene.
             */
            geometryBufferRenderer: Nullable<GeometryBufferRenderer>;
            /**
             * Enables a GeometryBufferRender and associates it with the scene
             * @param ratioOrDimensions defines the scaling ratio to apply to the renderer (1 by default which means same resolution). You can also directly pass a width and height for the generated textures
             * @param depthFormat Format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH16)
             * @param textureTypesAndFormats The types, formats and optional sampling modes of textures to create as render targets.
             * If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.
             * @returns the GeometryBufferRenderer
             */
            enableGeometryBufferRenderer(ratioOrDimensions?: number | {
                width: number;
                height: number;
            }, depthFormat?: number, textureTypesAndFormats?: {
                [key: number]: IGeometryBufferTextureTypeAndFormat;
            }): Nullable<GeometryBufferRenderer>;
            /**
             * Disables the GeometryBufferRender associated with the scene
             */
            disableGeometryBufferRenderer(): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the Geometry Buffer scene component responsible to manage a G-Buffer useful
     * in several rendering techniques.
     */
    export class GeometryBufferRendererSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "GeometryBufferRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
        private _gatherRenderTargets;
    }
    /**
     * Register side effects for geometryBufferRendererSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param geometryBufferRendererClass The GeometryBufferRenderer class to register the component for
     */
    export function RegisterGeometryBufferRendererSceneComponent(geometryBufferRendererClass: typeof GeometryBufferRenderer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryBufferRendererSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /** @internal */
    interface ISavedTransformationMatrix {
        world: Matrix;
        viewProjection: Matrix;
    }
    /**
     * Type, format and sampling settings for a geometry buffer render target.
     */
    export interface IGeometryBufferTextureTypeAndFormat {
        /** Texture type for the target. */
        textureType: number;
        /** Texture format for the target. */
        textureFormat: number;
        /** Optional sampling mode for the target texture. Defaults to bilinear when omitted. */
        samplingMode?: number;
    }
    export var Samplers: string[];
    /** list the uniforms used by the geometry renderer */
    export var Uniforms: string[];
    /**
     * This renderer is helpful to fill one of the render target with a geometry buffer.
     */
    export class GeometryBufferRenderer {
        /**
         * Force all the standard materials to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Constant used to retrieve the depth texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.DEPTH_TEXTURE_INDEX)
         */
        static readonly DEPTH_TEXTURE_TYPE = 0;
        /**
         * Constant used to retrieve the normal texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.NORMAL_TEXTURE_INDEX)
         */
        static readonly NORMAL_TEXTURE_TYPE = 1;
        /**
         * Constant used to retrieve the position texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.POSITION_TEXTURE_INDEX)
         */
        static readonly POSITION_TEXTURE_TYPE = 2;
        /**
         * Constant used to retrieve the velocity texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.VELOCITY_TEXTURE_INDEX)
         */
        static readonly VELOCITY_TEXTURE_TYPE = 3;
        /**
         * Constant used to retrieve the reflectivity texture index in the G-Buffer textures array
         * using the getIndex(GeometryBufferRenderer.REFLECTIVITY_TEXTURE_TYPE)
         */
        static readonly REFLECTIVITY_TEXTURE_TYPE = 4;
        /**
         * Constant used to retrieve the screen-space depth texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.SCREENSPACE_DEPTH_TEXTURE_TYPE)
         */
        static readonly SCREENSPACE_DEPTH_TEXTURE_TYPE = 5;
        /**
         * Constant used to retrieve the linear velocity texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.VELOCITY_LINEAR_TEXTURE_TYPE)
         */
        static readonly VELOCITY_LINEAR_TEXTURE_TYPE = 6;
        /**
         * Constant used to retrieve the irradiance texture index in the G-Buffer textures array
         * using getIndex(GeometryBufferRenderer.IRRADIANCE_TEXTURE_TYPE)
         */
        static readonly IRRADIANCE_TEXTURE_TYPE = 7;
        /**
         * Dictionary used to store the previous transformation matrices of each rendered mesh
         * in order to compute objects velocities when enableVelocity is set to "true"
         * @internal
         */
        _previousTransformationMatrices: {
            [index: number]: ISavedTransformationMatrix;
        };
        /**
         * Dictionary used to store the previous bones transformation matrices of each rendered mesh
         * in order to compute objects velocities when enableVelocity is set to "true"
         * @internal
         */
        _previousBonesTransformationMatrices: {
            [index: number]: Float32Array;
        };
        /**
         * Array used to store the ignored skinned meshes while computing velocity map (typically used by the motion blur post-process).
         * Avoids computing bones velocities and computes only mesh's velocity itself (position, rotation, scaling).
         */
        excludedSkinnedMeshesFromVelocity: AbstractMesh[];
        /** Gets or sets a boolean indicating if transparent meshes should be rendered */
        renderTransparentMeshes: boolean;
        /**
         * Gets or sets a boolean indicating if normals should be generated in world space (default: false, meaning normals are generated in view space)
         */
        generateNormalsInWorldSpace: boolean;
        private _normalsAreUnsigned;
        /**
         * Gets a boolean indicating if normals are encoded in the [0,1] range in the render target. If true, you should do `normal = normal_rt * 2.0 - 1.0` to get the right normal
         */
        get normalsAreUnsigned(): boolean;
        private _scene;
        private _resizeObserver;
        private _multiRenderTarget;
        private _textureTypesAndFormats;
        private _ratioOrDimensions;
        private _enableDepth;
        private _enableNormal;
        private _enablePosition;
        private _enableVelocity;
        private _enableVelocityLinear;
        private _enableReflectivity;
        private _enableScreenspaceDepth;
        private _enableIrradiance;
        private _depthFormat;
        private _clearColor;
        private _clearDepthColor;
        private _positionIndex;
        private _velocityIndex;
        private _velocityLinearIndex;
        private _reflectivityIndex;
        private _depthIndex;
        private _normalIndex;
        private _screenspaceDepthIndex;
        private _irradianceIndex;
        private _linkedWithPrePass;
        private _prePassRenderer;
        private _attachmentsFromPrePass;
        private _useUbo;
        protected _cachedDefines: string;
        /**
         * @internal
         * Sets up internal structures to share outputs with PrePassRenderer
         * This method should only be called by the PrePassRenderer itself
         */
        _linkPrePassRenderer(prePassRenderer: PrePassRenderer): void;
        /**
         * @internal
         * Separates internal structures from PrePassRenderer so the geometry buffer can now operate by itself.
         * This method should only be called by the PrePassRenderer itself
         */
        _unlinkPrePassRenderer(): void;
        /**
         * @internal
         * Resets the geometry buffer layout
         */
        _resetLayout(): void;
        /**
         * @internal
         * Replaces a texture in the geometry buffer renderer
         * Useful when linking textures of the prepass renderer
         */
        _forceTextureType(geometryBufferType: number, index: number): void;
        /**
         * @internal
         * Sets texture attachments
         * Useful when linking textures of the prepass renderer
         */
        _setAttachments(attachments: number[]): void;
        /**
         * @internal
         * Replaces the first texture which is hard coded as a depth texture in the geometry buffer
         * Useful when linking textures of the prepass renderer
         */
        _linkInternalTexture(internalTexture: InternalTexture): void;
        /**
         * Gets the render list (meshes to be rendered) used in the G buffer.
         */
        get renderList(): Nullable<AbstractMesh[]>;
        /**
         * Set the render list (meshes to be rendered) used in the G buffer.
         */
        set renderList(meshes: Nullable<AbstractMesh[]>);
        /**
         * Gets whether or not G buffer are supported by the running hardware.
         * This requires draw buffer supports
         */
        get isSupported(): boolean;
        /**
         * Returns the index of the given texture type in the G-Buffer textures array
         * @param textureType The texture type constant. For example GeometryBufferRenderer.POSITION_TEXTURE_INDEX
         * @returns the index of the given texture type in the G-Buffer textures array
         */
        getTextureIndex(textureType: number): number;
        /**
         * @returns a boolean indicating if object's depths are enabled for the G buffer.
         */
        get enableDepth(): boolean;
        /**
         * Sets whether or not object's depths are enabled for the G buffer.
         */
        set enableDepth(enable: boolean);
        /**
         * @returns a boolean indicating if object's normals are enabled for the G buffer.
         */
        get enableNormal(): boolean;
        /**
         * Sets whether or not object's normals are enabled for the G buffer.
         */
        set enableNormal(enable: boolean);
        /**
         * @returns a boolean indicating if objects positions are enabled for the G buffer.
         */
        get enablePosition(): boolean;
        /**
         * Sets whether or not objects positions are enabled for the G buffer.
         */
        set enablePosition(enable: boolean);
        /**
         * @returns a boolean indicating if objects velocities are enabled for the G buffer.
         */
        get enableVelocity(): boolean;
        /**
         * Sets whether or not objects velocities are enabled for the G buffer.
         */
        set enableVelocity(enable: boolean);
        /**
         * @returns a boolean indicating if object's linear velocities are enabled for the G buffer.
         */
        get enableVelocityLinear(): boolean;
        /**
         * Sets whether or not object's linear velocities are enabled for the G buffer.
         */
        set enableVelocityLinear(enable: boolean);
        /**
         * Gets a boolean indicating if objects reflectivity are enabled in the G buffer.
         */
        get enableReflectivity(): boolean;
        /**
         * Sets whether or not objects reflectivity are enabled for the G buffer.
         * For Metallic-Roughness workflow with ORM texture, we assume that ORM texture is defined according to the default layout:
         * pbr.useRoughnessFromMetallicTextureAlpha = false;
         * pbr.useRoughnessFromMetallicTextureGreen = true;
         * pbr.useMetallnessFromMetallicTextureBlue = true;
         */
        set enableReflectivity(enable: boolean);
        /**
         * Sets whether or not objects screenspace depth are enabled for the G buffer.
         */
        get enableScreenspaceDepth(): boolean;
        set enableScreenspaceDepth(enable: boolean);
        /**
         * Gets a boolean indicating if objects irradiance are enabled in the G buffer.
         */
        get enableIrradiance(): boolean;
        /**
         * Sets whether or not objects irradiance are enabled for the G buffer.
         */
        set enableIrradiance(enable: boolean);
        /**
         * This will store a mask in the alpha channel of the irradiance texture to indicate which pixels have
         * scattering and should be taken into account when applying image-based lighting.
         */
        generateIrradianceWithScatterMask: boolean;
        /**
         * If set to true (default: false), the depth texture will be cleared with the depth value corresponding to the far plane (1 in normal mode, 0 in reverse depth buffer mode)
         * If set to false, the depth texture is always cleared with 0.
         */
        useSpecificClearForDepthTexture: boolean;
        /**
         * Gets the scene associated with the buffer.
         */
        get scene(): Scene;
        /**
         * Gets the ratio used by the buffer during its creation.
         * How big is the buffer related to the main canvas.
         */
        get ratio(): number;
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Creates a new G Buffer for the scene
         * @param scene The scene the buffer belongs to
         * @param ratioOrDimensions How big is the buffer related to the main canvas (default: 1). You can also directly pass a width and height for the generated textures
         * @param depthFormat Format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH16)
         * @param textureTypesAndFormats The types, formats and optional sampling modes of textures to create as render targets.
         * If not provided, all textures will be RGBA and float or half float, depending on the engine capabilities.
         */
        constructor(scene: Scene, ratioOrDimensions?: number | {
            width: number;
            height: number;
        }, depthFormat?: number, textureTypesAndFormats?: {
            [key: number]: IGeometryBufferTextureTypeAndFormat;
        });
        private _shadersLoaded;
        private _initShaderSourceAsync;
        /**
         * Checks whether everything is ready to render a submesh to the G buffer.
         * @param subMesh the submesh to check readiness for
         * @param useInstances is the mesh drawn using instance or not
         * @returns true if ready otherwise false
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * Gets the current underlying G Buffer.
         * @returns the buffer
         */
        getGBuffer(): MultiRenderTarget;
        /**
         * Gets the number of samples used to render the buffer (anti aliasing).
         */
        get samples(): number;
        /**
         * Sets the number of samples used to render the buffer (anti aliasing).
         */
        set samples(value: number);
        /**
         * Disposes the renderer and frees up associated resources.
         */
        dispose(): void;
        private _assignRenderTargetIndices;
        protected _createRenderTargets(): void;
        private _copyBonesTransformationMatrices;
    }
    /**
     * Register side effects for geometryBufferRenderer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryBufferRenderer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryBufferRenderer.pure for tree-shakeable, side-effect-free usage.
     */


        interface Scene {
            /** @internal */
            _edgeRenderLineShader: Nullable<ShaderMaterial>;
        }
        interface AbstractMesh {
            /**
             * Gets the edgesRenderer associated with the mesh
             */
            edgesRenderer: Nullable<EdgesRenderer>;
        }
        interface LinesMesh {
            /**
             * Enables the edge rendering mode on the mesh.
             * This mode makes the mesh edges visible
             * @param epsilon defines the maximal distance between two angles to detect a face
             * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces
             * @returns the currentAbstractMesh
             * @see https://www.babylonjs-playground.com/#19O9TU#0
             */
            enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): AbstractMesh;
        }
        interface InstancedLinesMesh {
            /**
             * Enables the edge rendering mode on the mesh.
             * This mode makes the mesh edges visible
             * @param epsilon defines the maximal distance between two angles to detect a face
             * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces
             * @returns the current InstancedLinesMesh
             * @see https://www.babylonjs-playground.com/#19O9TU#0
             */
            enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean): InstancedLinesMesh;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the minimum contract an Edges renderer should follow.
     */
    export interface IEdgesRenderer extends IDisposable {
        /**
         * Gets or sets a boolean indicating if the edgesRenderer is active
         */
        isEnabled: boolean;
        /**
         * Renders the edges of the attached mesh,
         */
        render(): void;
        /**
         * Checks whether or not the edges renderer is ready to render.
         * @returns true if ready, otherwise false.
         */
        isReady(): boolean;
        /**
         * List of instances to render in case the source mesh has instances
         */
        customInstances: SmartArray<Matrix>;
    }
    /**
     * Defines the additional options of the edges renderer
     */
    export interface IEdgesRendererOptions {
        /**
         * Gets or sets a boolean indicating that the alternate edge finder algorithm must be used
         * If not defined, the default value is true
         */
        useAlternateEdgeFinder?: boolean;
        /**
         * Gets or sets a boolean indicating that the vertex merger fast processing must be used.
         * If not defined, the default value is true.
         * You should normally leave it undefined (or set it to true), except if you see some artifacts in the edges rendering (can happen with complex geometries)
         * This option is used only if useAlternateEdgeFinder = true
         */
        useFastVertexMerger?: boolean;
        /**
         * During edges processing, the vertices are merged if they are close enough: epsilonVertexMerge is the limit within which vertices are considered to be equal.
         * The default value is 1e-6
         * This option is used only if useAlternateEdgeFinder = true
         */
        epsilonVertexMerge?: number;
        /**
         * Gets or sets a boolean indicating that tessellation should be applied before finding the edges. You may need to activate this option if your geometry is a bit
         * unusual, like having a vertex of a triangle in-between two vertices of an edge of another triangle. It happens often when using CSG to construct meshes.
         * This option is used only if useAlternateEdgeFinder = true
         */
        applyTessellation?: boolean;
        /**
         * The limit under which 3 vertices are considered to be aligned. 3 vertices PQR are considered aligned if distance(PQ) + distance(QR) - distance(PR) < epsilonVertexAligned
         * The default value is 1e-6
         * This option is used only if useAlternateEdgeFinder = true
         */
        epsilonVertexAligned?: number;
        /**
         * Gets or sets a boolean indicating that degenerated triangles should not be processed.
         * Degenerated triangles are triangles that have 2 or 3 vertices with the same coordinates
         */
        removeDegeneratedTriangles?: boolean;
    }
    /**
     * This class is used to generate edges of the mesh that could then easily be rendered in a scene.
     */
    export class EdgesRenderer implements IEdgesRenderer {
        /**
         * Define the size of the edges with an orthographic camera
         */
        edgesWidthScalerForOrthographic: number;
        /**
         * Define the size of the edges with a perspective camera
         */
        edgesWidthScalerForPerspective: number;
        protected _source: AbstractMesh;
        protected _linesPositions: number[];
        protected _linesNormals: number[];
        protected _linesIndices: number[];
        protected _epsilon: number;
        protected _indicesCount: number;
        protected _drawWrapper?: DrawWrapper;
        protected _lineShader: ShaderMaterial;
        protected _ib: DataBuffer;
        protected _buffers: {
            [key: string]: Nullable<VertexBuffer>;
        };
        protected _buffersForInstances: {
            [key: string]: Nullable<VertexBuffer>;
        };
        protected _checkVerticesInsteadOfIndices: boolean;
        protected _options: Nullable<IEdgesRendererOptions>;
        private _meshRebuildObserver;
        private _meshDisposeObserver;
        /** Gets or sets a boolean indicating if the edgesRenderer is active */
        isEnabled: boolean;
        /** Gets the vertices generated by the edge renderer */
        get linesPositions(): Immutable<Array<number>>;
        /** Gets the normals generated by the edge renderer */
        get linesNormals(): Immutable<Array<number>>;
        /** Gets the indices generated by the edge renderer */
        get linesIndices(): Immutable<Array<number>>;
        /**
         * Gets or sets the shader used to draw the lines
         */
        get lineShader(): ShaderMaterial;
        set lineShader(shader: ShaderMaterial);
        /**
         * List of instances to render in case the source mesh has instances
         */
        customInstances: SmartArray<Matrix>;
        private static _GetShader;
        /** Shader language used*/
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Creates an instance of the EdgesRenderer. It is primarily use to display edges of a mesh.
         * Beware when you use this class with complex objects as the adjacencies computation can be really long
         * @param  source Mesh used to create edges
         * @param  epsilon sum of angles in adjacency to check for edge
         * @param  checkVerticesInsteadOfIndices bases the edges detection on vertices vs indices. Note that this parameter is not used if options.useAlternateEdgeFinder = true
         * @param  generateEdgesLines - should generate Lines or only prepare resources.
         * @param  options The options to apply when generating the edges
         */
        constructor(source: AbstractMesh, epsilon?: number, checkVerticesInsteadOfIndices?: boolean, generateEdgesLines?: boolean, options?: IEdgesRendererOptions);
        protected _prepareResources(): void;
        /** @internal */
        _rebuild(): void;
        /**
         * Releases the required resources for the edges renderer
         */
        dispose(): void;
        protected _processEdgeForAdjacencies(pa: number, pb: number, p0: number, p1: number, p2: number): number;
        protected _processEdgeForAdjacenciesWithVertices(pa: Vector3, pb: Vector3, p0: Vector3, p1: Vector3, p2: Vector3): number;
        /**
         * Checks if the pair of p0 and p1 is en edge
         * @param faceIndex
         * @param edge
         * @param faceNormals
         * @param  p0
         * @param  p1
         * @private
         */
        protected _checkEdge(faceIndex: number, edge: number, faceNormals: Array<Vector3>, p0: Vector3, p1: Vector3): void;
        /**
         * push line into the position, normal and index buffer
         * @param p0
         * @param p1
         * @param offset
         * @protected
         */
        protected createLine(p0: Vector3, p1: Vector3, offset: number): void;
        /**
         * See https://playground.babylonjs.com/#R3JR6V#1 for a visual display of the algorithm
         * @param edgePoints
         * @param indexTriangle
         * @param indices
         * @param remapVertexIndices
         */
        private _tessellateTriangle;
        private _generateEdgesLinesAlternate;
        /**
         * Generates lines edges from adjacencjes
         * @private
         */
        _generateEdgesLines(): void;
        /**
         * Checks whether or not the edges renderer is ready to render.
         * @returns true if ready, otherwise false.
         */
        isReady(): boolean;
        /**
         * Renders the edges of the attached mesh,
         */
        render(): void;
    }
    /**
     * LineEdgesRenderer for LineMeshes to remove unnecessary triangulation
     */
    export class LineEdgesRenderer extends EdgesRenderer {
        /**
         * This constructor turns off auto generating edges line in Edges Renderer to make it here.
         * @param  source LineMesh used to generate edges
         * @param  epsilon not important (specified angle for edge detection)
         * @param  checkVerticesInsteadOfIndices not important for LineMesh
         */
        constructor(source: AbstractMesh, epsilon?: number, checkVerticesInsteadOfIndices?: boolean);
        /**
         * Generate edges for each line in LinesMesh. Every Line should be rendered as edge.
         */
        _generateEdgesLines(): void;
    }
    /**
     * Register side effects for edgesRenderer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterEdgesRenderer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import edgesRenderer.pure for tree-shakeable, side-effect-free usage.
     */


        interface Scene {
            /** @internal (Backing field) */
            _depthRenderer: {
                [id: string]: DepthRenderer;
            };
            /**
             * Creates a depth renderer a given camera which contains a depth map which can be used for post processing.
             * @param camera The camera to create the depth renderer on (default: scene's active camera)
             * @param storeNonLinearDepth Defines whether the depth is stored linearly like in Babylon Shadows or directly like glFragCoord.z
             * @param force32bitsFloat Forces 32 bits float when supported (else 16 bits float is prioritized over 32 bits float if supported)
             * @param samplingMode The sampling mode to be used with the render target (Linear, Nearest...)
             * @param storeCameraSpaceZ Defines whether the depth stored is the Z coordinate in camera space. If true, storeNonLinearDepth has no effect. (Default: false)
             * @param existingRenderTargetTexture An existing render target texture to use (default: undefined). If not provided, a new render target texture will be created.
             * @returns the created depth renderer
             */
            enableDepthRenderer(camera?: Nullable<Camera>, storeNonLinearDepth?: boolean, force32bitsFloat?: boolean, samplingMode?: number, storeCameraSpaceZ?: boolean, existingRenderTargetTexture?: RenderTargetTexture): DepthRenderer;
            /**
             * Disables a depth renderer for a given camera
             * @param camera The camera to disable the depth renderer on (default: scene's active camera)
             */
            disableDepthRenderer(camera?: Nullable<Camera>): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the Depth Renderer scene component responsible to manage a depth buffer useful
     * in several rendering techniques.
     */
    export class DepthRendererSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "DepthRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
        private _gatherRenderTargets;
        private _isReadyForMesh;
        private _gatherActiveCameraRenderTargets;
    }
    /**
     * Register side effects for depthRendererSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param depthRendererClass The DepthRenderer class to register the component for
     */
    export function RegisterDepthRendererSceneComponent(depthRendererClass: typeof DepthRenderer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import depthRendererSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a depth renderer in Babylon.
     * A depth renderer will render to it's depth map every frame which can be displayed or used in post processing
     */
    export class DepthRenderer {
        private _scene;
        private _depthMap;
        private readonly _storeNonLinearDepth;
        private readonly _storeCameraSpaceZ;
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Force all the depth renderer to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /** Color used to clear the depth texture. Default: (1,0,0,1) */
        clearColor: Color4;
        /** Get if the depth renderer is using packed depth or not */
        readonly isPacked: boolean;
        private _camera;
        /** Enable or disable the depth renderer. When disabled, the depth texture is not updated */
        enabled: boolean;
        /** Force writing the transparent objects into the depth map */
        forceDepthWriteTransparentMeshes: boolean;
        private _alphaBlendedDepth;
        private _alphaBlendedDepthMaterialCache;
        /**
         * Enable or disable the alpha blending for depth rendering. When enabled,
         * the depth renderer will blend the depth values with the alpha values of
         * the transparent objects.
         */
        get alphaBlendedDepth(): boolean;
        set alphaBlendedDepth(value: boolean);
        /**
         * Specifies that the depth renderer will only be used within
         * the camera it is created for.
         * This can help forcing its rendering during the camera processing.
         */
        useOnlyInActiveCamera: boolean;
        /** If true, reverse the culling of materials before writing to the depth texture.
         * So, basically, when "true", back facing instead of front facing faces are rasterized into the texture
         */
        reverseCulling: boolean;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Sets a specific material to be used to render a mesh/a list of meshes by the depth renderer
         * @param mesh mesh or array of meshes
         * @param material material to use by the depth render when rendering the mesh(es). If undefined is passed, the specific material created by the depth renderer will be used.
         */
        setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material): void;
        /**
         * Ensures the GaussianSplatting depth material exists and is up to date for the given mesh.
         * Creates the material on first call, and recreates it when alphaBlendedDepth changes.
         * @param mesh the GaussianSplatting mesh
         * @param renderPassId the render pass ID to look up the per-pass material
         * @returns the current depth rendering material, or null if the mesh has no GS material
         */
        private _ensureGaussianSplattingDepthMaterial;
        /**
         * Instantiates a depth renderer
         * @param scene The scene the renderer belongs to
         * @param type The texture type of the depth map (default: Engine.TEXTURETYPE_FLOAT)
         * @param camera The camera to be used to render the depth map (default: scene's active camera)
         * @param storeNonLinearDepth Defines whether the depth is stored linearly like in Babylon Shadows or directly like glFragCoord.z
         * @param samplingMode The sampling mode to be used with the render target (Linear, Nearest...) (default: TRILINEAR_SAMPLINGMODE)
         * @param storeCameraSpaceZ Defines whether the depth stored is the Z coordinate in camera space. If true, storeNonLinearDepth has no effect. (Default: false)
         * @param name Name of the render target (default: DepthRenderer)
         * @param existingRenderTargetTexture An existing render target texture to use (default: undefined). If not provided, a new render target texture will be created.
         */
        constructor(scene: Scene, type?: number, camera?: Nullable<Camera>, storeNonLinearDepth?: boolean, samplingMode?: number, storeCameraSpaceZ?: boolean, name?: string, existingRenderTargetTexture?: RenderTargetTexture);
        private _shadersLoaded;
        private _initShaderSourceAsync;
        /**
         * Creates the depth rendering effect and checks if the effect is ready.
         * @param subMesh The submesh to be used to render the depth map of
         * @param useInstances If multiple world instances should be used
         * @returns if the depth renderer is ready to render the depth map
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * Gets the texture which the depth map will be written to.
         * @returns The depth map texture
         */
        getDepthMap(): RenderTargetTexture;
        /**
         * Disposes of the depth renderer.
         */
        dispose(): void;
    }




        interface Scene {
            /**
             * The depth peeling renderer
             */
            depthPeelingRenderer: Nullable<ThinDepthPeelingRenderer>;
            /** @internal (Backing field) */
            _depthPeelingRenderer: Nullable<ThinDepthPeelingRenderer>;
            /**
             * Flag to indicate if we want to use order independent transparency, despite the performance hit
             */
            useOrderIndependentTransparency: boolean;
            /** @internal */
            _useOrderIndependentTransparency: boolean;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Scene component to render order independent transparency with depth peeling
     */
    export class DepthPeelingSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "DepthPeelingRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
    }
    /**
     * Register side effects for depthPeelingSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param depthPeelingRendererClass The DepthPeelingRenderer class to use for instantiation
     */
    export function RegisterDepthPeelingSceneComponent(depthPeelingRendererClass: typeof DepthPeelingRenderer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import depthPeelingSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * The depth peeling renderer that performs
     * Order independant transparency (OIT).
     * This should not be instanciated directly, as it is part of a scene component
     */
    export class DepthPeelingRenderer extends ThinDepthPeelingRenderer {
        private _outputRT;
        private _prePassEffectConfiguration;
        private _blendBackTexture;
        /**
         * Instanciates the depth peeling renderer
         * @param scene Scene to attach to
         * @param passCount Number of depth layers to peel
         * @returns The depth peeling renderer
         */
        constructor(scene: Scene, passCount?: number);
        protected _createTextures(): void;
        protected _disposeTextures(): void;
        private _updateTextures;
        private _updateTextureReferences;
        /**
         * Links to the prepass renderer
         * @param prePassRenderer The scene PrePassRenderer
         */
        setPrePassRenderer(prePassRenderer: PrePassRenderer): void;
        protected _finalCompose(writeId: number): void;
        /**
         * Checks if the depth peeling renderer is ready to render transparent meshes
         * @returns true if the depth peeling renderer is ready to render the transparent meshes
         */
        isReady(): boolean;
        protected _beforeRender(): void;
        protected _afterRender(): void;
        protected _noTransparentMeshes(): void;
    }


        interface Scene {
            /** @internal (Backing field) */
            _boundingBoxRenderer: BoundingBoxRenderer;
            /** @internal (Backing field) */
            _forceShowBoundingBoxes: boolean;
            /**
             * Gets or sets a boolean indicating if all bounding boxes must be rendered
             */
            forceShowBoundingBoxes: boolean;
            /**
             * Gets the bounding box renderer associated with the scene
             * @returns a BoundingBoxRenderer
             */
            getBoundingBoxRenderer(): BoundingBoxRenderer;
        }
        interface AbstractMesh {
            /** @internal (Backing field) */
            _showBoundingBox: boolean;
            /**
             * Gets or sets a boolean indicating if the bounding box must be rendered as well (false by default)
             */
            showBoundingBox: boolean;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Component responsible of rendering the bounding box of the meshes in a scene.
     * This is usually used through the mesh.showBoundingBox or the scene.forceShowBoundingBoxes properties
     */
    export class BoundingBoxRenderer implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "BoundingBoxRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Color of the bounding box lines placed in front of an object
         */
        frontColor: Color3;
        /**
         * Color of the bounding box lines placed behind an object
         */
        backColor: Color3;
        /**
         * Defines if the renderer should show the back lines or not
         */
        showBackLines: boolean;
        /**
         * Observable raised before rendering a bounding box
         * When {@link BoundingBoxRenderer.useInstances} enabled,
         * this would only be triggered once for one rendering, instead of once every bounding box.
         * Events would be triggered with a dummy box to keep backwards compatibility,
         * the passed bounding box has no meaning and should be ignored.
         */
        onBeforeBoxRenderingObservable: Observable<BoundingBox>;
        /**
         * Observable raised after rendering a bounding box
         * When {@link BoundingBoxRenderer.useInstances} enabled,
         * this would only be triggered once for one rendering, instead of once every bounding box.
         * Events would be triggered with a dummy box to keep backwards compatibility,
         * the passed bounding box has no meaning and should be ignored.
         */
        onAfterBoxRenderingObservable: Observable<BoundingBox>;
        /**
         * Observable raised after resources are created
         */
        onResourcesReadyObservable: Observable<BoundingBoxRenderer>;
        /**
         * When false, no bounding boxes will be rendered
         */
        enabled: boolean;
        /** Shader language used by the renderer */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this renderer.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * @internal
         */
        renderList: SmartArray<BoundingBox>;
        private _colorShader;
        private _colorShaderForOcclusionQuery;
        private _vertexBuffers;
        private _indexBuffer;
        private _fillIndexBuffer;
        private _fillIndexData;
        private _uniformBufferFront;
        private _uniformBufferBack;
        private _renderPassIdForOcclusionQuery;
        /**
         * Internal buffer for instanced rendering
         */
        private _matrixBuffer;
        private _matrices;
        /**
         * Internal state of whether instanced rendering enabled
         */
        protected _useInstances: boolean;
        /** @internal */
        _drawWrapperFront: Nullable<DrawWrapper>;
        /** @internal */
        _drawWrapperBack: Nullable<DrawWrapper>;
        /**
         * Instantiates a new bounding box renderer in a scene.
         * @param scene the scene the  renderer renders in
         */
        constructor(scene: Scene);
        private _buildUniformLayout;
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Checks if the renderer is ready asynchronously.
         * @param timeStep Time step in ms between retries (default is 16)
         * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 30000)
         * @returns The promise that resolves when the renderer is ready
         */
        whenReadyAsync(timeStep?: number, maxTimeout?: number): Promise<void>;
        /** @internal */
        _evaluateSubMesh(mesh: AbstractMesh, subMesh: SubMesh): void;
        /** @internal */
        _preActiveMesh(mesh: AbstractMesh): void;
        private _prepareResources;
        private _createIndexBuffer;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * @internal
         */
        reset(): void;
        /**
         * Render the bounding boxes of a specific rendering group
         * @param renderingGroupId defines the rendering group to render
         */
        render(renderingGroupId: number): void;
        private _createWrappersForBoundingBox;
        /**
         * In case of occlusion queries, we can render the occlusion bounding box through this method
         * @param mesh Define the mesh to render the occlusion bounding box for
         */
        renderOcclusionBoundingBox(mesh: AbstractMesh): void;
        /**
         * Sets whether to use instanced rendering.
         * When not enabled, BoundingBoxRenderer renders in a loop,
         * calling engine.drawElementsType for each bounding box in renderList,
         * making every bounding box 1 or 2 draw call.
         * When enabled, it collects bounding boxes to render,
         * and render all boxes in 1 or 2 draw call.
         * This could make the rendering with many bounding boxes much faster than not enabled,
         * but could result in a difference in rendering result if
         * {@link BoundingBoxRenderer.showBackLines} enabled,
         * because drawing the black/white part of each box one after the other
         * can be different from drawing the black part of all boxes and then the white part.
         * Also, when enabled, events of {@link BoundingBoxRenderer.onBeforeBoxRenderingObservable}
         * and {@link BoundingBoxRenderer.onAfterBoxRenderingObservable} would only be triggered once
         * for one rendering, instead of once every bounding box.
         * Events would be triggered with a dummy box to keep backwards compatibility,
         * the passed bounding box has no meaning and should be ignored.
         * @param val whether to use instanced rendering
         */
        set useInstances(val: boolean);
        get useInstances(): boolean;
        /**
         * Instanced render the bounding boxes of a specific rendering group
         * @param renderingGroupId defines the rendering group to render
         */
        private _renderInstanced;
        /**
         * Creates buffer for instanced rendering
         * @param buffer buffer to set
         */
        private _createInstanceBuffer;
        /**
         * Clean up buffers for instanced rendering
         */
        private _cleanupInstanceBuffer;
        /**
         * Clean up resources for instanced rendering
         */
        private _cleanupInstances;
        /**
         * Dispose and release the resources attached to this renderer.
         */
        dispose(): void;
    }
    /**
     * Register side effects for boundingBoxRenderer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBoundingBoxRenderer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import boundingBoxRenderer.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */




    /** @internal */
    export class FluidRenderingTextures {
        protected _name: string;
        protected _scene: Scene;
        protected _camera: Nullable<Camera>;
        protected _engine: AbstractEngine;
        protected _width: number;
        protected _height: number;
        protected _blurTextureSizeX: number;
        protected _blurTextureSizeY: number;
        protected _textureType: number;
        protected _textureFormat: number;
        protected _blurTextureType: number;
        protected _blurTextureFormat: number;
        protected _useStandardBlur: boolean;
        protected _generateDepthBuffer: boolean;
        protected _samples: number;
        protected _postProcessRunningIndex: number;
        protected _rt: Nullable<RenderTargetWrapper>;
        protected _texture: Nullable<Texture>;
        protected _rtBlur: Nullable<RenderTargetWrapper>;
        protected _textureBlurred: Nullable<Texture>;
        protected _blurPostProcesses: Nullable<PostProcess[]>;
        enableBlur: boolean;
        blurSizeDivisor: number;
        blurFilterSize: number;
        private _blurNumIterations;
        get blurNumIterations(): number;
        set blurNumIterations(numIterations: number);
        blurMaxFilterSize: number;
        blurDepthScale: number;
        particleSize: number;
        onDisposeObservable: Observable<FluidRenderingTextures>;
        get renderTarget(): Nullable<RenderTargetWrapper>;
        get renderTargetBlur(): Nullable<RenderTargetWrapper>;
        get texture(): Nullable<Texture>;
        get textureBlur(): Nullable<Texture>;
        /** Shader language used by the texture */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in the texture
         */
        get shaderLanguage(): ShaderLanguage;
        constructor(name: string, scene: Scene, width: number, height: number, blurTextureSizeX: number, blurTextureSizeY: number, textureType?: number, textureFormat?: number, blurTextureType?: number, blurTextureFormat?: number, useStandardBlur?: boolean, camera?: Nullable<Camera>, generateDepthBuffer?: boolean, samples?: number, shaderLanguage?: ShaderLanguage);
        initialize(): void;
        applyBlurPostProcesses(): void;
        protected _createRenderTarget(): void;
        protected _createBlurPostProcesses(textureBlurSource: ThinTexture, textureType: number, textureFormat: number, blurSizeDivisor: number, debugName: string, useStandardBlur?: boolean): [RenderTargetWrapper, Texture, PostProcess[]];
        private _fixReusablePostProcess;
        private _getProjectedParticleConstant;
        private _getDepthThreshold;
        dispose(): void;
    }


    /**
     * Textures that can be displayed as a debugging tool
     */
    export enum FluidRenderingDebug {
        DepthTexture = 0,
        DepthBlurredTexture = 1,
        ThicknessTexture = 2,
        ThicknessBlurredTexture = 3,
        DiffuseTexture = 4,
        Normals = 5,
        DiffuseRendering = 6
    }
    /**
     * Class used to render an object as a fluid thanks to different render target textures (depth, thickness, diffuse)
     */
    export class FluidRenderingTargetRenderer {
        protected _scene: Scene;
        protected _camera: Nullable<Camera>;
        protected _engine: AbstractEngine;
        protected _invProjectionMatrix: Matrix;
        protected _depthClearColor: Color4;
        protected _thicknessClearColor: Color4;
        protected _needInitialization: boolean;
        /**
         * Returns true if the class needs to be reinitialized (because of changes in parameterization)
         */
        get needInitialization(): boolean;
        private _generateDiffuseTexture;
        /**
         * Gets or sets a boolean indicating that the diffuse texture should be generated and used for the rendering
         */
        get generateDiffuseTexture(): boolean;
        set generateDiffuseTexture(generate: boolean);
        /**
         * Fluid color. Not used if generateDiffuseTexture is true
         */
        fluidColor: Color3;
        /**
         * Density of the fluid (positive number). The higher the value, the more opaque the fluid.
         */
        density: number;
        /**
         * Strength of the refraction (positive number, but generally between 0 and 0.3).
         */
        refractionStrength: number;
        /**
         * Strength of the fresnel effect (value between 0 and 1). Lower the value if you want to soften the specular effect
         */
        fresnelClamp: number;
        /**
         * Strength of the specular power (positive number). Increase the value to make the specular effect more concentrated
         */
        specularPower: number;
        /**
         * Minimum thickness of the particles (positive number). If useFixedThickness is true, minimumThickness is the thickness used
         */
        minimumThickness: number;
        /**
         * Direction of the light. The fluid is assumed to be lit by a directional light
         */
        dirLight: Vector3;
        private _debugFeature;
        /**
         * Gets or sets the feature (texture) to be debugged. Not used if debug is false
         */
        get debugFeature(): FluidRenderingDebug;
        set debugFeature(feature: FluidRenderingDebug);
        private _debug;
        /**
         * Gets or sets a boolean indicating if we should display a specific texture (given by debugFeature) for debugging purpose
         */
        get debug(): boolean;
        set debug(debug: boolean);
        private _environmentMap?;
        /**
         * Gets or sets the environment map used for the reflection part of the shading
         * If null, no map will be used. If undefined, the scene.environmentMap will be used (if defined)
         */
        get environmentMap(): Nullable<BaseTexture> | undefined;
        set environmentMap(map: Nullable<BaseTexture> | undefined);
        private _enableBlurDepth;
        /**
         * Gets or sets a boolean indicating that the depth texture should be blurred
         */
        get enableBlurDepth(): boolean;
        set enableBlurDepth(enable: boolean);
        private _blurDepthSizeDivisor;
        /**
         * Gets or sets the depth size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the depth
         * For eg. if blurDepthSizeDivisor=2, the texture used to blur the depth will be half the size of the depth texture
         */
        get blurDepthSizeDivisor(): number;
        set blurDepthSizeDivisor(scale: number);
        private _blurDepthFilterSize;
        /**
         * Size of the kernel used to filter the depth blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)
         */
        get blurDepthFilterSize(): number;
        set blurDepthFilterSize(filterSize: number);
        private _blurDepthNumIterations;
        /**
         * Number of blurring iterations used to generate the depth blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)
         */
        get blurDepthNumIterations(): number;
        set blurDepthNumIterations(numIterations: number);
        private _blurDepthMaxFilterSize;
        /**
         * Maximum size of the kernel used to blur the depth texture (positive number, generally between 1 and 200 - higher values will require more processing power from the GPU when the particles are larger on screen)
         */
        get blurDepthMaxFilterSize(): number;
        set blurDepthMaxFilterSize(maxFilterSize: number);
        private _blurDepthDepthScale;
        /**
         * Depth weight in the calculation when applying the bilateral blur to generate the depth blur texture (positive number, generally between 0 and 100)
         */
        get blurDepthDepthScale(): number;
        set blurDepthDepthScale(scale: number);
        private _enableBlurThickness;
        /**
         * Gets or sets a boolean indicating that the thickness texture should be blurred
         */
        get enableBlurThickness(): boolean;
        set enableBlurThickness(enable: boolean);
        private _blurThicknessSizeDivisor;
        /**
         * Gets or sets the thickness size divisor (positive number, generally between 1 and 4), which is used as a divisor when creating the texture used for blurring the thickness
         * For eg. if blurThicknessSizeDivisor=2, the texture used to blur the thickness will be half the size of the thickness texture
         */
        get blurThicknessSizeDivisor(): number;
        set blurThicknessSizeDivisor(scale: number);
        private _blurThicknessFilterSize;
        /**
         * Size of the kernel used to filter the thickness blur texture (positive number, generally between 1 and 20 - higher values will require more processing power from the GPU)
         */
        get blurThicknessFilterSize(): number;
        set blurThicknessFilterSize(filterSize: number);
        private _blurThicknessNumIterations;
        /**
         * Number of blurring iterations used to generate the thickness blur texture (positive number, generally between 1 and 10 - higher values will require more processing power from the GPU)
         */
        get blurThicknessNumIterations(): number;
        set blurThicknessNumIterations(numIterations: number);
        private _useFixedThickness;
        /**
         * Gets or sets a boolean indicating that a fixed thickness should be used instead of generating a thickness texture
         */
        get useFixedThickness(): boolean;
        set useFixedThickness(use: boolean);
        /** @internal */
        _bgDepthTexture: Nullable<InternalTexture>;
        /** @internal */
        _onUseVelocityChanged: Observable<FluidRenderingTargetRenderer>;
        private _useVelocity;
        /**
         * Gets or sets a boolean indicating that the velocity should be used when rendering the particles as a fluid.
         * Note: the vertex buffers must contain a "velocity" buffer for this to work!
         */
        get useVelocity(): boolean;
        set useVelocity(use: boolean);
        private _depthMapSize;
        /**
         * Defines the size of the depth texture.
         * If null, the texture will have the size of the screen
         */
        get depthMapSize(): Nullable<number>;
        set depthMapSize(size: Nullable<number>);
        private _thicknessMapSize;
        /**
         * Defines the size of the thickness texture.
         * If null, the texture will have the size of the screen
         */
        get thicknessMapSize(): Nullable<number>;
        set thicknessMapSize(size: Nullable<number>);
        private _diffuseMapSize;
        /**
         * Defines the size of the diffuse texture.
         * If null, the texture will have the size of the screen
         */
        get diffuseMapSize(): Nullable<number>;
        set diffuseMapSize(size: Nullable<number>);
        private _samples;
        /**
         * Gets or sets the number of samples used by MSAA
         * Note: changing this value in WebGL does not work because depth/stencil textures can't be created with MSAA (see https://github.com/BabylonJS/Babylon.js/issues/12444)
         */
        get samples(): number;
        set samples(samples: number);
        private _compositeMode;
        /**
         * If compositeMode is true (default: false), when the alpha value of the background (the scene rendered without the fluid objects) is 0, the final alpha value of the pixel will be set to the thickness value.
         * This way, it is possible to composite the fluid rendering on top of the HTML background.
         */
        get compositeMode(): boolean;
        set compositeMode(value: boolean);
        /**
         * Gets the camera used for the rendering
         */
        get camera(): Nullable<Camera>;
        /** @internal */
        _renderPostProcess: Nullable<PostProcess>;
        /** @internal */
        _depthRenderTarget: Nullable<FluidRenderingTextures>;
        /** @internal */
        _diffuseRenderTarget: Nullable<FluidRenderingTextures>;
        /** @internal */
        _thicknessRenderTarget: Nullable<FluidRenderingTextures>;
        /** Shader language used by the renderer */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this renderer
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Creates an instance of the class
         * @param scene Scene used to render the fluid object into
         * @param camera Camera used to render the fluid object. If not provided, use the active camera of the scene instead
         * @param shaderLanguage The shader language to use
         */
        constructor(scene: Scene, camera?: Camera, shaderLanguage?: ShaderLanguage);
        /** @internal */
        _initialize(): void;
        protected _setBlurParameters(renderTarget?: Nullable<FluidRenderingTextures>): void;
        protected _setBlurDepthParameters(): void;
        protected _setBlurThicknessParameters(): void;
        protected _initializeRenderTarget(renderTarget: FluidRenderingTextures): void;
        protected _createLiquidRenderingPostProcess(): void;
        /** @internal */
        _clearTargets(): void;
        /** @internal */
        _render(fluidObject: FluidRenderingObject): void;
        /**
         * Releases all the resources used by the class
         * @param onlyPostProcesses If true, releases only the resources used by the render post processes
         */
        dispose(onlyPostProcesses?: boolean): void;
    }


    /**
     * Defines a rendering object based on a particle system
     */
    export class FluidRenderingObjectParticleSystem extends FluidRenderingObject {
        private _particleSystem;
        private _originalRender;
        private _blendMode;
        private _onBeforeDrawParticleObserver;
        private _updateInAnimate;
        /** Gets the particle system */
        get particleSystem(): IParticleSystem;
        /**
         * @returns the name of the class
         */
        getClassName(): string;
        private _useTrueRenderingForDiffuseTexture;
        /**
         * Gets or sets a boolean indicating that the diffuse texture should be generated based on the regular rendering of the particle system (default: true).
         * Sometimes, generating the diffuse texture this way may be sub-optimal. In that case, you can disable this property, in which case the particle system will be
         * rendered using a ALPHA_COMBINE mode instead of the one used by the particle system.
         */
        get useTrueRenderingForDiffuseTexture(): boolean;
        set useTrueRenderingForDiffuseTexture(use: boolean);
        /**
         * Gets the vertex buffers
         */
        get vertexBuffers(): {
            [key: string]: VertexBuffer;
        };
        /**
         * Gets the index buffer (or null if the object is using instancing)
         */
        get indexBuffer(): Nullable<DataBuffer>;
        /**
         * Creates a new instance of the class
         * @param scene The scene the particle system is part of
         * @param ps The particle system
         * @param shaderLanguage The shader language to use
         */
        constructor(scene: Scene, ps: IParticleSystem, shaderLanguage?: ShaderLanguage);
        /**
         * Indicates if the object is ready to be rendered
         * @returns True if everything is ready for the object to be rendered, otherwise false
         */
        isReady(): boolean;
        /**
         * Gets the number of particles in this particle system
         * @returns The number of particles
         */
        get numParticles(): number;
        /**
         * Render the diffuse texture for this object
         */
        renderDiffuseTexture(): void;
        /**
         * Releases the resources used by the class
         */
        dispose(): void;
    }


    /**
     * Defines a rendering object based on a list of custom buffers
     * The list must contain at least a "position" buffer!
     */
    export class FluidRenderingObjectCustomParticles extends FluidRenderingObject {
        private _numParticles;
        private _diffuseEffectWrapper;
        private _vertexBuffers;
        /**
         * @returns the name of the class
         */
        getClassName(): string;
        /**
         * Gets the vertex buffers
         */
        get vertexBuffers(): {
            [key: string]: VertexBuffer;
        };
        /**
         * Creates a new instance of the class
         * @param scene The scene the particles should be rendered into
         * @param buffers The list of buffers (must contain at least one "position" buffer!). Note that you don't have to pass all (or any!) buffers at once in the constructor, you can use the addBuffers method to add more later.
         * @param numParticles Number of vertices to take into account from the buffers
         * @param shaderLanguage The shader language to use
         */
        constructor(scene: Scene, buffers: {
            [key: string]: FloatArray;
        }, numParticles: number, shaderLanguage?: ShaderLanguage);
        /**
         * Add some new buffers
         * @param buffers List of buffers
         */
        addBuffers(buffers: {
            [key: string]: FloatArray;
        }): void;
        protected _createEffects(): void;
        /**
         * Indicates if the object is ready to be rendered
         * @returns True if everything is ready for the object to be rendered, otherwise false
         */
        isReady(): boolean;
        /**
         * Gets the number of particles in this object
         * @returns The number of particles
         */
        get numParticles(): number;
        /**
         * Sets the number of particles in this object
         * @param num The number of particles to take into account
         */
        setNumParticles(num: number): void;
        /**
         * Render the diffuse texture for this object
         */
        renderDiffuseTexture(): void;
        /**
         * Releases the resources used by the class
         */
        dispose(): void;
    }


    /**
     * Defines the base object used for fluid rendering.
     * It is based on a list of vertices (particles)
     */
    export abstract class FluidRenderingObject {
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        protected _effectsAreDirty: boolean;
        protected _depthEffectWrapper: Nullable<EffectWrapper>;
        protected _thicknessEffectWrapper: Nullable<EffectWrapper>;
        /** Defines the priority of the object. Objects will be rendered in ascending order of priority */
        priority: number;
        protected _particleSize: number;
        /** Observable triggered when the size of the particle is changed */
        onParticleSizeChanged: Observable<FluidRenderingObject>;
        /** Gets or sets the size of the particle */
        get particleSize(): number;
        set particleSize(size: number);
        /** Defines the alpha value of a particle */
        particleThicknessAlpha: number;
        /** Indicates if the object uses instancing or not */
        get useInstancing(): boolean;
        private _useVelocity;
        /** Indicates if velocity of particles should be used when rendering the object. The vertex buffer set must contain a "velocity" buffer for this to work! */
        get useVelocity(): boolean;
        set useVelocity(use: boolean);
        private _hasVelocity;
        /**
         * Gets the vertex buffers
         */
        abstract get vertexBuffers(): {
            [key: string]: VertexBuffer;
        };
        /**
         * Gets the index buffer (or null if the object is using instancing)
         */
        get indexBuffer(): Nullable<DataBuffer>;
        /**
         * @returns the name of the class
         */
        getClassName(): string;
        /** Shader language used by the object */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this object
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Instantiates a fluid rendering object
         * @param scene The scene the object is part of
         * @param shaderLanguage The shader language to use
         */
        constructor(scene: Scene, shaderLanguage?: ShaderLanguage);
        protected _createEffects(): void;
        /**
         * Indicates if the object is ready to be rendered
         * @returns True if everything is ready for the object to be rendered, otherwise false
         */
        isReady(): boolean;
        /**
         * Gets the number of particles (vertices) of this object
         * @returns The number of particles
         */
        abstract get numParticles(): number;
        /**
         * Render the depth texture for this object
         */
        renderDepthTexture(): void;
        /**
         * Render the thickness texture for this object
         */
        renderThicknessTexture(): void;
        /**
         * Render the diffuse texture for this object
         */
        renderDiffuseTexture(): void;
        /**
         * Releases the resources used by the class
         */
        dispose(): void;
    }


    /** @internal */
    export class FluidRenderingDepthTextureCopy {
        private _engine;
        private _depthRTWrapper;
        private _copyTextureToTexture;
        get depthRTWrapper(): RenderTargetWrapper;
        constructor(engine: AbstractEngine, width: number, height: number, samples?: number);
        copy(source: InternalTexture): boolean;
        dispose(): void;
    }


        interface Scene {
            /** @internal (Backing field) */
            _fluidRenderer: Nullable<FluidRenderer>;
            /**
             * Gets or Sets the fluid renderer associated to the scene.
             */
            fluidRenderer: Nullable<FluidRenderer>;
            /**
             * Enables the fluid renderer and associates it with the scene
             * @returns the FluidRenderer
             */
            enableFluidRenderer(): Nullable<FluidRenderer>;
            /**
             * Disables the fluid renderer associated with the scene
             */
            disableFluidRenderer(): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the fluid renderer scene component responsible to render objects as fluids
     */
    export class FluidRendererSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "FluidRenderer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        private _gatherActiveCameraRenderTargets;
        private _afterCameraDraw;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
    }
    /**
     * An object rendered as a fluid.
     * It consists of the object itself as well as the render target renderer (which is used to generate the textures (render target) needed for fluid rendering)
     */
    export interface IFluidRenderingRenderObject {
        /** object rendered as a fluid */
        object: FluidRenderingObject;
        /** target renderer used to render the fluid object */
        targetRenderer: FluidRenderingTargetRenderer;
    }
    /**
     * Class responsible for fluid rendering.
     * It is implementing the method described in https://developer.download.nvidia.com/presentations/2010/gdc/Direct3D_Effects.pdf
     */
    export class FluidRenderer {
        /** @internal */
        static _SceneComponentInitialization(scene: Scene): void;
        private _scene;
        private _engine;
        private _onEngineResizeObserver;
        private _cameras;
        /** Retrieves all the render objects managed by the class */
        readonly renderObjects: Array<IFluidRenderingRenderObject>;
        /** Retrieves all the render target renderers managed by the class */
        readonly targetRenderers: FluidRenderingTargetRenderer[];
        /** Shader language used by the renderer */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this renderer
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Initializes the class
         * @param scene Scene in which the objects are part of
         */
        constructor(scene: Scene);
        /**
         * Reinitializes the class
         * Can be used if you change the object priority (FluidRenderingObject.priority), to make sure the objects are rendered in the right order
         */
        recreate(): void;
        /**
         * Gets the render object corresponding to a particle system (null if the particle system is not rendered as a fluid)
         * @param ps The particle system
         * @returns the render object corresponding to this particle system if any, otherwise null
         */
        getRenderObjectFromParticleSystem(ps: IParticleSystem): Nullable<IFluidRenderingRenderObject>;
        /**
         * Adds a particle system to the fluid renderer.
         * @param ps particle system
         * @param generateDiffuseTexture True if you want to generate a diffuse texture from the particle system and use it as part of the fluid rendering (default: false)
         * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one
         * @param camera The camera used by the target renderer (if the target renderer is created by the method)
         * @returns the render object corresponding to the particle system
         */
        addParticleSystem(ps: IParticleSystem, generateDiffuseTexture?: boolean, targetRenderer?: FluidRenderingTargetRenderer, camera?: Camera): IFluidRenderingRenderObject;
        /**
         * Adds a custom particle set to the fluid renderer.
         * @param buffers The list of buffers (should contain at least a "position" buffer!)
         * @param numParticles Number of particles in each buffer
         * @param generateDiffuseTexture True if you want to generate a diffuse texture from buffers and use it as part of the fluid rendering (default: false). For the texture to be generated correctly, you need a "color" buffer in the set!
         * @param targetRenderer The target renderer used to display the particle system as a fluid. If not provided, the method will create a new one
         * @param camera The camera used by the target renderer (if the target renderer is created by the method)
         * @returns the render object corresponding to the custom particle set
         */
        addCustomParticles(buffers: {
            [key: string]: FloatArray;
        }, numParticles: number, generateDiffuseTexture?: boolean, targetRenderer?: FluidRenderingTargetRenderer, camera?: Camera): IFluidRenderingRenderObject;
        /**
         * Removes a render object from the fluid renderer
         * @param renderObject the render object to remove
         * @param removeUnusedTargetRenderer True to remove/dispose of the target renderer if it's not used anymore (default: true)
         * @returns True if the render object has been found and released, else false
         */
        removeRenderObject(renderObject: IFluidRenderingRenderObject, removeUnusedTargetRenderer?: boolean): boolean;
        private _sortRenderingObjects;
        private _removeUnusedTargetRenderers;
        private _getParticleSystemIndex;
        private _initialize;
        private _setParticleSizeForRenderTargets;
        private _setUseVelocityForRenderObject;
        /** @internal */
        _prepareRendering(): void;
        /** @internal */
        _render(forCamera?: Camera): void;
        /**
         * Disposes of all the resources used by the class
         */
        dispose(): void;
    }
    /**
     * Register side effects for fluidRenderer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFluidRenderer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fluidRenderer.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Build cdf maps for IBL importance sampling during IBL shadow computation.
     * This should not be instantiated directly, as it is part of a scene component
     * @internal
     */
    export class _IblShadowsVoxelTracingPass {
        private _scene;
        private _engine;
        private _renderPipeline;
        private _voxelShadowOpacity;
        /**
         * The opacity of the shadow cast from the voxel grid
         */
        get voxelShadowOpacity(): number;
        /**
         * The opacity of the shadow cast from the voxel grid
         */
        set voxelShadowOpacity(value: number);
        private _sssSamples;
        private _sssStride;
        private _sssMaxDist;
        private _sssThickness;
        private _ssShadowOpacity;
        /**
         * The opacity of the screen-space shadow
         */
        get ssShadowOpacity(): number;
        /**
         * The opacity of the screen-space shadow
         */
        set ssShadowOpacity(value: number);
        /**
         * The number of samples used in the screen space shadow pass.
         */
        get sssSamples(): number;
        /**
         * The number of samples used in the screen space shadow pass.
         */
        set sssSamples(value: number);
        /**
         * The stride used in the screen space shadow pass. This controls the distance between samples.
         */
        get sssStride(): number;
        /**
         * The stride used in the screen space shadow pass. This controls the distance between samples.
         */
        set sssStride(value: number);
        /**
         * The maximum distance that the screen-space shadow will be able to occlude.
         */
        get sssMaxDist(): number;
        /**
         * The maximum distance that the screen-space shadow will be able to occlude.
         */
        set sssMaxDist(value: number);
        /**
         * The thickness of the screen-space shadow
         */
        get sssThickness(): number;
        /**
         * The thickness of the screen-space shadow
         */
        set sssThickness(value: number);
        private _outputTexture;
        private _cameraInvView;
        private _cameraInvProj;
        private _invWorldScaleMatrix;
        private _frameId;
        private _sampleDirections;
        private _shadowParameters;
        private _sssParameters;
        private _opacityParameters;
        private _voxelBiasParameters;
        private _voxelNormalBias;
        /**
         * The bias to apply to the voxel sampling in the direction of the surface normal of the geometry.
         */
        get voxelNormalBias(): number;
        set voxelNormalBias(value: number);
        private _voxelDirectionBias;
        /**
         * The bias to apply to the voxel sampling in the direction of the light.
         */
        get voxelDirectionBias(): number;
        set voxelDirectionBias(value: number);
        /**
         * Is the effect enabled
         */
        enabled: boolean;
        /**
         * The number of directions to sample for the voxel tracing.
         */
        get sampleDirections(): number;
        /**
         * The number of directions to sample for the voxel tracing.
         */
        set sampleDirections(value: number);
        /**
         * The current rotation of the environment map, in radians.
         */
        get envRotation(): number;
        /**
         * The current rotation of the environment map, in radians.
         */
        set envRotation(value: number);
        /** Enable the debug view for this pass */
        debugEnabled: boolean;
        /**
         * Returns the output texture of the pass.
         * @returns The output texture.
         */
        getOutputTexture(): ProceduralTexture;
        /**
         * Gets the debug pass post process. This will create the resources for the pass
         * if they don't already exist.
         * @returns The post process
         */
        getDebugPassPP(): PostProcess;
        private _debugPassName;
        /**
         * The name of the debug pass
         */
        get debugPassName(): string;
        /** The default rotation of the environment map will align the shadows with the default lighting orientation */
        private _envRotation;
        /**
         * Set the matrix to use for scaling the world space to voxel space
         * @param matrix The matrix to use for scaling the world space to voxel space
         */
        setWorldScaleMatrix(matrix: Matrix): void;
        /**
         * Render the shadows in color rather than black and white.
         * This is slightly more expensive than black and white shadows but can be much
         * more accurate when the strongest lights in the IBL are non-white.
         */
        set coloredShadows(value: boolean);
        get coloredShadows(): boolean;
        private _coloredShadows;
        private _debugVoxelMarchEnabled;
        private _debugPassPP;
        private _debugSizeParams;
        /**
         * Sets params that control the position and scaling of the debug display on the screen.
         * @param x Screen X offset of the debug display (0-1)
         * @param y Screen Y offset of the debug display (0-1)
         * @param widthScale X scale of the debug display (0-1)
         * @param heightScale Y scale of the debug display (0-1)
         */
        setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number): void;
        /**
         * Creates the debug post process effect for this pass
         */
        private _createDebugPass;
        /**
         * Instantiates the shadow voxel-tracing pass
         * @param scene Scene to attach to
         * @param iblShadowsRenderPipeline The IBL shadows render pipeline
         * @returns The shadow voxel-tracing pass
         */
        constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
        private _createTextures;
        private _createDefines;
        private _setBindings;
        private _render;
        private _renderWhenGBufferReady;
        /**
         * Called by render pipeline when canvas resized.
         * @param scaleFactor The factor by which to scale the canvas size.
         */
        resize(scaleFactor?: number): void;
        /**
         * Checks if the pass is ready
         * @returns true if the pass is ready
         */
        isReady(): boolean | null;
        /**
         * Disposes the associated resources
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Voxel-based shadow rendering for IBL's.
     * This should not be instanciated directly, as it is part of a scene component
     * @internal
     * @see https://playground.babylonjs.com/#8R5SSE#222
     */
    export class _IblShadowsVoxelRenderer {
        private static readonly _VOXEL_VIEW_MATRICES;
        private _scene;
        private _engine;
        private _voxelGrid;
        private _voxelGridRT;
        private _combinedVoxelGridPT;
        private _voxelGridXaxis;
        private _voxelGridYaxis;
        private _voxelGridZaxis;
        private _voxelMrtsXaxis;
        private _voxelMrtsYaxis;
        private _voxelMrtsZaxis;
        private _voxelMaterial;
        private _voxelClearColor;
        /**
         * Return the voxel grid texture.
         * @returns The voxel grid texture.
         */
        getVoxelGrid(): ProceduralTexture | RenderTargetTexture;
        /**
         * Return the voxel render target used during voxelization.
         * @returns The voxel render target.
         */
        getRT(): ProceduralTexture | RenderTargetTexture;
        /**
         * Observable that triggers when the voxelization is complete
         */
        onVoxelizationCompleteObservable: Observable<void>;
        private _maxDrawBuffers;
        private _renderTargets;
        /** Per-mesh voxel ShaderMaterials for GaussianSplattingMesh, keyed by mesh uniqueId. */
        private _gsVoxelMaterialCache;
        private _triPlanarVoxelization;
        /**
         * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.
         */
        get triPlanarVoxelization(): boolean;
        /**
         * Whether to use tri-planar voxelization. More expensive, but can help with artifacts.
         */
        set triPlanarVoxelization(enabled: boolean);
        private _voxelizationInProgress;
        private _invWorldScaleMatrix;
        /**
         * Set the matrix to use for scaling the world space to voxel space
         * @param matrix The matrix to use for scaling the world space to voxel space
         */
        setWorldScaleMatrix(matrix: Matrix): void;
        /**
         * @returns Whether voxelization is currently happening.
         */
        isVoxelizationInProgress(): boolean;
        private _voxelResolution;
        private _voxelResolutionExp;
        /**
         * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.
         */
        get voxelResolutionExp(): number;
        /**
         * Resolution of the voxel grid. The final resolution will be 2^resolutionExp.
         */
        set voxelResolutionExp(resolutionExp: number);
        private _copyMipEffectRenderer;
        private _copyMipEffectWrapper;
        private _copyMipSourceTexture?;
        private _copyMipLayer;
        private _mipArray;
        /**
         * Instanciates the voxel renderer
         * @param scene Scene to attach to
         * @param iblShadowsRenderPipeline The render pipeline this pass is associated with
         * @param resolutionExp Resolution of the voxel grid. The final resolution will be 2^resolutionExp.
         * @param triPlanarVoxelization Whether to use tri-planar voxelization. Only applies to WebGL. Voxelization will take longer but will reduce missing geometry.
         * @returns The voxel renderer
         */
        constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline, resolutionExp?: number, triPlanarVoxelization?: boolean);
        private _generateMipMaps;
        private _generateMipMap;
        private _copyMipMaps;
        private _copyMipMap;
        private _computeNumberOfSlabs;
        private _createTextures;
        private _createVoxelMRTs;
        private _disposeVoxelTextures;
        private _createVoxelMaterials;
        /**
         * Checks if the voxel renderer is ready to voxelize scene
         * @returns true if the voxel renderer is ready to voxelize scene
         */
        isReady(): boolean;
        /**
         * If the MRT's are already in the list of render targets, this will
         * remove them so that they don't get rendered again.
         */
        private _stopVoxelization;
        private _removeVoxelRTs;
        /**
         * Renders voxel grid of scene for IBL shadows
         * @param includedMeshes
         * @param registerAfterRenderObservable Whether to register scene onAfterRender callback (legacy path).
         */
        updateVoxelGrid(includedMeshes: Mesh[], registerAfterRenderObservable?: boolean): void;
        /**
         * Advances voxelization work when running in custom render loops (for example FrameGraph tasks)
         * where scene onAfterRender timing may differ from classic pipeline flow.
         */
        processVoxelization(): void;
        private _renderVoxelGridBound;
        private _renderVoxelGrid;
        /**
         * Splits rendering for every voxel RT: non–Gaussian splatting meshes use subMesh.render
         * (material override from setMaterialForRendering); GaussianSplattingMesh uses a custom draw path with its cached voxel ShaderMaterial.
         * @param rtt - the render target texture to install the custom render function on
         */
        private _installVoxelMixedCustomRender;
        private _addGsMeshToVoxelRT;
        private _addRTsForRender;
        /**
         * Called by the pipeline to resize resources.
         */
        resize(): void;
        /**
         * Disposes the voxel renderer and associated resources
         */
        dispose(): void;
    }




    /**
     * This should not be instanciated directly, as it is part of a scene component
     * @internal
     */
    export class _IblShadowsSpatialBlurPass {
        private _scene;
        private _engine;
        private _renderPipeline;
        private _outputTexture;
        private _worldScale;
        private _blurParameters;
        /**
         * Is the effect enabled
         */
        enabled: boolean;
        /**
         * Returns the output texture of the pass.
         * @returns The output texture.
         */
        getOutputTexture(): ProceduralTexture;
        /**
         * Gets the debug pass post process
         * @returns The post process
         */
        getDebugPassPP(): PostProcess;
        private _debugPassName;
        /**
         * Sets the name of the debug pass
         */
        get debugPassName(): string;
        /**
         * The scale of the voxel grid in world space. This is used to scale the blur radius in world space.
         * @param scale The scale of the voxel grid in world space.
         */
        setWorldScale(scale: number): void;
        /** Enable the debug view for this pass */
        debugEnabled: boolean;
        private _debugPassPP;
        private _debugSizeParams;
        /**
         * Sets params that control the position and scaling of the debug display on the screen.
         * @param x Screen X offset of the debug display (0-1)
         * @param y Screen Y offset of the debug display (0-1)
         * @param widthScale X scale of the debug display (0-1)
         * @param heightScale Y scale of the debug display (0-1)
         */
        setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number): void;
        /**
         * Creates the debug post process effect for this pass
         */
        private _createDebugPass;
        /**
         * Instanciates the importance sampling renderer
         * @param scene Scene to attach to
         * @param iblShadowsRenderPipeline The IBL shadows render pipeline
         * @returns The importance sampling renderer
         */
        constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
        private _createTextures;
        private _setBindings;
        private _render;
        private _renderWhenGBufferReady;
        /**
         * Called by render pipeline when canvas resized.
         * @param scaleFactor The factor by which to scale the canvas size.
         */
        resize(scaleFactor?: number): void;
        /**
         * Checks if the pass is ready
         * @returns true if the pass is ready
         */
        isReady(): boolean;
        /**
         * Disposes the associated resources
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    interface IIblShadowsSettings {
        /**
         * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper
         * shadows but are more expensive to compute and require more memory.
         * The resolution is calculated as 2 to the power of this number.
         */
        resolutionExp?: number;
        /**
         * The number of different directions to sample during the voxel tracing pass. Higher
         * values will result in better quality, more stable shadows but are more expensive to compute.
         */
        sampleDirections?: number;
        /**
         * How dark the shadows are. 1.0 is full opacity, 0.0 is no shadows.
         */
        shadowOpacity?: number;
        /**
         * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.
         */
        envRotation?: number;
        /**
         * A factor that controls how long the shadows remain in the scene.
         * 0.0 is no persistence, 1.0 is full persistence.
         * This value applies only while the camera is moving. Once stationary, the pipeline
         * increases remanence automatically to help the shadows converge.
         */
        shadowRemanence?: number;
        /**
         * Render the voxel grid from 3 different axis. This will result in better quality shadows with fewer
         * bits of missing geometry.
         */
        triPlanarVoxelization?: boolean;
        /**
         * A size multiplier for the internal shadow render targets (default 1.0). A value of 1.0 represents full-resolution.
         * Scaling this below 1.0 will result in blurry shadows and potentially more artifacts but
         * could help increase performance on less powerful GPU's.
         */
        shadowRenderSizeFactor?: number;
        /**
         * Separate control for the opacity of the voxel shadows.
         */
        voxelShadowOpacity?: number;
        /**
         * Include screen-space shadows in the IBL shadow pipeline. This adds sharp shadows to small details
         * but only applies close to a shadow-casting object.
         */
        ssShadowsEnabled?: boolean;
        /**
         * The number of samples used in the screen space shadow pass.
         */
        ssShadowSampleCount?: number;
        /**
         * The stride of the screen-space shadow pass. This controls the distance between samples
         * in pixels.
         */
        ssShadowStride?: number;
        /**
         * A scale for the maximum distance a screen-space shadow can be cast in world-space.
         * The maximum distance that screen-space shadows cast is derived from the voxel size
         * and this value so shouldn't need to change if you scale your scene.
         */
        ssShadowDistanceScale?: number;
        /**
         * Screen-space shadow thickness scale. This value controls the assumed thickness of
         * on-screen surfaces in world-space. It scales with the size of the shadow-casting
         * region so shouldn't need to change if you scale your scene.
         */
        ssShadowThicknessScale?: number;
    }
    /**
     * Voxel-based shadow rendering for IBL's.
     * This should not be instanciated directly, as it is part of a scene component
     */
    export class IblShadowsRenderPipeline extends PostProcessRenderPipeline {
        /**
         * The scene that this pipeline is attached to
         */
        scene: Scene;
        private _allowDebugPasses;
        private _debugPasses;
        private _geometryBufferRenderer;
        private _shadowCastingMeshes;
        private _voxelRenderer;
        private _voxelTracingPass;
        private _spatialBlurPass;
        private _accumulationPass;
        private _noiseTexture;
        /**
         * Raw texture to be used before final data is available.
         * @internal
         */
        _dummyTexture2d: RawTexture;
        private _dummyTexture3d;
        private _shadowOpacity;
        private _enabled;
        private _coloredShadows;
        private _materialsWithRenderPlugin;
        /**
         * Observable that triggers when the shadow renderer is ready
         */
        onShadowTextureReadyObservable: Observable<void>;
        /**
         * Observable that triggers when a new IBL is set and the importance sampling is ready
         */
        onNewIblReadyObservable: Observable<void>;
        /**
         * Observable that triggers when the voxelization is complete
         */
        onVoxelizationCompleteObservable: Observable<void>;
        /**
         * The current world-space size of that the voxel grid covers in the scene.
         */
        voxelGridSize: number;
        /**
         * Reset the shadow accumulation. This has a similar affect to lowering the remanence for a single frame.
         * This is useful when making a sudden change to the IBL.
         */
        resetAccumulation(): void;
        /**
         * How dark the shadows appear. 1.0 is full opacity, 0.0 is no shadows.
         */
        get shadowOpacity(): number;
        set shadowOpacity(value: number);
        /**
         * Render the shadows in color rather than black and white.
         * This is slightly more expensive than black and white shadows but can be much
         * more accurate when the strongest lights in the IBL are non-white.
         */
        get coloredShadows(): boolean;
        set coloredShadows(value: boolean);
        private _renderSizeFactor;
        /**
         * A multiplier for the render size of the shadows. Used for rendering lower-resolution shadows.
         */
        get shadowRenderSizeFactor(): number;
        set shadowRenderSizeFactor(value: number);
        /**
         * How dark the voxel shadows appear. 1.0 is full opacity, 0.0 is no shadows.
         */
        get voxelShadowOpacity(): number;
        set voxelShadowOpacity(value: number);
        /**
         * How dark the screen-space shadows appear. 1.0 is full opacity, 0.0 is no shadows.
         */
        get ssShadowOpacity(): number;
        set ssShadowOpacity(value: number);
        /**
         * The number of samples used in the screen space shadow pass.
         */
        get ssShadowSampleCount(): number;
        set ssShadowSampleCount(value: number);
        /**
         * The stride of the screen-space shadow pass. This controls the distance between samples
         * in pixels.
         */
        get ssShadowStride(): number;
        set ssShadowStride(value: number);
        private _sssMaxDistScale;
        /**
         * A scale for the maximum distance a screen-space shadow can be cast in world-space.
         * The maximum distance that screen-space shadows cast is derived from the voxel size
         * and this value so shouldn't need to change if you scale your scene
         */
        get ssShadowDistanceScale(): number;
        set ssShadowDistanceScale(value: number);
        private _sssThicknessScale;
        /**
         * Screen-space shadow thickness scale. This value controls the assumed thickness of
         * on-screen surfaces in world-space. It scales with the size of the shadow-casting
         * region so shouldn't need to change if you scale your scene.
         */
        get ssShadowThicknessScale(): number;
        set ssShadowThicknessScale(value: number);
        /**
         * Returns the texture containing the voxel grid data
         * @returns The texture containing the voxel grid data
         * @internal
         */
        _getVoxelGridTexture(): Texture;
        /**
         * Returns the noise texture.
         * @returns The noise texture.
         * @internal
         */
        _getNoiseTexture(): Texture;
        /**
         * Returns the voxel-tracing texture.
         * @returns The voxel-tracing texture.
         * @internal
         */
        _getVoxelTracingTexture(): Texture;
        /**
         * Returns the spatial blur texture.
         * @returns The spatial blur texture.
         * @internal
         */
        _getSpatialBlurTexture(): Texture;
        /**
         * Returns the accumulated shadow texture.
         * @returns The accumulated shadow texture.
         * @internal
         */
        _getAccumulatedTexture(): Texture;
        private _gbufferDebugPass;
        private _gbufferDebugEnabled;
        private _gBufferDebugSizeParams;
        /**
         * Turn on or off the debug view of the G-Buffer. This will display only the targets
         * of the g-buffer that are used by the shadow pipeline.
         */
        get gbufferDebugEnabled(): boolean;
        set gbufferDebugEnabled(enabled: boolean);
        /**
         * Turn on or off the debug view of the CDF importance sampling data
         */
        get cdfDebugEnabled(): boolean;
        /**
         * Turn on or off the debug view of the CDF importance sampling data
         */
        set cdfDebugEnabled(enabled: boolean);
        /**
         * Display the debug view for just the shadow samples taken this frame.
         */
        get voxelTracingDebugEnabled(): boolean;
        set voxelTracingDebugEnabled(enabled: boolean);
        /**
         * Display the debug view for the spatial blur pass
         */
        get spatialBlurPassDebugEnabled(): boolean;
        set spatialBlurPassDebugEnabled(enabled: boolean);
        /**
         * Display the debug view for the shadows accumulated over time.
         */
        get accumulationPassDebugEnabled(): boolean;
        set accumulationPassDebugEnabled(enabled: boolean);
        /**
         * Add a mesh to be used for shadow-casting in the IBL shadow pipeline.
         * These meshes will be written to the voxel grid.
         * @param mesh A mesh or list of meshes that you want to cast shadows
         */
        addShadowCastingMesh(mesh: Mesh | Mesh[]): void;
        /**
         * Remove a mesh from the shadow-casting list. The mesh will no longer be written
         * to the voxel grid and will not cast shadows.
         * @param mesh The mesh or list of meshes that you don't want to cast shadows.
         */
        removeShadowCastingMesh(mesh: Mesh | Mesh[]): void;
        /**
         * Clear the list of shadow-casting meshes. This will remove all meshes from the list
         */
        clearShadowCastingMeshes(): void;
        /**
         * The exponent of the resolution of the voxel shadow grid. Higher resolutions will result in sharper
         * shadows but are more expensive to compute and require more memory.
         * The resolution is calculated as 2 to the power of this number.
         */
        get resolutionExp(): number;
        set resolutionExp(newResolution: number);
        /**
         * The number of different directions to sample during the voxel tracing pass
         */
        get sampleDirections(): number;
        /**
         * The number of different directions to sample during the voxel tracing pass
         */
        set sampleDirections(value: number);
        /**
         * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.
         **/
        get shadowRemanence(): number;
        /**
         * The decree to which the shadows persist between frames. 0.0 is no persistence, 1.0 is full persistence.
         **/
        set shadowRemanence(value: number);
        /**
         * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.
         */
        get envRotation(): number;
        /**
         * The global Y-axis rotation of the IBL for shadows. This should match the Y-rotation of the environment map applied to materials, skybox, etc.
         */
        set envRotation(value: number);
        /**
         * Allow debug passes to be enabled. Default is false.
         */
        get allowDebugPasses(): boolean;
        /**
         * Allow debug passes to be enabled. Default is false.
         */
        set allowDebugPasses(value: boolean);
        /**
         *  Support test.
         */
        static get IsSupported(): boolean;
        /**
         * Toggle the shadow tracing on or off
         * @param enabled Toggle the shadow tracing on or off
         */
        toggleShadow(enabled: boolean): void;
        /**
         * Trigger the scene to be re-voxelized. This should be run when any shadow-casters have been added, removed or moved.
         */
        updateVoxelization(): void;
        /**
         * Trigger the scene bounds of shadow-casters to be calculated. This is the world size that the voxel grid will cover and will always be a cube.
         */
        updateSceneBounds(): void;
        /**
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         * @param options Options to configure the pipeline
         * @param cameras Cameras to apply the pipeline to.
         */
        constructor(name: string, scene: Scene, options?: Partial<IIblShadowsSettings>, cameras?: Camera[]);
        private _handleResize;
        private _getGBufferDebugPass;
        private _createDebugPasses;
        private _disposeEffectPasses;
        private _disposeDebugPasses;
        private _updateDebugPasses;
        /**
         * Update the SS shadow max distance and thickness based on the voxel grid size and resolution.
         * The max distance should be just a little larger than the world size of a single voxel.
         */
        private _updateSsShadowParams;
        /**
         * Apply the shadows to a material or array of materials. If no material is provided, all
         * materials in the scene will be added.
         * @param material Material that will be affected by the shadows. If not provided, all materials of the scene will be affected.
         */
        addShadowReceivingMaterial(material?: Material | Material[]): void;
        /**
         * Remove a material from the list of materials that receive shadows. If no material
         * is provided, all materials in the scene will be removed.
         * @param material The material or array of materials that will no longer receive shadows
         */
        removeShadowReceivingMaterial(material: Material | Material[]): void;
        /**
         * Clear the list of materials that receive shadows. This will remove all materials from the list
         */
        clearShadowReceivingMaterials(): void;
        protected _addShadowSupportToMaterial(material: Material): void;
        protected _setPluginParameters(): void;
        private _updateBeforeRender;
        private _listenForCameraChanges;
        /**
         * Checks if the IBL shadow pipeline is ready to render shadows
         * @returns true if the IBL shadow pipeline is ready to render the shadows
         */
        isReady(): boolean | null;
        /**
         * Get the class name
         * @returns "IBLShadowsRenderPipeline"
         */
        getClassName(): string;
        /**
         * Disposes the IBL shadow pipeline and associated resources
         */
        dispose(): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     */
    class MaterialIBLShadowsRenderDefines extends MaterialDefines {
        RENDER_WITH_IBL_SHADOWS: boolean;
        COLORED_IBL_SHADOWS: boolean;
    }
    /**
     * Plugin used to render the contribution from IBL shadows.
     */
    export class IBLShadowsPluginMaterial extends MaterialPluginBase {
        /**
         * Defines the name of the plugin.
         */
        static readonly Name = "IBLShadowsPluginMaterial";
        /**
         * The texture containing the contribution from IBL shadows.
         */
        private _iblShadowsTexture;
        get iblShadowsTexture(): InternalTexture;
        set iblShadowsTexture(value: InternalTexture);
        /**
         * The opacity of the shadows.
         */
        shadowOpacity: number;
        private _isEnabled;
        private _isColored;
        get isColored(): boolean;
        set isColored(value: boolean);
        /**
         * Defines if the plugin is enabled in the material.
         */
        isEnabled: boolean;
        protected _markAllSubMeshesAsTexturesDirty(): void;
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /**
         * Gets a boolean indicating that the plugin is compatible with a give shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: Material | StandardMaterial | PBRBaseMaterial | OpenPBRMaterial);
        private _isOpenPBRMaterial;
        prepareDefines(defines: MaterialIBLShadowsRenderDefines): void;
        getClassName(): string;
        getUniforms(_shaderLanguage: ShaderLanguage): any;
        getSamplers(samplers: string[]): void;
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): {
            [name: string]: string;
        } | null;
    }
    /**
     * Register side effects for iblShadowsPluginMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterIblShadowsPluginMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import iblShadowsPluginMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * This should not be instantiated directly, as it is part of a scene component
     * @internal
     */
    export class _IblShadowsAccumulationPass {
        private _scene;
        private _engine;
        private _renderPipeline;
        private _outputTexture;
        private _oldAccumulationCopy;
        private _oldPositionCopy;
        private _accumulationParams;
        /** Enable the debug view for this pass */
        debugEnabled: boolean;
        /**
         * Is the effect enabled
         */
        enabled: boolean;
        /**
         * Returns the output texture of the pass.
         * @returns The output texture.
         */
        getOutputTexture(): ProceduralTexture;
        /**
         * Observable that triggers when the accumulation texture is ready
         */
        onReadyObservable: Observable<void>;
        /**
         * Gets the debug pass post process
         * @returns The post process
         */
        getDebugPassPP(): PostProcess;
        private _debugPassName;
        /**
         * Gets the name of the debug pass
         * @returns The name of the debug pass
         */
        get debugPassName(): string;
        /**
         * A value that controls how much of the previous frame's accumulation to keep.
         * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.
         */
        get remanence(): number;
        /**
         * A value that controls how much of the previous frame's accumulation to keep.
         * The higher the value, the faster the shadows accumulate but the more potential ghosting you'll see.
         */
        set remanence(value: number);
        private _remanence;
        /**
         * Reset the accumulation.
         */
        get reset(): boolean;
        /**
         * Reset the accumulation.
         */
        set reset(value: boolean);
        private _reset;
        /**
         * Tell the pass that the camera is moving. This will cause the accumulation
         * rate to change.
         */
        set isMoving(value: boolean);
        private _isMoving;
        private _debugPassPP;
        private _debugSizeParams;
        /**
         * Sets params that control the position and scaling of the debug display on the screen.
         * @param x Screen X offset of the debug display (0-1)
         * @param y Screen Y offset of the debug display (0-1)
         * @param widthScale X scale of the debug display (0-1)
         * @param heightScale Y scale of the debug display (0-1)
         */
        setDebugDisplayParams(x: number, y: number, widthScale: number, heightScale: number): void;
        /**
         * Creates the debug post process effect for this pass
         */
        private _createDebugPass;
        /**
         * Instantiates the accumulation pass
         * @param scene Scene to attach to
         * @param iblShadowsRenderPipeline The IBL shadows render pipeline
         * @returns The accumulation pass
         */
        constructor(scene: Scene, iblShadowsRenderPipeline: IblShadowsRenderPipeline);
        private _createTextures;
        private _setOutputTextureBindings;
        private _updatePositionCopy;
        private _setAccumulationCopyBindings;
        private _render;
        private _renderWhenGBufferReady;
        /**
         * Called by render pipeline when canvas resized.
         * @param scaleFactor The factor by which to scale the canvas size.
         */
        resize(scaleFactor?: number): void;
        private _disposeTextures;
        /**
         * Checks if the pass is ready
         * @returns true if the pass is ready
         */
        isReady(): boolean;
        /**
         * Disposes the associated resources
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * Reflective Shadow Maps were first described in http://www.klayge.org/material/3_12/GI/rsm.pdf by Carsten Dachsbacher and Marc Stamminger
     * Further explanations and implementations can be found in:
     * - Jaker video explaining RSM and its implementation: https://www.youtube.com/watch?v=LJQQdBsOYPM
     * - C++ implementation by Luis Angel: https://github.com/imyoungmin/RSM
     * - Javascript implementation by Erkaman: https://github.com/Erkaman/webgl-rsm
     */
    /**
     * Class used to manage the global illumination contribution calculated from reflective shadow maps (RSM).
     */
    export class GIRSMManager {
        private _scene;
        private _engine;
        private _giRSM;
        private _materialsWithRenderPlugin;
        private _sampleTexture;
        private _maxSamples;
        private _blurRTT;
        private _blurPostProcesses;
        private _blurXPostprocess;
        private _blurYPostprocess;
        private _upsamplingXPostprocess;
        private _upsamplingYPostprocess;
        private _ppGlobalIllumination;
        private _drawPhaseObserver;
        private _debugLayer;
        private _counters;
        private _countersRTW;
        private _firstActivation;
        private _geomBufferEnabled;
        private _geomBufferEnablePosition;
        private _tempMatrix;
        private _enable;
        /**
         * Defines the default texture types and formats used by the geometry buffer renderer.
         */
        static GeometryBufferTextureTypesAndFormats: {
            [key: number]: {
                textureType: number;
                textureFormat: number;
            };
        };
        /**
         * Enables or disables the manager. Default is false.
         * If disabled, the global illumination won't be calculated and the scene will be rendered normally, without any global illumination contribution.
         */
        get enable(): boolean;
        set enable(enable: boolean);
        /**
         * Defines if the global illumination calculation is paused or not.
         * Use this setting to pause the global illumination calculation when you know that the scene (camera/mesh/light positions) is not changing anymore to save some GPU power.
         * The scene will still be rendered with the latest global illumination contribution.
         */
        pause: boolean;
        private _enableBlur;
        /**
         * Defines if the global illumination contribution should be blurred or not (using a bilateral blur). Default is true.
         */
        get enableBlur(): boolean;
        set enableBlur(enable: boolean);
        private _useQualityBlur;
        /**
         * Defines if the blur should be done with a better quality but slower or not. Default is false.
         */
        get useQualityBlur(): boolean;
        set useQualityBlur(enable: boolean);
        /**
         * Defines the depth threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).
         * You may have to change this value, depending on your scene.
         */
        blurDepthThreshold: number;
        /**
         * Defines the normal threshold used by the bilateral blur post-processes (also used by the upsampling, if enabled).
         * You may have to change this value, depending on your scene.
         */
        blurNormalThreshold: number;
        /**
         * Defines the kernel size used by the bilateral blur post-processes. Default is 12.
         */
        blurKernel: number;
        private _forceFullSizeBlur;
        /**
         * Defines if the blur should be done at full resolution or not. Default is false.
         * If this setting is enabled, upampling will be disabled (ignored) as it is not needed anymore.
         */
        get fullSizeBlur(): boolean;
        set fullSizeBlur(mode: boolean);
        private _useQualityUpsampling;
        /**
         * Defines if the upsampling should be done with a better quality but slower or not. Default is false.
         */
        get useQualityUpsampling(): boolean;
        set useQualityUpsampling(enable: boolean);
        /**
         * Defines the kernel size used by the bilateral upsampling post-processes. Default is 6.
         */
        upsamplerKernel: number;
        private _showOnlyGI;
        /**
         * Defines if the debug layer should be enabled or not. Default is false.
         * Use this setting for debugging purpose, to show the global illumination contribution only.
         */
        get showOnlyGI(): boolean;
        set showOnlyGI(show: boolean);
        private _use32BitsDepthBuffer;
        /**
         * Defines if the depth buffer used by the geometry buffer renderer should be 32 bits or not. Default is false (16 bits).
         */
        get use32BitsDepthBuffer(): boolean;
        set use32BitsDepthBuffer(enable: boolean);
        private _outputDimensions;
        /**
         * Sets the output dimensions of the final process. It should normally be the same as the output dimensions of the screen.
         * @param dimensions The dimensions of the output texture (width and height)
         */
        setOutputDimensions(dimensions: {
            width: number;
            height: number;
        }): void;
        private _giTextureDimensions;
        /**
         * Sets the dimensions of the GI texture. Try to use the smallest size possible for better performance.
         * @param dimensions The dimensions of the GI texture (width and height)
         */
        setGITextureDimensions(dimensions: {
            width: number;
            height: number;
        }): void;
        private _giTextureType;
        /**
         * Gets or sets the texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.
         */
        get giTextureType(): number;
        set giTextureType(textureType: number);
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /** Gets the shader language used in this material. */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Gets the list of GIRSM used by the manager.
         */
        get giRSM(): GIRSM[];
        /**
         * Adds a (list of) GIRSM to the manager.
         * @param rsm The GIRSM (or array of GIRSM) to add to the manager
         */
        addGIRSM(rsm: GIRSM | GIRSM[]): void;
        /**
         * Removes a (list of) GIRSM from the manager.
         * @param rsm The GIRSM (or array of GIRSM) to remove from the manager
         */
        removeGIRSM(rsm: GIRSM | GIRSM[]): void;
        /**
         * Add a material to the manager. This will enable the global illumination contribution for the material.
         * @param material Material that will be affected by the global illumination contribution. If not provided, all materials of the scene will be affected.
         */
        addMaterial(material?: Material): void;
        /**
         * Gets the list of GPU counters used by the manager.
         * GPU timing measurements must be enabled for the counters to be filled (engine.enableGPUTimingMeasurements = true).
         * Only available with WebGPU. You will still get the list of counters with other engines but the values will always be 0.
         */
        get countersGPU(): Array<{
            name: string;
            value: number;
        }>;
        /**
         * Recreates the resources used by the manager.
         * You should normally not have to call this method manually, except if you change the useFullTexture property of a GIRSM, because the manager won't track this change.
         * @param disposeGeometryBufferRenderer Defines if the geometry buffer renderer should be disposed and recreated. Default is false.
         */
        recreateResources(disposeGeometryBufferRenderer?: boolean): void;
        /**
         * Generates the sample texture used by the the global illumination calculation process.
         * @param maxSamples The maximum number of samples to generate in the texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!
         */
        generateSampleTexture(maxSamples: number): void;
        /**
         * Disposes the manager.
         */
        dispose(): void;
        /**
         * Creates a new GIRSMManager
         * @param scene The scene
         * @param outputDimensions The dimensions of the output texture (width and height). Should normally be the same as the output dimensions of the screen.
         * @param giTextureDimensions The dimensions of the GI texture (width and height). Try to use the smallest size possible for better performance.
         * @param maxSamples The maximum number of samples to generate in the sample texture. Default value is 2048. The numSamples property of the GIRSM should be less than or equal to this value!
         * @param giTextureType The texture type used by the GI texture. Default is Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV.
         */
        constructor(scene: Scene, outputDimensions: {
            width: number;
            height: number;
        }, giTextureDimensions?: {
            width: number;
            height: number;
        }, maxSamples?: number, giTextureType?: number);
        private _shadersLoaded;
        private _onShaderLoadedObservable;
        private _initShaderSourceAsync;
        protected _disposePostProcesses(disposeGeometryBufferRenderer?: boolean): void;
        protected _setPluginParameters(): void;
        protected _createPostProcesses(): void;
        protected _addGISupportToMaterial(material: Material): void;
    }
    /**
     * @internal
     */
    class MaterialGIRSMRenderDefines extends MaterialDefines {
        RENDER_WITH_GIRSM: boolean;
        RSMCREATE_PROJTEXTURE: boolean;
    }
    /**
     * Plugin used to render the global illumination contribution.
     */
    export class GIRSMRenderPluginMaterial extends MaterialPluginBase {
        private _isPBR;
        /**
         * Defines the name of the plugin.
         */
        static readonly Name = "GIRSMRender";
        /**
         * The texture containing the global illumination contribution.
         */
        textureGIContrib: InternalTexture;
        /**
         * The width of the output texture.
         */
        outputTextureWidth: number;
        /**
         * The height of the output texture.
         */
        outputTextureHeight: number;
        private _isEnabled;
        /**
         * Defines if the plugin is enabled in the material.
         */
        isEnabled: boolean;
        protected _markAllSubMeshesAsTexturesDirty(): void;
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /**
         * Gets a boolean indicating that the plugin is compatible with a give shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: Material | StandardMaterial | PBRBaseMaterial);
        /**
         * Prepares the defines used by the plugin
         * @param defines the defines to prepare
         */
        prepareDefines(defines: MaterialGIRSMRenderDefines): void;
        getClassName(): string;
        getUniforms(): {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            fragment: string;
        };
        /**
         * Gets the samplers used by the plugin
         * @param samplers the list of samplers to update
         */
        getSamplers(samplers: string[]): void;
        /**
         * Binds the material data for a sub mesh
         * @param uniformBuffer the uniform buffer to update
         */
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        /**
         * Gets custom shader code for the plugin
         * @param shaderType the type of shader (vertex or fragment)
         * @param shaderLanguage the shader language
         * @returns the custom shader code
         */
        getCustomCode(shaderType: string, shaderLanguage: ShaderLanguage): {
            [name: string]: string;
        } | null;
    }
    /**
     * Register side effects for giRSMManager.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGiRSMManager(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import giRSMManager.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to store the global illumination parameters for a reflective shadow map.
     * Instances of this class are used by the GIRSMManager class to generate global illumination for a scene.
     */
    export class GIRSM {
        /**
         * The reflective shadow map used to generate the global illumination for the corresponding light.
         */
        rsm: ReflectiveShadowMap;
        /**
         * The number of samples to use to generate the global illumination. Default value is 400.
         */
        numSamples: number;
        /**
         * Radius of the circle in the RSM flux texture to read samples from. Default value is 0.1.
         * Valid values are between 0 and 1.
         */
        radius: number;
        /**
         * Intensity of the global illumination effect. Default value is 0.1.
         */
        intensity: number;
        /**
         * value used to correct for edge artifacts when calculating the global illumination effect. Default value is 0.1.
         * Will depend on your scene.
         */
        edgeArtifactCorrection: number;
        /**
         * Defines if samples should be rotated when generating the global illumination effect. Default value is true.
         * Rotating samples will improve the quality of the global illumination effect by trading banding for noise, at the cost of a bit of performance.
         */
        rotateSample: boolean;
        /**
         * Noise scale factor, only used if rotateSample is true. Default value is 100.
         * Will depend on your scene.
         */
        noiseFactor: number;
        /**
         * Defines if the full texture should be used when generating the global illumination effect. Default value is false.
         * If true, values for numSamples, radius, rotateSample and noiseFactor will be ignored and the full texture will be used to generate the global illumination effect.
         * Be careful to use a RSM texture size small enough to limit the number of samples! For eg. a 32x32 texture will generate 1024 samples per pixel!
         */
        useFullTexture: boolean;
        /**
         * Creates a new GIRSM instance
         * @param rsm The reflective shadow map
         */
        constructor(rsm: ReflectiveShadowMap);
        /**
         * Disposes the GIRSM
         */
        dispose(): void;
    }


    type ReflectionProbeParseType = typeof ReflectionProbeParse;
        interface Scene {
            /**
             * The list of reflection probes added to the scene
             * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/reflectionProbes
             */
            reflectionProbes: Array<ReflectionProbe>;
            /**
             * Removes the given reflection probe from this scene.
             * @param toRemove The reflection probe to remove
             * @returns The index of the removed reflection probe
             */
            removeReflectionProbe(toRemove: ReflectionProbe): number;
            /**
             * Adds the given reflection probe to this scene.
             * @param newReflectionProbe The reflection probe to add
             */
            addReflectionProbe(newReflectionProbe: ReflectionProbe): void;
        }
        export namespace ReflectionProbe {
            let Parse: ReflectionProbeParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Class used to generate realtime reflection / refraction cube textures
     * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/reflectionProbes
     */
    export class ReflectionProbe {
        /** defines the name of the probe */
        name: string;
        private _scene;
        private _renderTargetTexture;
        private _projectionMatrix;
        private _viewMatrix;
        private _target;
        private _add;
        private _attachedMesh;
        private _invertYAxis;
        private _sceneUBOs;
        private _currentSceneUBO;
        /** Gets or sets probe position (center of the cube map) */
        position: Vector3;
        /**
         * Gets or sets an object used to store user defined information for the reflection probe.
         */
        metadata: any;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /**
         * Creates a new reflection probe
         * @param name defines the name of the probe
         * @param size defines the texture resolution (for each face)
         * @param scene defines the hosting scene
         * @param generateMipMaps defines if mip maps should be generated automatically (true by default)
         * @param useFloat defines if HDR data (float data) should be used to store colors (false by default)
         * @param linearSpace defines if the probe should be generated in linear space or not (false by default)
         */
        constructor(
        /** defines the name of the probe */
        name: string, size: number, scene: Scene, generateMipMaps?: boolean, useFloat?: boolean, linearSpace?: boolean);
        /** Gets or sets the number of samples to use for multi-sampling (0 by default). Required WebGL2 */
        get samples(): number;
        set samples(value: number);
        /** Gets or sets the refresh rate to use (on every frame by default) */
        get refreshRate(): number;
        set refreshRate(value: number);
        /**
         * Gets the hosting scene
         * @returns a Scene
         */
        getScene(): Scene;
        /** Gets the internal CubeTexture used to render to */
        get cubeTexture(): RenderTargetTexture;
        /** Gets or sets the list of meshes to render */
        get renderList(): Nullable<AbstractMesh[]>;
        set renderList(value: Nullable<AbstractMesh[]>);
        /**
         * Attach the probe to a specific mesh (Rendering will be done from attached mesh's position)
         * @param mesh defines the mesh to attach to
         */
        attachToMesh(mesh: Nullable<AbstractMesh>): void;
        /**
         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
         */
        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
        /**
         * Clean all associated resources
         */
        dispose(): void;
        /**
         * Converts the reflection probe information to a readable string for debug purpose.
         * @param fullDetails Supports for multiple levels of logging within scene loading
         * @returns the human readable reflection probe info
         */
        toString(fullDetails?: boolean): string;
        /**
         * Get the class name of the refection probe.
         * @returns "ReflectionProbe"
         */
        getClassName(): string;
        /**
         * Serialize the reflection probe to a JSON representation we can easily use in the respective Parse function.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
    }
    /**
     * Parse the JSON representation of a reflection probe in order to recreate the reflection probe in the given scene.
     * @param parsedReflectionProbe Define the JSON representation of the reflection probe
     * @param scene Define the scene the parsed reflection probe should be instantiated in
     * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies
     * @returns The parsed reflection probe if successful
     */
    export function ReflectionProbeParse(parsedReflectionProbe: any, scene: Scene, rootUrl: string): Nullable<ReflectionProbe>;
    /**
     * Register side effects for reflectionProbe.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectionProbe(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectionProbe.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * VRMultiviewToSingleview used to convert multiview texture arrays to standard textures for scenarios such as webVR
     * This will not be used for webXR as it supports displaying texture arrays directly
     */
    export class VRMultiviewToSingleviewPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "VRMultiviewToSingleviewPostProcess" string
         */
        getClassName(): string;
        /**
         * Initializes a VRMultiviewToSingleview
         * @param name name of the post process
         * @param camera camera to be applied to
         * @param scaleFactor scaling factor to the size of the output texture
         */
        constructor(name: string, camera: Nullable<Camera>, scaleFactor: number);
    }




    /**
     * VRDistortionCorrectionPostProcess used for mobile VR
     */
    export class VRDistortionCorrectionPostProcess extends PostProcess {
        private _isRightEye;
        private _distortionFactors;
        private _postProcessScaleFactor;
        private _lensCenterOffset;
        private _scaleIn;
        private _scaleFactor;
        private _lensCenter;
        /**
         * Gets a string identifying the name of the class
         * @returns "VRDistortionCorrectionPostProcess" string
         */
        getClassName(): string;
        /**
         * Initializes the VRDistortionCorrectionPostProcess
         * @param name The name of the effect.
         * @param camera The camera to apply the render pass to.
         * @param isRightEye If this is for the right eye distortion
         * @param vrMetrics All the required metrics for the VR camera
         */
        constructor(name: string, camera: Nullable<Camera>, isRightEye: boolean, vrMetrics: VRCameraMetrics);
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     *  Inspired by https://developer.nvidia.com/gpugems/gpugems3/part-ii-light-and-shadows/chapter-13-volumetric-light-scattering-post-process
     */
    export class VolumetricLightScatteringPostProcess extends PostProcess {
        private _volumetricLightScatteringRTT;
        private _viewPort;
        private _screenCoordinates;
        /**
         * If not undefined, the mesh position is computed from the attached node position
         */
        attachedNode: {
            position: Vector3;
        };
        /**
         * Custom position of the mesh. Used if "useCustomMeshPosition" is set to "true"
         */
        customMeshPosition: Vector3;
        /**
         * Set if the post-process should use a custom position for the light source (true) or the internal mesh position (false)
         */
        useCustomMeshPosition: boolean;
        /**
         * If the post-process should inverse the light scattering direction
         */
        invert: boolean;
        /**
         * The internal mesh used by the post-process
         */
        mesh: Mesh;
        /**
         * @internal
         * VolumetricLightScatteringPostProcess.useDiffuseColor is no longer used, use the mesh material directly instead
         */
        get useDiffuseColor(): boolean;
        set useDiffuseColor(useDiffuseColor: boolean);
        /**
         * Array containing the excluded meshes not rendered in the internal pass
         */
        excludedMeshes: AbstractMesh[];
        /**
         * Array containing the only meshes rendered in the internal pass.
         * If this array is not empty, only the meshes from this array are rendered in the internal pass
         */
        includedMeshes: AbstractMesh[];
        /**
         * Controls the overall intensity of the post-process
         */
        exposure: number;
        /**
         * Dissipates each sample's contribution in range [0, 1]
         */
        decay: number;
        /**
         * Controls the overall intensity of each sample
         */
        weight: number;
        /**
         * Controls the density of each sample
         */
        density: number;
        /**
         * @constructor
         * @param name The post-process name
         * @param ratio The size of the post-process and/or internal pass (0.5 means that your postprocess will have a width = canvas.width 0.5 and a height = canvas.height 0.5)
         * @param camera The camera that the post-process will be attached to
         * @param mesh The mesh used to create the light scattering
         * @param samples The post-process quality, default 100
         * @param samplingMode The post-process filtering mode
         * @param engine The babylon engine
         * @param reusable If the post-process is reusable
         * @param scene The constructor needs a scene reference to initialize internal components. If "camera" is null a "scene" must be provided
         */
        constructor(name: string, ratio: any, camera: Nullable<Camera>, mesh?: Mesh, samples?: number, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, scene?: Scene);
        /**
         * Returns the string "VolumetricLightScatteringPostProcess"
         * @returns "VolumetricLightScatteringPostProcess"
         */
        getClassName(): string;
        private _isReady;
        /**
         * Sets the new light position for light scattering effect
         * @param position The new custom light position
         */
        setCustomMeshPosition(position: Vector3): void;
        /**
         * Returns the light position for light scattering effect
         * @returns Vector3 The custom light position
         */
        getCustomMeshPosition(): Vector3;
        /**
         * Disposes the internal assets and detaches the post-process from the camera
         * @param camera The camera from which to detach the post-process
         */
        dispose(camera: Camera): void;
        /**
         * Returns the render target texture used by the post-process
         * @returns the render target texture used by the post-process
         */
        getPass(): RenderTargetTexture;
        private _meshExcluded;
        private _createPass;
        private _updateMeshScreenCoordinates;
        /**
         * Creates a default mesh for the Volumeric Light Scattering post-process
         * @param name The mesh name
         * @param scene The scene where to create the mesh
         * @returns the default mesh
         */
        static CreateDefaultMesh(name: string, scene: Scene): Mesh;
    }
    /**
     * Register side effects for volumetricLightScatteringPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVolumetricLightScatteringPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import volumetricLightScatteringPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export type ToneMapPostProcessOptions = ThinTonemapPostProcessOptions & PostProcessOptions;
    /**
     * Defines a post process to apply tone mapping
     */
    export class TonemapPostProcess extends PostProcess {
        /**
         * Defines the required exposure adjustment
         */
        get exposureAdjustment(): number;
        set exposureAdjustment(value: number);
        /**
         * Gets the operator used for tonemapping
         */
        get operator(): TonemappingOperator;
        /**
         * Gets a string identifying the name of the class
         * @returns "TonemapPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinTonemapPostProcess;
        /**
         * Creates a new TonemapPostProcess
         * @param name defines the name of the postprocess
         * @param operator defines the operator to use
         * @param exposureAdjustment defines the required exposure adjustment
         * @param camera defines the camera to use (can be null)
         * @param samplingMode defines the required sampling mode (BABYLON.Texture.BILINEAR_SAMPLINGMODE by default)
         * @param engine defines the hosting engine (can be ignore if camera is set)
         * @param textureType defines the texture format to use (BABYLON.Engine.TEXTURETYPE_UNSIGNED_BYTE by default)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, operator: TonemappingOperator, exposureAdjustment: number, camera: Nullable<Camera> | ToneMapPostProcessOptions, samplingMode?: number, engine?: AbstractEngine, textureType?: number, reusable?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<TonemapPostProcess>;
    }
    /**
     * Register side effects for tonemapPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTonemapPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import tonemapPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** Defines operator used for tonemapping */
    export enum TonemappingOperator {
        /** Hable */
        Hable = 0,
        /** Reinhard */
        Reinhard = 1,
        /** HejiDawson */
        HejiDawson = 2,
        /** Photographic */
        Photographic = 3
    }
    /**
     * Options used to create a ThinTonemapPostProcess.
     */
    export interface ThinTonemapPostProcessOptions extends EffectWrapperCreationOptions {
        /** Defines the operator to use (default: Reinhard) */
        operator?: TonemappingOperator;
        /** Defines the required exposure adjustment (default: 1.0) */
        exposureAdjustment?: number;
    }
    /**
     * Post process used to apply a tone mapping operator
     */
    export class ThinTonemapPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "tonemap";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new tone mapping post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: ThinTonemapPostProcessOptions);
        /**
         * Gets the operator to use (default: Reinhard)
         */
        readonly operator: TonemappingOperator;
        /**
         * Defines the required exposure adjustment (default: 1.0)
         */
        exposureAdjustment: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Simple implementation of Temporal Anti-Aliasing (TAA).
     * This can be used to improve image quality for still pictures (screenshots for e.g.).
     */
    export class ThinTAAPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "taa";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        private _samples;
        /**
         * Number of accumulated samples (default: 8)
         */
        set samples(samples: number);
        get samples(): number;
        /**
         * The factor used to blend the history frame with current frame (default: 0.05)
         */
        factor: number;
        /**
         * The camera to use for the post process
         */
        camera: Nullable<Camera>;
        private _disabled;
        /**
         * Whether the TAA is disabled
         */
        get disabled(): boolean;
        set disabled(value: boolean);
        private _textureWidth;
        /**
         * The width of the texture in which to render
         */
        get textureWidth(): number;
        set textureWidth(width: number);
        private _textureHeight;
        /**
         * The height of the texture in which to render
         */
        get textureHeight(): number;
        set textureHeight(height: number);
        /**
         * Disable TAA on camera move (default: true).
         * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)
         */
        disableOnCameraMove: boolean;
        private _reprojectHistory;
        /**
         * Enables reprojecting the history texture with a per-pixel velocity.
         * If set the "velocitySampler" has to be provided.
         */
        get reprojectHistory(): boolean;
        set reprojectHistory(reproject: boolean);
        private _clampHistory;
        /**
         * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
         * This can help further reduce ghosting and artifacts.
         */
        get clampHistory(): boolean;
        set clampHistory(clamp: boolean);
        private _scene;
        private _hs;
        private _firstUpdate;
        private _taaMaterialManager;
        /**
         * Constructs a new TAA post process
         * @param name Name of the effect
         * @param scene The scene the post process belongs to
         * @param options Options to configure the effect
         */
        constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
        /** @internal */
        _reset(): void;
        /** @internal */
        _updateJitter(): void;
        protected _nextJitterOffset(output?: Vector2): Vector2;
        protected _updateProjectionMatrix(): void;
        bind(noDefaultBindings?: boolean): void;
        dispose(): void;
        private _updateEffect;
    }


    /**
     * Post process used to apply a sharpen effect
     */
    export class ThinSharpenPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "sharpen";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new sharpen post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * How much of the original color should be applied. Setting this to 0 will display edge detection. (default: 1)
         */
        colorAmount: number;
        /**
         * How much sharpness should be applied (default: 0.3)
         */
        edgeAmount: number;
        /**
         * The width of the source texture
         */
        textureWidth: number;
        /**
         * The height of the source texture
         */
        textureHeight: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to apply a screen space curvature post process
     */
    export class ThinScreenSpaceCurvaturePostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "screenSpaceCurvature";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new screen space curvature post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * Defines how much ridge the curvature effect displays.
         */
        ridge: number;
        /**
         * Defines how much valley the curvature effect displays.
         */
        valley: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * @internal
     */
    export class ThinSSRPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "screenSpaceReflection2";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        isSSRSupported: boolean;
        maxDistance: number;
        step: number;
        thickness: number;
        strength: number;
        reflectionSpecularFalloffExponent: number;
        maxSteps: number;
        roughnessFactor: number;
        selfCollisionNumSkip: number;
        private _reflectivityThreshold;
        get reflectivityThreshold(): number;
        set reflectivityThreshold(threshold: number);
        private _useBlur;
        get useBlur(): boolean;
        set useBlur(blur: boolean);
        private _enableSmoothReflections;
        get enableSmoothReflections(): boolean;
        set enableSmoothReflections(enabled: boolean);
        private _environmentTexture;
        get environmentTexture(): Nullable<CubeTexture>;
        set environmentTexture(texture: Nullable<CubeTexture>);
        private _environmentTextureIsProbe;
        get environmentTextureIsProbe(): boolean;
        set environmentTextureIsProbe(isProbe: boolean);
        private _attenuateScreenBorders;
        get attenuateScreenBorders(): boolean;
        set attenuateScreenBorders(attenuate: boolean);
        private _attenuateIntersectionDistance;
        get attenuateIntersectionDistance(): boolean;
        set attenuateIntersectionDistance(attenuate: boolean);
        private _attenuateIntersectionIterations;
        get attenuateIntersectionIterations(): boolean;
        set attenuateIntersectionIterations(attenuate: boolean);
        private _attenuateFacingCamera;
        get attenuateFacingCamera(): boolean;
        set attenuateFacingCamera(attenuate: boolean);
        private _attenuateBackfaceReflection;
        get attenuateBackfaceReflection(): boolean;
        set attenuateBackfaceReflection(attenuate: boolean);
        private _clipToFrustum;
        get clipToFrustum(): boolean;
        set clipToFrustum(clip: boolean);
        private _useFresnel;
        get useFresnel(): boolean;
        set useFresnel(fresnel: boolean);
        private _enableAutomaticThicknessComputation;
        get enableAutomaticThicknessComputation(): boolean;
        set enableAutomaticThicknessComputation(automatic: boolean);
        private _inputTextureColorIsInGammaSpace;
        get inputTextureColorIsInGammaSpace(): boolean;
        set inputTextureColorIsInGammaSpace(gammaSpace: boolean);
        private _generateOutputInGammaSpace;
        get generateOutputInGammaSpace(): boolean;
        set generateOutputInGammaSpace(gammaSpace: boolean);
        private _debug;
        get debug(): boolean;
        set debug(value: boolean);
        private _textureWidth;
        get textureWidth(): number;
        set textureWidth(width: number);
        private _textureHeight;
        get textureHeight(): number;
        set textureHeight(height: number);
        camera: Nullable<Camera>;
        private _useScreenspaceDepth;
        get useScreenspaceDepth(): boolean;
        set useScreenspaceDepth(value: boolean);
        private _normalsAreInWorldSpace;
        get normalsAreInWorldSpace(): boolean;
        set normalsAreInWorldSpace(value: boolean);
        private _normalsAreUnsigned;
        get normalsAreUnsigned(): boolean;
        set normalsAreUnsigned(value: boolean);
        private _scene;
        constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
        bind(noDefaultBindings?: boolean): void;
        private _updateEffectDefines;
    }


    /**
     * @internal
     */
    export class ThinSSRBlurPostProcess extends EffectWrapper {
        static readonly FragmentUrl = "screenSpaceReflection2Blur";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, direction?: Vector2, blurStrength?: number, options?: EffectWrapperCreationOptions);
        textureWidth: number;
        textureHeight: number;
        direction: Vector2;
        blurStrength: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * @internal
     */
    export class ThinSSRBlurCombinerPostProcess extends EffectWrapper {
        static readonly FragmentUrl = "screenSpaceReflection2BlurCombiner";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        strength: number;
        reflectionSpecularFalloffExponent: number;
        camera: Nullable<Camera>;
        private _useFresnel;
        get useFresnel(): boolean;
        set useFresnel(fresnel: boolean);
        private _useScreenspaceDepth;
        get useScreenspaceDepth(): boolean;
        set useScreenspaceDepth(value: boolean);
        private _inputTextureColorIsInGammaSpace;
        get inputTextureColorIsInGammaSpace(): boolean;
        set inputTextureColorIsInGammaSpace(gammaSpace: boolean);
        private _generateOutputInGammaSpace;
        get generateOutputInGammaSpace(): boolean;
        set generateOutputInGammaSpace(gammaSpace: boolean);
        private _debug;
        get debug(): boolean;
        set debug(value: boolean);
        private _reflectivityThreshold;
        get reflectivityThreshold(): number;
        set reflectivityThreshold(threshold: number);
        private _normalsAreInWorldSpace;
        get normalsAreInWorldSpace(): boolean;
        set normalsAreInWorldSpace(value: boolean);
        private _normalsAreUnsigned;
        get normalsAreUnsigned(): boolean;
        set normalsAreUnsigned(value: boolean);
        bind(noDefaultBindings?: boolean): void;
        private _updateEffectDefines;
    }


    /**
     * @internal
     */
    export class ThinSSAO2PostProcess extends EffectWrapper {
        private static readonly ORTHO_DEPTH_PROJECTION;
        private static readonly PERSPECTIVE_DEPTH_PROJECTION;
        static readonly FragmentUrl = "ssao2";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        camera: Nullable<Camera>;
        private _textureWidth;
        get textureWidth(): number;
        set textureWidth(width: number);
        private _textureHeight;
        get textureHeight(): number;
        set textureHeight(height: number);
        private _samples;
        set samples(n: number);
        get samples(): number;
        totalStrength: number;
        radius: number;
        maxZ: number;
        minZAspect: number;
        base: number;
        private _epsilon;
        private _normalsInWorldSpace;
        set normalsInWorldSpace(value: boolean);
        get normalsInWorldSpace(): boolean;
        set epsilon(n: number);
        get epsilon(): number;
        updateEffect(): void;
        private _scene;
        private _randomTexture;
        private _sampleSphere;
        private readonly _normalWorldToViewMatrix;
        private readonly _normalWorldToView;
        constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
        bind(noDefaultBindings?: boolean): void;
        dispose(): void;
        private _createRandomTexture;
        private _bits;
        private _radicalInverseVdC;
        private _hammersley;
        private _hemisphereSampleUniform;
        private _generateHemisphere;
        private _getDefinesForSSAO;
    }


    /**
     * @internal
     */
    export class ThinSSAO2CombinePostProcess extends EffectWrapper {
        static readonly FragmentUrl = "ssaoCombine";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        camera: Nullable<Camera>;
        useViewportInCombineStage: boolean;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * @internal
     */
    export class ThinSSAO2BlurPostProcess extends EffectWrapper {
        static readonly FragmentUrl = "ssao2";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine: Nullable<AbstractEngine> | undefined, isHorizontal: boolean, options?: EffectWrapperCreationOptions);
        private readonly _isHorizontal;
        private _bypassBlur;
        textureSize: number;
        bilateralSamples: number;
        bilateralSoften: number;
        bilateralTolerance: number;
        set bypassBlur(b: boolean);
        get bypassBlur(): boolean;
        private _expensiveBlur;
        set expensiveBlur(b: boolean);
        get expensiveBlur(): boolean;
        bind(noDefaultBindings?: boolean): void;
        private _getSamplersForBlur;
        private _getDefinesForBlur;
    }


    /**
     * PassPostProcess which produces an output the same as it's input
     */
    export class ThinPassPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "pass";
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new pass post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
    }
    /**
     * PassCubePostProcess which produces an output the same as it's input (which must be a cube texture)
     */
    export class ThinPassCubePostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "passCube";
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Creates the PassCubePostProcess
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        private _face;
        /**
         * Gets or sets the cube face to display.
         *  * 0 is +X
         *  * 1 is -X
         *  * 2 is +Y
         *  * 3 is -Y
         *  * 4 is +Z
         *  * 5 is -Z
         */
        get face(): number;
        set face(value: number);
    }


    /**
     * Post process used to apply a motion blur post process
     */
    export class ThinMotionBlurPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "motionBlur";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        /**
         * The default defines used by the effect
         */
        static readonly Defines = "#define GEOMETRY_SUPPORTED\n#define SAMPLES 64.0\n#define OBJECT_BASED";
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        private _scene;
        private _invViewProjection;
        private _previousViewProjection;
        /**
         * Constructs a new motion blur post process
         * @param name Name of the effect
         * @param scene The scene the effect belongs to
         * @param options Options to configure the effect
         */
        constructor(name: string, scene: Scene, options?: EffectWrapperCreationOptions);
        /**
         * Defines how much the image is blurred by the movement. Default value is equal to 1
         */
        motionStrength: number;
        private _motionBlurSamples;
        /**
         * Gets the number of iterations that are used for motion blur quality. Default value is equal to 32
         */
        get motionBlurSamples(): number;
        /**
         * Sets the number of iterations to be used for motion blur quality
         */
        set motionBlurSamples(samples: number);
        private _isObjectBased;
        /**
         * Gets whether or not the motion blur post-process is in object based mode.
         */
        get isObjectBased(): boolean;
        /**
         * Sets whether or not the motion blur post-process is in object based mode.
         */
        set isObjectBased(value: boolean);
        /**
         * The width of the source texture
         */
        textureWidth: number;
        /**
         * The height of the source texture
         */
        textureHeight: number;
        bind(noDefaultBindings?: boolean): void;
        private _updateEffect;
        private _applyMode;
    }


    /**
     * Options used to create a ThinImageProcessingPostProcessOptions.
     */
    export interface ThinImageProcessingPostProcessOptions extends EffectWrapperCreationOptions {
        /**
         * An existing image processing configuration to use. If not provided, the scene one will be used.
         */
        imageProcessingConfiguration?: ImageProcessingConfiguration;
        /**
         * The scene to retrieve the image processing configuration from if not provided in the options.
         * If not provided, the last created scene will be used.
         */
        scene?: Nullable<Scene>;
    }
    /**
     * Post process used to apply image processing to a scene
     */
    export class ThinImageProcessingPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "imageProcessing";
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Default configuration related to image processing available in the PBR Material.
         */
        protected _imageProcessingConfiguration: ImageProcessingConfiguration;
        /**
         * Gets the image processing configuration used either in this material.
         */
        get imageProcessingConfiguration(): ImageProcessingConfiguration;
        /**
         * Sets the Default image processing configuration used either in the this material.
         *
         * If sets to null, the scene one is in use.
         */
        set imageProcessingConfiguration(value: ImageProcessingConfiguration);
        /**
         * Keep track of the image processing observer to allow dispose and replace.
         */
        private _imageProcessingObserver;
        /**
         * Attaches a new image processing configuration to the PBR Material.
         * @param configuration
         * @param doNotBuild
         */
        protected _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>, doNotBuild?: boolean): void;
        /**
         * Gets Color curves setup used in the effect if colorCurvesEnabled is set to true .
         */
        get colorCurves(): Nullable<ColorCurves>;
        /**
         * Sets Color curves setup used in the effect if colorCurvesEnabled is set to true .
         */
        set colorCurves(value: Nullable<ColorCurves>);
        /**
         * Gets whether the color curves effect is enabled.
         */
        get colorCurvesEnabled(): boolean;
        /**
         * Sets whether the color curves effect is enabled.
         */
        set colorCurvesEnabled(value: boolean);
        /**
         * Gets Color grading LUT texture used in the effect if colorGradingEnabled is set to true.
         */
        get colorGradingTexture(): Nullable<BaseTexture>;
        /**
         * Sets Color grading LUT texture used in the effect if colorGradingEnabled is set to true.
         */
        set colorGradingTexture(value: Nullable<BaseTexture>);
        /**
         * Gets whether the color grading effect is enabled.
         */
        get colorGradingEnabled(): boolean;
        /**
         * Gets whether the color grading effect is enabled.
         */
        set colorGradingEnabled(value: boolean);
        /**
         * Gets exposure used in the effect.
         */
        get exposure(): number;
        /**
         * Sets exposure used in the effect.
         */
        set exposure(value: number);
        /**
         * Gets whether tonemapping is enabled or not.
         */
        get toneMappingEnabled(): boolean;
        /**
         * Sets whether tonemapping is enabled or not
         */
        set toneMappingEnabled(value: boolean);
        /**
         * Gets the type of tone mapping effect.
         */
        get toneMappingType(): number;
        /**
         * Sets the type of tone mapping effect.
         */
        set toneMappingType(value: number);
        /**
         * Gets contrast used in the effect.
         */
        get contrast(): number;
        /**
         * Sets contrast used in the effect.
         */
        set contrast(value: number);
        /**
         * Gets Vignette stretch size.
         */
        get vignetteStretch(): number;
        /**
         * Sets Vignette stretch size.
         */
        set vignetteStretch(value: number);
        /**
         * Gets Vignette center X Offset.
         * @deprecated use vignetteCenterX instead
         */
        get vignetteCentreX(): number;
        /**
         * Sets Vignette center X Offset.
         * @deprecated use vignetteCenterX instead
         */
        set vignetteCentreX(value: number);
        /**
         * Gets Vignette center Y Offset.
         * @deprecated use vignetteCenterY instead
         */
        get vignetteCentreY(): number;
        /**
         * Sets Vignette center Y Offset.
         * @deprecated use vignetteCenterY instead
         */
        set vignetteCentreY(value: number);
        /**
         * Vignette center Y Offset.
         */
        get vignetteCenterY(): number;
        set vignetteCenterY(value: number);
        /**
         * Vignette center X Offset.
         */
        get vignetteCenterX(): number;
        set vignetteCenterX(value: number);
        /**
         * Gets Vignette weight or intensity of the vignette effect.
         */
        get vignetteWeight(): number;
        /**
         * Sets Vignette weight or intensity of the vignette effect.
         */
        set vignetteWeight(value: number);
        /**
         * Gets Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
         * if vignetteEnabled is set to true.
         */
        get vignetteColor(): Color4;
        /**
         * Sets Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
         * if vignetteEnabled is set to true.
         */
        set vignetteColor(value: Color4);
        /**
         * Gets Camera field of view used by the Vignette effect.
         */
        get vignetteCameraFov(): number;
        /**
         * Sets Camera field of view used by the Vignette effect.
         */
        set vignetteCameraFov(value: number);
        /**
         * Gets the vignette blend mode allowing different kind of effect.
         */
        get vignetteBlendMode(): number;
        /**
         * Sets the vignette blend mode allowing different kind of effect.
         */
        set vignetteBlendMode(value: number);
        /**
         * Gets whether the vignette effect is enabled.
         */
        get vignetteEnabled(): boolean;
        /**
         * Sets whether the vignette effect is enabled.
         */
        set vignetteEnabled(value: boolean);
        /**
         * Gets intensity of the dithering effect.
         */
        get ditheringIntensity(): number;
        /**
         * Sets intensity of the dithering effect.
         */
        set ditheringIntensity(value: number);
        /**
         * Gets whether the dithering effect is enabled.
         */
        get ditheringEnabled(): boolean;
        /**
         * Sets whether the dithering effect is enabled.
         */
        set ditheringEnabled(value: boolean);
        private _fromLinearSpace;
        /**
         * Gets whether the input of the processing is in Gamma or Linear Space.
         */
        get fromLinearSpace(): boolean;
        /**
         * Sets whether the input of the processing is in Gamma or Linear Space.
         */
        set fromLinearSpace(value: boolean);
        /**
         * * Gets the width of the output texture used to store the result of the post process.
         */
        get outputTextureWidth(): number;
        /**
         * * Sets the width of the output texture used to store the result of the post process.
         */
        set outputTextureWidth(value: number);
        /**
         * * Gets the height of the output texture used to store the result of the post process.
         */
        get outputTextureHeight(): number;
        /**
         * * Sets the height of the output texture used to store the result of the post process.
         */
        set outputTextureHeight(value: number);
        /**
         * Gets/sets the aspect ratio used to override the default one.
         */
        overrideAspectRatio?: number;
        /**
         * Defines cache preventing GC.
         */
        private _defines;
        readonly options: Required<NonNullableFields<ThinImageProcessingPostProcessOptions>>;
        /**
         * Constructs a new image processing post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: ThinImageProcessingPostProcessOptions);
        /**
         * @internal
         */
        _updateParameters(): void;
        bind(noDefaultBindings?: boolean): void;
        dispose(): void;
    }


    /**
     * Post process used to render a grain effect
     */
    export class ThinGrainPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "grain";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new grain post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * The intensity of the grain added (default: 30)
         */
        intensity: number;
        /**
         * If the grain should be randomized on every frame
         */
        animated: boolean;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to apply a kernel filter
     */
    export class ThinFilterPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "filter";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new filter post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * The matrix to be applied to the image
         */
        kernelMatrix: Matrix;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Postprocess used to apply FXAA (antialiasing) to the scene
     */
    export class ThinFXAAPostProcess extends EffectWrapper {
        private static _GetDefines;
        /**
         * The vertex shader url
         */
        static readonly VertexUrl = "fxaa";
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "fxaa";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new FXAA post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * The texel size of the texture to apply FXAA on
         */
        texelSize: Vector2;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to extract highlights.
     */
    export class ThinExtractHighlightsPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "extractHighlights";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new extract highlights post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * The luminance threshold, pixels below this value will be set to black.
         */
        threshold: number;
        /** @internal */
        _exposure: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * @internal
     */
    export class ThinDepthOfFieldMergePostProcess extends EffectWrapper {
        static readonly FragmentUrl = "depthOfFieldMerge";
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
    }


    /**
     * Specifies the level of blur that should be applied when using the depth of field effect
     */
    export enum ThinDepthOfFieldEffectBlurLevel {
        /**
         * Subtle blur
         */
        Low = 0,
        /**
         * Medium blur
         */
        Medium = 1,
        /**
         * Large blur
         */
        High = 2
    }
    /**
     * Thin depth of field effect composed of circle of confusion, blur, and merge post processes.
     */
    export class ThinDepthOfFieldEffect {
        /** @internal */
        readonly _circleOfConfusion: ThinCircleOfConfusionPostProcess;
        /** @internal */
        readonly _depthOfFieldBlurX: Array<[ThinDepthOfFieldBlurPostProcess, number]>;
        /** @internal */
        readonly _depthOfFieldBlurY: Array<[ThinDepthOfFieldBlurPostProcess, number]>;
        /** @internal */
        readonly _dofMerge: ThinDepthOfFieldMergePostProcess;
        /**
         * The focal the length of the camera used in the effect in scene units/1000 (eg. millimeter)
         */
        set focalLength(value: number);
        get focalLength(): number;
        /**
         * F-Stop of the effect's camera. The diameter of the resulting aperture can be computed by lensSize/fStop. (default: 1.4)
         */
        set fStop(value: number);
        get fStop(): number;
        /**
         * Distance away from the camera to focus on in scene units/1000 (eg. millimeter). (default: 2000)
         */
        set focusDistance(value: number);
        get focusDistance(): number;
        /**
         * Max lens size in scene units/1000 (eg. millimeter). Standard cameras are 50mm. (default: 50) The diameter of the resulting aperture can be computed by lensSize/fStop.
         */
        set lensSize(value: number);
        get lensSize(): number;
        /**
         * The quality of the effect.
         */
        readonly blurLevel: ThinDepthOfFieldEffectBlurLevel;
        /**
         * Creates a new instance of @see ThinDepthOfFieldEffect
         * @param name The name of the depth of field render effect
         * @param engine The engine which the render effect will be applied. (default: current engine)
         * @param blurLevel The quality of the effect. (default: DepthOfFieldEffectBlurLevel.Low)
         * @param depthNotNormalized If the (view) depth used in circle of confusion post-process is normalized (0.0 to 1.0 from near to far) or not (0 to camera max distance) (default: false)
         * @param blockCompilation If shaders should not be compiled when the effect is created (default: false)
         */
        constructor(name: string, engine: Nullable<AbstractEngine>, blurLevel?: ThinDepthOfFieldEffectBlurLevel, depthNotNormalized?: boolean, blockCompilation?: boolean);
        /**
         * Checks if the effect is ready to be used
         * @returns if the effect is ready
         */
        isReady(): boolean;
    }


    /**
     * @internal
     */
    export class ThinDepthOfFieldBlurPostProcess extends ThinBlurPostProcess {
        constructor(name: string, engine: Nullable<AbstractEngine> | undefined, direction: Vector2, kernel: number, options?: EffectWrapperCreationOptions);
    }


    /**
     * Class used to apply a custom post process
     */
    export class ThinCustomPostProcess extends EffectWrapper {
        /**
         * Observable triggered when the post process is bound
         */
        onBindObservable: Observable<Effect>;
        /**
         * Constructs a new custom post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to apply a convolution effect
     */
    export class ThinConvolutionPostProcess extends EffectWrapper {
        /**
         * Edge detection 0 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect0Kernel: number[];
        /**
         * Edge detection 1 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect1Kernel: number[];
        /**
         * Edge detection 2 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect2Kernel: number[];
        /**
         * Kernel to sharpen an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static SharpenKernel: number[];
        /**
         * Kernel to emboss an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EmbossKernel: number[];
        /**
         * Kernel to blur an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static GaussianKernel: number[];
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "convolution";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new convolution post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param kernel Array of 9 values corresponding to the 3x3 kernel to be applied
         * @param options Options to configure the effect
         */
        constructor(name: string, engine: Nullable<AbstractEngine> | undefined, kernel: number[], options?: EffectWrapperCreationOptions);
        /** Array of 9 values corresponding to the 3x3 kernel to be applied */
        kernel: number[];
        /**
         * The width of the source texture
         */
        textureWidth: number;
        /**
         * The height of the source texture
         */
        textureHeight: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to apply color correction
     */
    export class ThinColorCorrectionPostProcess extends EffectWrapper {
        private _colorTableTexture;
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "colorCorrection";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new black and white post process
         * @param name Name of the effect
         * @param scene The scene the effect belongs to
         * @param colorTableUrl URL of the color table texture
         * @param options Options to configure the effect
         */
        constructor(name: string, scene: Nullable<Scene>, colorTableUrl: string, options?: EffectWrapperCreationOptions);
        /**
         * Gets the color table url used to create the LUT texture
         */
        readonly colorTableUrl: string;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Options used to create a ThinCircleOfConfusionPostProcess.
     */
    export interface ThinCircleOfConfusionPostProcessOptions extends EffectWrapperCreationOptions {
        /**
         * If the (view) depth is normalized (0.0 to 1.0 from near to far) or not (0 to camera max distance)
         */
        depthNotNormalized?: boolean;
    }
    /**
     * Post process used to calculate the circle of confusion (used for depth of field, for example)
     */
    export class ThinCircleOfConfusionPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "circleOfConfusion";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        /**
         * Defines if the depth is normalized or not
         */
        static readonly DefinesDepthNotNormalized = "#define COC_DEPTH_NOT_NORMALIZED";
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new circle of confusion post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: ThinCircleOfConfusionPostProcessOptions);
        /**
         * The camera to use to calculate the circle of confusion
         */
        camera: Camera;
        /**
         * Max lens size in scene units/1000 (eg. millimeter). Standard cameras are 50mm. (default: 50) The diameter of the resulting aperture can be computed by lensSize/fStop.
         */
        lensSize: number;
        /**
         * F-Stop of the effect's camera. The diameter of the resulting aperture can be computed by lensSize/fStop. (default: 1.4)
         */
        fStop: number;
        /**
         * Distance away from the camera to focus on in scene units/1000 (eg. millimeter). (default: 2000)
         */
        focusDistance: number;
        /**
         * Focal length of the effect's camera in scene units/1000 (eg. millimeter). (default: 50)
         */
        focalLength: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * The ChromaticAberrationPostProcess separates the rgb channels in an image to produce chromatic distortion around the edges of the screen
     */
    export class ThinChromaticAberrationPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "chromaticAberration";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new chromatic aberration post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * The amount of separation of rgb channels (default: 30)
         */
        aberrationAmount: number;
        /**
         * The amount the effect will increase for pixels closer to the edge of the screen. (default: 0)
         */
        radialIntensity: number;
        /**
         * The normalized direction in which the rgb channels should be separated. If set to 0,0 radial direction will be used. (default: Vector2(0.707,0.707))
         */
        direction: Vector2;
        /**
         * The center position where the radialIntensity should be around. [0.5,0.5 is center of screen, 1,1 is top right corner] (default: Vector2(0.5 ,0.5))
         */
        centerPosition: Vector2;
        /** The width of the source texture to which the effect is applied */
        screenWidth: number;
        /** The height of the source texture to which the effect is applied */
        screenHeight: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Post process used to apply a blur effect
     */
    export class ThinBlurPostProcess extends EffectWrapper {
        /**
         * The vertex shader url
         */
        static readonly VertexUrl = "kernelBlur";
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "kernelBlur";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        protected _kernel: number;
        protected _idealKernel: number;
        protected _packedFloat: boolean;
        private _staticDefines;
        /**
         * Constructs a new blur post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param direction Direction in which to apply the blur
         * @param kernel Kernel size of the blur
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, direction?: Vector2, kernel?: number, options?: EffectWrapperCreationOptions);
        /**
         * Width of the texture to apply the blur on
         */
        textureWidth: number;
        /**
         * Height of the texture to apply the blur on
         */
        textureHeight: number;
        /** The direction in which to blur the image. */
        direction: Vector2;
        /**
         * Sets the length in pixels of the blur sample region
         */
        set kernel(v: number);
        /**
         * Gets the length in pixels of the blur sample region
         */
        get kernel(): number;
        /**
         * Sets whether or not the blur needs to unpack/repack floats
         */
        set packedFloat(v: boolean);
        /**
         * Gets whether or not the blur is unpacking/repacking floats
         */
        get packedFloat(): boolean;
        bind(noDefaultBindings?: boolean): void;
        /** @internal */
        _updateParameters(onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void;
        /**
         * Best kernels are odd numbers that when divided by 2, their integer part is even, so 5, 9 or 13.
         * Other odd kernels optimize correctly but require proportionally more samples, even kernels are
         * possible but will produce minor visual artifacts. Since each new kernel requires a new shader we
         * want to minimize kernel changes, having gaps between physical kernels is helpful in that regard.
         * The gaps between physical kernels are compensated for in the weighting of the samples
         * @param idealKernel Ideal blur kernel.
         * @returns Nearest best kernel.
         */
        protected _nearestBestKernel(idealKernel: number): number;
        /**
         * Calculates the value of a Gaussian distribution with sigma 3 at a given point.
         * @param x The point on the Gaussian distribution to sample.
         * @returns the value of the Gaussian function at x.
         */
        protected _gaussianWeight(x: number): number;
        /**
         * Generates a string that can be used as a floating point number in GLSL.
         * @param x Value to print.
         * @param decimalFigures Number of decimal places to print the number to (excluding trailing 0s).
         * @returns GLSL float string.
         */
        protected _glslFloat(x: number, decimalFigures?: number): string;
    }


    /**
     * @internal
     */
    export class ThinBloomMergePostProcess extends EffectWrapper {
        static readonly FragmentUrl = "bloomMerge";
        static readonly Uniforms: string[];
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /** Weight of the bloom to be added to the original input. */
        weight: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * The bloom effect spreads bright areas of an image to simulate artifacts seen in cameras
     */
    export class ThinBloomEffect {
        /** @internal */
        _downscale: ThinExtractHighlightsPostProcess;
        /** @internal */
        _blurX: ThinBlurPostProcess;
        /** @internal */
        _blurY: ThinBlurPostProcess;
        /** @internal */
        _merge: ThinBloomMergePostProcess;
        /**
         * The luminance threshold to find bright areas of the image to bloom.
         */
        get threshold(): number;
        set threshold(value: number);
        /**
         * The strength of the bloom.
         */
        get weight(): number;
        set weight(value: number);
        /**
         * Specifies the size of the bloom blur kernel, relative to the final output size
         */
        get kernel(): number;
        set kernel(value: number);
        /**
         * The ratio of the blur texture to the input texture that should be used to compute the bloom.
         */
        readonly scale: number;
        /**
         * Creates a new instance of @see ThinBloomEffect
         * @param name The name of the bloom render effect
         * @param engine The engine which the render effect will be applied. (default: current engine)
         * @param scale The ratio of the blur texture to the input texture that should be used to compute the bloom.
         * @param blockCompilation If shaders should not be compiled when the effect is created (default: false)
         */
        constructor(name: string, engine: Nullable<AbstractEngine>, scale: number, blockCompilation?: boolean);
        /**
         * Checks if the effect is ready to be used
         * @returns if the effect is ready
         */
        isReady(): boolean;
    }


    /**
     * Post process used to render in black and white
     */
    export class ThinBlackAndWhitePostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "blackAndWhite";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new black and white post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
        /**
         * Effect intensity (default: 1)
         */
        degree: number;
        bind(noDefaultBindings?: boolean): void;
    }


    /**
     * Postprocess used to generate anaglyphic rendering
     */
    export class ThinAnaglyphPostProcess extends EffectWrapper {
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "anaglyph";
        /**
         * The list of samplers used by the effect
         */
        static readonly Samplers: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * Constructs a new anaglyph post process
         * @param name Name of the effect
         * @param engine Engine to use to render the effect. If not provided, the last created engine will be used
         * @param options Options to configure the effect
         */
        constructor(name: string, engine?: Nullable<AbstractEngine>, options?: EffectWrapperCreationOptions);
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Sub surface scattering post process
     */
    export class SubSurfaceScatteringPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "SubSurfaceScatteringPostProcess" string
         */
        getClassName(): string;
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number);
    }




    /** This file must only contain pure code and pure imports */
    /**
     * StereoscopicInterlacePostProcessI used to render stereo views from a rigged camera with support for alternate line interlacing
     */
    export class StereoscopicInterlacePostProcessI extends PostProcess {
        private _stepSize;
        private _passedProcess;
        /**
         * Gets a string identifying the name of the class
         * @returns "StereoscopicInterlacePostProcessI" string
         */
        getClassName(): string;
        /**
         * Initializes a StereoscopicInterlacePostProcessI
         * @param name The name of the effect.
         * @param rigCameras The rig cameras to be applied to the post process
         * @param isStereoscopicHoriz If the rendered results are horizontal or vertical
         * @param isStereoscopicInterlaced If the rendered results are alternate line interlaced
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, rigCameras: Camera[], isStereoscopicHoriz: boolean, isStereoscopicInterlaced: boolean, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
    }
    /**
     * StereoscopicInterlacePostProcess used to render stereo views from a rigged camera
     */
    export class StereoscopicInterlacePostProcess extends PostProcess {
        private _stepSize;
        private _passedProcess;
        /**
         * Gets a string identifying the name of the class
         * @returns "StereoscopicInterlacePostProcess" string
         */
        getClassName(): string;
        /**
         * Initializes a StereoscopicInterlacePostProcess
         * @param name The name of the effect.
         * @param rigCameras The rig cameras to be applied to the post process
         * @param isStereoscopicHoriz If the rendered results are horizontal or vertical
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, rigCameras: Camera[], isStereoscopicHoriz: boolean, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
    }




    /** This file must only contain pure code and pure imports */
    /**
     * The SharpenPostProcess applies a sharpen kernel to every pixel
     * See http://en.wikipedia.org/wiki/Kernel_(image_processing)
     */
    export class SharpenPostProcess extends PostProcess {
        /**
         * How much of the original color should be applied. Setting this to 0 will display edge detection. (default: 1)
         */
        get colorAmount(): number;
        set colorAmount(value: number);
        /**
         * How much sharpness should be applied (default: 0.3)
         */
        get edgeAmount(): number;
        set edgeAmount(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "SharpenPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinSharpenPostProcess;
        /**
         * Creates a new instance ConvolutionPostProcess
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): SharpenPostProcess;
    }
    /**
     * Register side effects for sharpenPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSharpenPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sharpenPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The ScreenSpaceReflectionPostProcess performs realtime reflections using only and only the available informations on the screen (positions and normals).
     * Basically, the screen space reflection post-process will compute reflections according the material's reflectivity.
     * @deprecated Use the new SSRRenderingPipeline instead.
     */
    export class ScreenSpaceReflectionPostProcess extends PostProcess {
        /**
         * Gets or sets a reflection threshold mainly used to adjust the reflection's height.
         */
        threshold: number;
        /**
         * Gets or sets the current reflection strength. 1.0 is an ideal value but can be increased/decreased for particular results.
         */
        strength: number;
        /**
         * Gets or sets the falloff exponent used while computing fresnel. More the exponent is high, more the reflections will be discrete.
         */
        reflectionSpecularFalloffExponent: number;
        /**
         * Gets or sets the step size used to iterate until the effect finds the color of the reflection's pixel. Typically in interval [0.1, 1.0]
         */
        step: number;
        /**
         * Gets or sets the factor applied when computing roughness. Default value is 0.2.
         */
        roughnessFactor: number;
        private _forceGeometryBuffer;
        private get _geometryBufferRenderer();
        private get _prePassRenderer();
        private _enableSmoothReflections;
        private _reflectionSamples;
        private _smoothSteps;
        private _isSceneRightHanded;
        /**
         * Gets a string identifying the name of the class
         * @returns "ScreenSpaceReflectionPostProcess" string
         */
        getClassName(): string;
        /**
         * Creates a new instance of ScreenSpaceReflectionPostProcess.
         * @param name The name of the effect.
         * @param scene The scene containing the objects to calculate reflections.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: true)
         * @param forceGeometryBuffer If this post process should use geometry buffer instead of prepass (default: false)
         */
        constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean, forceGeometryBuffer?: boolean);
        /**
         * Gets whether or not smoothing reflections is enabled.
         * Enabling smoothing will require more GPU power and can generate a drop in FPS.
         */
        get enableSmoothReflections(): boolean;
        /**
         * Sets whether or not smoothing reflections is enabled.
         * Enabling smoothing will require more GPU power and can generate a drop in FPS.
         */
        set enableSmoothReflections(enabled: boolean);
        /**
         * Gets the number of samples taken while computing reflections. More samples count is high,
         * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].
         */
        get reflectionSamples(): number;
        /**
         * Sets the number of samples taken while computing reflections. More samples count is high,
         * more the post-process wil require GPU power and can generate a drop in FPS. Basically in interval [25, 100].
         */
        set reflectionSamples(samples: number);
        /**
         * Gets the number of samples taken while smoothing reflections. More samples count is high,
         * more the post-process will require GPU power and can generate a drop in FPS.
         * Default value (5.0) work pretty well in all cases but can be adjusted.
         */
        get smoothSteps(): number;
        set smoothSteps(steps: number);
        private _updateEffectDefines;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): ScreenSpaceReflectionPostProcess;
    }
    /**
     * Register side effects for screenSpaceReflectionPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScreenSpaceReflectionPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import screenSpaceReflectionPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The Screen Space curvature effect can help highlighting ridge and valley of a model.
     */
    export class ScreenSpaceCurvaturePostProcess extends PostProcess {
        /**
         * Defines how much ridge the curvature effect displays.
         */
        get ridge(): number;
        set ridge(value: number);
        /**
         * Defines how much valley the curvature effect displays.
         */
        get valley(): number;
        set valley(value: number);
        private _geometryBufferRenderer;
        /**
         * Gets a string identifying the name of the class
         * @returns "ScreenSpaceCurvaturePostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinScreenSpaceCurvaturePostProcess;
        /**
         * Creates a new instance ScreenSpaceCurvaturePostProcess
         * @param name The name of the effect.
         * @param scene The scene containing the objects to blur according to their velocity.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * Support test.
         */
        static get IsSupported(): boolean;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): ScreenSpaceCurvaturePostProcess;
    }
    /**
     * Register side effects for screenSpaceCurvaturePostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScreenSpaceCurvaturePostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import screenSpaceCurvaturePostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Post process which applies a refraction texture
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#refraction
     */
    export class RefractionPostProcess extends PostProcess {
        private _refTexture;
        private _ownRefractionTexture;
        /** the base color of the refraction (used to taint the rendering) */
        color: Color3;
        /** simulated refraction depth */
        depth: number;
        /** the coefficient of the base color (0 to remove base color tainting) */
        colorLevel: number;
        /** Gets the url used to load the refraction texture */
        refractionTextureUrl: string;
        /**
         * Gets or sets the refraction texture
         * Please note that you are responsible for disposing the texture if you set it manually
         */
        get refractionTexture(): Texture;
        set refractionTexture(value: Texture);
        /**
         * Gets a string identifying the name of the class
         * @returns "RefractionPostProcess" string
         */
        getClassName(): string;
        /**
         * Initializes the RefractionPostProcess
         * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#refraction
         * @param name The name of the effect.
         * @param refractionTextureUrl Url of the refraction texture to use
         * @param color the base color of the refraction (used to taint the rendering)
         * @param depth simulated refraction depth
         * @param colorLevel the coefficient of the base color (0 to remove base color tainting)
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, refractionTextureUrl: string, color: Color3, depth: number, colorLevel: number, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
        /**
         * Disposes of the post process
         * @param camera Camera to dispose post process on
         */
        dispose(camera: Camera): void;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): RefractionPostProcess;
    }
    /**
     * Register side effects for refractionPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRefractionPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import refractionPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * PostProcessManager is used to manage one or more post processes or post process pipelines
     * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses
     */
    export class PostProcessManager {
        private _scene;
        private _indexBuffer;
        private _vertexBuffers;
        private readonly _activePostProcesses;
        /**
         * Creates a new instance PostProcess
         * @param scene The scene that the post process is associated with.
         */
        constructor(scene: Scene);
        private _prepareBuffers;
        private _buildIndexBuffer;
        private _getActivePostProcesses;
        /**
         * Observable raised before post processes are rendered.
         */
        onBeforeRenderObservable: Observable<PostProcessManager>;
        /**
         * Rebuilds the vertex buffers of the manager.
         * @internal
         */
        _rebuild(): void;
        /**
         * Prepares a frame to be run through a post process.
         * @param sourceTexture The input texture to the post processes. (default: null)
         * @param postProcesses An array of post processes to be run. (default: null)
         * @returns True if the post processes were able to be run.
         * @internal
         */
        _prepareFrame(sourceTexture?: Nullable<InternalTexture>, postProcesses?: Nullable<PostProcess[]>): boolean;
        /**
         * Manually render a set of post processes to a texture.
         * Please note, the frame buffer won't be unbound after the call in case you have more render to do.
         * @param postProcesses An array of post processes to be run.
         * @param targetTexture The render target wrapper to render to.
         * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight
         * @param faceIndex defines the face to render to if a cubemap is defined as the target
         * @param lodLevel defines which lod of the texture to render to
         * @param doNotBindFrambuffer If set to true, assumes that the framebuffer has been bound previously
         * @param numPostsProcesses The number of post processes to render. Defaults to the length of the postProcesses array.
         */
        directRender(postProcesses: PostProcess[], targetTexture?: Nullable<RenderTargetWrapper>, forceFullscreenViewport?: boolean, faceIndex?: number, lodLevel?: number, doNotBindFrambuffer?: boolean, numPostsProcesses?: number): void;
        /**
         * Finalize the result of the output of the postprocesses.
         * @param doNotPresent If true the result will not be displayed to the screen.
         * @param targetTexture The render target wrapper to render to.
         * @param faceIndex The index of the face to bind the target texture to.
         * @param postProcesses The array of post processes to render.
         * @param forceFullscreenViewport force gl.viewport to be full screen eg. 0,0,textureWidth,textureHeight (default: false)
         * @internal
         */
        _finalizeFrame(doNotPresent?: boolean, targetTexture?: RenderTargetWrapper, faceIndex?: number, postProcesses?: Array<PostProcess>, forceFullscreenViewport?: boolean): void;
        /**
         * Disposes of the post process manager.
         */
        dispose(): void;
    }


        interface AbstractEngine {
            /**
             * Sets a texture to the context from a postprocess
             * @param channel defines the channel to use
             * @param postProcess defines the source postprocess
             * @param name name of the channel
             */
            setTextureFromPostProcess(channel: number, postProcess: Nullable<PostProcess>, name: string): void;
            /**
             * Binds the output of the passed in post process to the texture channel specified
             * @param channel The channel the texture should be bound to
             * @param postProcess The post process which's output should be bound
             * @param name name of the channel
             */
            setTextureFromPostProcessOutput(channel: number, postProcess: Nullable<PostProcess>, name: string): void;
        }
        interface Effect {
            /**
             * Sets a texture to be the input of the specified post process. (To use the output, pass in the next post process in the pipeline)
             * @param channel Name of the sampler variable.
             * @param postProcess Post process to get the input texture from.
             */
            setTextureFromPostProcess(channel: string, postProcess: Nullable<PostProcess>): void;
            /**
             * (Warning! setTextureFromPostProcessOutput may be desired instead)
             * Sets the input texture of the passed in post process to be input of this effect. (To use the output of the passed in post process use setTextureFromPostProcessOutput)
             * @param channel Name of the sampler variable.
             * @param postProcess Post process to get the output texture from.
             */
            setTextureFromPostProcessOutput(channel: string, postProcess: Nullable<PostProcess>): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Options for the PostProcess constructor
     */
    export type PostProcessOptions = EffectWrapperCreationOptions & {
        /**
         * The width of the texture created for this post process.
         * This parameter (and height) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.
         * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.
         */
        width?: number;
        /**
         * The height of the texture created for this post process.
         * This parameter (and width) is only used when passing a value for the 5th parameter (options) to the PostProcess constructor function.
         * If you use a PostProcessOptions for the 3rd parameter of the constructor, size is used instead of width and height.
         */
        height?: number;
        /**
         * The size of the post process texture.
         * It is either a ratio to downscale or upscale the texture create for this post process, or an object containing width and height values.
         * Default: 1
         */
        size?: number | {
            width: number;
            height: number;
        };
        /**
         * The camera that the post process will be attached to (default: null)
         */
        camera?: Nullable<Camera>;
        /**
         * The sampling mode to be used by the shader (default: Constants.TEXTURE_NEAREST_SAMPLINGMODE)
         */
        samplingMode?: number;
        /**
         * The engine to be used to render the post process (default: engine from scene)
         */
        engine?: AbstractEngine;
        /**
         * If the post process can be reused on the same frame. (default: false)
         */
        reusable?: boolean;
        /**
         * Type of the texture created for this post process (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         */
        textureType?: number;
        /**
         * Format of the texture created for this post process (default: TEXTUREFORMAT_RGBA)
         */
        textureFormat?: number;
        /**
         * The effect wrapper instance used by the post process. If not provided, a new one will be created.
         */
        effectWrapper?: EffectWrapper;
    };
    /**
     * PostProcess can be used to apply a shader to a texture after it has been rendered
     * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses
     */
    export class PostProcess {
        /**
         * Force all the postprocesses to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static get ForceGLSL(): boolean;
        static set ForceGLSL(force: boolean);
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /**
         * Registers a shader code processing with a post process name.
         * @param postProcessName name of the post process. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to a post process name
         * @param customShaderCodeProcessing shader code processing to associate to the post process name
         */
        static RegisterShaderCodeProcessing(postProcessName: Nullable<string>, customShaderCodeProcessing?: EffectWrapperCustomShaderCodeProcessing): void;
        /**
         * Gets or sets the unique id of the post process
         */
        uniqueId: number;
        /** Name of the PostProcess. */
        get name(): string;
        set name(value: string);
        /**
         * Width of the texture to apply the post process on
         */
        width: number;
        /**
         * Height of the texture to apply the post process on
         */
        height: number;
        /**
         * Gets the node material used to create this postprocess (null if the postprocess was manually created)
         */
        nodeMaterialSource: Nullable<NodeMaterial>;
        /**
         * Internal, reference to the location where this postprocess was output to. (Typically the texture on the next postprocess in the chain)
         * @internal
         */
        _outputTexture: Nullable<RenderTargetWrapper>;
        /**
         * Sampling mode used by the shader
         */
        renderTargetSamplingMode: number;
        /**
         * Clear color to use when screen clearing
         */
        clearColor: Color4;
        /**
         * If the buffer needs to be cleared before applying the post process. (default: true)
         * Should be set to false if shader will overwrite all previous pixels.
         */
        autoClear: boolean;
        /**
         * If clearing the buffer should be forced in autoClear mode, even when alpha mode is enabled (default: false).
         * By default, the buffer will only be cleared if alpha mode is disabled (and autoClear is true).
         */
        forceAutoClearInAlphaMode: boolean;
        /**
         * Type of alpha mode to use when performing the post process (default: Engine.ALPHA_DISABLE)
         */
        get alphaMode(): number;
        set alphaMode(value: number);
        /**
         * Sets the setAlphaBlendConstants of the babylon engine
         */
        alphaConstants: Color4;
        /**
         * Animations to be used for the post processing
         */
        animations: Animation[];
        /**
         * Enable Pixel Perfect mode where texture is not scaled to be power of 2.
         * Can only be used on a single postprocess or on the last one of a chain. (default: false)
         */
        enablePixelPerfectMode: boolean;
        /**
         * Force the postprocess to be applied without taking in account viewport
         */
        forceFullscreenViewport: boolean;
        /**
         * List of inspectable custom properties (used by the Inspector)
         * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
         */
        inspectableCustomProperties: IInspectable[];
        /**
         * Scale mode for the post process (default: Engine.SCALEMODE_FLOOR)
         *
         * | Value | Type                                | Description |
         * | ----- | ----------------------------------- | ----------- |
         * | 1     | SCALEMODE_FLOOR                     | [engine.scalemode_floor](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_floor) |
         * | 2     | SCALEMODE_NEAREST                   | [engine.scalemode_nearest](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_nearest) |
         * | 3     | SCALEMODE_CEILING                   | [engine.scalemode_ceiling](https://doc.babylonjs.com/api/classes/babylon.engine#scalemode_ceiling) |
         *
         */
        scaleMode: number;
        /**
         * Force textures to be a power of two (default: false)
         */
        alwaysForcePOT: boolean;
        private _samples;
        /**
         * Number of sample textures (default: 1)
         */
        get samples(): number;
        set samples(n: number);
        /**
         * Modify the scale of the post process to be the same as the viewport (default: false)
         */
        adaptScaleToCurrentViewport: boolean;
        /**
         * Specifies if the post process should be serialized
         */
        doNotSerialize: boolean;
        private _camera;
        protected _scene: Scene;
        private _engine;
        protected _webGPUReady: boolean;
        private _options;
        private _reusable;
        private _renderId;
        private _textureType;
        private _textureFormat;
        /** @internal */
        private _shaderLanguage;
        /**
         * Gets the shader language type used to generate vertex and fragment source code.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * if externalTextureSamplerBinding is true, the "apply" method won't bind the textureSampler texture, it is expected to be done by the "outside" (by the onApplyObservable observer most probably).
         * counter-productive in some cases because if the texture bound by "apply" is different from the currently texture bound, (the one set by the onApplyObservable observer, for eg) some
         * internal structures (materialContext) will be dirtified, which may impact performances
         */
        externalTextureSamplerBinding: boolean;
        /**
         * Smart array of input and output textures for the post process.
         * @internal
         */
        _textures: SmartArray<RenderTargetWrapper>;
        /**
         * Smart array of input and output textures for the post process.
         * @internal
         */
        private _textureCache;
        /**
         * The index in _textures that corresponds to the output texture.
         * @internal
         */
        _currentRenderTextureInd: number;
        private _samplers;
        private _fragmentUrl;
        private _vertexUrl;
        private _parameters;
        private _uniformBuffers;
        protected _postProcessDefines: Nullable<string>;
        private _scaleRatio;
        protected _indexParameters: any;
        private _shareOutputWithPostProcess;
        private _texelSize;
        /** @internal */
        _forcedOutputTexture: Nullable<RenderTargetWrapper>;
        /**
         * Prepass configuration in case this post process needs a texture from prepass
         * @internal
         */
        _prePassEffectConfiguration: PrePassEffectConfiguration;
        /**
         * Returns the fragment url or shader name used in the post process.
         * @returns the fragment url or name in the shader store.
         */
        getEffectName(): string;
        /**
         * Executed when the effect was created
         * @returns effect that was created for this post process
         */
        onEffectCreatedObservable: Observable<Effect>;
        /**
         * An event triggered when the postprocess is activated.
         */
        onActivateObservable: Observable<Camera>;
        private _onActivateObserver;
        /**
         * A function that is added to the onActivateObservable
         */
        set onActivate(callback: Nullable<(camera: Camera) => void>);
        /**
         * An event triggered when the postprocess changes its size.
         */
        onSizeChangedObservable: Observable<PostProcess>;
        private _onSizeChangedObserver;
        /**
         * A function that is added to the onSizeChangedObservable
         */
        set onSizeChanged(callback: (postProcess: PostProcess) => void);
        /**
         * An event triggered when the postprocess applies its effect.
         */
        onApplyObservable: Observable<Effect>;
        private _onApplyObserver;
        /**
         * A function that is added to the onApplyObservable
         */
        set onApply(callback: (effect: Effect) => void);
        /**
         * An event triggered before rendering the postprocess
         */
        onBeforeRenderObservable: Observable<Effect>;
        private _onBeforeRenderObserver;
        /**
         * A function that is added to the onBeforeRenderObservable
         */
        set onBeforeRender(callback: (effect: Effect) => void);
        /**
         * An event triggered after rendering the postprocess
         */
        onAfterRenderObservable: Observable<Effect>;
        private _onAfterRenderObserver;
        /**
         * A function that is added to the onAfterRenderObservable
         */
        set onAfterRender(callback: (efect: Effect) => void);
        /**
         * An event triggered when the post-process is disposed
         */
        readonly onDisposeObservable: Observable<void>;
        /**
         * The input texture for this post process and the output texture of the previous post process. When added to a pipeline the previous post process will
         * render it's output into this texture and this texture will be used as textureSampler in the fragment shader of this post process.
         */
        get inputTexture(): RenderTargetWrapper;
        set inputTexture(value: RenderTargetWrapper);
        /**
         * Since inputTexture should always be defined, if we previously manually set `inputTexture`,
         * the only way to unset it is to use this function to restore its internal state
         */
        restoreDefaultInputTexture(): void;
        /**
         * Gets the camera which post process is applied to.
         * @returns The camera the post process is applied to.
         */
        getCamera(): Camera;
        /**
         * Gets the texel size of the postprocess.
         * See https://en.wikipedia.org/wiki/Texel_(graphics)
         */
        get texelSize(): Vector2;
        protected readonly _effectWrapper: EffectWrapper;
        protected readonly _useExistingThinPostProcess: boolean;
        /**
         * Creates a new instance PostProcess
         * @param name The name of the PostProcess.
         * @param fragmentUrl The url of the fragment shader to be used.
         * @param options The options to be used when constructing the post process.
         */
        constructor(name: string, fragmentUrl: string, options?: PostProcessOptions);
        /**
         * Creates a new instance PostProcess
         * @param name The name of the PostProcess.
         * @param fragmentUrl The url of the fragment shader to be used.
         * @param parameters Array of the names of uniform non-sampler2D variables that will be passed to the shader.
         * @param samplers Array of the names of uniform sampler2D variables that will be passed to the shader.
         * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param defines String of defines that will be set when running the fragment shader. (default: null)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param vertexUrl The url of the vertex shader to be used. (default: "postprocess")
         * @param indexParameters The index parameters to be used for babylons include syntax "#include<kernelBlurVaryingDeclaration>[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx
         * @param blockCompilation If the shader should not be compiled immediatly. (default: false)
         * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)
         * @param shaderLanguage The shader language of the shader. (default: GLSL)
         * @param extraInitializations Defines additional code to call to prepare the shader code
         */
        constructor(name: string, fragmentUrl: string, parameters: Nullable<string[]>, samplers: Nullable<string[]>, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, defines?: Nullable<string>, textureType?: number, vertexUrl?: string, indexParameters?: any, blockCompilation?: boolean, textureFormat?: number, shaderLanguage?: ShaderLanguage, extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void);
        protected _gatherImports(useWebGPU: boolean | undefined, list: Promise<any>[]): void;
        /**
         * Gets a string identifying the name of the class
         * @returns "PostProcess" string
         */
        getClassName(): string;
        /**
         * Gets the engine which this post process belongs to.
         * @returns The engine the post process was enabled with.
         */
        getEngine(): AbstractEngine;
        /**
         * The effect that is created when initializing the post process.
         * @returns The created effect corresponding to the postprocess.
         */
        getEffect(): Effect;
        /**
         * To avoid multiple redundant textures for multiple post process, the output the output texture for this post process can be shared with another.
         * @param postProcess The post process to share the output with.
         * @returns This post process.
         */
        shareOutputWith(postProcess: PostProcess): PostProcess;
        /**
         * Reverses the effect of calling shareOutputWith and returns the post process back to its original state.
         * This should be called if the post process that shares output with this post process is disabled/disposed.
         */
        useOwnOutput(): void;
        /**
         * Updates the effect with the current post process compile time values and recompiles the shader.
         * @param defines Define statements that should be added at the beginning of the shader. (default: null)
         * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)
         * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)
         * @param indexParameters The index parameters to be used for babylons include syntax "#include<kernelBlurVaryingDeclaration>[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx
         * @param onCompiled Called when the shader has been compiled.
         * @param onError Called if there is an error when compiling a shader.
         * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)
         * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)
         */
        updateEffect(defines?: Nullable<string>, uniforms?: Nullable<string[]>, samplers?: Nullable<string[]>, indexParameters?: any, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void, vertexUrl?: string, fragmentUrl?: string): void;
        /**
         * The post process is reusable if it can be used multiple times within one frame.
         * @returns If the post process is reusable
         */
        isReusable(): boolean;
        /** invalidate frameBuffer to hint the postprocess to create a depth buffer */
        markTextureDirty(): void;
        private _createRenderTargetTexture;
        private _flushTextureCache;
        /**
         * Resizes the post-process texture
         * @param width Width of the texture
         * @param height Height of the texture
         * @param camera The camera this post-process is applied to. Pass null if the post-process is used outside the context of a camera post-process chain (default: null)
         * @param needMipMaps True if mip maps need to be generated after render (default: false)
         * @param forceDepthStencil True to force post-process texture creation with stencil depth and buffer (default: false)
         */
        resize(width: number, height: number, camera?: Nullable<Camera>, needMipMaps?: boolean, forceDepthStencil?: boolean): void;
        private _getTarget;
        /**
         * Activates the post process by intializing the textures to be used when executed. Notifies onActivateObservable.
         * When this post process is used in a pipeline, this is call will bind the input texture of this post process to the output of the previous.
         * @param cameraOrScene The camera that will be used in the post process. This camera will be used when calling onActivateObservable. You can also pass the scene if no camera is available.
         * @param sourceTexture The source texture to be inspected to get the width and height if not specified in the post process constructor. (default: null)
         * @param forceDepthStencil If true, a depth and stencil buffer will be generated. (default: false)
         * @returns The render target wrapper that was bound to be written to.
         */
        activate(cameraOrScene: Nullable<Camera> | Scene, sourceTexture?: Nullable<InternalTexture>, forceDepthStencil?: boolean): RenderTargetWrapper;
        /**
         * If the post process is supported.
         */
        get isSupported(): boolean;
        /**
         * The aspect ratio of the output texture.
         */
        get aspectRatio(): number;
        /**
         * Get a value indicating if the post-process is ready to be used
         * @returns true if the post-process is ready (shader is compiled)
         */
        isReady(): boolean;
        /**
         * Binds all textures and uniforms to the shader, this will be run on every pass.
         * @returns the effect corresponding to this post process. Null if not compiled or not ready.
         */
        apply(): Nullable<Effect>;
        private _disposeTextures;
        private _disposeTextureCache;
        /**
         * Sets the required values to the prepass renderer.
         * @param prePassRenderer defines the prepass renderer to setup.
         * @returns true if the pre pass is needed.
         */
        setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean;
        /**
         * Disposes the post process.
         * @param camera The camera to dispose the post process on.
         */
        dispose(camera?: Camera): void;
        /**
         * Serializes the post process to a JSON object
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Clones this post process
         * @returns a new post process similar to this one
         */
        clone(): Nullable<PostProcess>;
        /**
         * Creates a material from parsed material data
         * @param parsedPostProcess defines parsed post process data
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures
         * @returns a new post process
         */
        static Parse(parsedPostProcess: any, scene: Scene, rootUrl: string): Nullable<PostProcess>;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Nullable<Camera>, scene: Nullable<Scene>, rootUrl: string): Nullable<PostProcess>;
    }
    /**
     * Register side effects for postProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import postProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * PassPostProcess which produces an output the same as it's input
     */
    export class PassPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "PassPostProcess" string
         */
        getClassName(): string;
        /**
         * Creates the PassPostProcess
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType The type of texture to be used when performing the post processing.
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): PassPostProcess;
    }
    /**
     * PassCubePostProcess which produces an output the same as it's input (which must be a cube texture)
     */
    export class PassCubePostProcess extends PostProcess {
        /**
         * Gets or sets the cube face to display.
         *  * 0 is +X
         *  * 1 is -X
         *  * 2 is +Y
         *  * 3 is -Y
         *  * 4 is +Z
         *  * 5 is -Z
         */
        get face(): number;
        set face(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "PassCubePostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinPassCubePostProcess;
        /**
         * Creates the PassCubePostProcess
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType The type of texture to be used when performing the post processing.
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): PassCubePostProcess;
    }
    /**
     * Register side effects for passPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPassPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import passPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The Motion Blur Post Process which blurs an image based on the objects velocity in scene.
     * Velocity can be affected by each object's rotation, position and scale depending on the transformation speed.
     * As an example, all you have to do is to create the post-process:
     *  var mb = new BABYLON.MotionBlurPostProcess(
     *      'mb', // The name of the effect.
     *      scene, // The scene containing the objects to blur according to their velocity.
     *      1.0, // The required width/height ratio to downsize to before computing the render pass.
     *      camera // The camera to apply the render pass to.
     * );
     * Then, all objects moving, rotating and/or scaling will be blurred depending on the transformation speed.
     */
    export class MotionBlurPostProcess extends PostProcess {
        /**
         * Defines how much the image is blurred by the movement. Default value is equal to 1
         */
        get motionStrength(): number;
        set motionStrength(value: number);
        /**
         * Gets the number of iterations are used for motion blur quality. Default value is equal to 32
         */
        get motionBlurSamples(): number;
        /**
         * Sets the number of iterations to be used for motion blur quality
         */
        set motionBlurSamples(samples: number);
        /**
         * Gets whether or not the motion blur post-process is in object based mode.
         */
        get isObjectBased(): boolean;
        /**
         * Sets whether or not the motion blur post-process is in object based mode.
         */
        set isObjectBased(value: boolean);
        private _forcedGeometryBuffer;
        private _forceGeometryBuffer;
        private get _geometryBufferRenderer();
        private get _prePassRenderer();
        /**
         * Gets a string identifying the name of the class
         * @returns "MotionBlurPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinMotionBlurPostProcess;
        /**
         * Creates a new instance MotionBlurPostProcess
         * @param name The name of the effect.
         * @param scene The scene containing the objects to blur according to their velocity.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: true)
         * @param forceGeometryBuffer If this post process should use geometry buffer instead of prepass (default: false)
         */
        constructor(name: string, scene: Scene, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean, forceGeometryBuffer?: boolean | GeometryBufferRenderer);
        /**
         * Excludes the given skinned mesh from computing bones velocities.
         * Computing bones velocities can have a cost and that cost. The cost can be saved by calling this function and by passing the skinned mesh reference to ignore.
         * @param skinnedMesh The mesh containing the skeleton to ignore when computing the velocity map.
         */
        excludeSkinnedMesh(skinnedMesh: AbstractMesh): void;
        /**
         * Removes the given skinned mesh from the excluded meshes to integrate bones velocities while rendering the velocity map.
         * @param skinnedMesh The mesh containing the skeleton that has been ignored previously.
         * @see excludeSkinnedMesh to exclude a skinned mesh from bones velocity computation.
         */
        removeExcludedSkinnedMesh(skinnedMesh: AbstractMesh): void;
        /**
         * Disposes the post process.
         * @param camera The camera to dispose the post process on.
         */
        dispose(camera?: Camera): void;
        /**
         * Called on the mode changed (object based or screen based).
         */
        private _applyMode;
        /**
         * Called on the effect is applied when the motion blur post-process is in object based mode.
         * @param effect
         */
        private _onApplyObjectBased;
        /**
         * Called on the effect is applied when the motion blur post-process is in screen based mode.
         * @param effect
         */
        private _onApplyScreenBased;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<MotionBlurPostProcess>;
    }
    /**
     * Register side effects for motionBlurPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMotionBlurPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import motionBlurPostProcess.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * ImageProcessingPostProcess
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#imageprocessing
     */
    export class ImageProcessingPostProcess extends PostProcess {
        protected get _imageProcessingConfiguration(): ImageProcessingConfiguration;
        /**
         * Gets the image processing configuration used either in this material.
         */
        get imageProcessingConfiguration(): ImageProcessingConfiguration;
        /**
         * Sets the Default image processing configuration used either in the this material.
         *
         * If sets to null, the scene one is in use.
         */
        set imageProcessingConfiguration(value: ImageProcessingConfiguration);
        /**
         * If the post process is supported.
         */
        get isSupported(): boolean;
        /**
         * Gets Color curves setup used in the effect if colorCurvesEnabled is set to true .
         */
        get colorCurves(): Nullable<ColorCurves>;
        /**
         * Sets Color curves setup used in the effect if colorCurvesEnabled is set to true .
         */
        set colorCurves(value: Nullable<ColorCurves>);
        /**
         * Gets whether the color curves effect is enabled.
         */
        get colorCurvesEnabled(): boolean;
        /**
         * Sets whether the color curves effect is enabled.
         */
        set colorCurvesEnabled(value: boolean);
        /**
         * Gets Color grading LUT texture used in the effect if colorGradingEnabled is set to true.
         */
        get colorGradingTexture(): Nullable<BaseTexture>;
        /**
         * Sets Color grading LUT texture used in the effect if colorGradingEnabled is set to true.
         */
        set colorGradingTexture(value: Nullable<BaseTexture>);
        /**
         * Gets whether the color grading effect is enabled.
         */
        get colorGradingEnabled(): boolean;
        /**
         * Gets whether the color grading effect is enabled.
         */
        set colorGradingEnabled(value: boolean);
        /**
         * Gets exposure used in the effect.
         */
        get exposure(): number;
        /**
         * Sets exposure used in the effect.
         */
        set exposure(value: number);
        /**
         * Gets whether tonemapping is enabled or not.
         */
        get toneMappingEnabled(): boolean;
        /**
         * Sets whether tonemapping is enabled or not
         */
        set toneMappingEnabled(value: boolean);
        /**
         * Gets the type of tone mapping effect.
         */
        get toneMappingType(): number;
        /**
         * Sets the type of tone mapping effect.
         */
        set toneMappingType(value: number);
        /**
         * Gets contrast used in the effect.
         */
        get contrast(): number;
        /**
         * Sets contrast used in the effect.
         */
        set contrast(value: number);
        /**
         * Gets Vignette stretch size.
         */
        get vignetteStretch(): number;
        /**
         * Sets Vignette stretch size.
         */
        set vignetteStretch(value: number);
        /**
         * Gets Vignette center X Offset.
         * @deprecated use vignetteCenterX instead
         */
        get vignetteCentreX(): number;
        /**
         * Sets Vignette center X Offset.
         * @deprecated use vignetteCenterX instead
         */
        set vignetteCentreX(value: number);
        /**
         * Gets Vignette center Y Offset.
         * @deprecated use vignetteCenterY instead
         */
        get vignetteCentreY(): number;
        /**
         * Sets Vignette center Y Offset.
         * @deprecated use vignetteCenterY instead
         */
        set vignetteCentreY(value: number);
        /**
         * Vignette center Y Offset.
         */
        get vignetteCenterY(): number;
        set vignetteCenterY(value: number);
        /**
         * Vignette center X Offset.
         */
        get vignetteCenterX(): number;
        set vignetteCenterX(value: number);
        /**
         * Gets Vignette weight or intensity of the vignette effect.
         */
        get vignetteWeight(): number;
        /**
         * Sets Vignette weight or intensity of the vignette effect.
         */
        set vignetteWeight(value: number);
        /**
         * Gets Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
         * if vignetteEnabled is set to true.
         */
        get vignetteColor(): Color4;
        /**
         * Sets Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
         * if vignetteEnabled is set to true.
         */
        set vignetteColor(value: Color4);
        /**
         * Gets Camera field of view used by the Vignette effect.
         */
        get vignetteCameraFov(): number;
        /**
         * Sets Camera field of view used by the Vignette effect.
         */
        set vignetteCameraFov(value: number);
        /**
         * Gets the vignette blend mode allowing different kind of effect.
         */
        get vignetteBlendMode(): number;
        /**
         * Sets the vignette blend mode allowing different kind of effect.
         */
        set vignetteBlendMode(value: number);
        /**
         * Gets whether the vignette effect is enabled.
         */
        get vignetteEnabled(): boolean;
        /**
         * Sets whether the vignette effect is enabled.
         */
        set vignetteEnabled(value: boolean);
        /**
         * Gets intensity of the dithering effect.
         */
        get ditheringIntensity(): number;
        /**
         * Sets intensity of the dithering effect.
         */
        set ditheringIntensity(value: number);
        /**
         * Gets whether the dithering effect is enabled.
         */
        get ditheringEnabled(): boolean;
        /**
         * Sets whether the dithering effect is enabled.
         */
        set ditheringEnabled(value: boolean);
        /**
         * Gets whether the input of the processing is in Gamma or Linear Space.
         */
        get fromLinearSpace(): boolean;
        /**
         * Sets whether the input of the processing is in Gamma or Linear Space.
         */
        set fromLinearSpace(value: boolean);
        protected _effectWrapper: ThinImageProcessingPostProcess;
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, imageProcessingConfiguration?: ImageProcessingConfiguration);
        /**
         *  "ImageProcessingPostProcess"
         * @returns "ImageProcessingPostProcess"
         */
        getClassName(): string;
        /**
         * @internal
         */
        _updateParameters(): void;
        dispose(camera?: Camera): void;
    }


    /**
     * Extracts highlights from the image
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses
     */
    export class HighlightsPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "HighlightsPostProcess" string
         */
        getClassName(): string;
        /**
         * Extracts highlights from the image
         * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of texture for the post process (default: Engine.TEXTURETYPE_UNSIGNED_BYTE)
         */
        constructor(name: string, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number);
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The GrainPostProcess adds noise to the image at mid luminance levels
     */
    export class GrainPostProcess extends PostProcess {
        /**
         * The intensity of the grain added (default: 30)
         */
        get intensity(): number;
        set intensity(value: number);
        /**
         * If the grain should be randomized on every frame
         */
        get animated(): boolean;
        set animated(value: boolean);
        /**
         * Gets a string identifying the name of the class
         * @returns "GrainPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinGrainPostProcess;
        /**
         * Creates a new instance of @see GrainPostProcess
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): GrainPostProcess;
    }
    /**
     * Register side effects for grainPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGrainPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import grainPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Fxaa post process
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#fxaa
     */
    export class FxaaPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "FxaaPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinFXAAPostProcess;
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): FxaaPostProcess;
    }
    /**
     * Register side effects for fxaaPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFxaaPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fxaaPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Applies a kernel filter to the image
     */
    export class FilterPostProcess extends PostProcess {
        /** The matrix to be applied to the image */
        get kernelMatrix(): Matrix;
        set kernelMatrix(value: Matrix);
        /**
         * Gets a string identifying the name of the class
         * @returns "FilterPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinFilterPostProcess;
        /**
         *
         * @param name The name of the effect.
         * @param kernelMatrix The matrix to be applied to the image
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, kernelMatrix: Matrix, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<FilterPostProcess>;
    }
    /**
     * Register side effects for filterPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFilterPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import filterPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The extract highlights post process sets all pixels to black except pixels above the specified luminance threshold. Used as the first step for a bloom effect.
     */
    export class ExtractHighlightsPostProcess extends PostProcess {
        /**
         * The luminance threshold, pixels below this value will be set to black.
         */
        get threshold(): number;
        set threshold(value: number);
        /** @internal */
        get _exposure(): number;
        /** @internal */
        set _exposure(value: number);
        /**
         * Post process which has the input texture to be used when performing highlight extraction
         * @internal
         */
        _inputPostProcess: Nullable<PostProcess>;
        /**
         * Gets a string identifying the name of the class
         * @returns "ExtractHighlightsPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinExtractHighlightsPostProcess;
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
    }
    /**
     * Register side effects for extractHighlightsPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterExtractHighlightsPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import extractHighlightsPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * DisplayPassPostProcess which produces an output the same as it's input
     */
    export class DisplayPassPostProcess extends PostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "DisplayPassPostProcess" string
         */
        getClassName(): string;
        /**
         * Creates the DisplayPassPostProcess
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<DisplayPassPostProcess>;
    }
    /**
     * Register side effects for displayPassPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDisplayPassPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import displayPassPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * The DepthOfFieldMergePostProcess merges blurred images with the original based on the values of the circle of confusion.
     */
    export class DepthOfFieldMergePostProcess extends PostProcess {
        private _blurSteps;
        /**
         * Gets a string identifying the name of the class
         * @returns "DepthOfFieldMergePostProcess" string
         */
        getClassName(): string;
        /**
         * Creates a new instance of DepthOfFieldMergePostProcess
         * @param name The name of the effect.
         * @param originalFromInput Post process which's input will be used for the merge.
         * @param circleOfConfusion Circle of confusion post process which's output will be used to blur each pixel.
         * @param _blurSteps Blur post processes from low to high which will be mixed with the original image.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, originalFromInput: PostProcess, circleOfConfusion: PostProcess, _blurSteps: Array<PostProcess>, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * Updates the effect with the current post process compile time values and recompiles the shader.
         * @param defines Define statements that should be added at the beginning of the shader. (default: null)
         * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)
         * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)
         * @param indexParameters The index parameters to be used for babylons include syntax "#include<kernelBlurVaryingDeclaration>[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx
         * @param onCompiled Called when the shader has been compiled.
         * @param onError Called if there is an error when compiling a shader.
         */
        updateEffect(defines?: Nullable<string>, uniforms?: Nullable<string[]>, samplers?: Nullable<string[]>, indexParameters?: any, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void;
    }


    /**
     * Specifies the level of max blur that should be applied when using the depth of field effect
     */
    export enum DepthOfFieldEffectBlurLevel {
        /**
         * Subtle blur
         */
        Low = 0,
        /**
         * Medium blur
         */
        Medium = 1,
        /**
         * Large blur
         */
        High = 2
    }
    /**
     * The depth of field effect applies a blur to objects that are closer or further from where the camera is focusing.
     */
    export class DepthOfFieldEffect extends PostProcessRenderEffect {
        private _circleOfConfusion;
        /**
         * @internal Internal, blurs from high to low
         */
        _depthOfFieldBlurX: Array<DepthOfFieldBlurPostProcess>;
        private _depthOfFieldBlurY;
        private _dofMerge;
        /**
         * @internal Internal post processes in depth of field effect
         */
        _effects: Array<PostProcess>;
        /**
         * The focal the length of the camera used in the effect in scene units/1000 (eg. millimeter)
         */
        set focalLength(value: number);
        get focalLength(): number;
        /**
         * F-Stop of the effect's camera. The diameter of the resulting aperture can be computed by lensSize/fStop. (default: 1.4)
         */
        set fStop(value: number);
        get fStop(): number;
        /**
         * Distance away from the camera to focus on in scene units/1000 (eg. millimeter). (default: 2000)
         */
        set focusDistance(value: number);
        get focusDistance(): number;
        /**
         * Max lens size in scene units/1000 (eg. millimeter). Standard cameras are 50mm. (default: 50) The diameter of the resulting aperture can be computed by lensSize/fStop.
         */
        set lensSize(value: number);
        get lensSize(): number;
        private _thinDepthOfFieldEffect;
        /**
         * Creates a new instance DepthOfFieldEffect
         * @param sceneOrEngine The scene or engine the effect belongs to.
         * @param depthTexture The depth texture of the scene to compute the circle of confusion.This must be set in order for this to function but may be set after initialization if needed.
         * @param blurLevel
         * @param pipelineTextureType The type of texture to be used when performing the post processing.
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         * @param depthNotNormalized If the depth from the depth texture is already normalized or if the normalization should be done at runtime in the shader (default: false)
         */
        constructor(sceneOrEngine: Scene | AbstractEngine, depthTexture: Nullable<RenderTargetTexture>, blurLevel?: DepthOfFieldEffectBlurLevel, pipelineTextureType?: number, blockCompilation?: boolean, depthNotNormalized?: boolean);
        /**
         * Get the current class name of the current effect
         * @returns "DepthOfFieldEffect"
         */
        getClassName(): string;
        /**
         * Depth texture to be used to compute the circle of confusion. This must be set here or in the constructor in order for the post process to function.
         */
        set depthTexture(value: RenderTargetTexture);
        /**
         * Disposes each of the internal effects for a given camera.
         * @param camera The camera to dispose the effect on.
         */
        disposeEffects(camera: Camera): void;
        /**
         * @internal Internal
         */
        _updateEffects(): void;
        /**
         * Internal
         * @returns if all the contained post processes are ready.
         * @internal
         */
        _isReady(): boolean;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The DepthOfFieldBlurPostProcess applied a blur in a give direction.
     * This blur differs from the standard BlurPostProcess as it attempts to avoid blurring pixels
     * based on samples that have a large difference in distance than the center pixel.
     * See section 2.6.2 http://fileadmin.cs.lth.se/cs/education/edan35/lectures/12dof.pdf
     */
    export class DepthOfFieldBlurPostProcess extends BlurPostProcess {
        /**
         * Gets a string identifying the name of the class
         * @returns "DepthOfFieldBlurPostProcess" string
         */
        getClassName(): string;
        /**
         * Creates a new instance DepthOfFieldBlurPostProcess
         * @param name The name of the effect.
         * @param _scene The scene the effect belongs to (not used, you can pass null)
         * @param direction The direction the blur should be applied.
         * @param kernel The size of the kernel used to blur.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param circleOfConfusion The circle of confusion + depth map to be used to avoid blurring across edges
         * @param imageToBlur The image to apply the blur to (default: Current rendered frame)
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)
         */
        constructor(name: string, _scene: Nullable<Scene>, direction: Vector2, kernel: number, options: number | PostProcessOptions, camera: Nullable<Camera>, circleOfConfusion: PostProcess, imageToBlur?: Nullable<PostProcess>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean, textureFormat?: number);
    }
    /**
     * Register side effects for depthOfFieldBlurPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDepthOfFieldBlurPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import depthOfFieldBlurPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The ConvolutionPostProcess applies a 3x3 kernel to every pixel of the
     * input texture to perform effects such as edge detection or sharpening
     * See http://en.wikipedia.org/wiki/Kernel_(image_processing)
     */
    export class ConvolutionPostProcess extends PostProcess {
        /** Array of 9 values corresponding to the 3x3 kernel to be applied */
        get kernel(): number[];
        set kernel(value: number[]);
        /**
         * Gets a string identifying the name of the class
         * @returns "ConvolutionPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinConvolutionPostProcess;
        /**
         * Creates a new instance ConvolutionPostProcess
         * @param name The name of the effect.
         * @param kernel Array of 9 values corresponding to the 3x3 kernel to be applied
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         */
        constructor(name: string, kernel: number[], options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<ConvolutionPostProcess>;
        /**
         * Edge detection 0 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect0Kernel: number[];
        /**
         * Edge detection 1 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect1Kernel: number[];
        /**
         * Edge detection 2 see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EdgeDetect2Kernel: number[];
        /**
         * Kernel to sharpen an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static SharpenKernel: number[];
        /**
         * Kernel to emboss an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static EmbossKernel: number[];
        /**
         * Kernel to blur an image see https://en.wikipedia.org/wiki/Kernel_(image_processing)
         */
        static GaussianKernel: number[];
    }
    /**
     * Register side effects for convolutionPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterConvolutionPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import convolutionPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     *
     * This post-process allows the modification of rendered colors by using
     * a 'look-up table' (LUT). This effect is also called Color Grading.
     *
     * The object needs to be provided an url to a texture containing the color
     * look-up table: the texture must be 256 pixels wide and 16 pixels high.
     * Use an image editing software to tweak the LUT to match your needs.
     *
     * For an example of a color LUT, see here:
     * @see http://udn.epicgames.com/Three/rsrc/Three/ColorGrading/RGBTable16x1.png
     * For explanations on color grading, see here:
     * @see http://udn.epicgames.com/Three/ColorGrading.html
     *
     */
    export class ColorCorrectionPostProcess extends PostProcess {
        /**
         * Gets the color table url used to create the LUT texture
         */
        get colorTableUrl(): string;
        /**
         * Gets a string identifying the name of the class
         * @returns "ColorCorrectionPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinColorCorrectionPostProcess;
        constructor(name: string, colorTableUrl: string, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<ColorCorrectionPostProcess>;
    }
    /**
     * Register side effects for colorCorrectionPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorCorrectionPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorCorrectionPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export type CircleOfConfusionPostProcessOptions = ThinCircleOfConfusionPostProcessOptions & PostProcessOptions;
    /**
     * The CircleOfConfusionPostProcess computes the circle of confusion value for each pixel given required lens parameters. See https://en.wikipedia.org/wiki/Circle_of_confusion
     */
    export class CircleOfConfusionPostProcess extends PostProcess {
        /**
         * Max lens size in scene units/1000 (eg. millimeter). Standard cameras are 50mm. (default: 50) The diameter of the resulting aperture can be computed by lensSize/fStop.
         */
        get lensSize(): number;
        set lensSize(value: number);
        /**
         * F-Stop of the effect's camera. The diameter of the resulting aperture can be computed by lensSize/fStop. (default: 1.4)
         */
        get fStop(): number;
        set fStop(value: number);
        /**
         * Distance away from the camera to focus on in scene units/1000 (eg. millimeter). (default: 2000)
         */
        get focusDistance(): number;
        set focusDistance(value: number);
        /**
         * Focal length of the effect's camera in scene units/1000 (eg. millimeter). (default: 50)
         */
        get focalLength(): number;
        set focalLength(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "CircleOfConfusionPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinCircleOfConfusionPostProcess;
        private _depthTexture;
        /**
         * Creates a new instance CircleOfConfusionPostProcess
         * @param name The name of the effect.
         * @param depthTexture The depth texture of the scene to compute the circle of confusion. This must be set in order for this to function but may be set after initialization if needed.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, depthTexture: Nullable<RenderTargetTexture>, options: number | CircleOfConfusionPostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * Depth texture to be used to compute the circle of confusion. This must be set here or in the constructor in order for the post process to function.
         */
        set depthTexture(value: RenderTargetTexture);
    }
    /**
     * Register side effects for circleOfConfusionPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCircleOfConfusionPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import circleOfConfusionPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The ChromaticAberrationPostProcess separates the rgb channels in an image to produce chromatic distortion around the edges of the screen
     */
    export class ChromaticAberrationPostProcess extends PostProcess {
        /**
         * The amount of separation of rgb channels (default: 30)
         */
        get aberrationAmount(): number;
        set aberrationAmount(value: number);
        /**
         * The amount the effect will increase for pixels closer to the edge of the screen. (default: 0)
         */
        get radialIntensity(): number;
        set radialIntensity(value: number);
        /**
         * The normalized direction in which the rgb channels should be separated. If set to 0,0 radial direction will be used. (default: Vector2(0.707,0.707))
         */
        get direction(): Vector2;
        set direction(value: Vector2);
        /**
         * The center position where the radialIntensity should be around. [0.5,0.5 is center of screen, 1,1 is top right corner] (default: Vector2(0.5 ,0.5))
         */
        get centerPosition(): Vector2;
        set centerPosition(value: Vector2);
        /** The width of the screen to apply the effect on */
        get screenWidth(): number;
        set screenWidth(value: number);
        /** The height of the screen to apply the effect on */
        get screenHeight(): number;
        set screenHeight(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "ChromaticAberrationPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinChromaticAberrationPostProcess;
        /**
         * Creates a new instance ChromaticAberrationPostProcess
         * @param name The name of the effect.
         * @param screenWidth The width of the screen to apply the effect on.
         * @param screenHeight The height of the screen to apply the effect on.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, screenWidth: number, screenHeight: number, options: number | PostProcessOptions, camera: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<ChromaticAberrationPostProcess>;
    }
    /**
     * Register side effects for chromaticAberrationPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterChromaticAberrationPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import chromaticAberrationPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The Blur Post Process which blurs an image based on a kernel and direction.
     * Can be used twice in x and y directions to perform a gaussian blur in two passes.
     */
    export class BlurPostProcess extends PostProcess {
        /** The direction in which to blur the image. */
        get direction(): Vector2;
        set direction(value: Vector2);
        /**
         * Sets the length in pixels of the blur sample region
         */
        set kernel(v: number);
        /**
         * Gets the length in pixels of the blur sample region
         */
        get kernel(): number;
        /**
         * Sets whether or not the blur needs to unpack/repack floats
         */
        set packedFloat(v: boolean);
        /**
         * Gets whether or not the blur is unpacking/repacking floats
         */
        get packedFloat(): boolean;
        /**
         * Gets a string identifying the name of the class
         * @returns "BlurPostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinBlurPostProcess;
        /**
         * Creates a new instance BlurPostProcess
         * @param name The name of the effect.
         * @param direction The direction in which to blur the image.
         * @param kernel The size of the kernel to be used when computing the blur. eg. Size of 3 will blur the center pixel by 2 pixels surrounding it.
         * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param defines
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)
         */
        constructor(name: string, direction: Vector2, kernel: number, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, defines?: string, blockCompilation?: boolean, textureFormat?: number);
        /**
         * Updates the effect with the current post process compile time values and recompiles the shader
         * @param _defines the post process defines
         * @param _uniforms the post process uniforms
         * @param _samplers the post process samplers
         * @param _indexParameters the index parameters
         * @param onCompiled callback called when the shader is compiled
         * @param onError callback called if there is an error
         */
        updateEffect(_defines?: Nullable<string>, _uniforms?: Nullable<string[]>, _samplers?: Nullable<string[]>, _indexParameters?: any, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void;
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<BlurPostProcess>;
    }
    /**
     * Register side effects for blurPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBlurPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import blurPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The BloomMergePostProcess merges blurred images with the original based on the values of the circle of confusion.
     */
    export class BloomMergePostProcess extends PostProcess {
        /** Weight of the bloom to be added to the original input. */
        get weight(): number;
        set weight(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "BloomMergePostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinBloomMergePostProcess;
        /**
         * Creates a new instance of @see BloomMergePostProcess
         * @param name The name of the effect.
         * @param originalFromInput Post process which's input will be used for the merge.
         * @param blurred Blurred highlights post process which's output will be used.
         * @param weight Weight of the bloom to be added to the original input.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(name: string, originalFromInput: PostProcess, blurred: PostProcess, weight: number, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, blockCompilation?: boolean);
    }
    /**
     * Register side effects for bloomMergePostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBloomMergePostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import bloomMergePostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * The bloom effect spreads bright areas of an image to simulate artifacts seen in cameras
     */
    export class BloomEffect extends PostProcessRenderEffect {
        /**
         * @internal Internal
         */
        _effects: Array<PostProcess>;
        /**
         * @internal Internal
         */
        _downscale: ExtractHighlightsPostProcess;
        private _blurX;
        private _blurY;
        private _merge;
        /**
         * The luminance threshold to find bright areas of the image to bloom.
         */
        get threshold(): number;
        set threshold(value: number);
        /**
         * The strength of the bloom.
         */
        get weight(): number;
        set weight(value: number);
        /**
         * Specifies the size of the bloom blur kernel, relative to the final output size
         */
        get kernel(): number;
        set kernel(value: number);
        get bloomScale(): number;
        private _thinBloomEffect;
        /**
         * Creates a new instance of @see BloomEffect
         * @param sceneOrEngine The scene or engine the effect belongs to.
         * @param bloomScale The ratio of the blur texture to the input texture that should be used to compute the bloom.
         * @param bloomWeight The strength of bloom.
         * @param bloomKernel The size of the kernel to be used when applying the blur.
         * @param pipelineTextureType The type of texture to be used when performing the post processing.
         * @param blockCompilation If compilation of the shader should not be done in the constructor. The updateEffect method can be used to compile the shader at a later time. (default: false)
         */
        constructor(sceneOrEngine: Scene | AbstractEngine, bloomScale: number, bloomWeight: number, bloomKernel: number, pipelineTextureType?: number, blockCompilation?: boolean);
        /**
         * Disposes each of the internal effects for a given camera.
         * @param camera The camera to dispose the effect on.
         */
        disposeEffects(camera?: Camera): void;
        /**
         * @internal Internal
         */
        _updateEffects(): void;
        /**
         * Internal
         * @returns if all the contained post processes are ready.
         * @internal
         */
        _isReady(): boolean;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Post process used to render in black and white
     */
    export class BlackAndWhitePostProcess extends PostProcess {
        /**
         * Linear about to convert he result to black and white (default: 1)
         */
        get degree(): number;
        set degree(value: number);
        /**
         * Gets a string identifying the name of the class
         * @returns "BlackAndWhitePostProcess" string
         */
        getClassName(): string;
        protected _effectWrapper: ThinBlackAndWhitePostProcess;
        /**
         * Creates a black and white post process
         * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/usePostProcesses#black-and-white
         * @param name The name of the effect.
         * @param options The required width/height ratio to downsize to before computing the render pass.
         * @param camera The camera to apply the render pass to.
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         */
        constructor(name: string, options: number | PostProcessOptions, camera?: Nullable<Camera>, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
        /**
         * @internal
         */
        static _Parse(parsedPostProcess: any, targetCamera: Camera, scene: Scene, rootUrl: string): Nullable<BlackAndWhitePostProcess>;
    }
    /**
     * Register side effects for blackAndWhitePostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBlackAndWhitePostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import blackAndWhitePostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Postprocess used to generate anaglyphic rendering
     */
    export class AnaglyphPostProcess extends PostProcess {
        private _passedProcess;
        /**
         * Gets a string identifying the name of the class
         * @returns "AnaglyphPostProcess" string
         */
        getClassName(): string;
        /**
         * Creates a new AnaglyphPostProcess
         * @param name defines postprocess name
         * @param options defines creation options or target ratio scale
         * @param rigCameras defines cameras using this postprocess
         * @param samplingMode defines required sampling mode (BABYLON.Texture.NEAREST_SAMPLINGMODE by default)
         * @param engine defines hosting engine
         * @param reusable defines if the postprocess will be reused multiple times per frame
         */
        constructor(name: string, options: number | PostProcessOptions, rigCameras: Camera[], samplingMode?: number, engine?: AbstractEngine, reusable?: boolean);
    }
    /**
     * Register side effects for anaglyphPostProcess.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAnaglyphPostProcess(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import anaglyphPostProcess.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


        interface Scene {
            /** @internal (Backing field) */
            _postProcessRenderPipelineManager: PostProcessRenderPipelineManager;
            /**
             * Gets the postprocess render pipeline manager
             * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
             * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/defaultRenderingPipeline
             */
            readonly postProcessRenderPipelineManager: PostProcessRenderPipelineManager;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the Render Pipeline scene component responsible to rendering pipelines
     */
    export class PostProcessRenderPipelineManagerSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "PostProcessRenderPipelineManager";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
        private _gatherRenderTargets;
    }
    /**
     * Register side effects for postProcessRenderPipelineManagerSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param pipelineManagerClass The PostProcessRenderPipelineManager class to use for lazy instantiation
     */
    export function RegisterPostProcessRenderPipelineManagerSceneComponent(pipelineManagerClass?: typeof PostProcessRenderPipelineManager): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import postProcessRenderPipelineManagerSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * PostProcessRenderPipelineManager class
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
     */
    export class PostProcessRenderPipelineManager {
        private readonly _renderPipelines;
        private readonly _onNewPipelineAddedObservable;
        private readonly _onPipelineRemovedObservable;
        /**
         * Initializes a PostProcessRenderPipelineManager
         * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
         */
        constructor();
        /**
         * An event triggered when a pipeline is added to the manager
         */
        get onNewPipelineAddedObservable(): IReadonlyObservable<PostProcessRenderPipeline>;
        /**
         * An event triggered when a pipeline is removed from the manager
         */
        get onPipelineRemovedObservable(): IReadonlyObservable<PostProcessRenderPipeline>;
        /**
         * Gets the list of supported render pipelines
         */
        get supportedPipelines(): PostProcessRenderPipeline[];
        /**
         * Adds a pipeline to the manager
         * @param renderPipeline The pipeline to add
         */
        addPipeline(renderPipeline: PostProcessRenderPipeline): void;
        /**
         * Remove the pipeline from the manager
         * @param renderPipelineName the name of the pipeline to remove
         */
        removePipeline(renderPipelineName: string): void;
        /**
         * Attaches a camera to the pipeline
         * @param renderPipelineName The name of the pipeline to attach to
         * @param cameras the camera to attach
         * @param unique if the camera can be attached multiple times to the pipeline
         */
        attachCamerasToRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera, unique?: boolean): void;
        /**
         * Detaches a camera from the pipeline
         * @param renderPipelineName The name of the pipeline to detach from
         * @param cameras the camera to detach
         */
        detachCamerasFromRenderPipeline(renderPipelineName: string, cameras: Camera[] | Camera): void;
        /**
         * Enables an effect by name on a pipeline
         * @param renderPipelineName the name of the pipeline to enable the effect in
         * @param renderEffectName the name of the effect to enable
         * @param cameras the cameras that the effect should be enabled on
         */
        enableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void;
        /**
         * Disables an effect by name on a pipeline
         * @param renderPipelineName the name of the pipeline to disable the effect in
         * @param renderEffectName the name of the effect to disable
         * @param cameras the cameras that the effect should be disabled on
         */
        disableEffectInPipeline(renderPipelineName: string, renderEffectName: string, cameras: Camera[] | Camera): void;
        /**
         * Updates the state of all contained render pipelines and disposes of any non supported pipelines
         */
        update(): void;
        /** @internal */
        _rebuild(): void;
        /**
         * Disposes of the manager and pipelines
         */
        dispose(): void;
    }


    /**
     * PostProcessRenderPipeline
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
     */
    export class PostProcessRenderPipeline {
        private _engine;
        protected _renderEffects: {
            [key: string]: PostProcessRenderEffect;
        };
        protected _renderEffectsForIsolatedPass: PostProcessRenderEffect[];
        /**
         * List of inspectable custom properties (used by the Inspector)
         * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
         */
        inspectableCustomProperties: IInspectable[];
        /**
         * @internal
         */
        protected _cameras: Camera[];
        /** @internal */
        _name: string;
        /**
         * Gets pipeline name
         */
        get name(): string;
        /**
         * Gets the unique id of the post process rendering pipeline
         */
        readonly uniqueId: number;
        /** Gets the list of attached cameras */
        get cameras(): Camera[];
        /**
         * Gets the active engine
         */
        get engine(): AbstractEngine;
        /**
         * Initializes a PostProcessRenderPipeline
         * @param _engine engine to add the pipeline to
         * @param name name of the pipeline
         */
        constructor(_engine: AbstractEngine, name: string);
        /**
         * Gets the class name
         * @returns "PostProcessRenderPipeline"
         */
        getClassName(): string;
        /**
         * If all the render effects in the pipeline are supported
         */
        get isSupported(): boolean;
        /**
         * Adds an effect to the pipeline
         * @param renderEffect the effect to add
         */
        addEffect(renderEffect: PostProcessRenderEffect): void;
        /** @internal */
        _rebuild(): void;
        /** @internal */
        _enableEffect(renderEffectName: string, cameras: Camera): void;
        /** @internal */
        _enableEffect(renderEffectName: string, cameras: Camera[]): void;
        /** @internal */
        _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;
        /** @internal */
        _disableEffect(renderEffectName: string, cameras: Nullable<Camera[]>): void;
        /** @internal */
        _attachCameras(cameras: Camera, unique: boolean): void;
        /** @internal */
        _attachCameras(cameras: Camera[], unique: boolean): void;
        /** @internal */
        _detachCameras(cameras: Camera): void;
        /** @internal */
        _detachCameras(cameras: Nullable<Camera[]>): void;
        /** @internal */
        _update(): void;
        /** @internal */
        _reset(): void;
        protected _enableMSAAOnFirstPostProcess(sampleCount: number): boolean;
        /**
         * Ensures that all post processes in the pipeline are the correct size according to the
         * the viewport's required size
         */
        protected _adaptPostProcessesToViewPort(): void;
        /**
         * Sets the required values to the prepass renderer.
         * @param prePassRenderer defines the prepass renderer to setup.
         * @returns true if the pre pass is needed.
         */
        setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean;
        /**
         * Disposes of the pipeline
         */
        dispose(): void;
    }


    /**
     * This represents a set of one or more post processes in Babylon.
     * A post process can be used to apply a shader to a texture after it is rendered.
     * @example https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/postProcessRenderPipeline
     */
    export class PostProcessRenderEffect {
        private _postProcesses;
        private _getPostProcesses;
        private _singleInstance;
        private _cameras;
        private _indicesForCamera;
        /**
         * Name of the effect
         * @internal
         */
        _name: string;
        /**
         * Instantiates a post process render effect.
         * A post process can be used to apply a shader to a texture after it is rendered.
         * @param engine The engine the effect is tied to
         * @param name The name of the effect
         * @param getPostProcesses A function that returns a set of post processes which the effect will run in order to be run.
         * @param singleInstance False if this post process can be run on multiple cameras. (default: true)
         */
        constructor(engine: AbstractEngine, name: string, getPostProcesses: () => Nullable<PostProcess | Array<PostProcess>>, singleInstance?: boolean);
        /**
         * Checks if all the post processes in the effect are supported.
         */
        get isSupported(): boolean;
        /**
         * Updates the current state of the effect
         * @internal
         */
        _update(): void;
        /**
         * Attaches the effect on cameras
         * @param cameras The camera to attach to.
         * @internal
         */
        _attachCameras(cameras: Camera): void;
        /**
         * Attaches the effect on cameras
         * @param cameras The camera to attach to.
         * @internal
         */
        _attachCameras(cameras: Camera[]): void;
        /**
         * Detaches the effect on cameras
         * @param cameras The camera to detach from.
         * @internal
         */
        _detachCameras(cameras: Camera): void;
        /**
         * Detaches the effect on cameras
         * @param cameras The camera to detach from.
         * @internal
         */
        _detachCameras(cameras: Camera[]): void;
        /**
         * Enables the effect on given cameras
         * @param cameras The camera to enable.
         * @internal
         */
        _enable(cameras: Camera): void;
        /**
         * Enables the effect on given cameras
         * @param cameras The camera to enable.
         * @internal
         */
        _enable(cameras: Nullable<Camera[]>): void;
        /**
         * Disables the effect on the given cameras
         * @param cameras The camera to disable.
         * @internal
         */
        _disable(cameras: Camera): void;
        /**
         * Disables the effect on the given cameras
         * @param cameras The camera to disable.
         * @internal
         */
        _disable(cameras: Nullable<Camera[]>): void;
        /**
         * Gets a list of the post processes contained in the effect.
         * @param camera The camera to get the post processes on.
         * @returns The list of the post processes in the effect.
         */
        getPostProcesses(camera?: Camera): Nullable<Array<PostProcess>>;
    }




    /**
     * The SSR rendering pipeline is used to generate a reflection based on a flat mirror model.
     */
    export class ThinSSRRenderingPipeline {
        /** @internal */
        readonly _ssrPostProcess: ThinSSRPostProcess;
        /** @internal */
        readonly _ssrBlurXPostProcess: ThinSSRBlurPostProcess;
        /** @internal */
        readonly _ssrBlurYPostProcess: ThinSSRBlurPostProcess;
        /** @internal */
        readonly _ssrBlurCombinerPostProcess: ThinSSRBlurCombinerPostProcess;
        /**
         * Gets or sets the name of the rendering pipeline
         */
        name: string;
        /**
         * Gets or sets a boolean indicating if the SSR rendering pipeline is supported
         */
        get isSSRSupported(): boolean;
        set isSSRSupported(supported: boolean);
        /**
         * Gets or sets the maxDistance used to define how far we look for reflection during the ray-marching on the reflected ray (default: 1000).
         * Note that this value is a view (camera) space distance (not pixels!).
         */
        get maxDistance(): number;
        set maxDistance(distance: number);
        /**
         * Gets or sets the step size used to iterate until the effect finds the color of the reflection's pixel. Should be an integer \>= 1 as it is the number of pixels we advance at each step (default: 1).
         * Use higher values to improve performances (but at the expense of quality).
         */
        get step(): number;
        set step(step: number);
        /**
         * Gets or sets the thickness value used as tolerance when computing the intersection between the reflected ray and the scene (default: 0.5).
         * If setting "enableAutomaticThicknessComputation" to true, you can use lower values for "thickness" (even 0), as the geometry thickness
         * is automatically computed thank to the regular depth buffer + the backface depth buffer
         */
        get thickness(): number;
        set thickness(thickness: number);
        /**
         * Gets or sets the current reflection strength. 1.0 is an ideal value but can be increased/decreased for particular results (default: 1).
         */
        get strength(): number;
        set strength(strength: number);
        /**
         * Gets or sets the falloff exponent used to compute the reflection strength. Higher values lead to fainter reflections (default: 1).
         */
        get reflectionSpecularFalloffExponent(): number;
        set reflectionSpecularFalloffExponent(exponent: number);
        /**
         * Maximum number of steps during the ray marching process after which we consider an intersection could not be found (default: 1000).
         * Should be an integer value.
         */
        get maxSteps(): number;
        set maxSteps(steps: number);
        /**
         * Gets or sets the factor applied when computing roughness. Default value is 0.2.
         * When blurring based on roughness is enabled (meaning blurDispersionStrength \> 0), roughnessFactor is used as a global roughness factor applied on all objects.
         * If you want to disable this global roughness set it to 0.
         */
        get roughnessFactor(): number;
        set roughnessFactor(factor: number);
        /**
         * Number of steps to skip at start when marching the ray to avoid self collisions (default: 1)
         * 1 should normally be a good value, depending on the scene you may need to use a higher value (2 or 3)
         */
        get selfCollisionNumSkip(): number;
        set selfCollisionNumSkip(skip: number);
        /**
         * Gets or sets the minimum value for one of the reflectivity component of the material to consider it for SSR (default: 0.04).
         * If all r/g/b components of the reflectivity is below or equal this value, the pixel will not be considered reflective and SSR won't be applied.
         */
        get reflectivityThreshold(): number;
        set reflectivityThreshold(threshold: number);
        /**
         * Gets or sets the downsample factor used to reduce the size of the texture used to compute the SSR contribution (default: 0).
         * Use 0 to render the SSR contribution at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
         * Note that it is used only when blurring is enabled (blurDispersionStrength \> 0), because in that mode the SSR contribution is generated in a separate texture.
         */
        ssrDownsample: number;
        /**
         * Gets or sets the blur dispersion strength. Set this value to 0 to disable blurring (default: 0.03)
         * The reflections are blurred based on the roughness of the surface and the distance between the pixel shaded and the reflected pixel: the higher the distance the more blurry the reflection is.
         * blurDispersionStrength allows to increase or decrease this effect.
         */
        get blurDispersionStrength(): number;
        set blurDispersionStrength(strength: number);
        /**
         * Gets or sets the downsample factor used to reduce the size of the textures used to blur the reflection effect (default: 0).
         * Use 0 to blur at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
         */
        blurDownsample: number;
        /**
         * Gets or sets whether or not smoothing reflections is enabled (default: false)
         * Enabling smoothing will require more GPU power.
         * Note that this setting has no effect if step = 1: it's only used if step \> 1.
         */
        get enableSmoothReflections(): boolean;
        set enableSmoothReflections(enabled: boolean);
        /**
         * Gets or sets the environment cube texture used to define the reflection when the reflected rays of SSR leave the view space or when the maxDistance/maxSteps is reached.
         */
        get environmentTexture(): Nullable<CubeTexture>;
        set environmentTexture(texture: Nullable<CubeTexture>);
        /**
         * Gets or sets the boolean defining if the environment texture is a standard cubemap (false) or a probe (true). Default value is false.
         * Note: a probe cube texture is treated differently than an ordinary cube texture because the Y axis is reversed.
         */
        get environmentTextureIsProbe(): boolean;
        set environmentTextureIsProbe(isProbe: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated at the screen borders (default: true).
         */
        get attenuateScreenBorders(): boolean;
        set attenuateScreenBorders(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated according to the distance of the intersection (default: true).
         */
        get attenuateIntersectionDistance(): boolean;
        set attenuateIntersectionDistance(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated according to the number of iterations performed to find the intersection (default: true).
         */
        get attenuateIntersectionIterations(): boolean;
        set attenuateIntersectionIterations(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated when the reflection ray is facing the camera (the view direction) (default: false).
         */
        get attenuateFacingCamera(): boolean;
        set attenuateFacingCamera(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the backface reflections should be attenuated (default: false).
         */
        get attenuateBackfaceReflection(): boolean;
        set attenuateBackfaceReflection(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the ray should be clipped to the frustum (default: true).
         * You can try to set this parameter to false to save some performances: it may produce some artefacts in some cases, but generally they won't really be visible
         */
        get clipToFrustum(): boolean;
        set clipToFrustum(clip: boolean);
        /**
         * Gets or sets a boolean indicating whether the blending between the current color pixel and the reflection color should be done with a Fresnel coefficient (default: false).
         * It is more physically accurate to use the Fresnel coefficient (otherwise it uses the reflectivity of the material for blending), but it is also more expensive when you use blur (when blurDispersionStrength \> 0).
         */
        get useFresnel(): boolean;
        set useFresnel(fresnel: boolean);
        /**
         * Gets or sets a boolean defining if geometry thickness should be computed automatically (default: false).
         * When enabled, a depth renderer is created which will render the back faces of the scene to a depth texture (meaning additional work for the GPU).
         * In that mode, the "thickness" property is still used as an offset to compute the ray intersection, but you can typically use a much lower
         * value than when enableAutomaticThicknessComputation is false (it's even possible to use a value of 0 when using low values for "step")
         * Note that for performance reasons, this option will only apply to the first camera to which the rendering pipeline is attached!
         */
        get enableAutomaticThicknessComputation(): boolean;
        set enableAutomaticThicknessComputation(automatic: boolean);
        /**
         * Gets or sets a boolean defining if the input color texture is in gamma space (default: true)
         * The SSR effect works in linear space, so if the input texture is in gamma space, we must convert the texture to linear space before applying the effect
         */
        get inputTextureColorIsInGammaSpace(): boolean;
        set inputTextureColorIsInGammaSpace(gammaSpace: boolean);
        /**
         * Gets or sets a boolean defining if the output color texture generated by the SSR pipeline should be in gamma space (default: true)
         * If you have a post-process that comes after the SSR and that post-process needs the input to be in a linear space, you must disable generateOutputInGammaSpace
         */
        get generateOutputInGammaSpace(): boolean;
        set generateOutputInGammaSpace(gammaSpace: boolean);
        /**
         * Gets or sets a boolean indicating if the effect should be rendered in debug mode (default: false).
         * In this mode, colors have this meaning:
         *   - blue: the ray hit the max distance (we reached maxDistance)
         *   - red: the ray ran out of steps (we reached maxSteps)
         *   - yellow: the ray went off screen
         *   - green: the ray hit a surface. The brightness of the green color is proportional to the distance between the ray origin and the intersection point: A brighter green means more computation than a darker green.
         * In the first 3 cases, the final color is calculated by mixing the skybox color with the pixel color (if environmentTexture is defined), otherwise the pixel color is not modified
         * You should try to get as few blue/red/yellow pixels as possible, as this means that the ray has gone further than if it had hit a surface.
         */
        get debug(): boolean;
        set debug(value: boolean);
        /**
         * Gets or sets the camera to use to render the reflection
         */
        get camera(): Nullable<Camera>;
        set camera(camera: Nullable<Camera>);
        /**
         * Gets or sets a boolean indicating if the depth buffer stores screen space depth instead of camera view space depth.
         */
        get useScreenspaceDepth(): boolean;
        set useScreenspaceDepth(use: boolean);
        /**
         * Gets or sets a boolean indicating if the normals are in world space (false by default, meaning normals are in camera view space).
         */
        get normalsAreInWorldSpace(): boolean;
        set normalsAreInWorldSpace(normalsAreInWorldSpace: boolean);
        /**
         * Gets or sets a boolean indicating if the normals are encoded as unsigned, that is normalUnsigned = normal*0.5+0.5 (false by default).
         */
        get normalsAreUnsigned(): boolean;
        set normalsAreUnsigned(normalsAreUnsigned: boolean);
        /**
         * Checks if all the post processes in the pipeline are ready.
         * @returns true if all the post processes in the pipeline are ready
         */
        isReady(): boolean;
        private _scene;
        /**
         * Constructor of the SSR rendering pipeline
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         */
        constructor(name: string, scene: Scene);
        /**
         * Disposes of the pipeline
         */
        dispose(): void;
    }


    /**
     * The SSAO2 rendering pipeline is used to generate ambient occlusion effects.
     */
    export class ThinSSAO2RenderingPipeline {
        /** @internal */
        readonly _ssaoPostProcess: ThinSSAO2PostProcess;
        /** @internal */
        readonly _ssaoBlurXPostProcess: ThinSSAO2BlurPostProcess;
        /** @internal */
        readonly _ssaoBlurYPostProcess: ThinSSAO2BlurPostProcess;
        /** @internal */
        readonly _ssaoCombinePostProcess: ThinSSAO2CombinePostProcess;
        /**
         * Gets or sets the name of the rendering pipeline
         */
        name: string;
        /**
         * The camera to which the rendering pipeline will be applied.
         */
        get camera(): Nullable<Camera>;
        set camera(camera: Nullable<Camera>);
        /**
         * Number of samples used for the SSAO calculations. Default value is 8.
         */
        set samples(n: number);
        get samples(): number;
        /**
         * The output strength of the SSAO post-process. Default value is 1.0.
         */
        get totalStrength(): number;
        set totalStrength(value: number);
        /**
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0
         */
        get radius(): number;
        set radius(value: number);
        /**
         * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.
         */
        get maxZ(): number;
        set maxZ(value: number);
        /**
         * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much.
         */
        get minZAspect(): number;
        set minZAspect(value: number);
        /**
         * The base color of the SSAO post-process
         * The final result is "base + ssao" between [0, 1]
         */
        get base(): number;
        set base(value: number);
        /**
         * Used in SSAO calculations to compensate for accuracy issues with depth values. Default 0.02.
         *
         * Normally you do not need to change this value, but you can experiment with it if you get a lot of in false self-occlusion on flat surfaces when using fewer than 16 samples. Useful range is normally [0..0.1] but higher values is allowed.
         */
        get epsilon(): number;
        set epsilon(n: number);
        /**
         * Skips the denoising (blur) stage of the SSAO calculations.
         *
         * Useful to temporarily set while experimenting with the other SSAO2 settings.
         */
        set bypassBlur(b: boolean);
        get bypassBlur(): boolean;
        /**
         * Enables the configurable bilateral denoising (blurring) filter. Default is true.
         * Set to false to instead use a legacy bilateral filter that can't be configured.
         *
         * The denoising filter runs after the SSAO calculations and is a very important step. Both options results in a so called bilateral being used, but the "expensive" one can be
         * configured in several ways to fit your scene.
         */
        set expensiveBlur(b: boolean);
        get expensiveBlur(): boolean;
        /**
         * The number of samples the bilateral filter uses in both dimensions when denoising the SSAO calculations. Default value is 16.
         *
         * A higher value should result in smoother shadows but will use more processing time in the shaders.
         *
         * A high value can cause the shadows to get to blurry or create visible artifacts (bands) near sharp details in the geometry. The artifacts can sometimes be mitigated by increasing the bilateralSoften setting.
         */
        get bilateralSamples(): number;
        set bilateralSamples(n: number);
        /**
         * Controls the shape of the denoising kernel used by the bilateral filter. Default value is 0.
         *
         * By default the bilateral filter acts like a box-filter, treating all samples on the same depth with equal weights. This is effective to maximize the denoising effect given a limited set of samples. However, it also often results in visible ghosting around sharp shadow regions and can spread out lines over large areas so they are no longer visible.
         *
         * Increasing this setting will make the filter pay less attention to samples further away from the center sample, reducing many artifacts but at the same time increasing noise.
         *
         * Useful value range is [0..1].
         */
        get bilateralSoften(): number;
        set bilateralSoften(n: number);
        /**
         * How forgiving the bilateral denoiser should be when rejecting samples. Default value is 0.
         *
         * A higher value results in the bilateral filter being more forgiving and thus doing a better job at denoising slanted and curved surfaces, but can lead to shadows spreading out around corners or between objects that are close to each other depth wise.
         *
         * Useful value range is normally [0..1], but higher values are allowed.
         */
        get bilateralTolerance(): number;
        set bilateralTolerance(n: number);
        /**
         * Indicates that the combine stage should use the current camera viewport to render the SSAO result on only a portion of the output texture (default: true).
         */
        get useViewportInCombineStage(): boolean;
        set useViewportInCombineStage(b: boolean);
        /**
         * Checks if all the post processes in the pipeline are ready.
         * @returns true if all the post processes in the pipeline are ready
         */
        isReady(): boolean;
        private _scene;
        /**
         * Constructor of the SSR rendering pipeline
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         */
        constructor(name: string, scene: Scene);
        /**
         * Disposes of the pipeline
         */
        dispose(): void;
    }


    type TAARenderingPipelineParseType = typeof TAARenderingPipelineParse;
        export namespace TAARenderingPipeline {
            let Parse: TAARenderingPipelineParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Simple implementation of Temporal Anti-Aliasing (TAA).
     * This can be used to improve image quality for still pictures (screenshots for e.g.).
     * Note that TAA post-process must be the first in the camera, so TAARenderingPipeline must be created before any other pipeline/post-processing.
     */
    export class TAARenderingPipeline extends PostProcessRenderPipeline {
        /**
         * The TAA PostProcess effect id in the pipeline
         */
        TAARenderEffect: string;
        /**
         * The pass PostProcess effect id in the pipeline
         */
        TAAPassEffect: string;
        /**
         * Number of accumulated samples (default: 16)
         */
        set samples(samples: number);
        get samples(): number;
        private _msaaSamples;
        /**
         * MSAA samples (default: 1)
         */
        set msaaSamples(samples: number);
        get msaaSamples(): number;
        /**
         * The factor used to blend the history frame with current frame (default: 0.05)
         */
        get factor(): number;
        set factor(value: number);
        /**
         * Disable TAA on camera move (default: true).
         * You generally want to keep this enabled, otherwise you will get a ghost effect when the camera moves (but if it's what you want, go for it!)
         */
        get disableOnCameraMove(): boolean;
        set disableOnCameraMove(value: boolean);
        /**
         * Enables reprojecting the history texture with a per-pixel velocity.
         */
        get reprojectHistory(): boolean;
        set reprojectHistory(reproject: boolean);
        /**
         * Clamps the history pixel to the min and max of the 3x3 pixels surrounding the target pixel.
         * This can help further reduce ghosting and artifacts.
         */
        get clampHistory(): boolean;
        set clampHistory(history: boolean);
        private _isEnabled;
        /**
         * Gets or sets a boolean indicating if the render pipeline is enabled (default: true).
         */
        get isEnabled(): boolean;
        set isEnabled(value: boolean);
        /**
         * Gets active scene
         */
        get scene(): Scene;
        private _scene;
        private _isDirty;
        private _camerasToBeAttached;
        private _textureType;
        private _taaPostProcess;
        private _taaThinPostProcess;
        private _passPostProcess;
        private _ping;
        private _pong;
        private _pingpong;
        /**
         * Returns true if TAA is supported by the running hardware
         */
        get isSupported(): boolean;
        /**
         * Constructor of the TAA rendering pipeline
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)
         * @param textureType The type of texture where the scene will be rendered (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         */
        constructor(name: string, scene: Scene, cameras?: Camera[], textureType?: number);
        /**
         * Get the class name
         * @returns "TAARenderingPipeline"
         */
        getClassName(): string;
        /**
         * Adds a camera to the pipeline
         * @param camera the camera to be added
         */
        addCamera(camera: Camera): void;
        /**
         * Removes a camera from the pipeline
         * @param camera the camera to remove
         */
        removeCamera(camera: Camera): void;
        /**
         * Removes the internal pipeline assets and detaches the pipeline from the scene cameras
         */
        dispose(): void;
        private _createPingPongTextures;
        private _updateReprojection;
        private _buildPipeline;
        private _disposePostProcesses;
        private _createTAAPostProcess;
        private _createPassPostProcess;
        /**
         * Serializes the rendering pipeline (Used when exporting)
         * @returns the serialized object
         */
        serialize(): any;
    }
    /**
     * Parse the serialized pipeline
     * @param source Source pipeline.
     * @param scene The scene to load the pipeline to.
     * @param rootUrl The URL of the serialized pipeline.
     * @returns An instantiated pipeline from the serialized object.
     */
    export function TAARenderingPipelineParse(source: any, scene: Scene, rootUrl: string): TAARenderingPipeline;
    /**
     * Register side effects for taaRenderingPipeline.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTaaRenderingPipeline(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import taaRenderingPipeline.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    class TAAJitterMaterialDefines extends MaterialDefines {
        TAA_JITTER: boolean;
    }
    class TAAJitterMaterialPlugin extends MaterialPluginBase {
        static readonly Name = "TAAJitter";
        private _manager;
        get manager(): Nullable<TAAMaterialManager>;
        set manager(manager: Nullable<TAAMaterialManager>);
        get isEnabled(): boolean;
        constructor(material: Material);
        /** @internal */
        _updateMaterial(): void;
        isCompatible(): boolean;
        getClassName(): string;
        prepareDefines(defines: TAAJitterMaterialDefines): void;
        getUniforms(shaderLanguage?: ShaderLanguage): {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            vertex: string;
        } | {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            vertex?: undefined;
        };
        hardBindForSubMesh(uniformBuffer: UniformBuffer): void;
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): {
            CUSTOM_VERTEX_MAIN_END: string;
        } | null;
        dispose(): void;
    }
    /**
     * Applies and manages the TAA jitter plugin on all materials.
     */
    export class TAAMaterialManager {
        private _isEnabled;
        /**
         * Set to enable or disable the jitter offset on all materials.
         */
        get isEnabled(): boolean;
        set isEnabled(enabled: boolean);
        /**
         * The current jitter offset to apply to all materials.
         */
        readonly jitter: Vector2;
        /** @internal */
        readonly _materialPlugins: TAAJitterMaterialPlugin[];
        /**
         * @param scene All materials in this scene will have a jitter offset applied to them.
         */
        constructor(scene: Scene);
        /**
         * Disposes of the material manager.
         */
        dispose(): void;
        private _getPlugin;
    }
    /**
     * Register side effects for taaMaterialManager.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTaaMaterialManager(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import taaMaterialManager.pure for tree-shakeable, side-effect-free usage.
     */


    type StandardRenderingPipelineParseType = typeof StandardRenderingPipelineParse;
        export namespace StandardRenderingPipeline {
            let Parse: StandardRenderingPipelineParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Standard rendering pipeline
     * Default pipeline should be used going forward but the standard pipeline will be kept for backwards compatibility.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/standardRenderingPipeline
     */
    export class StandardRenderingPipeline extends PostProcessRenderPipeline implements IDisposable, IAnimatable {
        /**
         * Public members
         */
        /**
         * Post-process which contains the original scene color before the pipeline applies all the effects
         */
        originalPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to down scale an image x4
         */
        downSampleX4PostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to calculate the illuminated surfaces controlled by a threshold
         */
        brightPassPostProcess: Nullable<PostProcess>;
        /**
         * Post-process array storing all the horizontal blur post-processes used by the pipeline
         */
        blurHPostProcesses: PostProcess[];
        /**
         * Post-process array storing all the vertical blur post-processes used by the pipeline
         */
        blurVPostProcesses: PostProcess[];
        /**
         * Post-process used to add colors of 2 textures (typically brightness + real scene color)
         */
        textureAdderPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to create volumetric lighting effect
         */
        volumetricLightPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to smooth the previous volumetric light post-process on the X axis
         */
        volumetricLightSmoothXPostProcess: Nullable<BlurPostProcess>;
        /**
         * Post-process used to smooth the previous volumetric light post-process on the Y axis
         */
        volumetricLightSmoothYPostProcess: Nullable<BlurPostProcess>;
        /**
         * Post-process used to merge the volumetric light effect and the real scene color
         */
        volumetricLightMergePostProces: Nullable<PostProcess>;
        /**
         * Post-process used to store the final volumetric light post-process (attach/detach for debug purpose)
         */
        volumetricLightFinalPostProcess: Nullable<PostProcess>;
        /**
         * Base post-process used to calculate the average luminance of the final image for HDR
         */
        luminancePostProcess: Nullable<PostProcess>;
        /**
         * Post-processes used to create down sample post-processes in order to get
         * the average luminance of the final image for HDR
         * Array of length "StandardRenderingPipeline.LuminanceSteps"
         */
        luminanceDownSamplePostProcesses: PostProcess[];
        /**
         * Post-process used to create a HDR effect (light adaptation)
         */
        hdrPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to store the final texture adder post-process (attach/detach for debug purpose)
         */
        textureAdderFinalPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to store the final lens flare post-process (attach/detach for debug purpose)
         */
        lensFlareFinalPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to merge the final HDR post-process and the real scene color
         */
        hdrFinalPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to create a lens flare effect
         */
        lensFlarePostProcess: Nullable<PostProcess>;
        /**
         * Post-process that merges the result of the lens flare post-process and the real scene color
         */
        lensFlareComposePostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to create a motion blur effect
         */
        motionBlurPostProcess: Nullable<PostProcess>;
        /**
         * Post-process used to create a depth of field effect
         */
        depthOfFieldPostProcess: Nullable<PostProcess>;
        /**
         * The Fast Approximate Anti-Aliasing post process which attempts to remove aliasing from an image.
         */
        fxaaPostProcess: Nullable<FxaaPostProcess>;
        /**
         * Post-process used to simulate realtime reflections using the screen space and geometry renderer.
         */
        screenSpaceReflectionPostProcess: Nullable<ScreenSpaceReflectionPostProcess>;
        /**
         * Represents the brightness threshold in order to configure the illuminated surfaces
         */
        brightThreshold: number;
        /**
         * Configures the blur intensity used for surexposed surfaces are highlighted surfaces (light halo)
         */
        blurWidth: number;
        /**
         * Sets if the blur for highlighted surfaces must be only horizontal
         */
        horizontalBlur: boolean;
        /**
         * Gets the overall exposure used by the pipeline
         */
        get exposure(): number;
        /**
         * Sets the overall exposure used by the pipeline
         */
        set exposure(value: number);
        /**
         * Texture used typically to simulate "dirty" on camera lens
         */
        lensTexture: Nullable<Texture>;
        /**
         * Represents the offset coefficient based on Rayleigh principle. Typically in interval [-0.2, 0.2]
         */
        volumetricLightCoefficient: number;
        /**
         * The overall power of volumetric lights, typically in interval [0, 10] maximum
         */
        volumetricLightPower: number;
        /**
         * Used the set the blur intensity to smooth the volumetric lights
         */
        volumetricLightBlurScale: number;
        /**
         * Light (spot or directional) used to generate the volumetric lights rays
         * The source light must have a shadow generate so the pipeline can get its
         * depth map
         */
        sourceLight: Nullable<SpotLight | DirectionalLight>;
        /**
         * For eye adaptation, represents the minimum luminance the eye can see
         */
        hdrMinimumLuminance: number;
        /**
         * For eye adaptation, represents the decrease luminance speed
         */
        hdrDecreaseRate: number;
        /**
         * For eye adaptation, represents the increase luminance speed
         */
        hdrIncreaseRate: number;
        /**
         * Gets whether or not the exposure of the overall pipeline should be automatically adjusted by the HDR post-process
         */
        get hdrAutoExposure(): boolean;
        /**
         * Sets whether or not the exposure of the overall pipeline should be automatically adjusted by the HDR post-process
         */
        set hdrAutoExposure(value: boolean);
        /**
         * Lens color texture used by the lens flare effect. Mandatory if lens flare effect enabled
         */
        lensColorTexture: Nullable<Texture>;
        /**
         * The overall strength for the lens flare effect
         */
        lensFlareStrength: number;
        /**
         * Dispersion coefficient for lens flare ghosts
         */
        lensFlareGhostDispersal: number;
        /**
         * Main lens flare halo width
         */
        lensFlareHaloWidth: number;
        /**
         * Based on the lens distortion effect, defines how much the lens flare result
         * is distorted
         */
        lensFlareDistortionStrength: number;
        /**
         * Configures the blur intensity used for for lens flare (halo)
         */
        lensFlareBlurWidth: number;
        /**
         * Lens star texture must be used to simulate rays on the flares and is available
         * in the documentation
         */
        lensStarTexture: Nullable<Texture>;
        /**
         * As the "lensTexture" (can be the same texture or different), it is used to apply the lens
         * flare effect by taking account of the dirt texture
         */
        lensFlareDirtTexture: Nullable<Texture>;
        /**
         * Represents the focal length for the depth of field effect
         */
        depthOfFieldDistance: number;
        /**
         * Represents the blur intensity for the blurred part of the depth of field effect
         */
        depthOfFieldBlurWidth: number;
        /**
         * Gets how much the image is blurred by the movement while using the motion blur post-process
         */
        get motionStrength(): number;
        /**
         * Sets how much the image is blurred by the movement while using the motion blur post-process
         */
        set motionStrength(strength: number);
        /**
         * Gets whether or not the motion blur post-process is object based or screen based.
         */
        get objectBasedMotionBlur(): boolean;
        /**
         * Sets whether or not the motion blur post-process should be object based or screen based
         */
        set objectBasedMotionBlur(value: boolean);
        /**
         * List of animations for the pipeline (IAnimatable implementation)
         */
        animations: Animation[];
        /**
         * Private members
         */
        private _scene;
        private _currentDepthOfFieldSource;
        private _basePostProcess;
        private _fixedExposure;
        private _currentExposure;
        private _hdrAutoExposure;
        private _hdrCurrentLuminance;
        private _motionStrength;
        private _isObjectBasedMotionBlur;
        private _floatTextureType;
        private _camerasToBeAttached;
        private _ratio;
        private _bloomEnabled;
        private _depthOfFieldEnabled;
        private _vlsEnabled;
        private _lensFlareEnabled;
        private _hdrEnabled;
        private _motionBlurEnabled;
        private _fxaaEnabled;
        private _screenSpaceReflectionsEnabled;
        private _motionBlurSamples;
        private _volumetricLightStepsCount;
        private _samples;
        /**
         * @ignore
         * Specifies if the bloom pipeline is enabled
         */
        get BloomEnabled(): boolean;
        set BloomEnabled(enabled: boolean);
        /**
         * @ignore
         * Specifies if the depth of field pipeline is enabled
         */
        get DepthOfFieldEnabled(): boolean;
        set DepthOfFieldEnabled(enabled: boolean);
        /**
         * @ignore
         * Specifies if the lens flare pipeline is enabled
         */
        get LensFlareEnabled(): boolean;
        set LensFlareEnabled(enabled: boolean);
        /**
         * @ignore
         * Specifies if the HDR pipeline is enabled
         */
        get HDREnabled(): boolean;
        set HDREnabled(enabled: boolean);
        /**
         * @ignore
         * Specifies if the volumetric lights scattering effect is enabled
         */
        get VLSEnabled(): boolean;
        set VLSEnabled(enabled: boolean);
        /**
         * @ignore
         * Specifies if the motion blur effect is enabled
         */
        get MotionBlurEnabled(): boolean;
        set MotionBlurEnabled(enabled: boolean);
        /**
         * Specifies if anti-aliasing is enabled
         */
        get fxaaEnabled(): boolean;
        set fxaaEnabled(enabled: boolean);
        /**
         * Specifies if screen space reflections are enabled.
         */
        get screenSpaceReflectionsEnabled(): boolean;
        set screenSpaceReflectionsEnabled(enabled: boolean);
        /**
         * Specifies the number of steps used to calculate the volumetric lights
         * Typically in interval [50, 200]
         */
        get volumetricLightStepsCount(): number;
        set volumetricLightStepsCount(count: number);
        /**
         * Specifies the number of samples used for the motion blur effect
         * Typically in interval [16, 64]
         */
        get motionBlurSamples(): number;
        set motionBlurSamples(samples: number);
        /**
         * Specifies MSAA sample count, setting this to 4 will provide 4x anti aliasing. (default: 1)
         */
        get samples(): number;
        set samples(sampleCount: number);
        /**
         * Default pipeline should be used going forward but the standard pipeline will be kept for backwards compatibility.
         * @constructor
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         * @param ratio The size of the postprocesses (0.5 means that your postprocess will have a width = canvas.width 0.5 and a height = canvas.height 0.5)
         * @param originalPostProcess the custom original color post-process. Must be "reusable". Can be null.
         * @param cameras The array of cameras that the rendering pipeline will be attached to
         */
        constructor(name: string, scene: Scene, ratio: number, originalPostProcess?: Nullable<PostProcess>, cameras?: Camera[]);
        private _buildPipeline;
        private _createDownSampleX4PostProcess;
        private _createBrightPassPostProcess;
        private _createBlurPostProcesses;
        private _createTextureAdderPostProcess;
        private _createVolumetricLightPostProcess;
        private _createLuminancePostProcesses;
        private _createHdrPostProcess;
        private _createLensFlarePostProcess;
        private _createDepthOfFieldPostProcess;
        private _createMotionBlurPostProcess;
        private _getDepthTexture;
        private _disposePostProcesses;
        /**
         * Dispose of the pipeline and stop all post processes
         */
        dispose(): void;
        /**
         * Serialize the rendering pipeline (Used when exporting)
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Luminance steps
         */
        static LuminanceSteps: number;
    }
    /**
     * Parse the serialized pipeline
     * @param source Source pipeline.
     * @param scene The scene to load the pipeline to.
     * @param rootUrl The URL of the serialized pipeline.
     * @returns An instantiated pipeline from the serialized object.
     */
    export function StandardRenderingPipelineParse(source: any, scene: Scene, rootUrl: string): StandardRenderingPipeline;
    /**
     * Register side effects for standardRenderingPipeline.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStandardRenderingPipeline(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import standardRenderingPipeline.pure for tree-shakeable, side-effect-free usage.
     */


    type SSRRenderingPipelineParseType = typeof SSRRenderingPipelineParse;
        export namespace SSRRenderingPipeline {
            let Parse: SSRRenderingPipelineParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Render pipeline to produce Screen Space Reflections (SSR) effect
     *
     * References:
     *   Screen Space Ray Tracing:
     *     - http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html
     *     - https://sourceforge.net/p/g3d/code/HEAD/tree/G3D10/data-files/shader/screenSpaceRayTrace.glsl
     *     - https://github.com/kode80/kode80SSR
     *   SSR:
     *     - general tips: https://sakibsaikia.github.io/graphics/2016/12/26/Screen-Space-Reflection-in-Killing-Floor-2.html
     *     - computation of blur radius from roughness and distance: https://github.com/godotengine/godot/blob/master/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl
     *     - blur and usage of back depth buffer: https://github.com/kode80/kode80SSR
     */
    export class SSRRenderingPipeline extends PostProcessRenderPipeline {
        /**
         * The SSR PostProcess effect id in the pipeline
         */
        SSRRenderEffect: string;
        /**
         * The blur PostProcess effect id in the pipeline
         */
        SSRBlurRenderEffect: string;
        /**
         * The PostProcess effect id in the pipeline that combines the SSR-Blur output with the original scene color
         */
        SSRCombineRenderEffect: string;
        private _thinSSRRenderingPipeline;
        private _samples;
        /**
         * MSAA sample count, setting this to 4 will provide 4x anti aliasing. (default: 1)
         */
        set samples(sampleCount: number);
        get samples(): number;
        /**
         * Gets or sets the maxDistance used to define how far we look for reflection during the ray-marching on the reflected ray (default: 1000).
         * Note that this value is a view (camera) space distance (not pixels!).
         */
        get maxDistance(): number;
        set maxDistance(distance: number);
        /**
         * Gets or sets the step size used to iterate until the effect finds the color of the reflection's pixel. Should be an integer \>= 1 as it is the number of pixels we advance at each step (default: 1).
         * Use higher values to improve performances (but at the expense of quality).
         */
        get step(): number;
        set step(step: number);
        /**
         * Gets or sets the thickness value used as tolerance when computing the intersection between the reflected ray and the scene (default: 0.5).
         * If setting "enableAutomaticThicknessComputation" to true, you can use lower values for "thickness" (even 0), as the geometry thickness
         * is automatically computed thank to the regular depth buffer + the backface depth buffer
         */
        get thickness(): number;
        set thickness(thickness: number);
        /**
         * Gets or sets the current reflection strength. 1.0 is an ideal value but can be increased/decreased for particular results (default: 1).
         */
        get strength(): number;
        set strength(strength: number);
        /**
         * Gets or sets the falloff exponent used to compute the reflection strength. Higher values lead to fainter reflections (default: 1).
         */
        get reflectionSpecularFalloffExponent(): number;
        set reflectionSpecularFalloffExponent(exponent: number);
        /**
         * Maximum number of steps during the ray marching process after which we consider an intersection could not be found (default: 1000).
         * Should be an integer value.
         */
        get maxSteps(): number;
        set maxSteps(steps: number);
        /**
         * Gets or sets the factor applied when computing roughness. Default value is 0.2.
         * When blurring based on roughness is enabled (meaning blurDispersionStrength \> 0), roughnessFactor is used as a global roughness factor applied on all objects.
         * If you want to disable this global roughness set it to 0.
         */
        get roughnessFactor(): number;
        set roughnessFactor(factor: number);
        /**
         * Number of steps to skip at start when marching the ray to avoid self collisions (default: 1)
         * 1 should normally be a good value, depending on the scene you may need to use a higher value (2 or 3)
         */
        get selfCollisionNumSkip(): number;
        set selfCollisionNumSkip(skip: number);
        /**
         * Gets or sets the minimum value for one of the reflectivity component of the material to consider it for SSR (default: 0.04).
         * If all r/g/b components of the reflectivity is below or equal this value, the pixel will not be considered reflective and SSR won't be applied.
         */
        get reflectivityThreshold(): number;
        set reflectivityThreshold(threshold: number);
        /**
         * Gets or sets the downsample factor used to reduce the size of the texture used to compute the SSR contribution (default: 0).
         * Use 0 to render the SSR contribution at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
         * Note that it is used only when blurring is enabled (blurDispersionStrength \> 0), because in that mode the SSR contribution is generated in a separate texture.
         */
        get ssrDownsample(): number;
        set ssrDownsample(downsample: number);
        /**
         * Gets or sets the blur dispersion strength. Set this value to 0 to disable blurring (default: 0.03)
         * The reflections are blurred based on the roughness of the surface and the distance between the pixel shaded and the reflected pixel: the higher the distance the more blurry the reflection is.
         * blurDispersionStrength allows to increase or decrease this effect.
         */
        get blurDispersionStrength(): number;
        set blurDispersionStrength(strength: number);
        private _useBlur;
        /**
         * Gets or sets the downsample factor used to reduce the size of the textures used to blur the reflection effect (default: 0).
         * Use 0 to blur at full resolution, 1 to render at half resolution, 2 to render at 1/3 resolution, etc.
         */
        get blurDownsample(): number;
        set blurDownsample(downsample: number);
        /**
         * Gets or sets whether or not smoothing reflections is enabled (default: false)
         * Enabling smoothing will require more GPU power.
         * Note that this setting has no effect if step = 1: it's only used if step \> 1.
         */
        get enableSmoothReflections(): boolean;
        set enableSmoothReflections(enabled: boolean);
        private get _useScreenspaceDepth();
        /**
         * Gets or sets the environment cube texture used to define the reflection when the reflected rays of SSR leave the view space or when the maxDistance/maxSteps is reached.
         */
        get environmentTexture(): Nullable<CubeTexture>;
        set environmentTexture(texture: Nullable<CubeTexture>);
        /**
         * Gets or sets the boolean defining if the environment texture is a standard cubemap (false) or a probe (true). Default value is false.
         * Note: a probe cube texture is treated differently than an ordinary cube texture because the Y axis is reversed.
         */
        get environmentTextureIsProbe(): boolean;
        set environmentTextureIsProbe(isProbe: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated at the screen borders (default: true).
         */
        get attenuateScreenBorders(): boolean;
        set attenuateScreenBorders(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated according to the distance of the intersection (default: true).
         */
        get attenuateIntersectionDistance(): boolean;
        set attenuateIntersectionDistance(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated according to the number of iterations performed to find the intersection (default: true).
         */
        get attenuateIntersectionIterations(): boolean;
        set attenuateIntersectionIterations(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the reflections should be attenuated when the reflection ray is facing the camera (the view direction) (default: false).
         */
        get attenuateFacingCamera(): boolean;
        set attenuateFacingCamera(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the backface reflections should be attenuated (default: false).
         */
        get attenuateBackfaceReflection(): boolean;
        set attenuateBackfaceReflection(attenuate: boolean);
        /**
         * Gets or sets a boolean indicating if the ray should be clipped to the frustum (default: true).
         * You can try to set this parameter to false to save some performances: it may produce some artefacts in some cases, but generally they won't really be visible
         */
        get clipToFrustum(): boolean;
        set clipToFrustum(clip: boolean);
        /**
         * Gets or sets a boolean indicating whether the blending between the current color pixel and the reflection color should be done with a Fresnel coefficient (default: false).
         * It is more physically accurate to use the Fresnel coefficient (otherwise it uses the reflectivity of the material for blending), but it is also more expensive when you use blur (when blurDispersionStrength \> 0).
         */
        get useFresnel(): boolean;
        set useFresnel(fresnel: boolean);
        /**
         * Gets or sets a boolean defining if geometry thickness should be computed automatically (default: false).
         * When enabled, a depth renderer is created which will render the back faces of the scene to a depth texture (meaning additional work for the GPU).
         * In that mode, the "thickness" property is still used as an offset to compute the ray intersection, but you can typically use a much lower
         * value than when enableAutomaticThicknessComputation is false (it's even possible to use a value of 0 when using low values for "step")
         * Note that for performance reasons, this option will only apply to the first camera to which the rendering pipeline is attached!
         */
        get enableAutomaticThicknessComputation(): boolean;
        set enableAutomaticThicknessComputation(automatic: boolean);
        /**
         * Gets the depth renderer used to render the back faces of the scene to a depth texture.
         */
        get backfaceDepthRenderer(): Nullable<DepthRenderer>;
        private _backfaceDepthTextureDownsample;
        /**
         * Gets or sets the downsample factor (default: 0) used to create the backface depth texture - used only if enableAutomaticThicknessComputation = true.
         * Use 0 to render the depth at full resolution, 1 to render at half resolution, 2 to render at 1/4 resolution, etc.
         * Note that you will get rendering artefacts when using a value different from 0: it's a tradeoff between image quality and performances.
         */
        get backfaceDepthTextureDownsample(): number;
        set backfaceDepthTextureDownsample(factor: number);
        private _backfaceForceDepthWriteTransparentMeshes;
        /**
         * Gets or sets a boolean (default: true) indicating if the depth of transparent meshes should be written to the backface depth texture (when automatic thickness computation is enabled).
         */
        get backfaceForceDepthWriteTransparentMeshes(): boolean;
        set backfaceForceDepthWriteTransparentMeshes(force: boolean);
        private _isEnabled;
        /**
         * Gets or sets a boolean indicating if the effect is enabled (default: true).
         */
        get isEnabled(): boolean;
        set isEnabled(value: boolean);
        /**
         * Gets or sets a boolean defining if the input color texture is in gamma space (default: true)
         * The SSR effect works in linear space, so if the input texture is in gamma space, we must convert the texture to linear space before applying the effect
         */
        get inputTextureColorIsInGammaSpace(): boolean;
        set inputTextureColorIsInGammaSpace(gammaSpace: boolean);
        /**
         * Gets or sets a boolean defining if the output color texture generated by the SSR pipeline should be in gamma space (default: true)
         * If you have a post-process that comes after the SSR and that post-process needs the input to be in a linear space, you must disable generateOutputInGammaSpace
         */
        get generateOutputInGammaSpace(): boolean;
        set generateOutputInGammaSpace(gammaSpace: boolean);
        /**
         * Gets or sets a boolean indicating if the effect should be rendered in debug mode (default: false).
         * In this mode, colors have this meaning:
         *   - blue: the ray hit the max distance (we reached maxDistance)
         *   - red: the ray ran out of steps (we reached maxSteps)
         *   - yellow: the ray went off screen
         *   - green: the ray hit a surface. The brightness of the green color is proportional to the distance between the ray origin and the intersection point: A brighter green means more computation than a darker green.
         * In the first 3 cases, the final color is calculated by mixing the skybox color with the pixel color (if environmentTexture is defined), otherwise the pixel color is not modified
         * You should try to get as few blue/red/yellow pixels as possible, as this means that the ray has gone further than if it had hit a surface.
         */
        get debug(): boolean;
        set debug(value: boolean);
        /**
         * Checks if all the post processes in the pipeline are ready.
         * @returns True if all the post processes in the pipeline are ready
         */
        isReady(): boolean;
        /**
         * Gets the scene the effect belongs to.
         * @returns the scene the effect belongs to.
         */
        getScene(): Scene;
        private _forceGeometryBuffer;
        private get _geometryBufferRenderer();
        private get _prePassRenderer();
        private _scene;
        private _isDirty;
        private _camerasToBeAttached;
        private _textureType;
        private _ssrPostProcess;
        private _blurPostProcessX;
        private _blurPostProcessY;
        private _blurCombinerPostProcess;
        private _depthRenderer;
        private _depthRendererCamera;
        /**
         * Gets active scene
         */
        get scene(): Scene;
        /**
         * Returns true if SSR is supported by the running hardware
         */
        get isSupported(): boolean;
        /**
         * Constructor of the SSR rendering pipeline
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)
         * @param forceGeometryBuffer Set to true if you want to use the legacy geometry buffer renderer (default: false)
         * @param textureType The texture type used by the different post processes created by SSR (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         * @param useScreenspaceDepth Indicates if the depth buffer should be linear or screenspace (default: false). This allows sharing the buffer with other effect pipelines that may require the depth to be in screenspace.
         */
        constructor(name: string, scene: Scene, cameras?: Camera[], forceGeometryBuffer?: boolean, textureType?: number, useScreenspaceDepth?: boolean);
        /**
         * Get the class name
         * @returns "SSRRenderingPipeline"
         */
        getClassName(): string;
        /**
         * Adds a camera to the pipeline
         * @param camera the camera to be added
         */
        addCamera(camera: Camera): void;
        /**
         * Removes a camera from the pipeline
         * @param camera the camera to remove
         */
        removeCamera(camera: Camera): void;
        /**
         * Removes the internal pipeline assets and detaches the pipeline from the scene cameras
         * @param disableGeometryBufferRenderer if the geometry buffer renderer should be disabled
         */
        dispose(disableGeometryBufferRenderer?: boolean): void;
        private _getTextureSize;
        private _buildPipeline;
        private _resizeDepthRenderer;
        private _disposeDepthRenderer;
        private _disposeBlurPostProcesses;
        private _disposeSSRPostProcess;
        private _createSSRPostProcess;
        private _createBlurAndCombinerPostProcesses;
        /**
         * Serializes the rendering pipeline (Used when exporting)
         * @returns the serialized object
         */
        serialize(): any;
    }
    /**
     * Parse the serialized pipeline
     * @param source Source pipeline.
     * @param scene The scene to load the pipeline to.
     * @param rootUrl The URL of the serialized pipeline.
     * @returns An instantiated pipeline from the serialized object.
     */
    export function SSRRenderingPipelineParse(source: any, scene: Scene, rootUrl: string): SSRRenderingPipeline;
    /**
     * Register side effects for ssrRenderingPipeline.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSsrRenderingPipeline(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import ssrRenderingPipeline.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Render pipeline to produce ssao effect
     */
    export class SSAORenderingPipeline extends PostProcessRenderPipeline {
        /**
         * @ignore
         * The PassPostProcess id in the pipeline that contains the original scene color
         */
        SSAOOriginalSceneColorEffect: string;
        /**
         * @ignore
         * The SSAO PostProcess id in the pipeline
         */
        SSAORenderEffect: string;
        /**
         * @ignore
         * The horizontal blur PostProcess id in the pipeline
         */
        SSAOBlurHRenderEffect: string;
        /**
         * @ignore
         * The vertical blur PostProcess id in the pipeline
         */
        SSAOBlurVRenderEffect: string;
        /**
         * @ignore
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
         */
        SSAOCombineRenderEffect: string;
        /**
         * The output strength of the SSAO post-process. Default value is 1.0.
         */
        totalStrength: number;
        /**
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 0.0006
         */
        radius: number;
        /**
         * Related to fallOff, used to interpolate SSAO samples (first interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to fallOff and superior to fallOff.
         * Default value is 0.0075
         */
        area: number;
        /**
         * Related to area, used to interpolate SSAO samples (second interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to area and inferior to area.
         * Default value is 0.000001
         */
        fallOff: number;
        /**
         * The base color of the SSAO post-process
         * The final result is "base + ssao" between [0, 1]
         */
        base: number;
        private _scene;
        private _randomTexture;
        private _originalColorPostProcess;
        private _ssaoPostProcess;
        private _blurHPostProcess;
        private _blurVPostProcess;
        private _ssaoCombinePostProcess;
        private _firstUpdate;
        /**
         * Gets active scene
         */
        get scene(): Scene;
        /**
         * @constructor
         * @param name - The rendering pipeline name
         * @param scene - The scene linked to this pipeline
         * @param ratio - The size of the postprocesses. Can be a number shared between passes or an object for more precision: { ssaoRatio: 0.5, combineRatio: 1.0 }
         * @param cameras - The array of cameras that the rendering pipeline will be attached to
         */
        constructor(name: string, scene: Scene, ratio: any, cameras?: Camera[]);
        /**
         * @internal
         */
        _attachCameras(cameras: any, unique: boolean): void;
        /**
         * Get the class name
         * @returns "SSAORenderingPipeline"
         */
        getClassName(): string;
        /**
         * Removes the internal pipeline assets and detaches the pipeline from the scene cameras
         * @param disableDepthRender - If the depth renderer should be disabled on the scene
         */
        dispose(disableDepthRender?: boolean): void;
        private _createBlurPostProcess;
        /** @internal */
        _rebuild(): void;
        private _createSSAOPostProcess;
        private _createSSAOCombinePostProcess;
        private _createRandomTexture;
    }




    type SSAO2RenderingPipelineParseType = typeof SSAO2RenderingPipelineParse;
        export namespace SSAO2RenderingPipeline {
            let Parse: SSAO2RenderingPipelineParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Render pipeline to produce ssao effect
     */
    export class SSAO2RenderingPipeline extends PostProcessRenderPipeline {
        /**
         * @ignore
         * The PassPostProcess id in the pipeline that contains the original scene color
         */
        SSAOOriginalSceneColorEffect: string;
        /**
         * @ignore
         * The SSAO PostProcess id in the pipeline
         */
        SSAORenderEffect: string;
        /**
         * @ignore
         * The horizontal blur PostProcess id in the pipeline
         */
        SSAOBlurHRenderEffect: string;
        /**
         * @ignore
         * The vertical blur PostProcess id in the pipeline
         */
        SSAOBlurVRenderEffect: string;
        /**
         * @ignore
         * The PostProcess id in the pipeline that combines the SSAO-Blur output with the original scene color (SSAOOriginalSceneColorEffect)
         */
        SSAOCombineRenderEffect: string;
        private _thinSSAORenderingPipeline;
        /**
         * The output strength of the SSAO post-process. Default value is 1.0.
         */
        get totalStrength(): number;
        set totalStrength(value: number);
        /**
         * Maximum depth value to still render AO. A smooth falloff makes the dimming more natural, so there will be no abrupt shading change.
         */
        get maxZ(): number;
        set maxZ(value: number);
        /**
         * In order to save performances, SSAO radius is clamped on close geometry. This ratio changes by how much.
         */
        get minZAspect(): number;
        set minZAspect(value: number);
        /**
         * Used in SSAO calculations to compensate for accuracy issues with depth values. Default 0.02.
         *
         * Normally you do not need to change this value, but you can experiment with it if you get a lot of in false self-occlusion on flat surfaces when using fewer than 16 samples. Useful range is normally [0..0.1] but higher values is allowed.
         */
        set epsilon(n: number);
        get epsilon(): number;
        /**
         * Number of samples used for the SSAO calculations. Default value is 8.
         */
        set samples(n: number);
        get samples(): number;
        private _textureSamples;
        /**
         * Number of samples to use for antialiasing.
         */
        set textureSamples(n: number);
        get textureSamples(): number;
        private _forcedGeometryBuffer;
        /**
         * Force rendering the geometry through geometry buffer.
         */
        private _forceGeometryBuffer;
        private get _geometryBufferRenderer();
        private get _prePassRenderer();
        /**
         * Ratio object used for SSAO ratio and blur ratio
         */
        private _ratio;
        private _textureType;
        /**
         * The radius around the analyzed pixel used by the SSAO post-process. Default value is 2.0
         */
        get radius(): number;
        set radius(value: number);
        /**
         * The base color of the SSAO post-process
         * The final result is "base + ssao" between [0, 1]
         */
        get base(): number;
        set base(value: number);
        /**
         * Skips the denoising (blur) stage of the SSAO calculations.
         *
         * Useful to temporarily set while experimenting with the other SSAO2 settings.
         */
        set bypassBlur(b: boolean);
        get bypassBlur(): boolean;
        /**
         * Enables the configurable bilateral denoising (blurring) filter. Default is true.
         * Set to false to instead use a legacy bilateral filter that can't be configured.
         *
         * The denoising filter runs after the SSAO calculations and is a very important step. Both options results in a so called bilateral being used, but the "expensive" one can be
         * configured in several ways to fit your scene.
         */
        set expensiveBlur(b: boolean);
        get expensiveBlur(): boolean;
        /**
         * The number of samples the bilateral filter uses in both dimensions when denoising the SSAO calculations. Default value is 16.
         *
         * A higher value should result in smoother shadows but will use more processing time in the shaders.
         *
         * A high value can cause the shadows to get to blurry or create visible artifacts (bands) near sharp details in the geometry. The artifacts can sometimes be mitigated by increasing the bilateralSoften setting.
         */
        get bilateralSamples(): number;
        set bilateralSamples(n: number);
        /**
         * Controls the shape of the denoising kernel used by the bilateral filter. Default value is 0.
         *
         * By default the bilateral filter acts like a box-filter, treating all samples on the same depth with equal weights. This is effective to maximize the denoising effect given a limited set of samples. However, it also often results in visible ghosting around sharp shadow regions and can spread out lines over large areas so they are no longer visible.
         *
         * Increasing this setting will make the filter pay less attention to samples further away from the center sample, reducing many artifacts but at the same time increasing noise.
         *
         * Useful value range is [0..1].
         */
        get bilateralSoften(): number;
        set bilateralSoften(n: number);
        /**
         * How forgiving the bilateral denoiser should be when rejecting samples. Default value is 0.
         *
         * A higher value results in the bilateral filter being more forgiving and thus doing a better job at denoising slanted and curved surfaces, but can lead to shadows spreading out around corners or between objects that are close to each other depth wise.
         *
         * Useful value range is normally [0..1], but higher values are allowed.
         */
        get bilateralTolerance(): number;
        set bilateralTolerance(n: number);
        /**
         *  Support test.
         */
        static get IsSupported(): boolean;
        /**
         * Indicates that the combine stage should use the current camera viewport to render the SSAO result on only a portion of the output texture (default: true).
         */
        get useViewportInCombineStage(): boolean;
        set useViewportInCombineStage(b: boolean);
        /**
         * Checks if all the post processes in the pipeline are ready.
         * @returns True if all the post processes in the pipeline are ready
         */
        isReady(): boolean;
        private _scene;
        private _originalColorPostProcess;
        private _ssaoPostProcess;
        private _blurHPostProcess;
        private _blurVPostProcess;
        private _ssaoCombinePostProcess;
        private _currentCameraMode;
        /**
         * Gets active scene
         */
        get scene(): Scene;
        /**
         * Creates the SSAO2 rendering pipeline.
         * @param name The rendering pipeline name
         * @param scene The scene linked to this pipeline
         * @param ratio The size of the postprocesses. Can be a number shared between passes or an object for more precision: { ssaoRatio: 0.5, blurRatio: 1.0 }
         * @param cameras The array of cameras that the rendering pipeline will be attached to
         * @param forceGeometryBuffer Set to true if you want to use the legacy geometry buffer renderer. You can also pass an existing instance of GeometryBufferRenderer if you want to use your own geometry buffer renderer.
         * @param textureType The texture type used by the different post processes created by SSAO (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         */
        constructor(name: string, scene: Scene, ratio: any, cameras?: Camera[], forceGeometryBuffer?: boolean | GeometryBufferRenderer, textureType?: number);
        /**
         * Get the class name
         * @returns "SSAO2RenderingPipeline"
         */
        getClassName(): string;
        /**
         * Removes the internal pipeline assets and detaches the pipeline from the scene cameras
         * @param disableGeometryBufferRenderer Set to true if you want to disable the Geometry Buffer renderer
         */
        dispose(disableGeometryBufferRenderer?: boolean): void;
        private _syncNormalsInWorldSpace;
        /** @internal */
        _rebuild(): void;
        private _createBlurPostProcess;
        private _createBlurFilter;
        private _getTextureSize;
        private _createSSAOPostProcess;
        private _createSSAOCombinePostProcess;
        /**
         * Serialize the rendering pipeline (Used when exporting)
         * @returns the serialized object
         */
        serialize(): any;
    }
    /**
     * Parse the serialized pipeline
     * @param source Source pipeline.
     * @param scene The scene to load the pipeline to.
     * @param rootUrl The URL of the serialized pipeline.
     * @returns An instantiated pipeline from the serialized object.
     */
    export function SSAO2RenderingPipelineParse(source: any, scene: Scene, rootUrl: string): SSAO2RenderingPipeline;
    /**
     * Register side effects for ssao2RenderingPipeline.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSsao2RenderingPipeline(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import ssao2RenderingPipeline.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * BABYLON.JS Chromatic Aberration GLSL Shader
     * Author: Olivier Guyot
     * Separates very slightly R, G and B colors on the edges of the screen
     * Inspired by Francois Tarlier & Martins Upitis
     */
    export class LensRenderingPipeline extends PostProcessRenderPipeline {
        /**
         * @ignore
         * The chromatic aberration PostProcess id in the pipeline
         */
        LensChromaticAberrationEffect: string;
        /**
         * @ignore
         * The highlights enhancing PostProcess id in the pipeline
         */
        HighlightsEnhancingEffect: string;
        /**
         * @ignore
         * The depth-of-field PostProcess id in the pipeline
         */
        LensDepthOfFieldEffect: string;
        private _scene;
        private _depthTexture;
        private _grainTexture;
        private _chromaticAberrationPostProcess;
        private _highlightsPostProcess;
        private _depthOfFieldPostProcess;
        private _edgeBlur;
        private _grainAmount;
        private _chromaticAberration;
        private _distortion;
        private _highlightsGain;
        private _highlightsThreshold;
        private _dofDistance;
        private _dofAperture;
        private _dofDarken;
        private _dofPentagon;
        private _blurNoise;
        /**
         * @constructor
         *
         * Effect parameters are as follow:
         * {
         *      chromatic_aberration: number;       // from 0 to x (1 for realism)
         *      edge_blur: number;                  // from 0 to x (1 for realism)
         *      distortion: number;                 // from 0 to x (1 for realism), note that this will effect the pointer position precision
         *      grain_amount: number;               // from 0 to 1
         *      grain_texture: BABYLON.Texture;     // texture to use for grain effect; if unset, use random B&W noise
         *      dof_focus_distance: number;         // depth-of-field: focus distance; unset to disable (disabled by default)
         *      dof_aperture: number;               // depth-of-field: focus blur bias (default: 1)
         *      dof_darken: number;                 // depth-of-field: darken that which is out of focus (from 0 to 1, disabled by default)
         *      dof_pentagon: boolean;              // depth-of-field: makes a pentagon-like "bokeh" effect
         *      dof_gain: number;                   // depth-of-field: highlights gain; unset to disable (disabled by default)
         *      dof_threshold: number;              // depth-of-field: highlights threshold (default: 1)
         *      blur_noise: boolean;                // add a little bit of noise to the blur (default: true)
         * }
         * Note: if an effect parameter is unset, effect is disabled
         *
         * @param name The rendering pipeline name
         * @param parameters - An object containing all parameters (see above)
         * @param scene The scene linked to this pipeline
         * @param ratio The size of the postprocesses (0.5 means that your postprocess will have a width = canvas.width 0.5 and a height = canvas.height 0.5)
         * @param cameras The array of cameras that the rendering pipeline will be attached to
         */
        constructor(name: string, parameters: any, scene: Scene, ratio?: number, cameras?: Camera[]);
        /**
         * Get the class name
         * @returns "LensRenderingPipeline"
         */
        getClassName(): string;
        /**
         * Gets associated scene
         */
        get scene(): Scene;
        /**
         * Gets or sets the edge blur
         */
        get edgeBlur(): number;
        set edgeBlur(value: number);
        /**
         * Gets or sets the grain amount
         */
        get grainAmount(): number;
        set grainAmount(value: number);
        /**
         * Gets or sets the chromatic aberration amount
         */
        get chromaticAberration(): number;
        set chromaticAberration(value: number);
        /**
         * Gets or sets the depth of field aperture
         */
        get dofAperture(): number;
        set dofAperture(value: number);
        /**
         * Gets or sets the edge distortion
         */
        get edgeDistortion(): number;
        set edgeDistortion(value: number);
        /**
         * Gets or sets the depth of field distortion
         */
        get dofDistortion(): number;
        set dofDistortion(value: number);
        /**
         * Gets or sets the darken out of focus amount
         */
        get darkenOutOfFocus(): number;
        set darkenOutOfFocus(value: number);
        /**
         * Gets or sets a boolean indicating if blur noise is enabled
         */
        get blurNoise(): boolean;
        set blurNoise(value: boolean);
        /**
         * Gets or sets a boolean indicating if pentagon bokeh is enabled
         */
        get pentagonBokeh(): boolean;
        set pentagonBokeh(value: boolean);
        /**
         * Gets or sets the highlight grain amount
         */
        get highlightsGain(): number;
        set highlightsGain(value: number);
        /**
         * Gets or sets the highlight threshold
         */
        get highlightsThreshold(): number;
        set highlightsThreshold(value: number);
        /**
         * Sets the amount of blur at the edges
         * @param amount blur amount
         */
        setEdgeBlur(amount: number): void;
        /**
         * Sets edge blur to 0
         */
        disableEdgeBlur(): void;
        /**
         * Sets the amount of grain
         * @param amount Amount of grain
         */
        setGrainAmount(amount: number): void;
        /**
         * Set grain amount to 0
         */
        disableGrain(): void;
        /**
         * Sets the chromatic aberration amount
         * @param amount amount of chromatic aberration
         */
        setChromaticAberration(amount: number): void;
        /**
         * Sets chromatic aberration amount to 0
         */
        disableChromaticAberration(): void;
        /**
         * Sets the EdgeDistortion amount
         * @param amount amount of EdgeDistortion
         */
        setEdgeDistortion(amount: number): void;
        /**
         * Sets edge distortion to 0
         */
        disableEdgeDistortion(): void;
        /**
         * Sets the FocusDistance amount
         * @param amount amount of FocusDistance
         */
        setFocusDistance(amount: number): void;
        /**
         * Disables depth of field
         */
        disableDepthOfField(): void;
        /**
         * Sets the Aperture amount
         * @param amount amount of Aperture
         */
        setAperture(amount: number): void;
        /**
         * Sets the DarkenOutOfFocus amount
         * @param amount amount of DarkenOutOfFocus
         */
        setDarkenOutOfFocus(amount: number): void;
        private _pentagonBokehIsEnabled;
        /**
         * Creates a pentagon bokeh effect
         */
        enablePentagonBokeh(): void;
        /**
         * Disables the pentagon bokeh effect
         */
        disablePentagonBokeh(): void;
        /**
         * Enables noise blur
         */
        enableNoiseBlur(): void;
        /**
         * Disables noise blur
         */
        disableNoiseBlur(): void;
        /**
         * Sets the HighlightsGain amount
         * @param amount amount of HighlightsGain
         */
        setHighlightsGain(amount: number): void;
        /**
         * Sets the HighlightsThreshold amount
         * @param amount amount of HighlightsThreshold
         */
        setHighlightsThreshold(amount: number): void;
        /**
         * Disables highlights
         */
        disableHighlights(): void;
        /**
         * Removes the internal pipeline assets and detaches the pipeline from the scene cameras
         * @param disableDepthRender If the scene's depth rendering should be disabled (default: false)
         */
        dispose(disableDepthRender?: boolean): void;
        private _createChromaticAberrationPostProcess;
        private _createHighlightsPostProcess;
        private _createDepthOfFieldPostProcess;
        private _createGrainTexture;
    }






    type DefaultRenderingPipelineParseType = typeof DefaultRenderingPipelineParse;
        export namespace DefaultRenderingPipeline {
            let Parse: DefaultRenderingPipelineParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * The default rendering pipeline can be added to a scene to apply common post processing effects such as anti-aliasing or depth of field.
     * See https://doc.babylonjs.com/features/featuresDeepDive/postProcesses/defaultRenderingPipeline
     */
    export class DefaultRenderingPipeline extends PostProcessRenderPipeline implements IDisposable, IAnimatable {
        private _scene;
        private _camerasToBeAttached;
        /**
         * ID of the sharpen post process,
         */
        private readonly SharpenPostProcessId;
        /**
         * @ignore
         * ID of the image processing post process;
         */
        readonly ImageProcessingPostProcessId = "ImageProcessingPostProcessEffect";
        /**
         * @ignore
         * ID of the Fast Approximate Anti-Aliasing post process;
         */
        readonly FxaaPostProcessId = "FxaaPostProcessEffect";
        /**
         * ID of the chromatic aberration post process,
         */
        private readonly ChromaticAberrationPostProcessId;
        /**
         * ID of the grain post process
         */
        private readonly GrainPostProcessId;
        /**
         * Sharpen post process which will apply a sharpen convolution to enhance edges
         */
        sharpen: SharpenPostProcess;
        private _sharpenEffect;
        private bloom;
        /**
         * Depth of field effect, applies a blur based on how far away objects are from the focus distance.
         */
        depthOfField: DepthOfFieldEffect;
        /**
         * The Fast Approximate Anti-Aliasing post process which attempts to remove aliasing from an image.
         */
        fxaa: FxaaPostProcess;
        /**
         * Image post processing pass used to perform operations such as tone mapping or color grading.
         */
        imageProcessing: ImageProcessingPostProcess;
        /**
         * Chromatic aberration post process which will shift rgb colors in the image
         */
        chromaticAberration: ChromaticAberrationPostProcess;
        private _chromaticAberrationEffect;
        /**
         * Grain post process which add noise to the image
         */
        grain: GrainPostProcess;
        private _grainEffect;
        /**
         * Glow post process which adds a glow to emissive areas of the image
         */
        private _glowLayer;
        /**
         * Animations which can be used to tweak settings over a period of time
         */
        animations: Animation[];
        private _imageProcessingConfigurationObserver;
        private _sharpenEnabled;
        private _bloomEnabled;
        private _depthOfFieldEnabled;
        private _depthOfFieldBlurLevel;
        private _fxaaEnabled;
        private _imageProcessingEnabled;
        private _defaultPipelineTextureType;
        private _bloomScale;
        private _chromaticAberrationEnabled;
        private _grainEnabled;
        private _buildAllowed;
        /**
         * Enable or disable automatic building of the pipeline when effects are enabled and disabled.
         * If false, you will have to manually call prepare() to update the pipeline.
         */
        get automaticBuild(): boolean;
        set automaticBuild(value: boolean);
        /**
         * This is triggered each time the pipeline has been built.
         */
        onBuildObservable: Observable<DefaultRenderingPipeline>;
        /**
         * Gets active scene
         */
        get scene(): Scene;
        /**
         * Enable or disable the sharpen process from the pipeline
         */
        set sharpenEnabled(enabled: boolean);
        get sharpenEnabled(): boolean;
        private _resizeObserver;
        private _hardwareScaleLevel;
        private _bloomKernel;
        /**
         * Specifies the size of the bloom blur kernel, relative to the final output size
         */
        get bloomKernel(): number;
        set bloomKernel(value: number);
        /**
         * Specifies the weight of the bloom in the final rendering
         */
        private _bloomWeight;
        /**
         * Specifies the luma threshold for the area that will be blurred by the bloom
         */
        private _bloomThreshold;
        private _hdr;
        /**
         * The strength of the bloom.
         */
        set bloomWeight(value: number);
        get bloomWeight(): number;
        /**
         * The luminance threshold to find bright areas of the image to bloom.
         */
        set bloomThreshold(value: number);
        get bloomThreshold(): number;
        /**
         * The scale of the bloom, lower value will provide better performance.
         */
        set bloomScale(value: number);
        get bloomScale(): number;
        /**
         * Enable or disable the bloom from the pipeline
         */
        set bloomEnabled(enabled: boolean);
        get bloomEnabled(): boolean;
        private _rebuildBloom;
        /**
         * If the depth of field is enabled.
         */
        get depthOfFieldEnabled(): boolean;
        set depthOfFieldEnabled(enabled: boolean);
        /**
         * Blur level of the depth of field effect. (Higher blur will effect performance)
         */
        get depthOfFieldBlurLevel(): DepthOfFieldEffectBlurLevel;
        set depthOfFieldBlurLevel(value: DepthOfFieldEffectBlurLevel);
        /**
         * If the anti aliasing is enabled.
         */
        set fxaaEnabled(enabled: boolean);
        get fxaaEnabled(): boolean;
        private _samples;
        /**
         * MSAA sample count, setting this to 4 will provide 4x anti aliasing. (default: 1)
         */
        set samples(sampleCount: number);
        get samples(): number;
        /**
         * If image processing is enabled.
         */
        set imageProcessingEnabled(enabled: boolean);
        get imageProcessingEnabled(): boolean;
        /**
         * If glow layer is enabled. (Adds a glow effect to emmissive materials)
         */
        set glowLayerEnabled(enabled: boolean);
        get glowLayerEnabled(): boolean;
        /**
         * Gets the glow layer (or null if not defined)
         */
        get glowLayer(): Nullable<GlowLayer>;
        /**
         * Enable or disable the chromaticAberration process from the pipeline
         */
        set chromaticAberrationEnabled(enabled: boolean);
        get chromaticAberrationEnabled(): boolean;
        /**
         * Enable or disable the grain process from the pipeline
         */
        set grainEnabled(enabled: boolean);
        get grainEnabled(): boolean;
        /**
         * Instantiates a DefaultRenderingPipeline.
         * @param name The rendering pipeline name (default: "")
         * @param hdr If high dynamic range textures should be used (default: true)
         * @param scene The scene linked to this pipeline (default: the last created scene)
         * @param cameras The array of cameras that the rendering pipeline will be attached to (default: scene.cameras)
         * @param automaticBuild If false, you will have to manually call prepare() to update the pipeline (default: true)
         */
        constructor(name?: string, hdr?: boolean, scene?: Scene, cameras?: Camera[], automaticBuild?: boolean);
        /**
         * Get the class name
         * @returns "DefaultRenderingPipeline"
         */
        getClassName(): string;
        /**
         * Force the compilation of the entire pipeline.
         */
        prepare(): void;
        private _hasCleared;
        private _prevPostProcess;
        private _prevPrevPostProcess;
        private _setAutoClearAndTextureSharing;
        private _depthOfFieldSceneObserver;
        private _activeCameraChangedObserver;
        private _activeCamerasChangedObserver;
        private _buildPipeline;
        private _disposePostProcesses;
        /**
         * Adds a camera to the pipeline
         * @param camera the camera to be added
         */
        addCamera(camera: Camera): void;
        /**
         * Removes a camera from the pipeline
         * @param camera the camera to remove
         */
        removeCamera(camera: Camera): void;
        /**
         * Dispose of the pipeline and stop all post processes
         */
        dispose(): void;
        /**
         * Serialize the rendering pipeline (Used when exporting)
         * @returns the serialized object
         */
        serialize(): any;
    }
    /**
     * Parse the serialized pipeline
     * @param source Source pipeline.
     * @param scene The scene to load the pipeline to.
     * @param rootUrl The URL of the serialized pipeline.
     * @returns An instantiated pipeline from the serialized object.
     */
    export function DefaultRenderingPipelineParse(source: any, scene: Scene, rootUrl: string): DefaultRenderingPipeline;
    /**
     * Register side effects for defaultRenderingPipeline.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDefaultRenderingPipeline(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import defaultRenderingPipeline.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class representing a contact point produced in a shape cast
     */
    export class ShapeCastResult extends CastingResult {
        private _hitFraction;
        /**
         * Gets the hit fraction along the casting ray
         */
        get hitFraction(): number;
        /**
         * Sets the hit fraction along the casting ray
         * @param fraction
         */
        setHitFraction(fraction: number): void;
        /**
         * Resets all the values to default
         */
        reset(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Class representing a contact point produced in a proximity cast
     */
    export class ProximityCastResult extends CastingResult {
        protected _hitDistance: number;
        /**
         * Gets the distance from the hit
         */
        get hitDistance(): number;
        /**
         * Sets the distance from the start point to the hit point
         * @param distance
         */
        setHitDistance(distance: number): void;
        /**
         * Resets all the values to default
         */
        reset(): void;
    }


    /**
     * Query for shape proximity.
     */
    export interface IPhysicsShapeProximityCastQuery {
        /**
         * The shape to test proximity against
         */
        shape: PhysicsShape;
        /**
         * The position of shape
         */
        position: Vector3;
        /**
         * The rotation of shape
         */
        rotation: Quaternion;
        /**
         * Maximum distance to check for collisions. Can be set to 0 to check for overlaps.
         */
        maxDistance: number;
        /**
         * Should trigger collisions be considered in the query?
         */
        shouldHitTriggers: boolean;
        /**
         * Ignores the body passed if it is in the query
         */
        ignoreBody?: PhysicsBody;
    }


    /**
     * Shape cast query
     */
    export interface IPhysicsShapeCastQuery {
        /**
         * The shape to query with
         */
        shape: PhysicsShape;
        /**
         * The rotation of the shape
         */
        rotation: Quaternion;
        /**
         * The start position of the query
         */
        startPosition: Vector3;
        /**
         * The end position of the query
         */
        endPosition: Vector3;
        /**
         * Should trigger collisions be considered in the query?
         */
        shouldHitTriggers: boolean;
        /**
         * Ignores the body passed if it is in the query
         */
        ignoreBody?: PhysicsBody;
    }


    /**
     * Interface for query parameters in the raycast function.
     * @see the "Collision Filtering" section in https://github.com/eoineoineoin/glTF/tree/MSFT_RigidBodies/extensions/2.0/Vendor/MSFT_collision_primitives
     */
    export interface IRaycastQuery {
        /** Membership mask */
        membership?: number;
        /** CollideWith mask */
        collideWith?: number;
        /** Should trigger collisions be considered in the query? */
        shouldHitTriggers?: boolean;
        /** Ignores the body passed if it is in the query */
        ignoreBody?: PhysicsBody;
    }
    /**
     * Holds the data for the raycast result
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsRaycastResult extends CastingResult {
        private _hitDistance;
        private _rayFromWorld;
        private _rayToWorld;
        /**
         * Gets the distance from the hit
         */
        get hitDistance(): number;
        /**
         * Gets the hit normal/direction in the world
         */
        get hitNormalWorld(): Vector3;
        /**
         * Gets the hit point in the world
         */
        get hitPointWorld(): Vector3;
        /**
         * Gets the ray "start point" of the ray in the world
         */
        get rayFromWorld(): Vector3;
        /**
         * Gets the ray "end point" of the ray in the world
         */
        get rayToWorld(): Vector3;
        /**
         * Sets the distance from the start point to the hit point
         * @param distance defines the distance to set
         */
        setHitDistance(distance: number): void;
        /**
         * Calculates the distance manually
         */
        calculateHitDistance(): void;
        /**
         * Resets all the values to default
         * @param from The from point on world space
         * @param to The to point on world space
         */
        reset(from?: Vector3, to?: Vector3): void;
    }


    /**
     * Interface for point proximity query.
     */
    export interface IPhysicsPointProximityQuery {
        /**
         * The position of the query
         */
        position: Vector3;
        /**
         * Maximum distance to check for collisions. Can be set to 0 to check for overlaps.
         */
        maxDistance: number;
        /**
         * Collision filter for the query.
         */
        collisionFilter: IRaycastQuery;
        /**
         * Should trigger collisions be considered in the query?
         */
        shouldHitTriggers: boolean;
        /**
         * Should the query ignore the body that is passed in?
         */
        ignoreBody?: PhysicsBody;
    }






    /**
     * A helper for physics simulations
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export class PhysicsHelper {
        private _scene;
        private _physicsEngine;
        private _hitData;
        /**
         * Initializes the Physics helper
         * @param scene Babylon.js scene
         */
        constructor(scene: Scene);
        /**
         * Applies a radial explosion impulse
         * @param origin the origin of the explosion
         * @param radiusOrEventOptions the radius or the options of radial explosion
         * @param strength the explosion strength
         * @param falloff possible options: Constant & Linear. Defaults to Constant
         * @returns A physics radial explosion event, or null
         */
        applyRadialExplosionImpulse(origin: Vector3, radiusOrEventOptions: number | PhysicsRadialExplosionEventOptions, strength?: number, falloff?: PhysicsRadialImpulseFalloff): Nullable<PhysicsRadialExplosionEvent>;
        /**
         * Applies a radial explosion force
         * @param origin the origin of the explosion
         * @param radiusOrEventOptions the radius or the options of radial explosion
         * @param strength the explosion strength
         * @param falloff possible options: Constant & Linear. Defaults to Constant
         * @returns A physics radial explosion event, or null
         */
        applyRadialExplosionForce(origin: Vector3, radiusOrEventOptions: number | PhysicsRadialExplosionEventOptions, strength?: number, falloff?: PhysicsRadialImpulseFalloff): Nullable<PhysicsRadialExplosionEvent>;
        private _applicationForBodies;
        /**
         * Creates a gravitational field
         * @param origin the origin of the gravitational field
         * @param radiusOrEventOptions the radius or the options of radial gravitational field
         * @param strength the gravitational field strength
         * @param falloff possible options: Constant & Linear. Defaults to Constant
         * @returns A physics gravitational field event, or null
         */
        gravitationalField(origin: Vector3, radiusOrEventOptions: number | PhysicsRadialExplosionEventOptions, strength?: number, falloff?: PhysicsRadialImpulseFalloff): Nullable<PhysicsGravitationalFieldEvent>;
        /**
         * Creates a physics updraft event
         * @param origin the origin of the updraft
         * @param radiusOrEventOptions the radius or the options of the updraft
         * @param strength the strength of the updraft
         * @param height the height of the updraft
         * @param updraftMode possible options: Center & Perpendicular. Defaults to Center
         * @returns A physics updraft event, or null
         */
        updraft(origin: Vector3, radiusOrEventOptions: number | PhysicsUpdraftEventOptions, strength?: number, height?: number, updraftMode?: PhysicsUpdraftMode): Nullable<PhysicsUpdraftEvent>;
        /**
         * Creates a physics vortex event
         * @param origin the of the vortex
         * @param radiusOrEventOptions the radius or the options of the vortex
         * @param strength the strength of the vortex
         * @param height   the height of the vortex
         * @returns a Physics vortex event, or null
         * A physics vortex event or null
         */
        vortex(origin: Vector3, radiusOrEventOptions: number | PhysicsVortexEventOptions, strength?: number, height?: number): Nullable<PhysicsVortexEvent>;
        private _copyPhysicsHitData;
    }
    /**
     * Represents a physics radial explosion event
     */
    class PhysicsRadialExplosionEvent {
        private _scene;
        private _options;
        private _sphere;
        private _dataFetched;
        /**
         * Initializes a radial explosion event
         * @param _scene BabylonJS scene
         * @param _options The options for the vortex event
         */
        constructor(_scene: Scene, _options: PhysicsRadialExplosionEventOptions);
        /**
         * Returns the data related to the radial explosion event (sphere).
         * @returns The radial explosion event data
         */
        getData(): PhysicsRadialExplosionEventData;
        private _getHitData;
        /**
         * Returns the force and contact point of the body or false, if the body is not affected by the force/impulse.
         * @param body A physics body where the transform node is an AbstractMesh
         * @param origin the origin of the explosion
         * @param data the data of the hit
         * @param instanceIndex the instance index of the body
         * @returns if there was a hit
         */
        getBodyHitData(body: PhysicsBody, origin: Vector3, data: PhysicsHitData, instanceIndex?: number): boolean;
        /**
         * Returns the force and contact point of the impostor or false, if the impostor is not affected by the force/impulse.
         * @param impostor A physics imposter
         * @param origin the origin of the explosion
         * @param data the data of the hit
         * @returns A physics force and contact point, or null
         */
        getImpostorHitData(impostor: PhysicsImpostor, origin: Vector3, data: PhysicsHitData): boolean;
        /**
         * Triggers affected impostors callbacks
         * @param affectedImpostorsWithData defines the list of affected impostors (including associated data)
         */
        triggerAffectedImpostorsCallback(affectedImpostorsWithData: Array<PhysicsAffectedImpostorWithData>): void;
        /**
         * Triggers affected bodies callbacks
         * @param affectedBodiesWithData defines the list of affected bodies (including associated data)
         */
        triggerAffectedBodiesCallback(affectedBodiesWithData: Array<PhysicsAffectedBodyWithData>): void;
        /**
         * Disposes the sphere.
         * @param force Specifies if the sphere should be disposed by force
         */
        dispose(force?: boolean): void;
        /*** Helpers ***/
        private _prepareSphere;
        private _intersectsWithSphere;
    }
    /**
     * Represents a gravitational field event
     */
    class PhysicsGravitationalFieldEvent {
        private _physicsHelper;
        private _scene;
        private _origin;
        private _options;
        private _tickCallback;
        private _sphere;
        private _dataFetched;
        /**
         * Initializes the physics gravitational field event
         * @param _physicsHelper A physics helper
         * @param _scene BabylonJS scene
         * @param _origin The origin position of the gravitational field event
         * @param _options The options for the vortex event
         */
        constructor(_physicsHelper: PhysicsHelper, _scene: Scene, _origin: Vector3, _options: PhysicsRadialExplosionEventOptions);
        /**
         * Returns the data related to the gravitational field event (sphere).
         * @returns A gravitational field event
         */
        getData(): PhysicsGravitationalFieldEventData;
        /**
         * Enables the gravitational field.
         */
        enable(): void;
        /**
         * Disables the gravitational field.
         */
        disable(): void;
        /**
         * Disposes the sphere.
         * @param force The force to dispose from the gravitational field event
         */
        dispose(force?: boolean): void;
        private _tick;
    }
    /**
     * Represents a physics updraft event
     */
    class PhysicsUpdraftEvent {
        private _scene;
        private _origin;
        private _options;
        private _physicsEngine;
        private _originTop;
        private _originDirection;
        private _tickCallback;
        private _cylinder;
        private _cylinderPosition;
        private _dataFetched;
        private static _HitData;
        /**
         * Initializes the physics updraft event
         * @param _scene BabylonJS scene
         * @param _origin The origin position of the updraft
         * @param _options The options for the updraft event
         */
        constructor(_scene: Scene, _origin: Vector3, _options: PhysicsUpdraftEventOptions);
        /**
         * Returns the data related to the updraft event (cylinder).
         * @returns A physics updraft event
         */
        getData(): PhysicsUpdraftEventData;
        /**
         * Enables the updraft.
         */
        enable(): void;
        /**
         * Disables the updraft.
         */
        disable(): void;
        /**
         * Disposes the cylinder.
         * @param force Specifies if the updraft should be disposed by force
         */
        dispose(force?: boolean): void;
        private _getHitData;
        private _getBodyHitData;
        private _getImpostorHitData;
        private _tick;
        /*** Helpers ***/
        private _prepareCylinder;
        private _intersectsWithCylinder;
    }
    /**
     * Represents a physics vortex event
     */
    class PhysicsVortexEvent {
        private _scene;
        private _origin;
        private _options;
        private _physicsEngine;
        private _originTop;
        private _tickCallback;
        private _cylinder;
        private _cylinderPosition;
        private _dataFetched;
        private static _OriginOnPlane;
        private static _HitData;
        /**
         * Initializes the physics vortex event
         * @param _scene The BabylonJS scene
         * @param _origin The origin position of the vortex
         * @param _options The options for the vortex event
         */
        constructor(_scene: Scene, _origin: Vector3, _options: PhysicsVortexEventOptions);
        /**
         * Returns the data related to the vortex event (cylinder).
         * @returns The physics vortex event data
         */
        getData(): PhysicsVortexEventData;
        /**
         * Enables the vortex.
         */
        enable(): void;
        /**
         * Disables the vortex.
         */
        disable(): void;
        /**
         * Disposes the cylinder.
         * @param force Specifies if the vortex should be disposed by force
         */
        dispose(force?: boolean): void;
        private _getHitData;
        private _getBodyHitData;
        private _getImpostorHitData;
        private _tick;
        /*** Helpers ***/
        private _prepareCylinder;
        private _intersectsWithCylinder;
    }
    /**
     * Options for the radial explosion event
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export class PhysicsRadialExplosionEventOptions {
        /**
         * The radius of the sphere for the radial explosion.
         */
        radius: number;
        /**
         * The strength of the explosion.
         */
        strength: number;
        /**
         * The strength of the force in correspondence to the distance of the affected object
         */
        falloff: PhysicsRadialImpulseFalloff;
        /**
         * Sphere options for the radial explosion.
         */
        sphere: {
            segments: number;
            diameter: number;
        };
        /**
         * Callback that is triggered when the radial explosion affects impostors.
         */
        affectedImpostorsCallback: (affectedImpostorsWithData: Array<PhysicsAffectedImpostorWithData>) => void;
        /**
         * Callback that is triggered when the radial explosion affects bodies.
         */
        affectedBodiesCallback: (affectedBodiesWithData: Array<PhysicsAffectedBodyWithData>) => void;
    }
    /**
     * Options for the updraft event
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export class PhysicsUpdraftEventOptions {
        /**
         * The radius of the cylinder for the vortex
         */
        radius: number;
        /**
         * The strength of the updraft.
         */
        strength: number;
        /**
         * The height of the cylinder for the updraft.
         */
        height: number;
        /**
         * The mode for the updraft.
         */
        updraftMode: PhysicsUpdraftMode;
    }
    /**
     * Options for the vortex event
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export class PhysicsVortexEventOptions {
        /**
         * The radius of the cylinder for the vortex
         */
        radius: number;
        /**
         * The strength of the vortex.
         */
        strength: number;
        /**
         * The height of the cylinder for the vortex.
         */
        height: number;
        /**
         * At which distance, relative to the radius the centripetal forces should kick in? Range: 0-1
         */
        centripetalForceThreshold: number;
        /**
         * This multiplier determines with how much force the objects will be pushed sideways/around the vortex, when below the threshold.
         */
        centripetalForceMultiplier: number;
        /**
         * This multiplier determines with how much force the objects will be pushed sideways/around the vortex, when above the threshold.
         */
        centrifugalForceMultiplier: number;
        /**
         * This multiplier determines with how much force the objects will be pushed upwards, when in the vortex.
         */
        updraftForceMultiplier: number;
    }
    /**
     * The strength of the force in correspondence to the distance of the affected object
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export enum PhysicsRadialImpulseFalloff {
        /** Defines that impulse is constant in strength across it's whole radius */
        Constant = 0,
        /** Defines that impulse gets weaker if it's further from the origin */
        Linear = 1
    }
    /**
     * The strength of the force in correspondence to the distance of the affected object
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export enum PhysicsUpdraftMode {
        /** Defines that the upstream forces will pull towards the top center of the cylinder */
        Center = 0,
        /** Defines that once a impostor is inside the cylinder, it will shoot out perpendicular from the ground of the cylinder */
        Perpendicular = 1
    }
    /**
     * Interface for a physics hit data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsHitData {
        /**
         * The force applied at the contact point
         */
        force: Vector3;
        /**
         * The contact point
         */
        contactPoint: Vector3;
        /**
         * The distance from the origin to the contact point
         */
        distanceFromOrigin: number;
        /**
         * For an instanced physics body (mesh with thin instances), the index of the thin instance the hit applies to
         */
        instanceIndex?: number;
    }
    /**
     * Interface for radial explosion event data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsRadialExplosionEventData {
        /**
         * A sphere used for the radial explosion event
         */
        sphere: Mesh;
    }
    /**
     * Interface for gravitational field event data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsGravitationalFieldEventData {
        /**
         * A sphere mesh used for the gravitational field event
         */
        sphere: Mesh;
    }
    /**
     * Interface for updraft event data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsUpdraftEventData {
        /**
         * A cylinder used for the updraft event
         */
        cylinder?: Mesh;
    }
    /**
     * Interface for vortex event data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsVortexEventData {
        /**
         * A cylinder used for the vortex event
         */
        cylinder: Mesh;
    }
    /**
     * Interface for an affected physics impostor
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine#further-functionality-of-the-impostor-class
     */
    export interface PhysicsAffectedImpostorWithData {
        /**
         * The impostor affected by the effect
         */
        impostor: PhysicsImpostor;
        /**
         * The data about the hit/force from the explosion
         */
        hitData: PhysicsHitData;
    }
    /**
     * Interface for an affected physics body
     * @see
     */
    export interface PhysicsAffectedBodyWithData {
        /**
         * The impostor affected by the effect
         */
        body: PhysicsBody;
        /**
         * The data about the hit/force from the explosion
         */
        hitData: PhysicsHitData;
    }






        interface Scene {
            /** @internal (Backing field) */
            _physicsEngine: Nullable<IPhysicsEngine>;
            /** @internal */
            _physicsTimeAccumulator: number;
            /**
             * Gets the current physics engine
             * @returns a IPhysicsEngine or null if none attached
             */
            getPhysicsEngine(): Nullable<IPhysicsEngine>;
            /**
             * Enables physics to the current scene
             * @param gravity defines the scene's gravity for the physics engine. defaults to real earth gravity : (0, -9.81, 0)
             * @param plugin defines the physics engine to be used. defaults to CannonJS.
             * @returns a boolean indicating if the physics engine was initialized
             */
            enablePhysics(gravity?: Nullable<Vector3>, plugin?: BABYLON.IPhysicsEnginePlugin | IPhysicsEnginePluginV2): boolean;
            /**
             * Disables and disposes the physics engine associated with the scene
             */
            disablePhysicsEngine(): void;
            /**
             * Gets a boolean indicating if there is an active physics engine
             * @returns a boolean indicating if there is an active physics engine
             */
            isPhysicsEnabled(): boolean;
            /**
             * Deletes a physics compound impostor
             * @param compound defines the compound to delete
             */
            deleteCompoundImpostor(compound: any): void;
            /**
             * An event triggered when physic simulation is about to be run
             */
            onBeforePhysicsObservable: Observable<Scene>;
            /**
             * An event triggered when physic simulation has been done
             */
            onAfterPhysicsObservable: Observable<Scene>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the physics engine scene component responsible to manage a physics engine
     */
    export class PhysicsEngineSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "PhysicsEngine";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
    }
    /**
     * Register side effects for joinedPhysicsEngineComponent.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterJoinedPhysicsEngineComponent(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import joinedPhysicsEngineComponent.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Base class for results of casts.
     */
    export class CastingResult {
        private _hasHit;
        protected _hitNormal: Vector3;
        protected _hitPoint: Vector3;
        private _triangleIndex;
        /**
         * The Physics body that the query hit.
         */
        body?: PhysicsBody;
        /**
         * The body Index in case the Physics body is using instances
         */
        bodyIndex?: number;
        /**
         * The shape hit by the query.
         */
        shape?: PhysicsShape;
        /**
         * Gets the hit point.
         */
        get hitPoint(): Vector3;
        /**
         * Gets the hit normal.
         */
        get hitNormal(): Vector3;
        /**
         * Gets if there was a hit
         */
        get hasHit(): boolean;
        /**
         * The index of the original triangle which was hit. Will be -1 if contact point is not on a mesh shape
         */
        get triangleIndex(): number;
        /**
         * Sets the hit data
         * @param hitNormal defines the normal in world space
         * @param hitPoint defines the point in world space
         * @param triangleIndex defines the index of the triangle in case of mesh shape
         */
        setHitData(hitNormal: IXYZ, hitPoint: IXYZ, triangleIndex?: number): void;
        /**
         * Resets all the values to default
         */
        reset(): void;
    }
    /**
     * Interface for 3D coordinates
     */
    interface IXYZ {
        /**
         * X
         */
        x: number;
        /**
         * Y
         */
        y: number;
        /**
         * Z
         */
        z: number;
    }


    /**
     * Interface used to define a physics engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface IPhysicsEngine {
        /**
         * Gets the gravity vector used by the simulation
         */
        gravity: Vector3;
        getPluginVersion(): number;
        /**
         * Sets the gravity vector used by the simulation
         * @param gravity defines the gravity vector to use
         */
        setGravity(gravity: Vector3): void;
        /**
         * Set the time step of the physics engine.
         * Default is 1/60.
         * To slow it down, enter 1/600 for example.
         * To speed it up, 1/30
         * @param newTimeStep the new timestep to apply to this world.
         */
        setTimeStep(newTimeStep: number): void;
        /**
         * Get the time step of the physics engine.
         * @returns the current time step
         */
        getTimeStep(): number;
        /**
         * Set the sub time step of the physics engine.
         * Default is 0 meaning there is no sub steps
         * To increase physics resolution precision, set a small value (like 1 ms)
         * @param subTimeStep defines the new sub timestep used for physics resolution.
         */
        setSubTimeStep(subTimeStep: number): void;
        /**
         * Get the sub time step of the physics engine.
         * @returns the current sub time step
         */
        getSubTimeStep(): number;
        /**
         * Release all resources
         */
        dispose(): void;
        /**
         * Gets the name of the current physics plugin
         * @returns the name of the plugin
         */
        getPhysicsPluginName(): string;
        /**
         * Gets the current plugin used to run the simulation
         * @returns current plugin
         */
        getPhysicsPlugin(): BABYLON.IPhysicsEnginePlugin | IPhysicsEnginePluginV2 | null;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3, query?: IRaycastQuery): PhysicsRaycastResult;
        /**
         * Called by the scene. No need to call it.
         * @param delta defines the timespan between frames
         */
        _step(delta: number): void;
    }


    /**
     * Ragdoll bone properties
     * @experimental
     */
    export class RagdollBoneProperties {
        /**
         * Width of the box shape
         */
        width?: number;
        /**
         * depth of the box shape
         */
        depth?: number;
        /**
         * height of the box shape
         */
        height?: number;
        /**
         * size that will be used of width, depth and height of the shape box
         */
        size?: number;
        /**
         * Type of Physics Constraint used between bones
         */
        joint?: number | undefined | PhysicsConstraintType;
        /**
         * Main rotation axis used by the constraint, in local space
         */
        rotationAxis?: Vector3;
        /**
         * Minimum rotation angle value
         */
        min?: number;
        /**
         * Maximum rotation angle value
         */
        max?: number;
        /**
         * Offset along local axis
         */
        boxOffset?: number;
        /**
         * Axis that need an offset
         */
        boneOffsetAxis?: Vector3;
    }
    /**
     * Ragdoll for Physics V2
     * @experimental
     */
    export class Ragdoll {
        private _skeleton;
        private _scene;
        private _rootTransformNode;
        private _config;
        private _boxConfigs;
        private _constraints;
        private _bones;
        private _initialRotation;
        private _initialRotation2;
        private _boneNames;
        private _transforms;
        private _aggregates;
        private _ragdollMode;
        private _rootBoneName;
        private _rootBoneIndex;
        private _mass;
        private _restitution;
        private _beforeRenderObserver;
        /**
         * Pause synchronization between physics and bone position/orientation
         */
        pauseSync: boolean;
        private _putBoxesInBoneCenter;
        private _defaultJoint;
        private _defaultJointMin;
        private _defaultJointMax;
        /**
         * Construct a new Ragdoll object. Once ready, it can be made dynamic by calling `Ragdoll` method
         * @param skeleton The skeleton containing bones to be physicalized
         * @param rootTransformNode The mesh or its transform used by the skeleton
         * @param config an array of `RagdollBoneProperties` corresponding to bones and their properties used to instanciate physics bodies
         */
        constructor(skeleton: Skeleton, rootTransformNode: Mesh | TransformNode, config: RagdollBoneProperties[]);
        /**
         * returns an array of created constraints
         * @returns array of created constraints
         */
        getConstraints(): Array<PhysicsConstraint>;
        /**
         * Returns the aggregate corresponding to the ragdoll bone index
         * @param index ragdoll bone aggregate index
         * @returns the aggregate for the bone index for the root aggregate if index is invalid
         */
        getAggregate(index: number): PhysicsAggregate;
        private _createColliders;
        private _initJoints;
        private _syncBonesToPhysics;
        private _setBoneOrientationToBody;
        private _syncBonesAndBoxes;
        private _setBodyOrientationToBone;
        private _defineRootBone;
        private _findNearestParent;
        private _init;
        /**
         * Enable ragdoll mode. Create physics objects and make them dynamic.
         */
        ragdoll(): void;
        /**
         * Dispose resources and remove physics objects
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Options for creating a physics shape
     */
    export interface PhysicShapeOptions {
        /**
         * The type of the shape. This can be one of the following: SPHERE, BOX, CAPSULE, CYLINDER, CONVEX_HULL, MESH, HEIGHTFIELD, CONTAINER
         */
        type?: PhysicsShapeType;
        /**
         * The parameters of the shape. Varies depending of the shape type.
         */
        parameters?: PhysicsShapeParameters;
        /**
         * Reference to an already existing physics shape in the plugin.
         */
        pluginData?: any;
    }
    /**
     * PhysicsShape class.
     * This class is useful for creating a physics shape that can be used in a physics engine.
     * A Physic Shape determine how collision are computed. It must be attached to a body.
     */
    export class PhysicsShape {
        /**
         * V2 Physics plugin private data for single shape
         */
        _pluginData: any;
        /**
         * The V2 plugin used to create and manage this Physics Body
         */
        private _physicsPlugin;
        private _type;
        private _material;
        private _isTrigger;
        private _isDisposed;
        /**
         * Constructs a new physics shape.
         * @param options The options for the physics shape. These are:
         *  * type: The type of the shape. This can be one of the following: SPHERE, BOX, CAPSULE, CYLINDER, CONVEX_HULL, MESH, HEIGHTFIELD, CONTAINER
         *  * parameters: The parameters of the shape.
         *  * pluginData: The plugin data of the shape. This is used if you already have a reference to the object on the plugin side.
         * You need to specify either type or pluginData.
         * @param scene The scene the shape belongs to.
         *
         * This code is useful for creating a new physics shape with the given type, options, and scene.
         * It also checks that the physics engine and plugin version are correct.
         * If not, it throws an error. This ensures that the shape is created with the correct parameters and is compatible with the physics engine.
         */
        constructor(options: PhysicShapeOptions, scene: Scene);
        /**
         * Returns the string "PhysicsShape".
         * @returns "PhysicsShape"
         */
        getClassName(): string;
        /**
         * Returns the type of the physics shape.
         * @returns The type of the physics shape.
         */
        get type(): PhysicsShapeType;
        /**
         * Set the membership mask of a shape. This is a bitfield of arbitrary
         * "categories" to which the shape is a member. This is used in combination
         * with the collide mask to determine if this shape should collide with
         * another.
         *
         * @param membershipMask Bitfield of categories of this shape.
         */
        set filterMembershipMask(membershipMask: number);
        /**
         * Get the membership mask of a shape.
         * @returns Bitmask of categories which this shape is a member of.
         */
        get filterMembershipMask(): number;
        /**
         * Sets the collide mask of a shape. This is a bitfield of arbitrary
         * "categories" to which this shape collides with. Given two shapes,
         * the engine will check if the collide mask and membership overlap:
         * shapeA.filterMembershipMask & shapeB.filterCollideMask
         *
         * If this value is zero (i.e. shapeB only collides with categories
         * which shapeA is _not_ a member of) then the shapes will not collide.
         *
         * Note, the engine will also perform the same test with shapeA and
         * shapeB swapped; the shapes will not collide if either shape has
         * a collideMask which prevents collision with the other shape.
         *
         * @param collideMask Bitmask of categories this shape should collide with
         */
        set filterCollideMask(collideMask: number);
        /**
         *
         * @returns Bitmask of categories that this shape should collide with
         */
        get filterCollideMask(): number;
        /**
         *
         * @param material
         */
        set material(material: PhysicsMaterial);
        /**
         * Returns the material of the physics shape.
         * @returns The material of the physics shape.
         */
        get material(): PhysicsMaterial;
        /**
         * Sets the density of the physics shape.
         * @param density The density of the physics shape.
         */
        set density(density: number);
        /**
         * Returns the density of the physics shape.
         * @returns The density of the physics shape.
         */
        get density(): number;
        /**
         * Utility to add a child shape to this container,
         * automatically computing the relative transform between
         * the container shape and the child instance.
         *
         * @param parentTransform The transform node associated with this shape
         * @param newChild The new PhysicsShape to add
         * @param childTransform The transform node associated with the child shape
         */
        addChildFromParent(parentTransform: TransformNode, newChild: PhysicsShape, childTransform: TransformNode): void;
        /**
         * Adds a child shape to a container with an optional transform
         * @param newChild The new PhysicsShape to add
         * @param translation Optional position of the child shape relative to this shape
         * @param rotation Optional rotation of the child shape relative to this shape
         * @param scale Optional scale of the child shape relative to this shape
         */
        addChild(newChild: PhysicsShape, translation?: Vector3, rotation?: Quaternion, scale?: Vector3): void;
        /**
         * Removes a child shape from this shape.
         * @param childIndex The index of the child shape to remove
         */
        removeChild(childIndex: number): void;
        /**
         * Returns the number of children of a physics shape.
         * @returns The number of children of a physics shape.
         */
        getNumChildren(): number;
        /**
         * Returns the bounding box of the physics shape.
         * @returns The bounding box of the physics shape.
         */
        getBoundingBox(): BoundingBox;
        set isTrigger(isTrigger: boolean);
        get isTrigger(): boolean;
        /**
         * Dispose the shape and release its associated resources.
         */
        dispose(): void;
    }
    /**
     * Helper object to create a sphere shape
     */
    export class PhysicsShapeSphere extends PhysicsShape {
        /**
         * Constructor for the Sphere Shape
         * @param center local center of the sphere
         * @param radius radius
         * @param scene scene to attach to
         */
        constructor(center: Vector3, radius: number, scene: Scene);
        /**
         * Derive an approximate sphere from the mesh.
         * @param mesh node from which to derive the sphere shape
         * @returns PhysicsShapeSphere
         */
        static FromMesh(mesh: AbstractMesh): PhysicsShapeSphere;
    }
    /**
     * Helper object to create a capsule shape
     */
    export class PhysicsShapeCapsule extends PhysicsShape {
        /**
         *
         * @param pointA Starting point that defines the capsule segment
         * @param pointB ending point of that same segment
         * @param radius radius
         * @param scene scene to attach to
         */
        constructor(pointA: Vector3, pointB: Vector3, radius: number, scene: Scene);
        /**
         * Derive an approximate capsule from the mesh. Note, this is
         * not the optimal bounding capsule.
         * @param mesh Node from which to derive a cylinder shape
         * @returns Physics Shape Capsule
         */
        static FromMesh(mesh: AbstractMesh): PhysicsShapeCapsule;
    }
    /**
     * Helper object to create a cylinder shape
     */
    export class PhysicsShapeCylinder extends PhysicsShape {
        /**
         *
         * @param pointA Starting point that defines the cylinder segment
         * @param pointB ending point of that same segment
         * @param radius radius
         * @param scene scene to attach to
         */
        constructor(pointA: Vector3, pointB: Vector3, radius: number, scene: Scene);
        /**
         * Derive an approximate cylinder from the mesh. Note, this is
         * not the optimal bounding cylinder.
         * @param mesh Node from which to derive a cylinder shape
         * @returns Physics Shape Cylinder
         */
        static FromMesh(mesh: AbstractMesh): PhysicsShapeCylinder;
    }
    /**
     * Helper object to create a box shape
     */
    export class PhysicsShapeBox extends PhysicsShape {
        /**
         *
         * @param center local center of the box
         * @param rotation local orientation
         * @param extents size of the box in each direction
         * @param scene scene to attach to
         */
        constructor(center: Vector3, rotation: Quaternion, extents: Vector3, scene: Scene);
        /**
         *
         * @param mesh
         * @returns PhysicsShapeBox
         */
        static FromMesh(mesh: AbstractMesh): PhysicsShapeBox;
    }
    /**
     * Helper object to create a convex hull shape
     */
    export class PhysicsShapeConvexHull extends PhysicsShape {
        /**
         *
         * @param mesh the mesh to be used as topology infos for the convex hull
         * @param scene scene to attach to
         */
        constructor(mesh: Mesh, scene: Scene);
    }
    /**
     * Helper object to create a mesh shape
     */
    export class PhysicsShapeMesh extends PhysicsShape {
        /**
         *
         * @param mesh the mesh topology that will be used to create the shape
         * @param scene scene to attach to
         */
        constructor(mesh: Mesh, scene: Scene);
    }
    /**
     * A shape container holds a variable number of shapes. Use AddChild to append to newly created parent container.
     */
    export class PhysicsShapeContainer extends PhysicsShape {
        /**
         * Constructor of the Shape container
         * @param scene scene to attach to
         */
        constructor(scene: Scene);
    }
    /**
     * Helper object to create a heightfield Shape
     */
    export class PhysicsShapeHeightField extends PhysicsShape {
        /**
         * Constructor of the Shape heightfield
         * @param heightFieldSizeX The size of the heightfield in the X axis
         * @param heightFieldSizeZ The size of the heightfield in the Z axis
         * @param numHeightFieldSamplesX The number of samples along the X axis
         * @param numHeightFieldSamplesZ The number of samples along the Z axis
         * @param heightFieldData The data for the heightfield
         * @param scene scene to attach to
         */
        constructor(heightFieldSizeX: number, heightFieldSizeZ: number, numHeightFieldSamplesX: number, numHeightFieldSamplesZ: number, heightFieldData: Float32Array, scene: Scene);
    }
    /**
     * Helper object to create a ground mesh Shape
     */
    export class PhysicsShapeGroundMesh extends PhysicsShape {
        /**
         * Constructor of the Shape heightfield
         * @param groundMesh ground mesh used for display
         * @param scene scene to attach to
         */
        constructor(groundMesh: GroundMesh, scene: Scene);
    }


    /**
     * Determines how values from the PhysicsMaterial are combined when
     * two objects are in contact. When each PhysicsMaterial specifies
     * a different combine mode for some property, the combine mode which
     * is used will be selected based on their order in this enum - i.e.
     * a value later in this list will be preferentially used.
     */
    export enum PhysicsMaterialCombineMode {
        /**
         * The final value will be the geometric mean of the two values:
         * sqrt( valueA *  valueB )
         */
        GEOMETRIC_MEAN = 0,
        /**
         * The final value will be the smaller of the two:
         * min( valueA , valueB )
         */
        MINIMUM = 1,
        /** The final value will be the larger of the two:
         * max( valueA , valueB )
         */
        MAXIMUM = 2,
        /** The final value will be the arithmetic mean of the two values:
         * (valueA + valueB) / 2
         */
        ARITHMETIC_MEAN = 3,
        /**
         * The final value will be the product of the two values:
         * valueA * valueB
         */
        MULTIPLY = 4
    }
    /**
     * Physics material class
     * Helps setting friction and restitution that are used to compute responding forces in collision response
     */
    export interface PhysicsMaterial {
        /**
         * Sets the friction used by this material
         *
         * The friction determines how much an object will slow down when it is in contact with another object.
         * This is important for simulating realistic physics, such as when an object slides across a surface.
         *
         * If not provided, a default value of 0.5 will be used.
         */
        friction?: number;
        /**
         * Sets the static friction used by this material.
         *
         * Static friction is the friction that must be overcome before a pair of objects can start sliding
         * relative to each other; for physically-realistic behaviour, it should be at least as high as the
         * normal friction value. If not provided, the friction value will be used
         */
        staticFriction?: number;
        /**
         * Sets the restitution of the physics material.
         *
         * The restitution is a factor which describes, the amount of energy that is retained after a collision,
         * which should be a number between 0 and 1..
         *
         * A restitution of 0 means that no energy is retained and the objects will not bounce off each other,
         * while a restitution of 1 means that all energy is retained and the objects will bounce.
         *
         * Note, though, due that due to the simulation implementation, an object with a restitution of 1 may
         * still lose energy over time.
         *
         * If not provided, a default value of 0 will be used.
         */
        restitution?: number;
        /**
         * Describes how two different friction values should be combined. See PhysicsMaterialCombineMode for
         * more details.
         *
         * If not provided, will use PhysicsMaterialCombineMode.MINIMUM
         */
        frictionCombine?: PhysicsMaterialCombineMode;
        /**
         * Describes how two different restitution values should be combined. See PhysicsMaterialCombineMode for
         * more details.
         *
         * If not provided, will use PhysicsMaterialCombineMode.MAXIMUM
         */
        restitutionCombine?: PhysicsMaterialCombineMode;
    }


        interface TransformNode {
            /** @internal */
            _physicsBody: Nullable<PhysicsBody>;
            /**
             * Gets or sets the physics body associated with this node.
             */
            physicsBody: Nullable<PhysicsBody>;
            /**
             *
             */
            getPhysicsBody(): Nullable<PhysicsBody>;
            /** Apply a physic impulse to the mesh
             * @param force defines the force to apply
             * @param contactPoint defines where to apply the force
             * @returns the current mesh
             */
            applyImpulse(force: Vector3, contactPoint: Vector3): TransformNode;
            /** Apply a physic angular impulse to the mesh
             * @param angularImpulse defines the torque to apply
             * @returns the current mesh
             */
            applyAngularImpulse(angularImpulse: Vector3): TransformNode;
            /** Apply a physic torque to the mesh
             * @param torque defines the torque to apply
             * @returns the current mesh
             */
            applyTorque(torque: Vector3): TransformNode;
            /** @internal */
            _disposePhysicsObserver: Nullable<Observer<Node>>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for physicsV2PhysicsEngineComponent.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPhysicsV2PhysicsEngineComponent(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import physicsEngineComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to control physics engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsEngineV2 implements IPhysicsEngine {
        private _physicsPlugin;
        /** @internal */
        private _physicsBodies;
        private _subTimeStep;
        /**
         * Gets the gravity vector used by the simulation
         */
        gravity: Vector3;
        /**
         *
         * @returns physics plugin version
         */
        getPluginVersion(): number;
        /**
         * Factory used to create the default physics plugin.
         * @returns The default physics plugin
         */
        static DefaultPluginFactory(): IPhysicsEnginePluginV2;
        /**
         * Creates a new Physics Engine
         * @param gravity defines the gravity vector used by the simulation
         * @param _physicsPlugin defines the plugin to use (CannonJS by default)
         */
        constructor(gravity: Nullable<Vector3>, _physicsPlugin?: IPhysicsEnginePluginV2);
        /**
         * Sets the gravity vector used by the simulation
         * @param gravity defines the gravity vector to use
         */
        setGravity(gravity: Vector3): void;
        /**
         * Set the time step of the physics engine.
         * Default is 1/60.
         * To slow it down, enter 1/600 for example.
         * To speed it up, 1/30
         * Unit is seconds.
         * @param newTimeStep defines the new timestep to apply to this world.
         */
        setTimeStep(newTimeStep?: number): void;
        /**
         * Get the time step of the physics engine.
         * @returns the current time step
         */
        getTimeStep(): number;
        /**
         * Set the sub time step of the physics engine.
         * Default is 0 meaning there is no sub steps
         * To increase physics resolution precision, set a small value (like 1 ms)
         * @param subTimeStep defines the new sub timestep used for physics resolution.
         */
        setSubTimeStep(subTimeStep?: number): void;
        /**
         * Get the sub time step of the physics engine.
         * @returns the current sub time step
         */
        getSubTimeStep(): number;
        /**
         * Release all resources
         */
        dispose(): void;
        /**
         * Gets the name of the current physics plugin
         * @returns the name of the plugin
         */
        getPhysicsPluginName(): string;
        /**
         * Set the maximum allowed linear and angular velocities
         * @param maxLinearVelocity maximum allowed linear velocity
         * @param maxAngularVelocity maximum allowed angular velocity
         */
        setVelocityLimits(maxLinearVelocity: number, maxAngularVelocity: number): void;
        /**
         * @returns maximum allowed linear velocity
         */
        getMaxLinearVelocity(): number;
        /**
         * @returns maximum allowed angular velocity
         */
        getMaxAngularVelocity(): number;
        /**
         * Called by the scene. No need to call it.
         * @param delta defines the timespan between frames
         */
        _step(delta: number): void;
        /**
         * Add a body as an active component of this engine
         * @param physicsBody The body to add
         */
        addBody(physicsBody: PhysicsBody): void;
        /**
         * Removes a particular body from this engine
         * @param physicsBody The body to remove from the simulation
         */
        removeBody(physicsBody: PhysicsBody): void;
        /**
         * @returns an array of bodies added to this engine
         */
        getBodies(): Array<PhysicsBody>;
        /**
         * Gets the current plugin used to run the simulation
         * @returns current plugin
         */
        getPhysicsPlugin(): IPhysicsEnginePluginV2;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param result resulting PhysicsRaycastResult or array of PhysicsRaycastResults
         * @param query raycast query object
         * If result is an empty array, it will be populated with every detected raycast hit.
         * If result is a populated array, it will only fill the PhysicsRaycastResults present in the array.
         */
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult | Array<PhysicsRaycastResult>, query?: IRaycastQuery): void;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param query raycast query object
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3, query?: IRaycastQuery): PhysicsRaycastResult;
        /**
         * Does a raycast through multiple objects in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param query raycast query object
         * @returns array of PhysicsRaycastResult
         */
        raycastMulti(from: Vector3, to: Vector3, query?: IRaycastQuery): Array<PhysicsRaycastResult>;
    }


    /**
     * This is a holder class for the physics constraint created by the physics plugin
     * It holds a set of functions to control the underlying constraint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsConstraint {
        /**
         * V2 Physics plugin private data for a physics material
         */
        _pluginData: any;
        /**
         * The V2 plugin used to create and manage this Physics Body
         */
        protected _physicsPlugin: IPhysicsEnginePluginV2;
        protected _options: PhysicsConstraintParameters;
        protected _type: PhysicsConstraintType;
        /**
         * @internal
         * The internal options that were used to init the constraint
         */
        _initOptions?: PhysicsConstraintParameters;
        /**
         * Constructs a new constraint for the physics constraint.
         * @param type The type of constraint to create.
         * @param options The options for the constraint.
         * @param scene The scene the constraint belongs to.
         *
         * This code is useful for creating a new constraint for the physics engine. It checks if the scene has a physics engine, and if the plugin version is correct.
         * If all checks pass, it initializes the constraint with the given type and options.
         */
        constructor(type: PhysicsConstraintType, options: PhysicsConstraintParameters, scene: Scene);
        /**
         * Gets the type of the constraint.
         *
         * @returns The type of the constraint.
         *
         */
        get type(): PhysicsConstraintType;
        /**
         * Retrieves the options of the physics constraint.
         *
         * @returns The physics constraint parameters.
         *
         */
        get options(): PhysicsConstraintParameters;
        /**
         * Enable/disable the constraint
         * @param isEnabled value for the constraint
         */
        set isEnabled(isEnabled: boolean);
        /**
         *
         * @returns true if constraint is enabled
         */
        get isEnabled(): boolean;
        /**
         * Enables or disables collisions for the physics engine.
         *
         * @param isEnabled - A boolean value indicating whether collisions should be enabled or disabled.
         *
         */
        set isCollisionsEnabled(isEnabled: boolean);
        /**
         * Gets whether collisions are enabled for this physics object.
         *
         * @returns `true` if collisions are enabled, `false` otherwise.
         *
         */
        get isCollisionsEnabled(): boolean;
        /**
         * Gets all bodies that are using this constraint
         * @returns
         */
        getBodiesUsingConstraint(): ConstrainedBodyPair[];
        /**
         * Disposes the constraint from the physics engine.
         *
         * This method is useful for cleaning up the physics engine when a body is no longer needed. Disposing the body will free up resources and prevent memory leaks.
         */
        dispose(): void;
    }
    /**
     * This describes a single limit used by Physics6DoFConstraint
     */
    export class Physics6DoFLimit {
        /**
         * The axis ID to limit
         */
        axis: PhysicsConstraintAxis;
        /**
         * An optional minimum limit for the axis.
         * Corresponds to a distance in meters for linear axes, an angle in radians for angular axes.
         */
        minLimit?: number;
        /**
         * An optional maximum limit for the axis.
         * Corresponds to a distance in meters for linear axes, an angle in radians for angular axes.
         */
        maxLimit?: number;
        /**
         * The stiffness of the constraint.
         */
        stiffness?: number;
        /**
         * A constraint parameter that specifies damping.
         */
        damping?: number;
    }
    /**
     * A generic constraint, which can be used to build more complex constraints than those specified
     * in PhysicsConstraintType. The axis and pivot options in PhysicsConstraintParameters define the space
     * the constraint operates in. This constraint contains a set of limits, which restrict the
     * relative movement of the bodies in that coordinate system
     */
    export class Physics6DoFConstraint extends PhysicsConstraint {
        /**
         * The collection of limits which this constraint will apply
         */
        limits: Physics6DoFLimit[];
        constructor(constraintParams: PhysicsConstraintParameters, limits: Physics6DoFLimit[], scene: Scene);
        /**
         * Sets the friction of the given axis of the physics engine.
         * @param axis - The axis of the physics engine to set the friction for.
         * @param friction - The friction to set for the given axis.
         *
         */
        setAxisFriction(axis: PhysicsConstraintAxis, friction: number): void;
        /**
         * Gets the friction of the given axis of the physics engine.
         * @param axis - The axis of the physics engine.
         * @returns The friction of the given axis, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisFriction(axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the limit mode for the given axis of the constraint.
         * @param axis The axis to set the limit mode for.
         * @param limitMode The limit mode to set.
         *
         * This method is useful for setting the limit mode for a given axis of the constraint. This is important for
         * controlling the behavior of the physics engine when the constraint is reached. By setting the limit mode,
         * the engine can be configured to either stop the motion of the objects, or to allow them to continue
         * moving beyond the constraint.
         */
        setAxisMode(axis: PhysicsConstraintAxis, limitMode: PhysicsConstraintAxisLimitMode): void;
        /**
         * Gets the limit mode of the given axis of the constraint.
         *
         * @param axis - The axis of the constraint.
         * @returns The limit mode of the given axis, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMode(axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintAxisLimitMode>;
        /**
         * Sets the minimum limit of a given axis of a constraint.
         * @param axis - The axis of the constraint.
         * @param minLimit - The minimum limit of the axis.
         *
         */
        setAxisMinLimit(axis: PhysicsConstraintAxis, minLimit: number): void;
        /**
         * Gets the minimum limit of the given axis of the physics engine.
         * @param axis - The axis of the physics engine.
         * @returns The minimum limit of the given axis, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMinLimit(axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the maximum limit of the given axis for the physics engine.
         * @param axis - The axis to set the limit for.
         * @param limit - The maximum limit of the axis.
         *
         * This method is useful for setting the maximum limit of the given axis for the physics engine,
         * which can be used to control the movement of the physics object. This helps to ensure that the
         * physics object does not move beyond the given limit.
         */
        setAxisMaxLimit(axis: PhysicsConstraintAxis, limit: number): void;
        /**
         * Gets the maximum limit of the given axis of the physics engine.
         * @param axis - The axis of the physics engine.
         * @returns The maximum limit of the given axis, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMaxLimit(axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the motor type of the given axis of the constraint.
         * @param axis - The axis of the constraint.
         * @param motorType - The type of motor to use.
         */
        setAxisMotorType(axis: PhysicsConstraintAxis, motorType: PhysicsConstraintMotorType): void;
        /**
         * Gets the motor type of the specified axis of the constraint.
         *
         * @param axis - The axis of the constraint.
         * @returns The motor type of the specified axis, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMotorType(axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintMotorType>;
        /**
         * Sets the target velocity of the motor associated with the given axis of the constraint.
         * @param axis - The axis of the constraint.
         * @param target - The target velocity of the motor.
         *
         * This method is useful for setting the target velocity of the motor associated with the given axis of the constraint.
         */
        setAxisMotorTarget(axis: PhysicsConstraintAxis, target: number): void;
        /**
         * Gets the target velocity of the motor associated to the given constraint axis.
         * @param axis - The constraint axis associated to the motor.
         * @returns The target velocity of the motor, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMotorTarget(axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the maximum force of the motor of the given axis of the constraint.
         * @param axis - The axis of the constraint.
         * @param maxForce - The maximum force of the motor.
         *
         */
        setAxisMotorMaxForce(axis: PhysicsConstraintAxis, maxForce: number): void;
        /**
         * Gets the maximum force of the motor of the given axis of the constraint.
         * @param axis - The axis of the constraint.
         * @returns The maximum force of the motor, or null if the constraint hasn't been initialized yet.
         *
         */
        getAxisMotorMaxForce(axis: PhysicsConstraintAxis): Nullable<number>;
    }
    /**
     * Represents a Ball and Socket Constraint, used to simulate a joint
     * This class is useful for simulating a joint between two bodies in a physics engine.
     * It allows for the two bodies to move relative to each other in a way that mimics a ball and socket joint, such as a shoulder or hip joint.
     * @param pivotA - The first pivot, defined locally in the first body frame
     * @param pivotB - The second pivot, defined locally in the second body frame
     * @param axisA - The axis of the first body
     * @param axisB - The axis of the second body
     * @param scene - The scene the constraint is applied to
     * @returns The Ball and Socket Constraint
     */
    export class BallAndSocketConstraint extends PhysicsConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, scene: Scene);
    }
    /**
     * Creates a distance constraint.
     *
     * This code is useful for creating a distance constraint in a physics engine.
     * A distance constraint is a type of constraint that keeps two objects at a certain distance from each other.
     * The scene is used to add the constraint to the physics engine.
     * @param maxDistance distance between bodies
     * @param scene The scene the constraint belongs to
     * @returns DistanceConstraint
     */
    export class DistanceConstraint extends PhysicsConstraint {
        constructor(maxDistance: number, scene: Scene);
    }
    /**
     * Creates a HingeConstraint, which is a type of PhysicsConstraint.
     *
     * This code is useful for creating a HingeConstraint, which is a type of PhysicsConstraint.
     * This constraint is used to simulate a hinge joint between two rigid bodies, allowing them to rotate around a single axis.
     * @param pivotA - The first pivot point, in world space.
     * @param pivotB - The second pivot point, in world space.
     * @param scene - The scene the constraint is used in.
     * @returns The new HingeConstraint.
     */
    export class HingeConstraint extends PhysicsConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, scene: Scene);
    }
    /**
     * Creates a SliderConstraint, which is a type of PhysicsConstraint.
     *
     * This code is useful for creating a SliderConstraint, which is a type of PhysicsConstraint.
     * It allows the user to specify the two pivots and two axes of the constraint in world space, as well as the scene the constraint belongs to.
     * This is useful for creating a constraint between two rigid bodies that allows them to move along a certain axis.
     * @param pivotA - The first pivot of the constraint, in world space.
     * @param pivotB - The second pivot of the constraint, in world space.
     * @param axisA - The first axis of the constraint, in world space.
     * @param axisB - The second axis of the constraint, in world space.
     * @param scene - The scene the constraint belongs to.
     * @returns The created SliderConstraint.
     */
    export class SliderConstraint extends PhysicsConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, scene: Scene);
    }
    /**
     * Creates a LockConstraint, which is a type of PhysicsConstraint.
     *
     * This code is useful for creating a LockConstraint, which is a type of PhysicsConstraint.
     * It takes in two pivots and two axes in local space, as well as the scene the constraint belongs to, and creates a LockConstraint.
     * @param pivotA - The first pivot of the constraint in local space.
     * @param pivotB - The second pivot of the constraint in local space.
     * @param axisA - The first axis of the constraint in local space.
     * @param axisB - The second axis of the constraint in local space.
     * @param scene - The scene the constraint belongs to.
     * @returns The created LockConstraint.
     */
    export class LockConstraint extends PhysicsConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, scene: Scene);
    }
    /**
     * Creates a PrismaticConstraint, which is a type of PhysicsConstraint.
     *
     * This code is useful for creating a PrismaticConstraint, which is a type of PhysicsConstraint.
     * It takes in two pivots and two axes in local space, as well as the scene the constraint belongs to, and creates a PrismaticConstraint.
     * @param pivotA - The first pivot of the constraint in local space.
     * @param pivotB - The second pivot of the constraint in local space.
     * @param axisA - The first axis of the constraint in local space.
     * @param axisB - The second axis of the constraint in local space.
     * @param scene - The scene the constraint belongs to.
     * @returns The created PrismaticConstraint.
     */
    export class PrismaticConstraint extends PhysicsConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, scene: Scene);
    }
    /**
     * Creates a SpringConstraint, which is a type of Physics6DoFConstraint. This constraint applies a force at the ends which is proportional
     * to the distance between ends, and a stiffness and damping factor. The force is calculated as (stiffness * positionError) - (damping * velocity)
     *
     * @param pivotA - The first pivot of the constraint in local space.
     * @param pivotB - The second pivot of the constraint in local space.
     * @param axisA - The first axis of the constraint in local space.
     * @param axisB - The second axis of the constraint in local space.
     * @param minDistance - The minimum distance between the two pivots.
     * @param maxDistance - The maximum distance between the two pivots.
     * @param stiffness - The stiffness of the spring.
     * @param damping - The damping of the spring.
     * @param scene - The scene the constraint belongs to.
     * @returns The created SpringConstraint.
     */
    export class SpringConstraint extends Physics6DoFConstraint {
        constructor(pivotA: Vector3, pivotB: Vector3, axisA: Vector3, axisB: Vector3, minDistance: number, maxDistance: number, stiffness: number, damping: number, scene: Scene);
    }


    /**
     * PhysicsBody is useful for creating a physics body that can be used in a physics engine. It allows
     * the user to set the mass and velocity of the body, which can then be used to calculate the
     * motion of the body in the physics engine.
     */
    export class PhysicsBody {
        /**
         * V2 Physics plugin private data for single Transform
         */
        _pluginData: any;
        /**
         * V2 Physics plugin private data for instances
         */
        _pluginDataInstances: Array<any>;
        /**
         * The V2 plugin used to create and manage this Physics Body
         */
        private _physicsPlugin;
        /**
         * The engine used to create and manage this Physics Body
         */
        private _physicsEngine;
        /**
         * If the collision callback is enabled
         */
        private _collisionCBEnabled;
        /**
         * If the collision ended callback is enabled
         */
        private _collisionEndedCBEnabled;
        /**
         * The transform node associated with this Physics Body
         */
        transformNode: TransformNode;
        /**
         * Disable pre-step that consists in updating Physics Body from Transform Node Translation/Orientation.
         * True by default for maximum performance.
         */
        get disablePreStep(): boolean;
        set disablePreStep(value: boolean);
        /**
         * Disable sync from physics to transformNode. This value is set to true at body creation or at motionType setting when the body is not dynamic.
         */
        disableSync: boolean;
        /**
         * Physics engine will try to make this body sleeping and not active
         */
        startAsleep: boolean;
        private _nodeDisposeObserver;
        private _isDisposed;
        private _shape;
        private _prestepType;
        /**
         * Constructs a new physics body for the given node.
         * @param transformNode - The Transform Node to construct the physics body for. For better performance, it is advised that this node does not have a parent.
         * @param motionType - The motion type of the physics body. The options are:
         *  - PhysicsMotionType.STATIC - Static bodies are not moving and unaffected by forces or collisions. They are good for level boundaries or terrain.
         *  - PhysicsMotionType.DYNAMIC - Dynamic bodies are fully simulated. They can move and collide with other objects.
         *  - PhysicsMotionType.ANIMATED - They behave like dynamic bodies, but they won't be affected by other bodies, but still push other bodies out of the way.
         * @param startsAsleep - Whether the physics body should start in a sleeping state (not a guarantee). Defaults to false.
         * @param scene - The scene containing the physics engine.
         *
         * This code is useful for creating a physics body for a given Transform Node in a scene.
         * It checks the version of the physics engine and the physics plugin, and initializes the body accordingly.
         * It also sets the node's rotation quaternion if it is not already set. Finally, it adds the body to the physics engine.
         */
        constructor(transformNode: TransformNode, motionType: PhysicsMotionType, startsAsleep: boolean, scene: Scene);
        /**
         * Returns the string "PhysicsBody".
         * @returns "PhysicsBody"
         */
        getClassName(): string;
        /**
         * Clone the PhysicsBody to a new body and assign it to the transformNode parameter
         * @param transformNode transformNode that will be used for the cloned PhysicsBody
         * @returns the newly cloned PhysicsBody
         */
        clone(transformNode: TransformNode): PhysicsBody;
        /**
         * If a physics body is connected to an instanced node, update the number physic instances to match the number of node instances.
         */
        updateBodyInstances(): void;
        /**
         * This returns the number of internal instances of the physics body
         */
        get numInstances(): number;
        /**
         * Get the motion type of the physics body. Can be STATIC, DYNAMIC, or ANIMATED.
         */
        get motionType(): PhysicsMotionType;
        /**
         * Sets the shape of the physics body.
         * @param shape - The shape of the physics body.
         *
         * This method is useful for setting the shape of the physics body, which is necessary for the physics engine to accurately simulate the body's behavior.
         * The shape is used to calculate the body's mass, inertia, and other properties.
         */
        set shape(shape: Nullable<PhysicsShape>);
        /**
         * Retrieves the physics shape associated with this object.
         *
         * @returns The physics shape associated with this object, or `undefined` if no
         * shape is associated.
         *
         * This method is useful for retrieving the physics shape associated with this object,
         * which can be used to apply physical forces to the object or to detect collisions.
         */
        get shape(): Nullable<PhysicsShape>;
        /**
         * Returns the bounding box of the physics body.
         * @returns The bounding box of the physics body.
         */
        getBoundingBox(): BoundingBox;
        /**
         * Sets the event mask for the physics engine.
         *
         * @param eventMask - A bitmask that determines which events will be sent to the physics engine.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the event mask for.
         *
         * This method is useful for setting the event mask for the physics engine, which determines which events
         * will be sent to the physics engine. This allows the user to control which events the physics engine will respond to.
         */
        setEventMask(eventMask: number, instanceIndex?: number): void;
        /**
         * Gets the event mask of the physics engine.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the event mask for.
         * @returns The event mask of the physics engine.
         *
         * This method is useful for getting the event mask of the physics engine,
         * which is used to determine which events the engine will respond to.
         * This is important for ensuring that the engine is responding to the correct events and not
         * wasting resources on unnecessary events.
         */
        getEventMask(instanceIndex?: number): number;
        /**
         * Sets the motion type of the physics body. Can be STATIC, DYNAMIC, or ANIMATED.
         * @param motionType - The motion type to set.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the motion type for. If body is instanced but instanceIndex is undefined, the motion type will be set for all instances.
         */
        setMotionType(motionType: PhysicsMotionType, instanceIndex?: number): void;
        /**
         * Gets the motion type of the physics body. Can be STATIC, DYNAMIC, or ANIMATED.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the motion type for.
         * @returns The motion type of the physics body.
         */
        getMotionType(instanceIndex?: number): PhysicsMotionType;
        /**
         * Set the prestep type of the body
         * @param prestepType prestep type provided by PhysicsPrestepType
         */
        setPrestepType(prestepType: PhysicsPrestepType): void;
        /**
         * Get the current prestep type of the body
         * @returns the type of prestep associated with the body and its instance index
         */
        getPrestepType(): PhysicsPrestepType;
        /**
         * Computes the mass properties of the physics object, based on the set of physics shapes this body uses.
         * This method is useful for computing the initial mass properties of a physics object, such as its mass,
         * inertia, and center of mass; these values are important for accurately simulating the physics of the
         * object in the physics engine, and computing values based on the shape will provide you with reasonable
         * initial values, which you can then customize.
         * @param instanceIndex - The index of the instance to compute the mass properties for.
         * @returns The mass properties of the object.
         */
        computeMassProperties(instanceIndex?: number): PhysicsMassProperties;
        /**
         * Sets the mass properties of the physics object.
         *
         * @param massProps - The mass properties to set.
         * @param instanceIndex - The index of the instance to set the mass properties for. If not defined, the mass properties will be set for all instances.
         *
         * This method is useful for setting the mass properties of a physics object, such as its mass,
         * inertia, and center of mass. This is important for accurately simulating the physics of the object in the physics engine.
         */
        setMassProperties(massProps: PhysicsMassProperties, instanceIndex?: number): void;
        /**
         * Retrieves the mass properties of the object.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the mass properties for.
         * @returns The mass properties of the object.
         *
         * This method is useful for physics simulations, as it allows the user to
         * retrieve the mass properties of the object, such as its mass, center of mass,
         * and moment of inertia. This information is necessary for accurate physics
         * simulations.
         */
        getMassProperties(instanceIndex?: number): PhysicsMassProperties;
        /**
         * Sets the linear damping of the physics body.
         *
         * @param damping - The linear damping value.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the linear damping for.
         *
         * This method is useful for controlling the linear damping of the physics body,
         * which is the rate at which the body's velocity decreases over time. This is useful for simulating
         * the effects of air resistance or other forms of friction.
         */
        setLinearDamping(damping: number, instanceIndex?: number): void;
        /**
         * Gets the linear damping of the physics body.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the linear damping for.
         * @returns The linear damping of the physics body.
         *
         * This method is useful for retrieving the linear damping of the physics body, which is the amount of
         * resistance the body has to linear motion. This is useful for simulating realistic physics behavior
         * in a game.
         */
        getLinearDamping(instanceIndex?: number): number;
        /**
         * Sets the angular damping of the physics body.
         * @param damping The angular damping of the body.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the angular damping for.
         *
         * This method is useful for controlling the angular velocity of a physics body.
         * By setting the damping, the body's angular velocity will be reduced over time, simulating the effect of friction.
         * This can be used to create realistic physical behavior in a physics engine.
         */
        setAngularDamping(damping: number, instanceIndex?: number): void;
        /**
         * Gets the angular damping of the physics body.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the angular damping for.
         *
         * @returns The angular damping of the physics body.
         *
         * This method is useful for getting the angular damping of the physics body,
         * which is the rate of reduction of the angular velocity over time.
         * This is important for simulating realistic physics behavior in a game.
         */
        getAngularDamping(instanceIndex?: number): number;
        /**
         * Sets the linear velocity of the physics object.
         * @param linVel - The linear velocity to set.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the linear velocity for.
         *
         * This method is useful for setting the linear velocity of a physics object,
         * which is necessary for simulating realistic physics in a game engine.
         * By setting the linear velocity, the physics object will move in the direction and speed specified by the vector.
         * This allows for realistic physics simulations, such as simulating the motion of a ball rolling down a hill.
         */
        setLinearVelocity(linVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the linear velocity of the physics body and stores it in the given vector3.
         * @param linVel - The vector3 to store the linear velocity in.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the linear velocity for.
         *
         * This method is useful for getting the linear velocity of a physics body in a physics engine.
         * This can be used to determine the speed and direction of the body, which can be used to calculate the motion of the body.
         */
        getLinearVelocityToRef(linVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the linear velocity of the physics body as a new vector3.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the linear velocity for.
         * @returns The linear velocity of the physics body.
         *
         * This method is useful for getting the linear velocity of a physics body in a physics engine.
         * This can be used to determine the speed and direction of the body, which can be used to calculate the motion of the body.
         */
        getLinearVelocity(instanceIndex?: number): Vector3;
        /**
         * Sets the angular velocity of the physics object.
         * @param angVel - The angular velocity to set.
         * @param instanceIndex - If this body is instanced, the index of the instance to set the angular velocity for.
         *
         * This method is useful for setting the angular velocity of a physics object, which is necessary for
         * simulating realistic physics behavior. The angular velocity is used to determine the rate of rotation of the object,
         * which is important for simulating realistic motion.
         */
        setAngularVelocity(angVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the angular velocity of the physics body and stores it in the given vector3.
         * @param angVel - The vector3 to store the angular velocity in.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the angular velocity for.
         *
         * This method is useful for getting the angular velocity of a physics body, which can be used to determine the body's
         * rotational speed. This information can be used to create realistic physics simulations.
         */
        getAngularVelocityToRef(angVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the angular velocity of the physics body as a new vector3.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the angular velocity for.
         * @returns The angular velocity of the physics body.
         *
         * This method is useful for getting the angular velocity of a physics body, which can be used to determine the body's
         * rotational speed. This information can be used to create realistic physics simulations.
         */
        getAngularVelocity(instanceIndex?: number): Vector3;
        /**
         * Applies an impulse to the physics object.
         *
         * @param impulse The impulse vector.
         * @param location The location of the impulse.
         * @param instanceIndex For a instanced body, the instance to where the impulse should be applied. If not specified, the impulse is applied to all instances.
         *
         * This method is useful for applying an impulse to a physics object, which can be used to simulate physical forces such as gravity,
         * collisions, and explosions. This can be used to create realistic physics simulations in a game or other application.
         */
        applyImpulse(impulse: Vector3, location: Vector3, instanceIndex?: number): void;
        /**
         * Add torque to a physics body
         * @param angularImpulse The angular impulse vector.
         * @param instanceIndex For a instanced body, the instance to where the impulse should be applied. If not specified, the impulse is applied to all instances.
         */
        applyAngularImpulse(angularImpulse: Vector3, instanceIndex?: number): void;
        /**
         * Applies a torque to the physics body.
         *
         * @param torque The torque vector.
         * @param instanceIndex For a instanced body, the instance to where the torque should be applied. If not specified, the torque is applied to all instances.
         *
         * This method is useful for applying a torque to a physics body, which can be used to simulate rotational forces such as motors,
         * angular momentum, and rotational dynamics. This can be used to create realistic physics simulations in a game or other application.
         */
        applyTorque(torque: Vector3, instanceIndex?: number): void;
        /**
         * Applies a force to the physics object.
         *
         * @param force The force vector.
         * @param location The location of the force.
         * @param instanceIndex For a instanced body, the instance to where the force should be applied. If not specified, the force is applied to all instances.
         *
         * This method is useful for applying a force to a physics object, which can be used to simulate physical forces such as gravity,
         * collisions, and explosions. This can be used to create realistic physics simulations in a game or other application.
         */
        applyForce(force: Vector3, location: Vector3, instanceIndex?: number): void;
        /**
         * Retrieves the geometry of the body from the physics plugin.
         *
         * @returns The geometry of the body.
         *
         * This method is useful for retrieving the geometry of the body from the physics plugin, which can be used for various physics calculations.
         */
        getGeometry(): object;
        /**
         * Returns an observable that will be notified for when a collision starts or continues for this PhysicsBody
         * @param instanceIndex - optionally, the index of the instance in the body
         * @returns Observable
         */
        getCollisionObservable(instanceIndex?: number): Observable<IPhysicsCollisionEvent>;
        /**
         * Returns an observable that will be notified when the body has finished colliding with another body
         * @param instanceIndex - optionally, the index of the instance in the body
         * @returns Observable
         */
        getCollisionEndedObservable(instanceIndex?: number): Observable<IBasePhysicsCollisionEvent>;
        /**
         * Enable or disable collision callback for this PhysicsBody.
         * @param enabled true if PhysicsBody's collision will rise a collision event and notifies the observable
         */
        setCollisionCallbackEnabled(enabled: boolean): void;
        /**
         * Enable or disable collision ended callback for this PhysicsBody.
         * @param enabled true if PhysicsBody's collision ended will rise a collision event and notifies the observable
         */
        setCollisionEndedCallbackEnabled(enabled: boolean): void;
        /**
         * Get the center of the object in world space.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the center for.
         * @returns geometric center of the associated mesh
         */
        getObjectCenterWorld(instanceIndex?: number): Vector3;
        /**
         * Get the center of the object in world space.
         * @param ref - The vector3 to store the result in.
         * @param instanceIndex - If this body is instanced, the index of the instance to get the center for.
         * @returns geometric center of the associated mesh
         */
        getObjectCenterWorldToRef(ref: Vector3, instanceIndex?: number): Vector3;
        /**
         * Adds a constraint to the physics engine.
         *
         * @param childBody - The body to which the constraint will be applied.
         * @param constraint - The constraint to be applied.
         * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         *
         */
        addConstraint(childBody: PhysicsBody, constraint: PhysicsConstraint, instanceIndex?: number, childInstanceIndex?: number): void;
        /**
         * Sync with a bone
         * @param bone The bone that the impostor will be synced to.
         * @param boneMesh The mesh that the bone is influencing.
         * @param jointPivot The pivot of the joint / bone in local space.
         * @param distToJoint Optional distance from the impostor to the joint.
         * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.
         * @param boneAxis Optional vector3 axis the bone is aligned with
         */
        syncWithBone(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion, boneAxis?: Vector3): void;
        /**
         * Executes a callback on the body or all of the instances of a body
         * @param callback the callback to execute
         */
        iterateOverAllInstances(callback: (body: PhysicsBody, instanceIndex?: number) => void): void;
        /**
         * Sets the gravity factor of the physics body
         * @param factor the gravity factor to set
         * @param instanceIndex the instance of the body to set, if undefined all instances will be set
         */
        setGravityFactor(factor: number, instanceIndex?: number): void;
        /**
         * Gets the gravity factor of the physics body
         * @param instanceIndex the instance of the body to get, if undefined the value of first instance will be returned
         * @returns the gravity factor
         */
        getGravityFactor(instanceIndex?: number): number;
        /**
         * Set the target transformation (position and rotation) of the body, such that the body will set its velocity to reach that target
         * @param position The target position
         * @param rotation The target rotation
         * @param instanceIndex The index of the instance in an instanced body
         */
        setTargetTransform(position: Vector3, rotation: Quaternion, instanceIndex?: number): void;
        /**
         * Returns if the body has been disposed.
         * @returns true if disposed, false otherwise.
         */
        get isDisposed(): boolean;
        /**
         * Disposes the body from the physics engine.
         *
         * This method is useful for cleaning up the physics engine when a body is no longer needed. Disposing the body will free up resources and prevent memory leaks.
         */
        dispose(): void;
    }


    /**
     * The interface for the physics aggregate parameters
     */
    export interface PhysicsAggregateParameters {
        /**
         * The mass of the physics aggregate
         */
        mass: number;
        /**
         * The friction of the physics aggregate
         */
        friction?: number;
        /**
         * The coefficient of restitution of the physics aggregate
         */
        restitution?: number;
        /**
         * Radius for sphere, cylinder and capsule
         */
        radius?: number;
        /**
         * Starting point for cylinder/capsule
         */
        pointA?: Vector3;
        /**
         * Ending point for cylinder/capsule
         */
        pointB?: Vector3;
        /**
         * Extents for box
         */
        extents?: Vector3;
        /**
         * Orientation for box
         */
        rotation?: Quaternion;
        /**
         * mesh local center
         */
        center?: Vector3;
        /**
         * mesh object. Used for mesh and convex hull aggregates.
         */
        mesh?: Mesh;
        /**
         * Physics engine will try to make this body sleeping and not active
         */
        startAsleep?: boolean;
        /**
         * If true, mark the created shape as a trigger shape
         */
        isTriggerShape?: boolean;
    }
    /**
     * Helper class to create and interact with a PhysicsAggregate.
     * This is a transition object that works like Physics Plugin V1 Impostors.
     * This helper instantiates all mandatory physics objects to get a body/shape and material.
     * It's less efficient than handling body and shapes independently but for prototyping or
     * a small numbers of physics objects, it's good enough.
     */
    export class PhysicsAggregate {
        /**
         * The physics-enabled object used as the physics aggregate
         */
        transformNode: TransformNode;
        /**
         * The type of the physics aggregate
         */
        type: PhysicsShapeType | PhysicsShape;
        private _options;
        private _scene?;
        /**
         * The body that is associated with this aggregate
         */
        body: PhysicsBody;
        /**
         * The shape that is associated with this aggregate
         */
        shape: PhysicsShape;
        /**
         * The material that is associated with this aggregate
         */
        material: PhysicsMaterial;
        private _disposeShapeWhenDisposed;
        private _nodeDisposeObserver;
        constructor(
        /**
         * The physics-enabled object used as the physics aggregate
         */
        transformNode: TransformNode, 
        /**
         * The type of the physics aggregate
         */
        type: PhysicsShapeType | PhysicsShape, _options?: PhysicsAggregateParameters, _scene?: Scene | undefined);
        private _getObjectBoundingBox;
        private _hasVertices;
        private _addSizeOptions;
        /**
         * Releases the body, shape and material
         */
        dispose(): void;
    }




    /**
     * Shape properties for the character controller
     */
    export interface CharacterShapeOptions {
        /**
         * optional shape used for collision detection
         */
        shape?: PhysicsShape;
        /**
         * capsule height for the capsule shape if no shape is provided
         */
        capsuleHeight?: number;
        /**
         * capsule radius for the capsule shape if no shape is provided
         */
        capsuleRadius?: number;
    }
    /**
     * Collision event data for the character controller
     */
    export interface ICharacterControllerCollisionEvent {
        /**
         * The collider physics body
         */
        collider: PhysicsBody;
        /**
         * Index of the collider in instances
         */
        colliderIndex: number;
        /**
         * Separation force applied to the collider
         */
        impulse: Vector3;
        /**
         * Position where the impulse is applied
         */
        impulsePosition: Vector3;
    }
    /**
     * State of the character on the surface
     */
    export enum CharacterSupportedState {
        UNSUPPORTED = 0,
        SLIDING = 1,
        SUPPORTED = 2
    }
    /**
     * Surface information computed by checkSupport method
     */
    export interface CharacterSurfaceInfo {
        /**
         * Indicates whether the surface is dynamic.
         * A dynamic surface is one that can change its properties over time,
         * such as moving platforms or surfaces that can be affected by external forces.
         * surfaceInfo.supportedState is always CharacterSupportedState.SUPPORTED when isSurfaceDynamic is true.
         */
        isSurfaceDynamic: boolean;
        /**
         * The supported state of the character on the surface.
         */
        supportedState: CharacterSupportedState;
        /**
         * The average normal vector of the surface.
         * This vector is perpendicular to the surface and points outwards.
         */
        averageSurfaceNormal: Vector3;
        /**
         * The average velocity of the surface.
         * This vector represents the speed and direction in which the surface is moving.
         */
        averageSurfaceVelocity: Vector3;
        /**
         * The average angular velocity of the surface.
         */
        averageAngularSurfaceVelocity: Vector3;
    }
    interface IContact {
        /** @internal */
        position: Vector3;
        /** @internal */
        normal: Vector3;
        /** @internal */
        distance: number;
        /** @internal */
        fraction: number;
        /** @internal */
        bodyB: {
            body: PhysicsBody;
            index: number;
        };
        /** @internal */
        allowedPenetration: number;
    }
    interface ISurfaceConstraintInfo {
        /** @internal */
        planeNormal: Vector3;
        /** @internal */
        planeDistance: number;
        /** @internal */
        velocity: Vector3;
        /** @internal */
        angularVelocity: Vector3;
        /** @internal */
        staticFriction: number;
        /** @internal */
        extraUpStaticFriction: number;
        /** @internal */
        extraDownStaticFriction: number;
        /** @internal */
        dynamicFriction: number;
        /** @internal */
        priority: number;
    }
    const enum SurfaceConstraintInteractionStatus {
        OK = 0,
        FAILURE_3D = 1,
        FAILURE_2D = 2
    }
    interface ISurfaceConstraintInteraction {
        /** @internal */
        touched: boolean;
        /** @internal */
        stopped: boolean;
        /** @internal */
        surfaceTime: number;
        /** @internal */
        penaltyDistance: number;
        /** @internal */
        status: SurfaceConstraintInteractionStatus;
    }
    /** @internal */
    class SimplexSolverOutput {
        /** @internal */
        position: Vector3;
        /** @internal */
        velocity: Vector3;
        /** @internal */
        deltaTime: number;
        /** @internal */
        planeInteractions: ISurfaceConstraintInteraction[];
    }
    /** @internal */
    class SimplexSolverActivePlanes {
        /** @internal */
        index: number;
        /** @internal */
        constraint: ISurfaceConstraintInfo;
        /** @internal */
        interaction: ISurfaceConstraintInteraction;
        /** @internal */
        copyFrom(other: SimplexSolverActivePlanes): void;
    }
    /** @internal */
    class SimplexSolverInfo {
        /** @internal */
        supportPlanes: Array<SimplexSolverActivePlanes>;
        /** @internal */
        numSupportPlanes: number;
        /** @internal */
        currentTime: number;
        /** @internal */
        inputConstraints: ISurfaceConstraintInfo[];
        /** @internal */
        outputInteractions: ISurfaceConstraintInteraction[];
        /** @internal */
        getOutput(constraint: ISurfaceConstraintInfo): ISurfaceConstraintInteraction;
    }
    /**
     * Character controller using physics
     */
    export class PhysicsCharacterController {
        private _position;
        private _orientation;
        private _velocity;
        private _lastVelocity;
        private _shape;
        private _body;
        private _transformNode;
        private _ownShape;
        private _manifold;
        private _stepUpSavedManifold;
        private _lastDisplacement;
        private _contactAngleSensitivity;
        private _lastInvDeltaTime;
        private _scene;
        private _tmpMatrix;
        private _tmpVecs;
        /**
         * minimum distance to make contact
         * default 0.05
         */
        keepDistance: number;
        /**
         * maximum distance to keep contact
         * default 0.1
         */
        keepContactTolerance: number;
        /**
         * maximum number of raycast per integration starp
         * default 10
         */
        maxCastIterations: number;
        /**
         * speed when recovery from penetration
         * default 1.0
         */
        penetrationRecoverySpeed: number;
        /**
         * friction with static surfaces
         * default 0
         */
        staticFriction: number;
        /**
         * friction with dynamic surfaces
         * default 1
         */
        dynamicFriction: number;
        /**
         * cosine value of slope angle that can be climbed
         * computed as `Math.cos(Math.PI * (angleInDegree / 180.0));`
         * default 0.5 (value for a 60deg angle)
         */
        maxSlopeCosine: number;
        /**
         * Maximum height the character can automatically step up onto a walkable surface.
         * When greater than 0 the controller enforces this as a strict cap on step climbing,
         * independent of the collision shape's geometry:
         *
         *  - Obstacles whose top is at most maxStepHeight above the character's foot are
         *    climbed (either rolled over naturally by the capsule, or snapped up via the
         *    step-up sweep when the simplex would otherwise be blocked).
         *  - Obstacles taller than maxStepHeight are blocked, even ones the capsule's
         *    rounded bottom would otherwise glide over.
         *
         * This is enforced by demoting any "walkable" contact that sits more than
         * maxStepHeight above the foot into an extra horizontal wall constraint, so the
         * step-height limit does not depend on the capsule radius. As a documented side
         * effect, slopes whose contact rises above maxStepHeight (roughly when
         * `capsuleRadius * (1 - cos(slopeAngle)) > maxStepHeight`) are also treated as
         * walls. Pick maxStepHeight large enough to clear the slope angles you want to
         * remain walkable, or rely on `maxSlopeCosine` alone (with maxStepHeight = 0)
         * when the rounded-capsule riding behavior is acceptable.
         *
         * Step-up only triggers against STATIC and ANIMATED bodies. Dynamic bodies fall
         * through to normal contact resolution and pushing behavior.
         *
         * Thin walls / fences with floor behind them are not considered steppable: the
         * landing must be measurably higher than the starting position along `up`.
         *
         * The foot is computed as `position - up * footOffset`. Override `footOffset` if
         * you supply a custom collision shape whose center is not at half-height.
         *
         * Assumes `up` is a unit vector.
         *
         * default 0 (disabled)
         */
        maxStepHeight: number;
        /**
         * Distance from the body's `position` to the character's foot along `up`.
         * Used by `maxStepHeight` to measure how high a contact sits above the foot.
         * Defaults to half the capsule height passed at construction. Override when
         * supplying a custom collision shape whose center is not at half-height.
         */
        footOffset: number;
        /**
         * character maximum speed
         * default 10
         */
        maxCharacterSpeedForSolver: number;
        /**
         * up vector
         */
        up: Vector3;
        /**
         * Strength when pushing other bodies
         * default 1e38
         */
        characterStrength: number;
        /**
         * Acceleration factor. A value of 1 means reaching max velocity immediately
         */
        acceleration: number;
        /**
         * maximum acceleration in world space coordinate
         */
        maxAcceleration: number;
        /**
         * character mass
         * default 0
         */
        characterMass: number;
        /**
         * Observable for trigger entered and trigger exited events
         */
        onTriggerCollisionObservable: Observable<ICharacterControllerCollisionEvent>;
        private _startCollector;
        private _castCollector;
        private _displacementEps;
        /**
         * instanciate a new characterController
         * @param position Initial position
         * @param characterShapeOptions character physics shape options
         * @param scene Scene
         */
        constructor(position: Vector3, characterShapeOptions: CharacterShapeOptions, scene: Scene);
        /**
         * Dispose the character controller
         */
        dispose(): void;
        /**
         * Get shape used for collision
         */
        get shape(): PhysicsShape;
        /**
         * Set shape used for collision
         */
        set shape(value: PhysicsShape);
        /**
         * Character position
         * @returns Character position
         */
        getPosition(): Vector3;
        /**
         * Teleport character to a new position
         * @param position new position
         */
        setPosition(position: Vector3): void;
        /**
         * Character velocity
         * @returns Character velocity vector
         */
        getVelocity(): Vector3;
        /**
         * Set velocity vector
         * @param velocity vector
         */
        setVelocity(velocity: Vector3): void;
        protected _validateManifold(): void;
        private _getPointVelocityToRef;
        protected _compareContacts(contactA: IContact, contactB: IContact): number;
        protected _findContact(referenceContact: IContact, contactList: IContact[], threshold: number): number;
        protected _updateManifold(startCollector: any, castCollector: any, castPath: Vector3): number;
        protected _bodyPositionTracking: Map<any, any>;
        protected _createSurfaceConstraint(dt: number, contact: IContact, timeTravelled: number): ISurfaceConstraintInfo;
        protected _addMaxSlopePlane(maxSlopeCos: number, up: Vector3, index: number, constraints: ISurfaceConstraintInfo[], allowedPenetration: number): boolean;
        /**
         * Adds an extra horizontal wall constraint when a "walkable" contact sits more than
         * `maxStepHeight` above the character's foot along `up`. Mirrors the structure of
         * `_addMaxSlopePlane` but gates on contact height rather than slope steepness.
         *
         * This makes `maxStepHeight` a strict cap on step climbing independent of the
         * capsule's curved bottom: without this, the rounded hemisphere produces an up-tilted
         * (walkable) contact normal for any obstacle shorter than the capsule radius, and
         * the simplex rides over it regardless of `maxStepHeight`.
         * @param constraints constraint list being assembled for the current manifold
         * @param contact source manifold contact backing `constraints[index]`
         * @param index index of the constraint in `constraints` whose contact is under test
         * @param allowedPenetration allowed penetration distance for this contact
         * @returns true if an extra wall constraint was appended
         */
        protected _addStepHeightWallPlane(constraints: ISurfaceConstraintInfo[], contact: IContact, index: number, allowedPenetration: number): boolean;
        protected _resolveConstraintPenetration(constraint: ISurfaceConstraintInfo, penetrationRecoverySpeed: number): void;
        protected _createConstraintsFromManifold(dt: number, timeTravelled: number): ISurfaceConstraintInfo[];
        protected _simplexSolverSortInfo(info: SimplexSolverInfo): void;
        protected _simplexSolverSolve1d(info: SimplexSolverInfo, sci: ISurfaceConstraintInfo, velocityIn: Vector3, velocityOut: Vector3): void;
        protected _simplexSolverSolveTest1d(sci: ISurfaceConstraintInfo, velocityIn: Vector3): boolean;
        protected _simplexSolverSolve2d(info: SimplexSolverInfo, maxSurfaceVelocity: Vector3, sci0: ISurfaceConstraintInfo, sci1: ISurfaceConstraintInfo, velocityIn: Vector3, velocityOut: Vector3): void;
        protected _simplexSolverSolve3d(info: SimplexSolverInfo, maxSurfaceVelocity: Vector3, sci0: ISurfaceConstraintInfo, sci1: ISurfaceConstraintInfo, sci2: ISurfaceConstraintInfo, allowResort: boolean, velocityIn: Vector3, velocityOut: Vector3): void;
        protected _simplexSolverExamineActivePlanes(info: SimplexSolverInfo, maxSurfaceVelocity: Vector3, velocityIn: Vector3, velocityOut: Vector3): void;
        protected _simplexSolverSolve(constraints: ISurfaceConstraintInfo[], velocity: Vector3, deltaTime: number, minDeltaTime: number, up: Vector3, maxSurfaceVelocity: Vector3): SimplexSolverOutput;
        /**
         * Compute a CharacterSurfaceInfo from current state and a direction
         * @param deltaTime frame delta time in seconds. When using scene.deltaTime divide by 1000.0
         * @param direction direction to check, usually gravity direction
         * @returns a CharacterSurfaceInfo object
         */
        checkSupport(deltaTime: number, direction: Vector3): CharacterSurfaceInfo;
        /**
         * Compute a CharacterSurfaceInfo from current state and a direction
         * @param deltaTime frame delta time in seconds. When using scene.deltaTime divide by 1000.0
         * @param direction direction to check, usually gravity direction
         * @param surfaceInfo output for surface info
         */
        checkSupportToRef(deltaTime: number, direction: Vector3, surfaceInfo: CharacterSurfaceInfo): void;
        protected _castWithCollectors(startPos: Vector3, endPos: Vector3, castCollector: any, startCollector?: any): void;
        /**
         * Rebuild the contact manifold from a proximity query at the given position.
         * Used by step-up to validate a candidate landing without the merging logic of `_updateManifold`,
         * which is not suited to a zero-length cast.
         * @param position position at which to run the proximity query
         */
        protected _refreshManifoldAtPosition(position: Vector3): void;
        /**
         * Search the simplex solver output for a constraint that blocks horizontal motion:
         * touched by the solver, non-walkable along `up`, and opposing the requested horizontal direction.
         * @param simplexOutput output of `_simplexSolverSolve`
         * @param constraints constraint array passed to the solver
         * @param horizDir normalized horizontal direction of intent
         * @returns the index of the first matching constraint, or -1
         */
        protected _findBlockingConstraintIndex(simplexOutput: SimplexSolverOutput, constraints: ISurfaceConstraintInfo[], horizDir: Vector3): number;
        /**
         * Iterate hits in the cast collector to find the closest one.
         * @returns object with fraction, normal, body and index of the closest hit; null if there were no hits
         */
        protected _getClosestCastHit(): {
            fraction: number;
            normal: Vector3;
            body: {
                body: PhysicsBody;
                index: number;
            } | null;
        } | null;
        /**
         * Attempt a step-up sweep when the character is blocked by a vertical-ish obstacle.
         * Runs three shape casts (up, forward, down) and, if a valid walkable landing is found,
         * commits a new position, refreshes the manifold and updates `_lastDisplacement`.
         *
         * Caller responsibilities on success:
         * - subtract the returned time from `remainingTime`
         * - skip `_resolveContacts`, the recast block and the position update for the iteration
         *   (the step is a teleport, not a contact-resolution motion)
         *
         * @param remainingTime time budget left in the current `_integrateManifolds` iteration
         * @param inputVelocity character velocity at the start of the integration call
         * @param simplexOutput output of the iteration's simplex solve
         * @param constraints constraint array passed to the solver
         * @returns time consumed by the step on success, -1 on failure (no state mutated)
         */
        protected _tryStepUp(remainingTime: number, inputVelocity: Vector3, simplexOutput: SimplexSolverOutput, constraints: ISurfaceConstraintInfo[]): number;
        protected _resolveContacts(deltaTime: number, gravity: Vector3): void;
        protected _getInverseInertiaWorld(body: {
            body: PhysicsBody;
            index: number;
        }): DeepImmutableObject<Matrix>;
        protected _getComWorldToRef(body: {
            body: PhysicsBody;
            index: number;
        }, result: Vector3): void;
        protected _getInvMass(body: {
            body: PhysicsBody;
            index: number;
        }): number;
        protected _integrateManifolds(deltaTime: number, gravity: Vector3): void;
        /**
         * Move the character with collisions
         * @param displacement defines the requested displacement vector
         */
        moveWithCollisions(displacement: Vector3): void;
        /**
         * Update internal state. Must be called once per frame
         * @param deltaTime frame delta time in seconds. When using scene.deltaTime divide by 1000.0
         * @param surfaceInfo surface information returned by checkSupport
         * @param gravity gravity applied to the character. Can be different that world gravity
         */
        integrate(deltaTime: number, surfaceInfo: CharacterSurfaceInfo, gravity: Vector3): void;
        /**
         * Helper function to calculate velocity based on surface informations and current velocity state and target
         * @param deltaTime frame delta time in seconds. When using scene.deltaTime divide by 1000.0
         * @param forwardWorld character forward in world coordinates
         * @param surfaceNormal surface normal direction
         * @param currentVelocity current velocity
         * @param surfaceVelocity velocity induced by the surface
         * @param desiredVelocity desired character velocity
         * @param upWorld up vector in world space
         * @param result resulting velocity vector
         * @returns boolean true if result has been computed
         */
        calculateMovementToRef(deltaTime: number, forwardWorld: Vector3, surfaceNormal: Vector3, currentVelocity: Vector3, surfaceVelocity: Vector3, desiredVelocity: Vector3, upWorld: Vector3, result: Vector3): boolean;
        /**
         * Helper function to calculate velocity based on surface informations and current velocity state and target
         * @param deltaTime frame delta time in seconds. When using scene.deltaTime divide by 1000.0
         * @param forwardWorld character forward in world coordinates
         * @param surfaceNormal surface normal direction
         * @param currentVelocity current velocity
         * @param surfaceVelocity velocity induced by the surface
         * @param desiredVelocity desired character velocity
         * @param upWorld up vector in world space
         * @returns a new velocity vector
         */
        calculateMovement(deltaTime: number, forwardWorld: Vector3, surfaceNormal: Vector3, currentVelocity: Vector3, surfaceVelocity: Vector3, desiredVelocity: Vector3, upWorld: Vector3): Vector3;
    }


    /** How a specific axis can be constrained */
    export enum PhysicsConstraintAxisLimitMode {
        /**
         * The axis is not restricted at all
         */
        FREE = 0,
        /**
         * The axis has a minimum/maximum limit
         */
        LIMITED = 1,
        /**
         * The axis allows no relative movement of the pivots
         */
        LOCKED = 2
    }
    /** The constraint specific axis to use when setting Friction, `ConstraintAxisLimitMode`, max force, ... */
    export enum PhysicsConstraintAxis {
        /**
         * Translation along the primary axis of the constraint (i.e. the
         * direction specified by PhysicsConstraintParameters.axisA/axisB)
         */
        LINEAR_X = 0,
        /**
         * Translation along the second axis of the constraint (i.e. the
         * direction specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)
         */
        LINEAR_Y = 1,
        /**
         * Translation along the third axis of the constraint. This axis is
         * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)
         */
        LINEAR_Z = 2,
        /**
         * Rotation around the primary axis of the constraint (i.e. the
         * axis specified by PhysicsConstraintParameters.axisA/axisB)
         */
        ANGULAR_X = 3,
        /**
         * Rotation around the second axis of the constraint (i.e. the
         * axis specified by PhysicsConstraintParameters.perpAxisA/perpAxisB)
         */
        ANGULAR_Y = 4,
        /**
         * Rotation around the third axis of the constraint. This axis is
         * computed from the cross product of axisA/axisB and perpAxisA/perpAxisB)
         */
        ANGULAR_Z = 5,
        /**
         * A 3D distance limit; similar to specifying the LINEAR_X/Y/Z axes
         * individually, but the distance calculation uses all three axes
         * simultaneously, instead of individually.
         */
        LINEAR_DISTANCE = 6
    }
    /** Type of Constraint */
    export enum PhysicsConstraintType {
        /**
         * A ball and socket constraint will attempt to line up the pivot
         * positions in each body, and have no restrictions on rotation
         */
        BALL_AND_SOCKET = 1,
        /**
         * A distance constraint will attempt to keep the pivot locations
         * within a specified distance.
         */
        DISTANCE = 2,
        /**
         * A hinge constraint will keep the pivot positions aligned as well
         * as two angular axes. The remaining angular axis will be free to rotate.
         */
        HINGE = 3,
        /**
         * A slider constraint allows bodies to translate along one axis and
         * rotate about the same axis. The remaining two axes are locked in
         * place
         */
        SLIDER = 4,
        /**
         * A lock constraint will attempt to keep the pivots completely lined
         * up between both bodies, allowing no relative movement.
         */
        LOCK = 5,
        /**
         * A prismatic will lock the rotations of the bodies, and allow translation
         * only along one axis
         */
        PRISMATIC = 6,
        /**
         * A generic constraint; this starts with no limits on how the bodies can
         * move relative to each other, but limits can be added via the PhysicsConstraint
         * interfaces. This can be used to specify a large variety of constraints
         */
        SIX_DOF = 7
    }
    /** Type of Shape */
    export enum PhysicsShapeType {
        SPHERE = 0,
        CAPSULE = 1,
        CYLINDER = 2,
        BOX = 3,
        CONVEX_HULL = 4,
        CONTAINER = 5,
        MESH = 6,
        HEIGHTFIELD = 7
    }
    /** Optional motor which attempts to move a body at a specific velocity, or at a specific position */
    export enum PhysicsConstraintMotorType {
        NONE = 0,
        VELOCITY = 1,
        POSITION = 2
    }
    export enum PhysicsEventType {
        COLLISION_STARTED = "COLLISION_STARTED",
        COLLISION_CONTINUED = "COLLISION_CONTINUED",
        COLLISION_FINISHED = "COLLISION_FINISHED",
        TRIGGER_ENTERED = "TRIGGER_ENTERED",
        TRIGGER_EXITED = "TRIGGER_EXITED"
    }
    /**
     * Base collision object
     */
    export interface IBasePhysicsCollisionEvent {
        /**
         * 1st physics body that collided
         */
        collider: PhysicsBody;
        /**
         * 2nd physics body that collided
         */
        collidedAgainst: PhysicsBody;
        /**
         * index in instances array for the collider
         */
        colliderIndex: number;
        /**
         * index in instances array for the collidedAgainst
         */
        collidedAgainstIndex: number;
        /**
         * Event type
         */
        type: PhysicsEventType;
    }
    /**
     * Collision object that is the parameter when notification for collision fires.
     */
    export interface IPhysicsCollisionEvent extends IBasePhysicsCollisionEvent {
        /**
         * World position where the collision occurred
         */
        point: Nullable<Vector3>;
        /**
         * Penetration distance
         */
        distance: number;
        /**
         * Impulse value computed by the solver response
         */
        impulse: number;
        /**
         * Collision world normal direction
         */
        normal: Nullable<Vector3>;
    }
    /**
     * Parameters used to describe the Shape
     */
    export interface PhysicsShapeParameters {
        /**
         * Shape center position
         */
        center?: Vector3;
        /**
         * Radius for cylinder, shape and capsule
         */
        radius?: number;
        /**
         * First point position that defines the cylinder or capsule
         */
        pointA?: Vector3;
        /**
         * Second point position that defines the cylinder or capsule
         */
        pointB?: Vector3;
        /**
         * Shape orientation
         */
        rotation?: Quaternion;
        /**
         * Dimension extents for the box
         */
        extents?: Vector3;
        /**
         * Mesh used for Mesh shape or convex hull. It can be different than the mesh the body is attached to.
         */
        mesh?: Mesh;
        /**
         * Use children hierarchy
         */
        includeChildMeshes?: boolean;
        /**
         * The size of the heightfield in the X axis
         */
        heightFieldSizeX?: number;
        /**
         * The size of the heightfield in the Z axis
         */
        heightFieldSizeZ?: number;
        /**
         * The number of samples along the X axis
         */
        numHeightFieldSamplesX?: number;
        /**
         * The number of samples along the Z axis
         */
        numHeightFieldSamplesZ?: number;
        /**
         * The data for the heightfield
         */
        heightFieldData?: Float32Array;
        /**
         * Ground mesh used for display
         */
        groundMesh?: GroundMesh;
    }
    /**
     * Parameters used to describe a Constraint
     */
    export interface PhysicsConstraintParameters {
        /**
         * Location of the constraint pivot in the space of first body
         */
        pivotA?: Vector3;
        /**
         * Location of the constraint pivot in the space of the second body
         */
        pivotB?: Vector3;
        /**
         * An axis in the space of the first body which determines how
         * distances/angles are measured for LINEAR_X/ANGULAR_X limits.
         */
        axisA?: Vector3;
        /**
         * An axis in the space of the second body which determines how
         * distances/angles are measured for LINEAR_X/ANGULAR_X limits.
         */
        axisB?: Vector3;
        /**
         * An axis in the space of the first body which determines how
         * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.
         */
        perpAxisA?: Vector3;
        /**
         * An axis in the space of the second body which determines how
         * distances/angles are measured for LINEAR_Y/ANGULAR_Y limits.
         */
        perpAxisB?: Vector3;
        /**
         * The maximum distance that can separate the two pivots.
         * Only used for DISTANCE constraints
         */
        maxDistance?: number;
        /**
         * Determines if the connected bodies should collide. Generally,
         * it is preferable to set this to false, especially if the constraint
         * positions the bodies so that they overlap. Otherwise, the constraint
         * will "fight" the collision detection and may cause jitter.
         */
        collision?: boolean;
    }
    /**
     * Parameters used to describe mass and inertia of the Physics Body
     */
    export interface PhysicsMassProperties {
        /**
         * The center of mass, in local space. This is The
         * point the body will rotate around when applying
         * an angular velocity.
         *
         * If not provided, the physics engine will compute
         * an appropriate value.
         */
        centerOfMass?: Vector3;
        /**
         * The total mass of this object, in kilograms. This
         * affects how easy it is to move the body. A value
         * of zero will be used as an infinite mass.
         *
         * If not provided, the physics engine will compute
         * an appropriate value.
         */
        mass?: number;
        /**
         * The principal moments of inertia of this object
         * for a unit mass. This determines how easy it is
         * for the body to rotate. A value of zero on any
         * axis will be used as infinite inertia about that
         * axis.
         *
         * If not provided, the physics engine will compute
         * an appropriate value.
         */
        inertia?: Vector3;
        /**
         * The rotation rotating from inertia major axis space
         * to parent space (i.e., the rotation which, when
         * applied to the 3x3 inertia tensor causes the inertia
         * tensor to become a diagonal matrix). This determines
         * how the values of inertia are aligned with the parent
         * object.
         *
         * If not provided, the physics engine will compute
         * an appropriate value.
         */
        inertiaOrientation?: Quaternion;
    }
    /**
     * Indicates how the body will behave.
     */
    export enum PhysicsMotionType {
        STATIC = 0,
        ANIMATED = 1,
        DYNAMIC = 2
    }
    /**
     * Indicates how to handle position/rotation change of transform node attached to a physics body
     */
    export enum PhysicsPrestepType {
        DISABLED = 0,
        TELEPORT = 1,
        ACTION = 2
    }
    /**
     * Controls the body sleep mode.
     */
    export enum PhysicsActivationControl {
        SIMULATION_CONTROLLED = 0,
        ALWAYS_ACTIVE = 1,
        ALWAYS_INACTIVE = 2
    }
    /**
     * Represents a pair of bodies connected by a constraint.
     */
    export type ConstrainedBodyPair = {
        parentBody: PhysicsBody;
        parentBodyIndex: number;
        childBody: PhysicsBody;
        childBodyIndex: number;
    };
    /** @internal */
    export interface IPhysicsEnginePluginV2 {
        /**
         * Physics plugin world instance
         */
        world: any;
        /**
         * Physics plugin name
         */
        name: string;
        /**
         * Collision observable
         */
        onCollisionObservable: Observable<IPhysicsCollisionEvent>;
        /**
         * Collision ended observable
         */
        onCollisionEndedObservable: Observable<IBasePhysicsCollisionEvent>;
        /**
         * Trigger observable
         */
        onTriggerCollisionObservable: Observable<IBasePhysicsCollisionEvent>;
        setGravity(gravity: Vector3): void;
        setTimeStep(timeStep: number): void;
        getTimeStep(): number;
        executeStep(delta: number, bodies: Array<PhysicsBody>): void;
        getPluginVersion(): number;
        setVelocityLimits(maxLinearVelocity: number, maxAngularVelocity: number): void;
        getMaxLinearVelocity(): number;
        getMaxAngularVelocity(): number;
        initBody(body: PhysicsBody, motionType: PhysicsMotionType, position: Vector3, orientation: Quaternion): void;
        initBodyInstances(body: PhysicsBody, motionType: PhysicsMotionType, mesh: Mesh): void;
        updateBodyInstances(body: PhysicsBody, mesh: Mesh): void;
        removeBody(body: PhysicsBody): void;
        sync(body: PhysicsBody): void;
        syncTransform(body: PhysicsBody, transformNode: TransformNode): void;
        setShape(body: PhysicsBody, shape: Nullable<PhysicsShape>): void;
        getShape(body: PhysicsBody): Nullable<PhysicsShape>;
        getShapeType(shape: PhysicsShape): PhysicsShapeType;
        setEventMask(body: PhysicsBody, eventMask: number, instanceIndex?: number): void;
        getEventMask(body: PhysicsBody, instanceIndex?: number): number;
        setMotionType(body: PhysicsBody, motionType: PhysicsMotionType, instanceIndex?: number): void;
        getMotionType(body: PhysicsBody, instanceIndex?: number): PhysicsMotionType;
        computeMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;
        setMassProperties(body: PhysicsBody, massProps: PhysicsMassProperties, instanceIndex?: number): void;
        getMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;
        setLinearDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;
        getLinearDamping(body: PhysicsBody, instanceIndex?: number): number;
        setAngularDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;
        getAngularDamping(body: PhysicsBody, instanceIndex?: number): number;
        setLinearVelocity(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;
        getLinearVelocityToRef(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;
        applyImpulse(body: PhysicsBody, impulse: Vector3, location: Vector3, instanceIndex?: number): void;
        applyAngularImpulse(body: PhysicsBody, angularImpulse: Vector3, instanceIndex?: number): void;
        applyForce(body: PhysicsBody, force: Vector3, location: Vector3, instanceIndex?: number): void;
        applyTorque(body: PhysicsBody, torque: Vector3, instanceIndex?: number): void;
        setAngularVelocity(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;
        getAngularVelocityToRef(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;
        getBodyGeometry(body: PhysicsBody): object;
        disposeBody(body: PhysicsBody): void;
        setCollisionCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;
        setCollisionEndedCallbackEnabled(body: PhysicsBody, enabled: boolean, instanceIndex?: number): void;
        addConstraint(body: PhysicsBody, childBody: PhysicsBody, constraint: PhysicsConstraint, instanceIndex?: number, childInstanceIndex?: number): void;
        getCollisionObservable(body: PhysicsBody, instanceIndex?: number): Observable<IPhysicsCollisionEvent>;
        getCollisionEndedObservable(body: PhysicsBody, instanceIndex?: number): Observable<IBasePhysicsCollisionEvent>;
        setGravityFactor(body: PhysicsBody, factor: number, instanceIndex?: number): void;
        getGravityFactor(body: PhysicsBody, instanceIndex?: number): number;
        setTargetTransform(body: PhysicsBody, position: Vector3, rotation: Quaternion, instanceIndex?: number): void;
        initShape(shape: PhysicsShape, type: PhysicsShapeType, options: PhysicsShapeParameters): void;
        setShapeFilterMembershipMask(shape: PhysicsShape, membershipMask: number): void;
        getShapeFilterMembershipMask(shape: PhysicsShape): number;
        setShapeFilterCollideMask(shape: PhysicsShape, collideMask: number): void;
        getShapeFilterCollideMask(shape: PhysicsShape): number;
        setMaterial(shape: PhysicsShape, material: PhysicsMaterial): void;
        getMaterial(shape: PhysicsShape): PhysicsMaterial;
        setDensity(shape: PhysicsShape, density: number): void;
        getDensity(shape: PhysicsShape): number;
        addChild(shape: PhysicsShape, newChild: PhysicsShape, translation?: Vector3, rotation?: Quaternion, scale?: Vector3): void;
        removeChild(shape: PhysicsShape, childIndex: number): void;
        getNumChildren(shape: PhysicsShape): number;
        getBoundingBox(shape: PhysicsShape): BoundingBox;
        getBodyBoundingBox(body: PhysicsBody): BoundingBox;
        disposeShape(shape: PhysicsShape): void;
        setTrigger(shape: PhysicsShape, isTrigger: boolean): void;
        initConstraint(constraint: PhysicsConstraint, body: PhysicsBody, childBody: PhysicsBody): void;
        setEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;
        getEnabled(constraint: PhysicsConstraint): boolean;
        setCollisionsEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;
        getCollisionsEnabled(constraint: PhysicsConstraint): boolean;
        setAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, friction: number): void;
        getAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        setAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limitMode: PhysicsConstraintAxisLimitMode): void;
        getAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintAxisLimitMode>;
        setAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, minLimit: number): void;
        getAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        setAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limit: number): void;
        getAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        setAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, motorType: PhysicsConstraintMotorType): void;
        getAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintMotorType>;
        setAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, target: number): void;
        getAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        setAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, maxForce: number): void;
        getAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        disposeConstraint(constraint: PhysicsConstraint): void;
        getBodiesUsingConstraint(constraint: PhysicsConstraint): ConstrainedBodyPair[];
        raycast(from: Vector3, to: Vector3, result: PhysicsRaycastResult | Array<PhysicsRaycastResult>, query?: IRaycastQuery): void;
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    class BodyPluginData {
        constructor(bodyId: any);
        /**
         * The Havok body identifier associated with this plugin body.
         */
        hpBodyId: any;
        /**
         * Offset of the body's world transform in Havok memory.
         */
        worldTransformOffset: number;
        /**
         * User-defined mass properties for the body.
         */
        userMassProps: PhysicsMassProperties;
        /**
         * Reference to the world region this body belongs to.
         * Used for floating origin mode to ensure consistent coordinate transformation.
         * Will be undefined for non-floating-origin worlds (uses the default world).
         */
        worldRegion?: PhysicsWorldRegion;
    }
    /**
     * Configuration parameters for the Havok plugin
     */
    export interface HavokPluginParameters {
        /**
         * Maximum number of raycast hits to process
         */
        maxQueryCollectorHits?: number;
        /**
         * Radius of each floating origin world region.
         * Bodies within this radius of a world region's origin will use that world.
         * Bodies created outside existing regions will create a new region.
         * Default is 100000 units.
         */
        floatingOriginWorldRadius?: number;
    }
    /**
     * Represents a physics world region with a fixed floating origin.
     * Bodies within a certain radius of this origin are simulated in this world.
     * @internal
     */
    interface PhysicsWorldRegion {
        /** The Havok world handle */
        world: any;
        /** The fixed floating origin for this world region (in world coordinates) */
        floatingOrigin: Vector3;
        /** The gravity for this world region (can be different per region for planetary scenarios) */
        gravity: number[];
    }
    /**
     * The Havok Physics plugin
     */
    export class HavokPlugin implements IPhysicsEnginePluginV2 {
        private _useDeltaForWorldStep;
        /**
         * Reference to the WASM library
         */
        _hknp: any;
        /**
         * Created Havok world which physics bodies are added to (default world for non-floating-origin)
         */
        world: any;
        /**
         * Name of the plugin
         */
        name: string;
        /**
         * We only have a single raycast in-flight right now
         */
        private _queryCollector;
        private _multiQueryCollector;
        private _fixedTimeStep;
        private _maxQueryCollectorHits;
        private _tmpVec3;
        private _bodies;
        private _shapes;
        private _bodyCollisionObservable;
        private _constraintToBodyIdPair;
        private _bodyCollisionEndedObservable;
        /**
         * Array of world regions. The first region is always the default world with origin at Vector3.Zero.
         * Additional regions are created as needed for floating origin mode.
         */
        private _worldRegions;
        /**
         * Stored gravity value to apply to new world regions.
         */
        private _currentGravity;
        /**
         * Radius of each floating origin world region.
         * Bodies within this radius of a world region's origin will use that world.
         */
        private _floatingOriginWorldRadius;
        /**
         * Finds an existing world region that contains the given world position,
         * or creates a new world region centered at that position.
         *
         * When floatingOriginMode is enabled, we use multiple Havok worlds to maintain
         * float32 precision across a large world. Each world region has its own fixed
         * floating origin, and bodies within that region are simulated relative to it.
         *
         * @param worldPosition - The world position of the body being created
         * @returns The world region to use for this body
         */
        private _getOrCreateWorldRegion;
        /**
         * Checks if a body's world position has left its current region and, if so,
         * moves it to the correct region (existing or newly created).
         * This preserves linear and angular velocity across the transition.
         *
         * @param pluginData - The plugin data for the body (or instance) to check
         */
        private _reRegionBodyPluginData;
        /**
         * Searches existing world regions for one that contains the given position.
         * @param worldPosition - The world position to find a region for
         * @returns null if no existing region contains it (does NOT create a new one).
         */
        private _findExistingRegion;
        /**
         * Observable for collision started and collision continued events
         */
        onCollisionObservable: Observable<IPhysicsCollisionEvent>;
        /**
         * Observable for collision ended events
         */
        onCollisionEndedObservable: Observable<IBasePhysicsCollisionEvent>;
        /**
         * Observable for trigger entered and trigger exited events
         */
        onTriggerCollisionObservable: Observable<IBasePhysicsCollisionEvent>;
        constructor(_useDeltaForWorldStep?: boolean, hpInjection?: any, parameters?: HavokPluginParameters);
        /**
         * If this plugin is supported
         * @returns true if its supported
         */
        isSupported(): boolean;
        /**
         * Sets the gravity of the physics world.
         *
         * @param gravity - The gravity vector to set.
         * @param worldPosition - Optional world position to specify which region's gravity to set.
         *                        If provided, only the region containing this position will be updated.
         *                        If not provided, all regions will be updated (default behavior).
         *                        This is useful for planetary scenarios where gravity direction varies by location.
         */
        setGravity(gravity: Vector3, worldPosition?: Vector3): void;
        /**
         * Gets the gravity of the physics world or a specific region.
         *
         * @param worldPosition - Optional world position to get the gravity for that region.
         *                        If not provided, returns the default gravity.
         * @returns The gravity vector.
         */
        getGravity(worldPosition?: Vector3): Vector3;
        /**
         * Sets the fixed time step for the physics engine.
         *
         * @param timeStep - The fixed time step to use for the physics engine.
         *
         */
        setTimeStep(timeStep: number): void;
        /**
         * Gets the fixed time step used by the physics engine.
         *
         * @returns The fixed time step used by the physics engine.
         *
         */
        getTimeStep(): number;
        /**
         * Sets the maximum number of raycast hits to process.
         *
         * @param maxQueryCollectorHits - The maximum number of raycast hits to process.
         */
        setMaxQueryCollectorHits(maxQueryCollectorHits: number): void;
        /**
         * Gets the maximum number of raycast hits to process.
         *
         * @returns The maximum number of raycast hits to process.
         */
        getMaxQueryCollectorHits(): number;
        /**
         * Executes a single step of the physics engine.
         *
         * @param delta The time delta in seconds since the last step.
         * @param physicsBodies An array of physics bodies to be simulated.
         *
         * This method is useful for simulating the physics engine. It sets the physics body transformation,
         * steps the world, syncs the physics body, and notifies collisions. This allows for the physics engine
         * to accurately simulate the physics bodies in the world.
         */
        executeStep(delta: number, physicsBodies: Array<PhysicsBody>): void;
        /**
         * Returns the version of the physics engine plugin.
         *
         * @returns The version of the physics engine plugin.
         *
         * This method is useful for determining the version of the physics engine plugin that is currently running.
         */
        getPluginVersion(): number;
        /**
         * Set the maximum allowed linear and angular velocities
         * @param maxLinearVelocity maximum allowed linear velocity
         * @param maxAngularVelocity maximum allowed angular velocity
         */
        setVelocityLimits(maxLinearVelocity: number, maxAngularVelocity: number): void;
        /**
         * @returns maximum allowed linear velocity
         */
        getMaxLinearVelocity(): number;
        /**
         * @returns maximum allowed angular velocity
         */
        getMaxAngularVelocity(): number;
        /**
         * Initializes a physics body with the given position and orientation.
         *
         * @param body - The physics body to initialize.
         * @param motionType - The motion type of the body.
         * @param position - The position of the body.
         * @param orientation - The orientation of the body.
         * This code is useful for initializing a physics body with the given position and orientation.
         * It creates a plugin data for the body and adds it to the world. It then converts the position
         * and orientation to a transform and sets the body's transform to the given values.
         */
        initBody(body: PhysicsBody, motionType: PhysicsMotionType, position: Vector3, orientation: Quaternion): void;
        /**
         * Removes a body from the world. To dispose of a body, it is necessary to remove it from the world first.
         *
         * @param body - The body to remove.
         */
        removeBody(body: PhysicsBody): void;
        /**
         * Initializes the body instances for a given physics body and mesh.
         *
         * @param body - The physics body to initialize.
         * @param motionType - How the body will be handled by the engine
         * @param mesh - The mesh to initialize.
         *
         * This code is useful for creating a physics body from a mesh. It creates a
         * body instance for each instance of the mesh and adds it to the world. It also
         * sets the position of the body instance to the position of the mesh instance.
         * This allows for the physics engine to accurately simulate the mesh in the
         * world.
         */
        initBodyInstances(body: PhysicsBody, motionType: PhysicsMotionType, mesh: Mesh): void;
        private _createOrUpdateBodyInstances;
        /**
         * Update the internal body instances for a given physics body to match the instances in a mesh.
         * @param body the body that will be updated
         * @param mesh the mesh with reference instances
         */
        updateBodyInstances(body: PhysicsBody, mesh: Mesh): void;
        /**
         * Synchronizes the transform of a physics body with its transform node.
         * @param body - The physics body to synchronize.
         *
         * This function is useful for keeping the physics body's transform in sync with its transform node.
         * This is important for ensuring that the physics body is accurately represented in the physics engine.
         */
        sync(body: PhysicsBody): void;
        /**
         * Synchronizes the transform of a physics body with the transform of its
         * corresponding transform node.
         *
         * @param body - The physics body to synchronize.
         * @param transformNode - The destination Transform Node.
         *
         * This code is useful for synchronizing the position and orientation of a
         * physics body with the position and orientation of its corresponding
         * transform node. This is important for ensuring that the physics body and
         * the transform node are in the same position and orientation in the scene.
         * This is necessary for the physics engine to accurately simulate the
         * physical behavior of the body.
         */
        syncTransform(body: PhysicsBody, transformNode: TransformNode): void;
        /**
         * Sets the shape of a physics body.
         * @param body - The physics body to set the shape for.
         * @param shape - The physics shape to set.
         *
         * This function is used to set the shape of a physics body. It is useful for
         * creating a physics body with a specific shape, such as a box or a sphere,
         * which can then be used to simulate physical interactions in a physics engine.
         * This function is especially useful for meshes with multiple instances, as it
         * will set the shape for each instance of the mesh.
         */
        setShape(body: PhysicsBody, shape: Nullable<PhysicsShape>): void;
        /**
         * Returns a reference to the first instance of the plugin data for a physics body.
         * @param body
         * @param instanceIndex
         * @returns a reference to the first instance
         */
        private _getPluginReference;
        /**
         * Gets the shape of a physics body. This will create a new shape object
         *
         * @param body - The physics body.
         * @returns The shape of the physics body.
         *
         */
        getShape(body: PhysicsBody): Nullable<PhysicsShape>;
        /**
         * Gets the type of a physics shape.
         * @param shape - The physics shape to get the type for.
         * @returns The type of the physics shape.
         *
         */
        getShapeType(shape: PhysicsShape): PhysicsShapeType;
        /**
         * Sets the event mask of a physics body.
         * @param body - The physics body to set the event mask for.
         * @param eventMask - The event mask to set.
         * @param instanceIndex - The index of the instance to set the event mask for
         *
         * This function is useful for setting the event mask of a physics body, which is used to determine which events the body will respond to. This is important for ensuring that the physics engine is able to accurately simulate the behavior of the body in the game world.
         */
        setEventMask(body: PhysicsBody, eventMask: number, instanceIndex?: number): void;
        /**
         * Retrieves the event mask of a physics body.
         *
         * @param body - The physics body to retrieve the event mask from.
         * @param instanceIndex - The index of the instance to retrieve the event mask from.
         * @returns The event mask of the physics body.
         *
         */
        getEventMask(body: PhysicsBody, instanceIndex?: number): number;
        private _fromMassPropertiesTuple;
        private _internalUpdateMassProperties;
        _internalSetMotionType(pluginData: BodyPluginData, motionType: PhysicsMotionType): void;
        /**
         * sets the motion type of a physics body.
         * @param body - The physics body to set the motion type for.
         * @param motionType - The motion type to set.
         * @param instanceIndex - The index of the instance to set the motion type for. If undefined, the motion type of all the bodies will be set.
         */
        setMotionType(body: PhysicsBody, motionType: PhysicsMotionType, instanceIndex?: number): void;
        /**
         * Gets the motion type of a physics body.
         * @param body - The physics body to get the motion type from.
         * @param instanceIndex - The index of the instance to get the motion type from. If not specified, the motion type of the first instance will be returned.
         * @returns The motion type of the physics body.
         */
        getMotionType(body: PhysicsBody, instanceIndex?: number): PhysicsMotionType;
        /**
         * sets the activation control mode of a physics body, for instance if you need the body to never sleep.
         * @param body - The physics body to set the activation control mode.
         * @param controlMode - The activation control mode.
         */
        setActivationControl(body: PhysicsBody, controlMode: PhysicsActivationControl): void;
        private _internalComputeMassProperties;
        /**
         * Computes the mass properties of a physics body, from it's shape
         *
         * @param body - The physics body to copmute the mass properties of
         * @param instanceIndex - The index of the instance to compute the mass properties of.
         * @returns The mass properties of the physics body.
         */
        computeMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;
        /**
         * Sets the mass properties of a physics body.
         *
         * @param body - The physics body to set the mass properties of.
         * @param massProps - The mass properties to set.
         * @param instanceIndex - The index of the instance to set the mass properties of. If undefined, the mass properties of all the bodies will be set.
         * This function is useful for setting the mass properties of a physics body,
         * such as its mass, inertia, and center of mass. This is important for
         * accurately simulating the physics of the body in the physics engine.
         *
         */
        setMassProperties(body: PhysicsBody, massProps: PhysicsMassProperties, instanceIndex?: number): void;
        /**
         * Gets the mass properties of a physics body.
         * @param body - The physics body to get the mass properties from.
         * @param instanceIndex - The index of the instance to get the mass properties from. If not specified, the mass properties of the first instance will be returned.
         * @returns The mass properties of the physics body.
         */
        getMassProperties(body: PhysicsBody, instanceIndex?: number): PhysicsMassProperties;
        /**
         * Sets the linear damping of the given body.
         * @param body - The body to set the linear damping for.
         * @param damping - The linear damping to set.
         * @param instanceIndex - The index of the instance to set the linear damping for. If not specified, the linear damping of the first instance will be set.
         *
         * This method is useful for controlling the linear damping of a body in a physics engine.
         * Linear damping is a force that opposes the motion of the body, and is proportional to the velocity of the body.
         * This method allows the user to set the linear damping of a body, which can be used to control the motion of the body.
         */
        setLinearDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;
        /**
         * Gets the linear damping of the given body.
         * @param body - The body to get the linear damping from.
         * @param instanceIndex - The index of the instance to get the linear damping from. If not specified, the linear damping of the first instance will be returned.
         * @returns The linear damping of the given body.
         *
         * This method is useful for getting the linear damping of a body in a physics engine.
         * Linear damping is a force that opposes the motion of the body and is proportional to the velocity of the body.
         * It is used to simulate the effects of air resistance and other forms of friction.
         */
        getLinearDamping(body: PhysicsBody, instanceIndex?: number): number;
        /**
         * Sets the angular damping of a physics body.
         * @param body - The physics body to set the angular damping for.
         * @param damping - The angular damping value to set.
         * @param instanceIndex - The index of the instance to set the angular damping for. If not specified, the angular damping of the first instance will be set.
         *
         * This function is useful for controlling the angular velocity of a physics body.
         * By setting the angular damping, the body's angular velocity will be reduced over time, allowing for more realistic physics simulations.
         */
        setAngularDamping(body: PhysicsBody, damping: number, instanceIndex?: number): void;
        /**
         * Gets the angular damping of a physics body.
         * @param body - The physics body to get the angular damping from.
         * @param instanceIndex - The index of the instance to get the angular damping from. If not specified, the angular damping of the first instance will be returned.
         * @returns The angular damping of the body.
         *
         * This function is useful for retrieving the angular damping of a physics body,
         * which is used to control the rotational motion of the body. The angular damping is a value between 0 and 1, where 0 is no damping and 1 is full damping.
         */
        getAngularDamping(body: PhysicsBody, instanceIndex?: number): number;
        /**
         * Sets the linear velocity of a physics body.
         * @param body - The physics body to set the linear velocity of.
         * @param linVel - The linear velocity to set.
         * @param instanceIndex - The index of the instance to set the linear velocity of. If not specified, the linear velocity of the first instance will be set.
         *
         * This function is useful for setting the linear velocity of a physics body, which is necessary for simulating
         * motion in a physics engine. The linear velocity is the speed and direction of the body's movement.
         */
        setLinearVelocity(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the linear velocity of a physics body and stores it in a given vector.
         * @param body - The physics body to get the linear velocity from.
         * @param linVel - The vector to store the linear velocity in.
         * @param instanceIndex - The index of the instance to get the linear velocity from. If not specified, the linear velocity of the first instance will be returned.
         *
         * This function is useful for retrieving the linear velocity of a physics body,
         * which can be used to determine the speed and direction of the body. This
         * information can be used to simulate realistic physics behavior in a game.
         */
        getLinearVelocityToRef(body: PhysicsBody, linVel: Vector3, instanceIndex?: number): void;
        private _applyToBodyOrInstances;
        /**
         * Applies an impulse to a physics body at a given location.
         * @param body - The physics body to apply the impulse to.
         * @param impulse - The impulse vector to apply.
         * @param location - The location in world space to apply the impulse.
         * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.
         *
         * This method is useful for applying an impulse to a physics body at a given location.
         * This can be used to simulate physical forces such as explosions, collisions, and gravity.
         */
        applyImpulse(body: PhysicsBody, impulse: Vector3, location: Vector3, instanceIndex?: number): void;
        /**
         * Applies an angular impulse(torque) to a physics body
         * @param body - The physics body to apply the impulse to.
         * @param angularImpulse - The torque value
         * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.
         */
        applyAngularImpulse(body: PhysicsBody, angularImpulse: Vector3, instanceIndex?: number): void;
        /**
         * Applies a force to a physics body at a given location.
         * @param body - The physics body to apply the impulse to.
         * @param force - The force vector to apply.
         * @param location - The location in world space to apply the impulse.
         * @param instanceIndex - The index of the instance to apply the force to. If not specified, the force will be applied to all instances.
         *
         * This method is useful for applying a force to a physics body at a given location.
         * This can be used to simulate physical forces such as explosions, collisions, and gravity.
         */
        applyForce(body: PhysicsBody, force: Vector3, location: Vector3, instanceIndex?: number): void;
        /**
         * Applies a torque to a physics body.
         * @param body - The physics body to apply the torque to.
         * @param torque - The torque vector.
         * @param instanceIndex - The index of the instance to apply the torque to. If not specified, the torque will be applied to all instances.
         *
         * This method is useful for applying a torque to a physics body.
         * This can be used to simulate rotational forces such as motors, angular momentum, and rotational dynamics.
         */
        applyTorque(body: PhysicsBody, torque: Vector3, instanceIndex?: number): void;
        /**
         * Sets the angular velocity of a physics body.
         *
         * @param body - The physics body to set the angular velocity of.
         * @param angVel - The angular velocity to set.
         * @param instanceIndex - The index of the instance to set the angular velocity of. If not specified, the angular velocity of the first instance will be set.
         *
         * This function is useful for setting the angular velocity of a physics body in a physics engine.
         * This allows for more realistic simulations of physical objects, as they can be given a rotational velocity.
         */
        setAngularVelocity(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;
        /**
         * Gets the angular velocity of a body.
         * @param body - The body to get the angular velocity from.
         * @param angVel - The vector3 to store the angular velocity.
         * @param instanceIndex - The index of the instance to get the angular velocity from. If not specified, the angular velocity of the first instance will be returned.
         *
         * This method is useful for getting the angular velocity of a body in a physics engine. It
         * takes the body and a vector3 as parameters and stores the angular velocity of the body
         * in the vector3. This is useful for getting the angular velocity of a body in order to
         * calculate the motion of the body in the physics engine.
         */
        getAngularVelocityToRef(body: PhysicsBody, angVel: Vector3, instanceIndex?: number): void;
        /**
         * Sets the transformation of the given physics body to the given transform node.
         * @param body The physics body to set the transformation for.
         * @param node The transform node to set the transformation from.
         * Sets the transformation of the given physics body to the given transform node.
         *
         * This function is useful for setting the transformation of a physics body to a
         * transform node, which is necessary for the physics engine to accurately simulate
         * the motion of the body. It also takes into account instances of the transform
         * node, which is necessary for accurate simulation of multiple bodies with the
         * same transformation.
         */
        setPhysicsBodyTransformation(body: PhysicsBody, node: TransformNode): void;
        /**
         * Set the target transformation (position and rotation) of the body, such that the body will set its velocity to reach that target
         * @param body The physics body to set the target transformation for.
         * @param position The target position
         * @param rotation The target rotation
         * @param instanceIndex The index of the instance in an instanced body
         */
        setTargetTransform(body: PhysicsBody, position: Vector3, rotation: Quaternion, instanceIndex?: number): void;
        /**
         * Sets the gravity factor of a body
         * @param body the physics body to set the gravity factor for
         * @param factor the gravity factor
         * @param instanceIndex the index of the instance in an instanced body
         */
        setGravityFactor(body: PhysicsBody, factor: number, instanceIndex?: number): void;
        /**
         * Get the gravity factor of a body
         * @param body the physics body to get the gravity factor from
         * @param instanceIndex the index of the instance in an instanced body. If not specified, the gravity factor of the first instance will be returned.
         * @returns the gravity factor
         */
        getGravityFactor(body: PhysicsBody, instanceIndex?: number): number;
        /**
         * Disposes a physics body.
         *
         * @param body - The physics body to dispose.
         *
         * This method is useful for releasing the resources associated with a physics body when it is no longer needed.
         * This is important for avoiding memory leaks in the physics engine.
         */
        disposeBody(body: PhysicsBody): void;
        private _createOptionsFromGroundMesh;
        /**
         * Initializes a physics shape with the given type and parameters.
         * @param shape - The physics shape to initialize.
         * @param type - The type of shape to initialize.
         * @param options - The parameters for the shape.
         *
         * This code is useful for initializing a physics shape with the given type and parameters.
         * It allows for the creation of a sphere, box, capsule, container, cylinder, mesh, and heightfield.
         * Depending on the type of shape, different parameters are required.
         * For example, a sphere requires a radius, while a box requires extents and a rotation.
         */
        initShape(shape: PhysicsShape, type: PhysicsShapeType, options: PhysicsShapeParameters): void;
        /**
         * Sets the shape filter membership mask of a body
         * @param shape - The physics body to set the shape filter membership mask for.
         * @param membershipMask - The shape filter membership mask to set.
         */
        setShapeFilterMembershipMask(shape: PhysicsShape, membershipMask: number): void;
        /**
         * Gets the shape filter membership mask of a body
         * @param shape - The physics body to get the shape filter membership mask from.
         * @returns The shape filter membership mask of the given body.
         */
        getShapeFilterMembershipMask(shape: PhysicsShape): number;
        /**
         * Sets the shape filter collide mask of a body
         * @param shape - The physics body to set the shape filter collide mask for.
         * @param collideMask - The shape filter collide mask to set.
         */
        setShapeFilterCollideMask(shape: PhysicsShape, collideMask: number): void;
        /**
         * Gets the shape filter collide mask of a body
         * @param shape - The physics body to get the shape filter collide mask from.
         * @returns The shape filter collide mask of the given body.
         */
        getShapeFilterCollideMask(shape: PhysicsShape): number;
        /**
         * Sets the material of a physics shape.
         * @param shape - The physics shape to set the material of.
         * @param material - The material to set.
         *
         */
        setMaterial(shape: PhysicsShape, material: PhysicsMaterial): void;
        /**
         * Gets the material associated with a physics shape.
         * @param shape - The shape to get the material from.
         * @returns The material associated with the shape.
         */
        getMaterial(shape: PhysicsShape): PhysicsMaterial;
        /**
         * Sets the density of a physics shape.
         * @param shape - The physics shape to set the density of.
         * @param density - The density to set.
         *
         */
        setDensity(shape: PhysicsShape, density: number): void;
        /**
         * Calculates the density of a given physics shape.
         *
         * @param shape - The physics shape to calculate the density of.
         * @returns The density of the given physics shape.
         *
         */
        getDensity(shape: PhysicsShape): number;
        /**
         * Gets the transform infos of a given transform node.
         * This code is useful for getting the position and orientation of a given transform node.
         * It first checks if the node has a rotation quaternion, and if not, it creates one from the node's rotation.
         * It then creates an array containing the position and orientation of the node and returns it.
         * @param node - The transform node.
         * @param offset - The floating origin offset to apply.
         * @returns An array containing the position and orientation of the node.
         */
        private _getTransformInfos;
        /**
         * Adds a child shape to the given shape.
         * @param shape - The parent shape.
         * @param newChild - The child shape to add.
         * @param translation - The relative translation of the child from the parent shape
         * @param rotation - The relative rotation of the child from the parent shape
         * @param scale - The relative scale scale of the child from the parent shaep
         *
         */
        addChild(shape: PhysicsShape, newChild: PhysicsShape, translation?: Vector3, rotation?: Quaternion, scale?: Vector3): void;
        /**
         * Removes a child shape from a parent shape.
         * @param shape - The parent shape.
         * @param childIndex - The index of the child shape to remove.
         *
         */
        removeChild(shape: PhysicsShape, childIndex: number): void;
        /**
         * Returns the number of children of the given shape.
         *
         * @param shape - The shape to get the number of children from.
         * @returns The number of children of the given shape.
         *
         */
        getNumChildren(shape: PhysicsShape): number;
        /**
         * Marks the shape as a trigger
         * @param shape the shape to mark as a trigger
         * @param isTrigger if the shape is a trigger
         */
        setTrigger(shape: PhysicsShape, isTrigger: boolean): void;
        /**
         * Calculates the bounding box of a given physics shape.
         *
         * @param _shape - The physics shape to calculate the bounding box for.
         * @returns The calculated bounding box.
         *
         * This method is useful for physics engines as it allows to calculate the
         * boundaries of a given shape. Knowing the boundaries of a shape is important
         * for collision detection and other physics calculations.
         */
        getBoundingBox(_shape: PhysicsShape): BoundingBox;
        /**
         * Calculates the world bounding box of a given physics body.
         *
         * @param body - The physics body to calculate the bounding box for.
         * @returns The calculated bounding box.
         *
         * This method is useful for physics engines as it allows to calculate the
         * boundaries of a given body.
         */
        getBodyBoundingBox(body: PhysicsBody): BoundingBox;
        /**
         * Gets the geometry of a physics body.
         *
         * @param body - The physics body.
         * @returns An object containing the positions and indices of the body's geometry.
         *
         */
        getBodyGeometry(body: PhysicsBody): {
            positions: Float32Array | number[];
            indices: Uint32Array | number[];
        };
        /**
         * Releases a physics shape from the physics engine.
         *
         * @param shape - The physics shape to be released.
         *
         * This method is useful for releasing a physics shape from the physics engine, freeing up resources and preventing memory leaks.
         */
        disposeShape(shape: PhysicsShape): void;
        /**
         * Initializes a physics constraint with the given parameters.
         *
         * @param constraint - The physics constraint to be initialized.
         * @param body - The main body
         * @param childBody - The child body.
         * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         *
         * This function is useful for setting up a physics constraint in a physics engine.
         */
        initConstraint(constraint: PhysicsConstraint, body: PhysicsBody, childBody: PhysicsBody, instanceIndex?: number, childInstanceIndex?: number): void;
        /**
         * Get a list of all the pairs of bodies that are connected by this constraint.
         * @param constraint the constraint to search from
         * @returns a list of parent, child pairs
         */
        getBodiesUsingConstraint(constraint: PhysicsConstraint): ConstrainedBodyPair[];
        /**
         * Adds a constraint to the physics engine.
         *
         * @param body - The main body to which the constraint is applied.
         * @param childBody - The body to which the constraint is applied.
         * @param constraint - The constraint to be applied.
         * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.
         */
        addConstraint(body: PhysicsBody, childBody: PhysicsBody, constraint: PhysicsConstraint, instanceIndex?: number, childInstanceIndex?: number): void;
        /**
         * Enables or disables a constraint in the physics engine.
         * @param constraint - The constraint to enable or disable.
         * @param isEnabled - Whether the constraint should be enabled or disabled.
         *
         */
        setEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;
        /**
         * Gets the enabled state of the given constraint.
         * @param constraint - The constraint to get the enabled state from.
         * @returns The enabled state of the given constraint.
         *
         */
        getEnabled(constraint: PhysicsConstraint): boolean;
        /**
         * Enables or disables collisions for the given constraint.
         * @param constraint - The constraint to enable or disable collisions for.
         * @param isEnabled - Whether collisions should be enabled or disabled.
         *
         */
        setCollisionsEnabled(constraint: PhysicsConstraint, isEnabled: boolean): void;
        /**
         * Gets whether collisions are enabled for the given constraint.
         * @param constraint - The constraint to get collisions enabled for.
         * @returns Whether collisions are enabled for the given constraint.
         *
         */
        getCollisionsEnabled(constraint: PhysicsConstraint): boolean;
        /**
         * Sets the friction of the given axis of the given constraint.
         *
         * @param constraint - The constraint to set the friction of.
         * @param axis - The axis of the constraint to set the friction of.
         * @param friction - The friction to set.
         *
         */
        setAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, friction: number): void;
        /**
         * Gets the friction value of the specified axis of the given constraint.
         *
         * @param constraint - The constraint to get the axis friction from.
         * @param axis - The axis to get the friction from.
         * @returns The friction value of the specified axis.
         *
         */
        getAxisFriction(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the limit mode of the specified axis of the given constraint.
         * @param constraint - The constraint to set the axis mode of.
         * @param axis - The axis to set the limit mode of.
         * @param limitMode - The limit mode to set.
         */
        setAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limitMode: PhysicsConstraintAxisLimitMode): void;
        /**
         * Gets the axis limit mode of the given constraint.
         *
         * @param constraint - The constraint to get the axis limit mode from.
         * @param axis - The axis to get the limit mode from.
         * @returns The axis limit mode of the given constraint.
         *
         */
        getAxisMode(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintAxisLimitMode>;
        /**
         * Sets the minimum limit of the given axis of the given constraint.
         * @param constraint - The constraint to set the minimum limit of.
         * @param axis - The axis to set the minimum limit of.
         * @param limit - The minimum limit to set.
         *
         */
        setAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limit: number): void;
        /**
         * Gets the minimum limit of the specified axis of the given constraint.
         * @param constraint - The constraint to get the minimum limit from.
         * @param axis - The axis to get the minimum limit from.
         * @returns The minimum limit of the specified axis of the given constraint.
         *
         */
        getAxisMinLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the maximum limit of the given axis of the given constraint.
         * @param constraint - The constraint to set the maximum limit of the given axis.
         * @param axis - The axis to set the maximum limit of.
         * @param limit - The maximum limit to set.
         *
         */
        setAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, limit: number): void;
        /**
         * Gets the maximum limit of the given axis of the given constraint.
         *
         * @param constraint - The constraint to get the maximum limit from.
         * @param axis - The axis to get the maximum limit from.
         * @returns The maximum limit of the given axis of the given constraint.
         *
         */
        getAxisMaxLimit(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the motor type of the given axis of the given constraint.
         * @param constraint - The constraint to set the motor type of.
         * @param axis - The axis of the constraint to set the motor type of.
         * @param motorType - The motor type to set.
         *
         */
        setAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, motorType: PhysicsConstraintMotorType): void;
        /**
         * Gets the motor type of the specified axis of the given constraint.
         * @param constraint - The constraint to get the motor type from.
         * @param axis - The axis of the constraint to get the motor type from.
         * @returns The motor type of the specified axis of the given constraint.
         *
         */
        getAxisMotorType(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<PhysicsConstraintMotorType>;
        /**
         * Sets the target of an axis motor of a constraint.
         *
         * @param constraint - The constraint to set the axis motor target of.
         * @param axis - The axis of the constraint to set the motor target of.
         * @param target - The target of the axis motor.
         *
         */
        setAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, target: number): void;
        /**
         * Gets the target of the motor of the given axis of the given constraint.
         *
         * @param constraint - The constraint to get the motor target from.
         * @param axis - The axis of the constraint to get the motor target from.
         * @returns The target of the motor of the given axis of the given constraint.
         *
         */
        getAxisMotorTarget(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Sets the maximum force that can be applied by the motor of the given constraint axis.
         * @param constraint - The constraint to set the motor max force for.
         * @param axis - The axis of the constraint to set the motor max force for.
         * @param maxForce - The maximum force that can be applied by the motor.
         *
         */
        setAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis, maxForce: number): void;
        /**
         * Gets the maximum force of the motor of the given constraint axis.
         *
         * @param constraint - The constraint to get the motor maximum force from.
         * @param axis - The axis of the constraint to get the motor maximum force from.
         * @returns The maximum force of the motor of the given constraint axis.
         *
         */
        getAxisMotorMaxForce(constraint: PhysicsConstraint, axis: PhysicsConstraintAxis): Nullable<number>;
        /**
         * Disposes a physics constraint.
         *
         * @param constraint - The physics constraint to dispose.
         *
         * This method is useful for releasing the resources associated with a physics constraint, such as
         * the Havok constraint, when it is no longer needed. This is important for avoiding memory leaks.
         */
        disposeConstraint(constraint: PhysicsConstraint): void;
        private _populateHitData;
        /**
         * Performs a raycast from a given start point to a given end point and stores the result in a given PhysicsRaycastResult object.
         *
         * @param from - The start point of the raycast.
         * @param to - The end point of the raycast.
         * @param result - The PhysicsRaycastResult object (or array of PhysicsRaycastResults) to store the result of the raycast.
         * @param query - The raycast query options. See [[IRaycastQuery]] for more information.
         *
         * Performs a raycast. It takes in two points, from and to, and a PhysicsRaycastResult object to store the result of the raycast.
         * It then performs the raycast and stores the hit data in the PhysicsRaycastResult object.
         * If result is an empty array, it will be populated with every detected raycast hit.
         * If result is a populated array, it will only fill the PhysicsRaycastResults present in the array.
         */
        raycast(from: Vector3, to: Vector3, result: PhysicsRaycastResult | Array<PhysicsRaycastResult>, query?: IRaycastQuery): void;
        /**
         * Given a point, returns the closest physics
         * body to that point.
         * @param query the query to perform. @see IPhysicsPointProximityQuery
         * @param result contact point on the hit shape, in world space
         */
        pointProximity(query: IPhysicsPointProximityQuery, result: ProximityCastResult): void;
        /**
         * Given a shape in a specific position and orientation, returns the closest point to that shape.
         * @param query the query to perform. @see IPhysicsShapeProximityCastQuery
         * @param inputShapeResult contact point on input shape, in input shape space
         * @param hitShapeResult contact point on hit shape, in world space
         */
        shapeProximity(query: IPhysicsShapeProximityCastQuery, inputShapeResult: ProximityCastResult, hitShapeResult: ProximityCastResult): void;
        /**
         * Given a shape in a specific orientation, cast it from the start to end position specified by the query, and return the first hit.
         * @param query the query to perform. @see IPhysicsShapeCastQuery
         * @param inputShapeResult contact point on input shape, in input shape space
         * @param hitShapeResult contact point on hit shape, in world space
         */
        shapeCast(query: IPhysicsShapeCastQuery, inputShapeResult: ShapeCastResult, hitShapeResult: ShapeCastResult): void;
        /**
         * Return the collision observable for a particular physics body.
         * @param body the physics body
         * @param instanceIndex - optionally, the index of the instance in the body
         * @returns the collision observable for the body
         */
        getCollisionObservable(body: PhysicsBody, instanceIndex?: number): Observable<IPhysicsCollisionEvent>;
        /**
         * Return the collision ended observable for a particular physics body.
         * @param body the physics body
         * @param instanceIndex - optionally, the index of the instance in the body
         * @returns the collision ended observable for the body
         */
        getCollisionEndedObservable(body: PhysicsBody, instanceIndex?: number): Observable<IBasePhysicsCollisionEvent>;
        /**
         * Enable collision to be reported for a body when a callback is setup on the world
         * @param body the physics body
         * @param enabled whether to enable or disable collision events
         */
        setCollisionCallbackEnabled(body: PhysicsBody, enabled: boolean): void;
        /**
         * Enable collision ended to be reported for a body when a callback is setup on the world
         * @param body the physics body
         * @param enabled whether to enable or disable collision ended events
         */
        setCollisionEndedCallbackEnabled(body: PhysicsBody, enabled: boolean): void;
        private _notifyTriggers;
        /**
         * Runs thru all detected collisions and filter by body
         * @param world optional world to check collisions for (defaults to main world)
         */
        private _notifyCollisions;
        /**
         * Gets the number of bodies in the world
         */
        get numBodies(): any;
        /**
         * Dispose the world and free resources
         */
        dispose(): void;
        private _v3ToBvecRef;
        private _bVecToV3;
        /**
         * Converts a Vector3 to Havok format with floating origin offset subtracted.
         * Use this for world-space positions being sent to Havok.
         * @param v - The vector to convert
         * @param offset - Optional offset to use. If not provided, no offset is applied.
         * @returns The converted vector
         */
        private _bVecToV3WithOffset;
        private _bQuatToV4;
        private _constraintMotorTypeToNative;
        private _nativeToMotorType;
        private _materialCombineToNative;
        private _nativeToMaterialCombine;
        private _constraintAxisToNative;
        private _nativeToLimitMode;
        private _limitModeToNative;
        private _nativeCollisionValueToCollisionType;
        private _nativeTriggerCollisionValueToCollisionType;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Interface for Physics-Joint data
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface PhysicsJointData {
        /**
         * The main pivot of the joint
         */
        mainPivot?: Vector3;
        /**
         * The connected pivot of the joint
         */
        connectedPivot?: Vector3;
        /**
         * The main axis of the joint
         */
        mainAxis?: Vector3;
        /**
         * The connected axis of the joint
         */
        connectedAxis?: Vector3;
        /**
         * The collision of the joint
         */
        collision?: boolean;
        /**
         * Native Oimo/Cannon/Energy data
         */
        nativeParams?: any;
    }
    /**
     * This is a holder class for the physics joint created by the physics plugin
     * It holds a set of functions to control the underlying joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsJoint {
        /**
         * The type of the physics joint
         */
        type: number;
        /**
         * The data for the physics joint
         */
        jointData: PhysicsJointData;
        private _physicsJoint;
        protected _physicsPlugin: IPhysicsEnginePlugin;
        /**
         * Initializes the physics joint
         * @param type The type of the physics joint
         * @param jointData The data for the physics joint
         */
        constructor(
        /**
         * The type of the physics joint
         */
        type: number, 
        /**
         * The data for the physics joint
         */
        jointData: PhysicsJointData);
        /**
         * Gets the physics joint
         */
        get physicsJoint(): any;
        /**
         * Sets the physics joint
         */
        set physicsJoint(newJoint: any);
        /**
         * Sets the physics plugin
         */
        set physicsPlugin(physicsPlugin: IPhysicsEnginePlugin);
        /**
         * Execute a function that is physics-plugin specific.
         * @param {Function} func the function that will be executed.
         *                        It accepts two parameters: the physics world and the physics joint
         */
        executeNativeFunction(func: (world: any, physicsJoint: any) => void): void;
        /**
         * Distance-Joint type
         */
        static DistanceJoint: number;
        /**
         * Hinge-Joint type
         */
        static HingeJoint: number;
        /**
         * Ball-and-Socket joint type
         */
        static BallAndSocketJoint: number;
        /**
         * Wheel-Joint type
         */
        static WheelJoint: number;
        /**
         * Slider-Joint type
         */
        static SliderJoint: number;
        /**
         * Prismatic-Joint type
         */
        static PrismaticJoint: number;
        /**
         * Universal-Joint type
         * ENERGY FTW! (compare with this - @see http://ode-wiki.org/wiki/index.php?title=Manual:_Joint_Types_and_Functions)
         */
        static UniversalJoint: number;
        /**
         * Hinge-Joint 2 type
         */
        static Hinge2Joint: number;
        /**
         * Point to Point Joint type.  Similar to a Ball-Joint.  Different in parameters
         */
        static PointToPointJoint: number;
        /**
         * Spring-Joint type
         */
        static SpringJoint: number;
        /**
         * Lock-Joint type
         */
        static LockJoint: number;
    }
    /**
     * A class representing a physics distance joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class DistanceJoint extends PhysicsJoint {
        /**
         *
         * @param jointData The data for the Distance-Joint
         */
        constructor(jointData: DistanceJointData);
        /**
         * Update the predefined distance.
         * @param maxDistance The maximum preferred distance
         * @param minDistance The minimum preferred distance
         */
        updateDistance(maxDistance: number, minDistance?: number): void;
    }
    /**
     * Represents a Motor-Enabled Joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class MotorEnabledJoint extends PhysicsJoint implements IMotorEnabledJoint {
        /**
         * Initializes the Motor-Enabled Joint
         * @param type The type of the joint
         * @param jointData The physical joint data for the joint
         */
        constructor(type: number, jointData: PhysicsJointData);
        /**
         * Set the motor values.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param force the force to apply
         * @param maxForce max force for this motor.
         */
        setMotor(force?: number, maxForce?: number): void;
        /**
         * Set the motor's limits.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param upperLimit The upper limit of the motor
         * @param lowerLimit The lower limit of the motor
         */
        setLimit(upperLimit: number, lowerLimit?: number): void;
    }
    /**
     * This class represents a single physics Hinge-Joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class HingeJoint extends MotorEnabledJoint {
        /**
         * Initializes the Hinge-Joint
         * @param jointData The joint data for the Hinge-Joint
         */
        constructor(jointData: PhysicsJointData);
        /**
         * Set the motor values.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param {number} force the force to apply
         * @param {number} maxForce max force for this motor.
         */
        setMotor(force?: number, maxForce?: number): void;
        /**
         * Set the motor's limits.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param upperLimit The upper limit of the motor
         * @param lowerLimit The lower limit of the motor
         */
        setLimit(upperLimit: number, lowerLimit?: number): void;
    }
    /**
     * This class represents a dual hinge physics joint (same as wheel joint)
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class Hinge2Joint extends MotorEnabledJoint {
        /**
         * Initializes the Hinge2-Joint
         * @param jointData The joint data for the Hinge2-Joint
         */
        constructor(jointData: PhysicsJointData);
        /**
         * Set the motor values.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param targetSpeed the speed the motor is to reach
         * @param maxForce max force for this motor.
         * @param motorIndex motor's index, 0 or 1.
         */
        setMotor(targetSpeed?: number, maxForce?: number, motorIndex?: number): void;
        /**
         * Set the motor limits.
         * Attention, this function is plugin specific. Engines won't react 100% the same.
         * @param upperLimit the upper limit
         * @param lowerLimit lower limit
         * @param motorIndex the motor's index, 0 or 1.
         */
        setLimit(upperLimit: number, lowerLimit?: number, motorIndex?: number): void;
    }
    /**
     * Interface for a motor enabled joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface IMotorEnabledJoint {
        /**
         * Physics joint
         */
        physicsJoint: any;
        /**
         * Sets the motor of the motor-enabled joint
         * @param force The force of the motor
         * @param maxForce The maximum force of the motor
         * @param motorIndex The index of the motor
         */
        setMotor(force?: number, maxForce?: number, motorIndex?: number): void;
        /**
         * Sets the limit of the motor
         * @param upperLimit The upper limit of the motor
         * @param lowerLimit The lower limit of the motor
         * @param motorIndex The index of the motor
         */
        setLimit(upperLimit: number, lowerLimit?: number, motorIndex?: number): void;
    }
    /**
     * Joint data for a Distance-Joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface DistanceJointData extends PhysicsJointData {
        /**
         * Max distance the 2 joint objects can be apart
         */
        maxDistance: number;
    }
    /**
     * Joint data from a spring joint
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface SpringJointData extends PhysicsJointData {
        /**
         * Length of the spring
         */
        length: number;
        /**
         * Stiffness of the spring
         */
        stiffness: number;
        /**
         * Damping of the spring
         */
        damping: number;
        /** this callback will be called when applying the force to the impostors. */
        forceApplicationCallback: () => void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The interface for the physics imposter parameters
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface PhysicsImpostorParameters {
        /**
         * The mass of the physics imposter
         */
        mass: number;
        /**
         * The friction of the physics imposter
         */
        friction?: number;
        /**
         * The coefficient of restitution of the physics imposter
         */
        restitution?: number;
        /**
         * The native options of the physics imposter
         */
        nativeOptions?: any;
        /**
         * Specifies if the parent should be ignored
         */
        ignoreParent?: boolean;
        /**
         * Specifies if bi-directional transformations should be disabled
         */
        disableBidirectionalTransformation?: boolean;
        /**
         * The pressure inside the physics imposter, soft object only
         */
        pressure?: number;
        /**
         * The stiffness the physics imposter, soft object only
         */
        stiffness?: number;
        /**
         * The number of iterations used in maintaining consistent vertex velocities, soft object only
         */
        velocityIterations?: number;
        /**
         * The number of iterations used in maintaining consistent vertex positions, soft object only
         */
        positionIterations?: number;
        /**
         * The number used to fix points on a cloth (0, 1, 2, 4, 8) or rope (0, 1, 2) only
         * 0 None, 1, back left or top, 2, back right or bottom, 4, front left, 8, front right
         * Add to fix multiple points
         */
        fixedPoints?: number;
        /**
         * The collision margin around a soft object
         */
        margin?: number;
        /**
         * The collision margin around a soft object
         */
        damping?: number;
        /**
         * The path for a rope based on an extrusion
         */
        path?: any;
        /**
         * The shape of an extrusion used for a rope based on an extrusion
         */
        shape?: any;
    }
    /**
     * Interface for a physics-enabled object
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export interface IPhysicsEnabledObject {
        /**
         * The position of the physics-enabled object
         */
        position: Vector3;
        /**
         * The rotation of the physics-enabled object
         */
        rotationQuaternion: Nullable<Quaternion>;
        /**
         * The scale of the physics-enabled object
         */
        scaling: Vector3;
        /**
         * The rotation of the physics-enabled object
         */
        rotation?: Vector3;
        /**
         * The parent of the physics-enabled object
         */
        parent?: any;
        /**
         * The bounding info of the physics-enabled object
         * @returns The bounding info of the physics-enabled object
         */
        getBoundingInfo(): BoundingInfo;
        /**
         * Computes the world matrix
         * @param force Specifies if the world matrix should be computed by force
         * @returns A world matrix
         */
        computeWorldMatrix(force: boolean): Matrix;
        /**
         * Gets the world matrix
         * @returns A world matrix
         */
        getWorldMatrix?(): Matrix;
        /**
         * Gets the child meshes
         * @param directDescendantsOnly Specifies if only direct-descendants should be obtained
         * @returns An array of abstract meshes
         */
        getChildMeshes?(directDescendantsOnly?: boolean): Array<AbstractMesh>;
        /**
         * Gets the vertex data
         * @param kind The type of vertex data
         * @returns A nullable array of numbers, or a float32 array
         */
        getVerticesData(kind: string): Nullable<FloatArray>;
        /**
         * Gets the indices from the mesh
         * @returns A nullable array of index arrays
         */
        getIndices?(): Nullable<IndicesArray>;
        /**
         * Gets the scene from the mesh
         * @returns the indices array or null
         */
        getScene?(): Scene;
        /**
         * Gets the absolute position from the mesh
         * @returns the absolute position
         */
        getAbsolutePosition(): Vector3;
        /**
         * Gets the absolute pivot point from the mesh
         * @returns the absolute pivot point
         */
        getAbsolutePivotPoint(): Vector3;
        /**
         * Rotates the mesh
         * @param axis The axis of rotation
         * @param amount The amount of rotation
         * @param space The space of the rotation
         * @returns The rotation transform node
         */
        rotate(axis: Vector3, amount: number, space?: Space): TransformNode;
        /**
         * Translates the mesh
         * @param axis The axis of translation
         * @param distance The distance of translation
         * @param space The space of the translation
         * @returns The transform node
         */
        translate(axis: Vector3, distance: number, space?: Space): TransformNode;
        /**
         * Sets the absolute position of the mesh
         * @param absolutePosition The absolute position of the mesh
         * @returns The transform node
         */
        setAbsolutePosition(absolutePosition: Vector3): TransformNode;
        /**
         * Gets the class name of the mesh
         * @returns The class name
         */
        getClassName(): string;
    }
    /**
     * Represents a physics imposter
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsImpostor {
        /**
         * The physics-enabled object used as the physics imposter
         */
        object: IPhysicsEnabledObject;
        /**
         * The type of the physics imposter
         */
        type: number;
        private _options;
        private _scene?;
        /**
         * The default object size of the imposter
         */
        static DEFAULT_OBJECT_SIZE: Vector3;
        /**
         * The identity quaternion of the imposter
         */
        static IDENTITY_QUATERNION: Quaternion;
        /** @internal */
        _pluginData: any;
        private _physicsEngine;
        private _physicsBody;
        private _bodyUpdateRequired;
        private _onBeforePhysicsStepCallbacks;
        private _onAfterPhysicsStepCallbacks;
        /** @internal */
        _onPhysicsCollideCallbacks: Array<{
            callback: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable<Vector3>, distance: number, impulse: number, normal: Nullable<Vector3>) => void;
            otherImpostors: Array<PhysicsImpostor>;
        }>;
        private _deltaPosition;
        private _deltaRotation;
        private _deltaRotationConjugated;
        /** @internal */
        _isFromLine: boolean;
        private _parent;
        private _isDisposed;
        private static _TmpVecs;
        private static _TmpQuat;
        /**
         * Specifies if the physics imposter is disposed
         */
        get isDisposed(): boolean;
        /**
         * Gets the mass of the physics imposter
         */
        get mass(): number;
        set mass(value: number);
        /**
         * Gets the coefficient of friction
         */
        get friction(): number;
        /**
         * Sets the coefficient of friction
         */
        set friction(value: number);
        /**
         * Gets the coefficient of restitution
         */
        get restitution(): number;
        /**
         * Sets the coefficient of restitution
         */
        set restitution(value: number);
        /**
         * Gets the pressure of a soft body; only supported by the AmmoJSPlugin
         */
        get pressure(): number;
        /**
         * Sets the pressure of a soft body; only supported by the AmmoJSPlugin
         */
        set pressure(value: number);
        /**
         * Gets the stiffness of a soft body; only supported by the AmmoJSPlugin
         */
        get stiffness(): number;
        /**
         * Sets the stiffness of a soft body; only supported by the AmmoJSPlugin
         */
        set stiffness(value: number);
        /**
         * Gets the velocityIterations of a soft body; only supported by the AmmoJSPlugin
         */
        get velocityIterations(): number;
        /**
         * Sets the velocityIterations of a soft body; only supported by the AmmoJSPlugin
         */
        set velocityIterations(value: number);
        /**
         * Gets the positionIterations of a soft body; only supported by the AmmoJSPlugin
         */
        get positionIterations(): number;
        /**
         * Sets the positionIterations of a soft body; only supported by the AmmoJSPlugin
         */
        set positionIterations(value: number);
        /**
         * The unique id of the physics imposter
         * set by the physics engine when adding this impostor to the array
         */
        uniqueId: number;
        /**
         * @internal
         */
        soft: boolean;
        /**
         * @internal
         */
        segments: number;
        private _joints;
        /**
         * Initializes the physics imposter
         * @param object The physics-enabled object used as the physics imposter
         * @param type The type of the physics imposter. Types are available as static members of this class.
         * @param _options The options for the physics imposter
         * @param _scene The Babylon scene
         */
        constructor(
        /**
         * The physics-enabled object used as the physics imposter
         */
        object: IPhysicsEnabledObject, 
        /**
         * The type of the physics imposter
         */
        type: number, _options?: PhysicsImpostorParameters, _scene?: Scene | undefined);
        /**
         * This function will completely initialize this impostor.
         * It will create a new body - but only if this mesh has no parent.
         * If it has, this impostor will not be used other than to define the impostor
         * of the child mesh.
         * @internal
         */
        _init(): void;
        private _getPhysicsParent;
        /**
         * Should a new body be generated.
         * @returns boolean specifying if body initialization is required
         */
        isBodyInitRequired(): boolean;
        /**
         * Sets the updated scaling
         */
        setScalingUpdated(): void;
        /**
         * Force a regeneration of this or the parent's impostor's body.
         * Use with caution - This will remove all previously-instantiated joints.
         */
        forceUpdate(): void;
        /**
         * Gets the body that holds this impostor. Either its own, or its parent.
         */
        get physicsBody(): any;
        /**
         * Get the parent of the physics imposter
         * @returns Physics imposter or null
         */
        get parent(): Nullable<PhysicsImpostor>;
        /**
         * Sets the parent of the physics imposter
         */
        set parent(value: Nullable<PhysicsImpostor>);
        /**
         * Set the physics body. Used mainly by the physics engine/plugin
         */
        set physicsBody(physicsBody: any);
        /**
         * Resets the update flags
         */
        resetUpdateFlags(): void;
        /**
         * Gets the object extents
         * @returns the object extents
         */
        getObjectExtents(): Vector3;
        /**
         * Gets the object center
         * @returns The object center
         */
        getObjectCenter(): Vector3;
        /**
         * Get a specific parameter from the options parameters
         * @param paramName The object parameter name
         * @returns The object parameter
         */
        getParam(paramName: string): any;
        /**
         * Sets a specific parameter in the options given to the physics plugin
         * @param paramName The parameter name
         * @param value The value of the parameter
         */
        setParam(paramName: string, value: number): void;
        /**
         * Specifically change the body's mass. Won't recreate the physics body object
         * @param mass The mass of the physics imposter
         */
        setMass(mass: number): void;
        /**
         * Gets the linear velocity
         * @returns  linear velocity or null
         */
        getLinearVelocity(): Nullable<Vector3>;
        /**
         * Sets the linear velocity
         * @param velocity  linear velocity or null
         */
        setLinearVelocity(velocity: Nullable<Vector3>): void;
        /**
         * Gets the angular velocity
         * @returns angular velocity or null
         */
        getAngularVelocity(): Nullable<Vector3>;
        /**
         * Sets the angular velocity
         * @param velocity The velocity or null
         */
        setAngularVelocity(velocity: Nullable<Vector3>): void;
        /**
         * Execute a function with the physics plugin native code
         * Provide a function the will have two variables - the world object and the physics body object
         * @param func The function to execute with the physics plugin native code
         */
        executeNativeFunction(func: (world: any, physicsBody: any) => void): void;
        /**
         * Register a function that will be executed before the physics world is stepping forward
         * @param func The function to execute before the physics world is stepped forward
         */
        registerBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void;
        /**
         * Unregister a function that will be executed before the physics world is stepping forward
         * @param func The function to execute before the physics world is stepped forward
         */
        unregisterBeforePhysicsStep(func: (impostor: PhysicsImpostor) => void): void;
        /**
         * Register a function that will be executed after the physics step
         * @param func The function to execute after physics step
         */
        registerAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void;
        /**
         * Unregisters a function that will be executed after the physics step
         * @param func The function to execute after physics step
         */
        unregisterAfterPhysicsStep(func: (impostor: PhysicsImpostor) => void): void;
        /**
         * register a function that will be executed when this impostor collides against a different body
         * @param collideAgainst Physics imposter, or array of physics imposters to collide against
         * @param func Callback that is executed on collision
         */
        registerOnPhysicsCollide(collideAgainst: PhysicsImpostor | Array<PhysicsImpostor>, func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor, point: Nullable<Vector3>) => void): void;
        /**
         * Unregisters the physics imposter's collision callback
         * @param collideAgainst The physics object to collide against
         * @param func Callback to execute on collision
         */
        unregisterOnPhysicsCollide(collideAgainst: PhysicsImpostor | Array<PhysicsImpostor>, func: (collider: PhysicsImpostor, collidedAgainst: PhysicsImpostor | Array<PhysicsImpostor>, point: Nullable<Vector3>) => void): void;
        private _tmpQuat;
        private _tmpQuat2;
        /**
         * Get the parent rotation
         * @returns The parent rotation
         */
        getParentsRotation(): Quaternion;
        /**
         * this function is executed by the physics engine.
         */
        beforeStep: () => void;
        /**
         * this function is executed by the physics engine
         */
        afterStep: () => void;
        /**
         * Legacy collision detection event support
         */
        onCollideEvent: Nullable<(collider: PhysicsImpostor, collidedWith: PhysicsImpostor) => void>;
        /**
         *  define an onCollide function to call when this impostor collides against a different body
         * @param e collide event data
         */
        onCollide: (e: {
            body: any;
            point: Nullable<Vector3>;
            distance: number;
            impulse: number;
            normal: Nullable<Vector3>;
        }) => void;
        /**
         * Apply a force
         * @param force The force to apply
         * @param contactPoint The contact point for the force
         * @returns The physics imposter
         */
        applyForce(force: Vector3, contactPoint: Vector3): PhysicsImpostor;
        /**
         * Apply an impulse
         * @param force The impulse force
         * @param contactPoint The contact point for the impulse force
         * @returns The physics imposter
         */
        applyImpulse(force: Vector3, contactPoint: Vector3): PhysicsImpostor;
        /**
         * A help function to create a joint
         * @param otherImpostor A physics imposter used to create a joint
         * @param jointType The type of joint
         * @param jointData The data for the joint
         * @returns The physics imposter
         */
        createJoint(otherImpostor: PhysicsImpostor, jointType: number, jointData: PhysicsJointData): PhysicsImpostor;
        /**
         * Add a joint to this impostor with a different impostor
         * @param otherImpostor A physics imposter used to add a joint
         * @param joint The joint to add
         * @returns The physics imposter
         */
        addJoint(otherImpostor: PhysicsImpostor, joint: PhysicsJoint): PhysicsImpostor;
        /**
         * Add an anchor to a cloth impostor
         * @param otherImpostor rigid impostor to anchor to
         * @param width ratio across width from 0 to 1
         * @param height ratio up height from 0 to 1
         * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch
         * @param noCollisionBetweenLinkedBodies when true collisions between cloth impostor and anchor are ignored; default false
         * @returns impostor the soft imposter
         */
        addAnchor(otherImpostor: PhysicsImpostor, width: number, height: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor;
        /**
         * Add a hook to a rope impostor
         * @param otherImpostor rigid impostor to anchor to
         * @param length ratio across rope from 0 to 1
         * @param influence the elasticity between rope impostor and anchor from 0, very stretchy to 1, little stretch
         * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false
         * @returns impostor the rope imposter
         */
        addHook(otherImpostor: PhysicsImpostor, length: number, influence: number, noCollisionBetweenLinkedBodies: boolean): PhysicsImpostor;
        /**
         * Will keep this body still, in a sleep mode.
         * @returns the physics imposter
         */
        sleep(): PhysicsImpostor;
        /**
         * Wake the body up.
         * @returns The physics imposter
         */
        wakeUp(): PhysicsImpostor;
        /**
         * Clones the physics imposter
         * @param newObject The physics imposter clones to this physics-enabled object
         * @returns A nullable physics imposter
         */
        clone(newObject: IPhysicsEnabledObject): Nullable<PhysicsImpostor>;
        /**
         * Disposes the physics imposter
         */
        dispose(): void;
        /**
         * Sets the delta position
         * @param position The delta position amount
         */
        setDeltaPosition(position: Vector3): void;
        /**
         * Sets the delta rotation
         * @param rotation The delta rotation amount
         */
        setDeltaRotation(rotation: Quaternion): void;
        /**
         * Gets the box size of the physics imposter and stores the result in the input parameter
         * @param result Stores the box size
         * @returns The physics imposter
         */
        getBoxSizeToRef(result: Vector3): PhysicsImpostor;
        /**
         * Gets the radius of the physics imposter
         * @returns Radius of the physics imposter
         */
        getRadius(): number;
        /**
         * Sync a bone with this impostor
         * @param bone The bone to sync to the impostor.
         * @param boneMesh The mesh that the bone is influencing.
         * @param jointPivot The pivot of the joint / bone in local space.
         * @param distToJoint Optional distance from the impostor to the joint.
         * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.
         */
        syncBoneWithImpostor(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion): void;
        /**
         * Sync impostor to a bone
         * @param bone The bone that the impostor will be synced to.
         * @param boneMesh The mesh that the bone is influencing.
         * @param jointPivot The pivot of the joint / bone in local space.
         * @param distToJoint Optional distance from the impostor to the joint.
         * @param adjustRotation Optional quaternion for adjusting the local rotation of the bone.
         * @param boneAxis Optional vector3 axis the bone is aligned with
         */
        syncImpostorWithBone(bone: Bone, boneMesh: AbstractMesh, jointPivot: Vector3, distToJoint?: number, adjustRotation?: Quaternion, boneAxis?: Vector3): void;
        /**
         * No-Imposter type
         */
        static NoImpostor: number;
        /**
         * Sphere-Imposter type
         */
        static SphereImpostor: number;
        /**
         * Box-Imposter type
         */
        static BoxImpostor: number;
        /**
         * Plane-Imposter type
         */
        static PlaneImpostor: number;
        /**
         * Mesh-imposter type (Only available to objects with vertices data)
         */
        static MeshImpostor: number;
        /**
         * Capsule-Impostor type (Ammo.js plugin only)
         */
        static CapsuleImpostor: number;
        /**
         * Cylinder-Imposter type
         */
        static CylinderImpostor: number;
        /**
         * Particle-Imposter type
         */
        static ParticleImpostor: number;
        /**
         * Heightmap-Imposter type
         */
        static HeightmapImpostor: number;
        /**
         * ConvexHull-Impostor type (Ammo.js plugin only)
         */
        static ConvexHullImpostor: number;
        /**
         * Custom-Imposter type (Ammo.js plugin only)
         */
        static CustomImpostor: number;
        /**
         * Rope-Imposter type
         */
        static RopeImpostor: number;
        /**
         * Cloth-Imposter type
         */
        static ClothImpostor: number;
        /**
         * Softbody-Imposter type
         */
        static SoftbodyImpostor: number;
    }
    /**
     * Register side effects for physicsImpostor.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPhysicsImpostor(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import physicsImpostor.pure for tree-shakeable, side-effect-free usage.
     */


        interface AbstractMesh {
            /** @internal */
            _physicsImpostor: Nullable<PhysicsImpostor>;
            /**
             * Gets or sets impostor used for physic simulation
             * @see https://doc.babylonjs.com/features/featuresDeepDive/physics
             */
            physicsImpostor: Nullable<PhysicsImpostor>;
            /**
             * Gets the current physics impostor
             * @see https://doc.babylonjs.com/features/featuresDeepDive/physics
             * @returns a physics impostor or null
             */
            getPhysicsImpostor(): Nullable<PhysicsImpostor>;
            /** Apply a physic impulse to the mesh
             * @param force defines the force to apply
             * @param contactPoint defines where to apply the force
             * @returns the current mesh
             * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
             */
            applyImpulse(force: Vector3, contactPoint: Vector3): AbstractMesh;
            /**
             * Creates a physic joint between two meshes
             * @param otherMesh defines the other mesh to use
             * @param pivot1 defines the pivot to use on this mesh
             * @param pivot2 defines the pivot to use on the other mesh
             * @param options defines additional options (can be plugin dependent)
             * @returns the current mesh
             * @see https://www.babylonjs-playground.com/#0BS5U0#0
             */
            setPhysicsLinkWith(otherMesh: Mesh, pivot1: Vector3, pivot2: Vector3, options?: any): AbstractMesh;
            /** @internal */
            _disposePhysicsObserver: Nullable<Observer<Node>>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for physicsV1PhysicsEngineComponent.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPhysicsV1PhysicsEngineComponent(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import physicsEngineComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to control physics engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     */
    export class PhysicsEngine implements IPhysicsEngine {
        private _physicsPlugin;
        /**
         * Global value used to control the smallest number supported by the simulation
         */
        private _impostors;
        private _joints;
        private _subTimeStep;
        private _uniqueIdCounter;
        /**
         * Gets the gravity vector used by the simulation
         */
        gravity: Vector3;
        /**
         *
         * @returns version
         */
        getPluginVersion(): number;
        /**
         * @virtual
         * Factory used to create the default physics plugin.
         * @returns The default physics plugin
         */
        static DefaultPluginFactory(): IPhysicsEnginePlugin;
        /**
         * Creates a new Physics Engine
         * @param gravity defines the gravity vector used by the simulation
         * @param _physicsPlugin defines the plugin to use (CannonJS by default)
         */
        constructor(gravity: Nullable<Vector3>, _physicsPlugin?: IPhysicsEnginePlugin);
        /**
         * Sets the gravity vector used by the simulation
         * @param gravity defines the gravity vector to use
         */
        setGravity(gravity: Vector3): void;
        /**
         * Set the time step of the physics engine.
         * Default is 1/60.
         * To slow it down, enter 1/600 for example.
         * To speed it up, 1/30
         * @param newTimeStep defines the new timestep to apply to this world.
         */
        setTimeStep(newTimeStep?: number): void;
        /**
         * Get the time step of the physics engine.
         * @returns the current time step
         */
        getTimeStep(): number;
        /**
         * Set the sub time step of the physics engine.
         * Default is 0 meaning there is no sub steps
         * To increase physics resolution precision, set a small value (like 1 ms)
         * @param subTimeStep defines the new sub timestep used for physics resolution.
         */
        setSubTimeStep(subTimeStep?: number): void;
        /**
         * Get the sub time step of the physics engine.
         * @returns the current sub time step
         */
        getSubTimeStep(): number;
        /**
         * Release all resources
         */
        dispose(): void;
        /**
         * Gets the name of the current physics plugin
         * @returns the name of the plugin
         */
        getPhysicsPluginName(): string;
        /**
         * Adding a new impostor for the impostor tracking.
         * This will be done by the impostor itself.
         * @param impostor the impostor to add
         */
        addImpostor(impostor: PhysicsImpostor): void;
        /**
         * Remove an impostor from the engine.
         * This impostor and its mesh will not longer be updated by the physics engine.
         * @param impostor the impostor to remove
         */
        removeImpostor(impostor: PhysicsImpostor): void;
        /**
         * Add a joint to the physics engine
         * @param mainImpostor defines the main impostor to which the joint is added.
         * @param connectedImpostor defines the impostor that is connected to the main impostor using this joint
         * @param joint defines the joint that will connect both impostors.
         */
        addJoint(mainImpostor: PhysicsImpostor, connectedImpostor: PhysicsImpostor, joint: PhysicsJoint): void;
        /**
         * Removes a joint from the simulation
         * @param mainImpostor defines the impostor used with the joint
         * @param connectedImpostor defines the other impostor connected to the main one by the joint
         * @param joint defines the joint to remove
         */
        removeJoint(mainImpostor: PhysicsImpostor, connectedImpostor: PhysicsImpostor, joint: PhysicsJoint): void;
        /**
         * Called by the scene. No need to call it.
         * @param delta defines the timespan between frames
         */
        _step(delta: number): void;
        /**
         * Gets the current plugin used to run the simulation
         * @returns current plugin
         */
        getPhysicsPlugin(): IPhysicsEnginePlugin;
        /**
         * Gets the list of physic impostors
         * @returns an array of PhysicsImpostor
         */
        getImpostors(): Array<PhysicsImpostor>;
        /**
         * Gets the impostor for a physics enabled object
         * @param object defines the object impersonated by the impostor
         * @returns the PhysicsImpostor or null if not found
         */
        getImpostorForPhysicsObject(object: IPhysicsEnabledObject): Nullable<PhysicsImpostor>;
        /**
         * Gets the impostor for a physics body object
         * @param body defines physics body used by the impostor
         * @returns the PhysicsImpostor or null if not found
         */
        getImpostorWithPhysicsBody(body: any): Nullable<PhysicsImpostor>;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3): PhysicsRaycastResult;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param result resulting PhysicsRaycastResult
         * @returns true if the ray hits an impostor, else false
         */
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void;
    }




    /**
     * Interface used to describe a physics joint
     */
    export interface PhysicsImpostorJoint {
        /** Defines the main impostor to which the joint is linked */
        mainImpostor: PhysicsImpostor;
        /** Defines the impostor that is connected to the main impostor using this joint */
        connectedImpostor: PhysicsImpostor;
        /** Defines the joint itself */
        joint: PhysicsJoint;
    }
    /** @internal */
    export interface IPhysicsEnginePlugin {
        world: any;
        name: string;
        setGravity(gravity: Vector3): void;
        setTimeStep(timeStep: number): void;
        getTimeStep(): number;
        executeStep(delta: number, impostors: Array<PhysicsImpostor>): void;
        getPluginVersion(): number;
        applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        generatePhysicsBody(impostor: PhysicsImpostor): void;
        removePhysicsBody(impostor: PhysicsImpostor): void;
        generateJoint(joint: PhysicsImpostorJoint): void;
        removeJoint(joint: PhysicsImpostorJoint): void;
        isSupported(): boolean;
        setTransformationFromPhysicsBody(impostor: PhysicsImpostor): void;
        setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion): void;
        setLinearVelocity(impostor: PhysicsImpostor, velocity: Nullable<Vector3>): void;
        setAngularVelocity(impostor: PhysicsImpostor, velocity: Nullable<Vector3>): void;
        getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        setBodyMass(impostor: PhysicsImpostor, mass: number): void;
        getBodyMass(impostor: PhysicsImpostor): number;
        getBodyFriction(impostor: PhysicsImpostor): number;
        setBodyFriction(impostor: PhysicsImpostor, friction: number): void;
        getBodyRestitution(impostor: PhysicsImpostor): number;
        setBodyRestitution(impostor: PhysicsImpostor, restitution: number): void;
        getBodyPressure?(impostor: PhysicsImpostor): number;
        setBodyPressure?(impostor: PhysicsImpostor, pressure: number): void;
        getBodyStiffness?(impostor: PhysicsImpostor): number;
        setBodyStiffness?(impostor: PhysicsImpostor, stiffness: number): void;
        getBodyVelocityIterations?(impostor: PhysicsImpostor): number;
        setBodyVelocityIterations?(impostor: PhysicsImpostor, velocityIterations: number): void;
        getBodyPositionIterations?(impostor: PhysicsImpostor): number;
        setBodyPositionIterations?(impostor: PhysicsImpostor, positionIterations: number): void;
        appendAnchor?(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, width: number, height: number, influence: number, noCollisionBetweenLinkedBodies: boolean): void;
        appendHook?(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, length: number, influence: number, noCollisionBetweenLinkedBodies: boolean): void;
        sleepBody(impostor: PhysicsImpostor): void;
        wakeUpBody(impostor: PhysicsImpostor): void;
        raycast(from: Vector3, to: Vector3): PhysicsRaycastResult;
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void;
        updateDistanceJoint(joint: PhysicsJoint, maxDistance: number, minDistance?: number): void;
        setMotor(joint: IMotorEnabledJoint, speed: number, maxForce?: number, motorIndex?: number): void;
        setLimit(joint: IMotorEnabledJoint, upperLimit: number, lowerLimit?: number, motorIndex?: number): void;
        getRadius(impostor: PhysicsImpostor): number;
        getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void;
        syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor): void;
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** @internal */
    export class OimoJSPlugin implements IPhysicsEnginePlugin {
        private _useDeltaForWorldStep;
        world: any;
        name: string;
        BJSOIMO: any;
        private _raycastResult;
        private _fixedTimeStep;
        constructor(_useDeltaForWorldStep?: boolean, iterations?: number, oimoInjection?: any);
        /**
         *
         * @returns plugin version
         */
        getPluginVersion(): number;
        setGravity(gravity: Vector3): void;
        setTimeStep(timeStep: number): void;
        getTimeStep(): number;
        private _tmpImpostorsArray;
        executeStep(delta: number, impostors: Array<PhysicsImpostor>): void;
        applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        generatePhysicsBody(impostor: PhysicsImpostor): void;
        private _tmpPositionVector;
        removePhysicsBody(impostor: PhysicsImpostor): void;
        generateJoint(impostorJoint: PhysicsImpostorJoint): void;
        removeJoint(impostorJoint: PhysicsImpostorJoint): void;
        isSupported(): boolean;
        setTransformationFromPhysicsBody(impostor: PhysicsImpostor): void;
        setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion): void;
        setLinearVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        setAngularVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        setBodyMass(impostor: PhysicsImpostor, mass: number): void;
        getBodyMass(impostor: PhysicsImpostor): number;
        getBodyFriction(impostor: PhysicsImpostor): number;
        setBodyFriction(impostor: PhysicsImpostor, friction: number): void;
        getBodyRestitution(impostor: PhysicsImpostor): number;
        setBodyRestitution(impostor: PhysicsImpostor, restitution: number): void;
        sleepBody(impostor: PhysicsImpostor): void;
        wakeUpBody(impostor: PhysicsImpostor): void;
        updateDistanceJoint(joint: PhysicsJoint, maxDistance: number, minDistance?: number): void;
        setMotor(joint: IMotorEnabledJoint, speed: number, force?: number, motorIndex?: number): void;
        setLimit(joint: IMotorEnabledJoint, upperLimit: number, lowerLimit?: number, motorIndex?: number): void;
        syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor): void;
        getRadius(impostor: PhysicsImpostor): number;
        getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void;
        dispose(): void;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3): PhysicsRaycastResult;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param result resulting PhysicsRaycastResult
         */
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void;
    }




    /** This file must only contain pure code and pure imports */
    /** @internal */
    export class CannonJSPlugin implements IPhysicsEnginePlugin {
        private _useDeltaForWorldStep;
        world: any;
        name: string;
        private _physicsMaterials;
        private _fixedTimeStep;
        private _cannonRaycastResult;
        private _raycastResult;
        private _physicsBodiesToRemoveAfterStep;
        private _firstFrame;
        private _tmpQuaternion;
        BJSCANNON: any;
        constructor(_useDeltaForWorldStep?: boolean, iterations?: number, cannonInjection?: any);
        /**
         *
         * @returns plugin version
         */
        getPluginVersion(): number;
        setGravity(gravity: Vector3): void;
        setTimeStep(timeStep: number): void;
        getTimeStep(): number;
        executeStep(delta: number, impostors: Array<PhysicsImpostor>): void;
        private _removeMarkedPhysicsBodiesFromWorld;
        applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        generatePhysicsBody(impostor: PhysicsImpostor): void;
        private _processChildMeshes;
        removePhysicsBody(impostor: PhysicsImpostor): void;
        generateJoint(impostorJoint: PhysicsImpostorJoint): void;
        removeJoint(impostorJoint: PhysicsImpostorJoint): void;
        private _addMaterial;
        private _checkWithEpsilon;
        private _createShape;
        private _createHeightmap;
        private _minus90X;
        private _plus90X;
        private _tmpPosition;
        private _tmpDeltaPosition;
        private _tmpUnityRotation;
        private _updatePhysicsBodyTransformation;
        setTransformationFromPhysicsBody(impostor: PhysicsImpostor): void;
        setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion): void;
        isSupported(): boolean;
        setLinearVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        setAngularVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        setBodyMass(impostor: PhysicsImpostor, mass: number): void;
        getBodyMass(impostor: PhysicsImpostor): number;
        getBodyFriction(impostor: PhysicsImpostor): number;
        setBodyFriction(impostor: PhysicsImpostor, friction: number): void;
        getBodyRestitution(impostor: PhysicsImpostor): number;
        setBodyRestitution(impostor: PhysicsImpostor, restitution: number): void;
        sleepBody(impostor: PhysicsImpostor): void;
        wakeUpBody(impostor: PhysicsImpostor): void;
        updateDistanceJoint(joint: PhysicsJoint, maxDistance: number): void;
        setMotor(joint: IMotorEnabledJoint, speed?: number, maxForce?: number, motorIndex?: number): void;
        setLimit(joint: IMotorEnabledJoint, minForce: number, maxForce?: number): void;
        syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor): void;
        getRadius(impostor: PhysicsImpostor): number;
        getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void;
        dispose(): void;
        private _extendNamespace;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3): PhysicsRaycastResult;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param result resulting PhysicsRaycastResult
         */
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void;
    }
    /**
     * Register side effects for cannonJSPlugin.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCannonJSPlugin(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cannonJSPlugin.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * AmmoJS Physics plugin
     * @see https://doc.babylonjs.com/features/featuresDeepDive/physics/usingPhysicsEngine
     * @see https://github.com/kripken/ammo.js/
     */
    export class AmmoJSPlugin implements IPhysicsEnginePlugin {
        private _useDeltaForWorldStep;
        /**
         * Reference to the Ammo library
         */
        bjsAMMO: any;
        /**
         * Created ammoJS world which physics bodies are added to
         */
        world: any;
        /**
         * Name of the plugin
         */
        name: string;
        private _timeStep;
        private _fixedTimeStep;
        private _maxSteps;
        private _tmpQuaternion;
        private _tmpAmmoTransform;
        private _tmpAmmoQuaternion;
        private _tmpAmmoConcreteContactResultCallback;
        private _collisionConfiguration;
        private _dispatcher;
        private _overlappingPairCache;
        private _solver;
        private _softBodySolver;
        private _tmpAmmoVectorA;
        private _tmpAmmoVectorB;
        private _tmpAmmoVectorC;
        private _tmpAmmoVectorD;
        private _tmpContactCallbackResult;
        private _tmpAmmoVectorRCA;
        private _tmpAmmoVectorRCB;
        private _raycastResult;
        private _tmpContactPoint;
        private _tmpContactNormal;
        private _tmpContactDistance;
        private _tmpContactImpulse;
        private _tmpVec3;
        private static readonly _DISABLE_COLLISION_FLAG;
        private static readonly _KINEMATIC_FLAG;
        private static readonly _DISABLE_DEACTIVATION_FLAG;
        /**
         * Initializes the ammoJS plugin
         * @param _useDeltaForWorldStep if the time between frames should be used when calculating physics steps (Default: true)
         * @param ammoInjection can be used to inject your own ammo reference
         * @param overlappingPairCache can be used to specify your own overlapping pair cache
         */
        constructor(_useDeltaForWorldStep?: boolean, ammoInjection?: any, overlappingPairCache?: any);
        /**
         *
         * @returns plugin version
         */
        getPluginVersion(): number;
        /**
         * Sets the gravity of the physics world (m/(s^2))
         * @param gravity Gravity to set
         */
        setGravity(gravity: Vector3): void;
        /**
         * Amount of time to step forward on each frame (only used if useDeltaForWorldStep is false in the constructor)
         * @param timeStep timestep to use in seconds
         */
        setTimeStep(timeStep: number): void;
        /**
         * Increment to step forward in the physics engine (If timeStep is set to 1/60 and fixedTimeStep is set to 1/120 the physics engine should run 2 steps per frame) (Default: 1/60)
         * @param fixedTimeStep fixedTimeStep to use in seconds
         */
        setFixedTimeStep(fixedTimeStep: number): void;
        /**
         * Sets the maximum number of steps by the physics engine per frame (Default: 5)
         * @param maxSteps the maximum number of steps by the physics engine per frame
         */
        setMaxSteps(maxSteps: number): void;
        /**
         * Gets the current timestep (only used if useDeltaForWorldStep is false in the constructor)
         * @returns the current timestep in seconds
         */
        getTimeStep(): number;
        /**
         * The create custom shape handler function to be called when using BABYLON.PhysicsImposter.CustomImpostor
         */
        onCreateCustomShape: (impostor: PhysicsImpostor) => any;
        /**
         * The create custom mesh impostor handler function to support building custom mesh impostor vertex data
         */
        onCreateCustomMeshImpostor: (impostor: PhysicsImpostor) => any;
        /**
         * The create custom convex hull impostor handler function to support building custom convex hull impostor vertex data
         */
        onCreateCustomConvexHullImpostor: (impostor: PhysicsImpostor) => any;
        private _isImpostorInContact;
        private _isImpostorPairInContact;
        private _stepSimulation;
        /**
         * Moves the physics simulation forward delta seconds and updates the given physics imposters
         * Prior to the step the imposters physics location is set to the position of the babylon meshes
         * After the step the babylon meshes are set to the position of the physics imposters
         * @param delta amount of time to step forward
         * @param impostors array of imposters to update before/after the step
         */
        executeStep(delta: number, impostors: Array<PhysicsImpostor>): void;
        /**
         * Update babylon mesh to match physics world object
         * @param impostor imposter to match
         */
        private _afterSoftStep;
        /**
         * Update babylon mesh vertices vertices to match physics world softbody or cloth
         * @param impostor imposter to match
         */
        private _ropeStep;
        /**
         * Update babylon mesh vertices vertices to match physics world softbody or cloth
         * @param impostor imposter to match
         */
        private _softbodyOrClothStep;
        private _tmpMatrix;
        /**
         * Applies an impulse on the imposter
         * @param impostor imposter to apply impulse to
         * @param force amount of force to be applied to the imposter
         * @param contactPoint the location to apply the impulse on the imposter
         */
        applyImpulse(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        /**
         * Applies a force on the imposter
         * @param impostor imposter to apply force
         * @param force amount of force to be applied to the imposter
         * @param contactPoint the location to apply the force on the imposter
         */
        applyForce(impostor: PhysicsImpostor, force: Vector3, contactPoint: Vector3): void;
        /**
         * Creates a physics body using the plugin
         * @param impostor the imposter to create the physics body on
         */
        generatePhysicsBody(impostor: PhysicsImpostor): void;
        /**
         * Removes the physics body from the imposter and disposes of the body's memory
         * @param impostor imposter to remove the physics body from
         */
        removePhysicsBody(impostor: PhysicsImpostor): void;
        /**
         * Generates a joint
         * @param impostorJoint the imposter joint to create the joint with
         */
        generateJoint(impostorJoint: PhysicsImpostorJoint): void;
        /**
         * Removes a joint
         * @param impostorJoint the imposter joint to remove the joint from
         */
        removeJoint(impostorJoint: PhysicsImpostorJoint): void;
        private _addMeshVerts;
        /**
         * Initialise the soft body vertices to match its object's (mesh) vertices
         * Softbody vertices (nodes) are in world space and to match this
         * The object's position and rotation is set to zero and so its vertices are also then set in world space
         * @param impostor to create the softbody for
         * @returns the number of vertices added to the softbody
         */
        private _softVertexData;
        /**
         * Create an impostor's soft body
         * @param impostor to create the softbody for
         * @returns the softbody
         */
        private _createSoftbody;
        /**
         * Create cloth for an impostor
         * @param impostor to create the softbody for
         * @returns the cloth
         */
        private _createCloth;
        /**
         * Create rope for an impostor
         * @param impostor to create the softbody for
         * @returns the rope
         */
        private _createRope;
        /**
         * Create a custom physics impostor shape using the plugin's onCreateCustomShape handler
         * @param impostor to create the custom physics shape for
         * @returns the custom physics shape
         */
        private _createCustom;
        private _addHullVerts;
        private _createShape;
        /**
         * Sets the mesh body position/rotation from the babylon impostor
         * @param impostor imposter containing the physics body and babylon object
         */
        setTransformationFromPhysicsBody(impostor: PhysicsImpostor): void;
        /**
         * Sets the babylon object's position/rotation from the physics body's position/rotation
         * @param impostor imposter containing the physics body and babylon object
         * @param newPosition new position
         * @param newRotation new rotation
         */
        setPhysicsBodyTransformation(impostor: PhysicsImpostor, newPosition: Vector3, newRotation: Quaternion): void;
        /**
         * If this plugin is supported
         * @returns true if its supported
         */
        isSupported(): boolean;
        /**
         * Sets the linear velocity of the physics body
         * @param impostor imposter to set the velocity on
         * @param velocity velocity to set
         */
        setLinearVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        /**
         * Sets the angular velocity of the physics body
         * @param impostor imposter to set the velocity on
         * @param velocity velocity to set
         */
        setAngularVelocity(impostor: PhysicsImpostor, velocity: Vector3): void;
        /**
         * gets the linear velocity
         * @param impostor imposter to get linear velocity from
         * @returns linear velocity
         */
        getLinearVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        /**
         * gets the angular velocity
         * @param impostor imposter to get angular velocity from
         * @returns angular velocity
         */
        getAngularVelocity(impostor: PhysicsImpostor): Nullable<Vector3>;
        /**
         * Sets the mass of physics body
         * @param impostor imposter to set the mass on
         * @param mass mass to set
         */
        setBodyMass(impostor: PhysicsImpostor, mass: number): void;
        /**
         * Gets the mass of the physics body
         * @param impostor imposter to get the mass from
         * @returns mass
         */
        getBodyMass(impostor: PhysicsImpostor): number;
        /**
         * Gets friction of the impostor
         * @param impostor impostor to get friction from
         * @returns friction value
         */
        getBodyFriction(impostor: PhysicsImpostor): number;
        /**
         * Sets friction of the impostor
         * @param impostor impostor to set friction on
         * @param friction friction value
         */
        setBodyFriction(impostor: PhysicsImpostor, friction: number): void;
        /**
         * Gets restitution of the impostor
         * @param impostor impostor to get restitution from
         * @returns restitution value
         */
        getBodyRestitution(impostor: PhysicsImpostor): number;
        /**
         * Sets restitution of the impostor
         * @param impostor impostor to set resitution on
         * @param restitution resitution value
         */
        setBodyRestitution(impostor: PhysicsImpostor, restitution: number): void;
        /**
         * Gets pressure inside the impostor
         * @param impostor impostor to get pressure from
         * @returns pressure value
         */
        getBodyPressure(impostor: PhysicsImpostor): number;
        /**
         * Sets pressure inside a soft body impostor
         * Cloth and rope must remain 0 pressure
         * @param impostor impostor to set pressure on
         * @param pressure pressure value
         */
        setBodyPressure(impostor: PhysicsImpostor, pressure: number): void;
        /**
         * Gets stiffness of the impostor
         * @param impostor impostor to get stiffness from
         * @returns pressure value
         */
        getBodyStiffness(impostor: PhysicsImpostor): number;
        /**
         * Sets stiffness of the impostor
         * @param impostor impostor to set stiffness on
         * @param stiffness stiffness value from 0 to 1
         */
        setBodyStiffness(impostor: PhysicsImpostor, stiffness: number): void;
        /**
         * Gets velocityIterations of the impostor
         * @param impostor impostor to get velocity iterations from
         * @returns velocityIterations value
         */
        getBodyVelocityIterations(impostor: PhysicsImpostor): number;
        /**
         * Sets velocityIterations of the impostor
         * @param impostor impostor to set velocity iterations on
         * @param velocityIterations velocityIterations value
         */
        setBodyVelocityIterations(impostor: PhysicsImpostor, velocityIterations: number): void;
        /**
         * Gets positionIterations of the impostor
         * @param impostor impostor to get position iterations from
         * @returns positionIterations value
         */
        getBodyPositionIterations(impostor: PhysicsImpostor): number;
        /**
         * Sets positionIterations of the impostor
         * @param impostor impostor to set position on
         * @param positionIterations positionIterations value
         */
        setBodyPositionIterations(impostor: PhysicsImpostor, positionIterations: number): void;
        /**
         * Append an anchor to a cloth object
         * @param impostor is the cloth impostor to add anchor to
         * @param otherImpostor is the rigid impostor to anchor to
         * @param width ratio across width from 0 to 1
         * @param height ratio up height from 0 to 1
         * @param influence the elasticity between cloth impostor and anchor from 0, very stretchy to 1, little stretch
         * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false
         */
        appendAnchor(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, width: number, height: number, influence?: number, noCollisionBetweenLinkedBodies?: boolean): void;
        /**
         * Append an hook to a rope object
         * @param impostor is the rope impostor to add hook to
         * @param otherImpostor is the rigid impostor to hook to
         * @param length ratio along the rope from 0 to 1
         * @param influence the elasticity between soft impostor and anchor from 0, very stretchy to 1, little stretch
         * @param noCollisionBetweenLinkedBodies when true collisions between soft impostor and anchor are ignored; default false
         */
        appendHook(impostor: PhysicsImpostor, otherImpostor: PhysicsImpostor, length: number, influence?: number, noCollisionBetweenLinkedBodies?: boolean): void;
        /**
         * Sleeps the physics body and stops it from being active
         * @param impostor impostor to sleep
         */
        sleepBody(impostor: PhysicsImpostor): void;
        /**
         * Activates the physics body
         * @param impostor impostor to activate
         */
        wakeUpBody(impostor: PhysicsImpostor): void;
        /**
         * Updates the distance parameters of the joint
         */
        updateDistanceJoint(): void;
        /**
         * Sets a motor on the joint
         * @param joint joint to set motor on
         * @param speed speed of the motor
         * @param maxForce maximum force of the motor
         */
        setMotor(joint: IMotorEnabledJoint, speed?: number, maxForce?: number): void;
        /**
         * Sets the motors limit
         */
        setLimit(): void;
        /**
         * Syncs the position and rotation of a mesh with the impostor
         * @param mesh mesh to sync
         * @param impostor impostor to update the mesh with
         */
        syncMeshWithImpostor(mesh: AbstractMesh, impostor: PhysicsImpostor): void;
        /**
         * Gets the radius of the impostor
         * @param impostor impostor to get radius from
         * @returns the radius
         */
        getRadius(impostor: PhysicsImpostor): number;
        /**
         * Gets the box size of the impostor
         * @param impostor impostor to get box size from
         * @param result the resulting box size
         */
        getBoxSizeToRef(impostor: PhysicsImpostor, result: Vector3): void;
        /**
         * Disposes of the impostor
         */
        dispose(): void;
        /**
         * Does a raycast in the physics world
         * @param from where should the ray start?
         * @param to where should the ray end?
         * @returns PhysicsRaycastResult
         */
        raycast(from: Vector3, to: Vector3): PhysicsRaycastResult;
        /**
         * Does a raycast in the physics world
         * @param from when should the ray start?
         * @param to when should the ray end?
         * @param result resulting PhysicsRaycastResult
         */
        raycastToRef(from: Vector3, to: Vector3, result: PhysicsRaycastResult): void;
    }








    /** This file must only contain pure code and pure imports */
    /** @internal */
    export class WebGL2ParticleSystem implements IGPUParticleSystemPlatform {
        private _parent;
        private _engine;
        private _updateEffect;
        private _updateEffectOptions;
        private _renderVAO;
        private _updateVAO;
        private _renderVertexBuffers;
        private _baseUniformsNamesLength;
        /** @internal */
        readonly alignDataInBuffer = false;
        /** @internal */
        constructor(parent: GPUParticleSystem, engine: ThinEngine);
        /** @internal */
        contextLost(): void;
        /** @internal */
        isUpdateBufferCreated(): boolean;
        /** @internal */
        isUpdateBufferReady(): boolean;
        /** @internal */
        createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor;
        /** @internal */
        createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: {
            [key: string]: VertexBuffer;
        }): void;
        /** @internal */
        createParticleBuffer(data: number[]): DataArray | DataBuffer;
        /** @internal */
        bindDrawBuffers(index: number, effect: Effect, indexBuffer: Nullable<DataBuffer>): void;
        /** @internal */
        preUpdateParticleBuffer(): void;
        /** @internal */
        updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void;
        /** @internal */
        releaseBuffers(): void;
        /** @internal */
        releaseVertexBuffers(): void;
        private _createUpdateVAO;
    }
    /**
     * Register side effects for webgl2ParticleSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWebgl2ParticleSystem(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import webgl2ParticleSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a thin particle system in Babylon.
     * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
     * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.
     * This thin version contains a limited subset of the total features in order to provide users with a way to get particles but with a smaller footprint
     * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
     */
    export class ThinParticleSystem extends BaseParticleSystem implements IDisposable, IAnimatable, IParticleSystem {
        /**
         * Force all the particle systems to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * This function can be defined to provide custom update for active particles.
         * This function will be called instead of regular update (age, position, color, etc.).
         * Do not forget that this function will be called on every frame so try to keep it simple and fast :)
         */
        updateFunction: (particles: Particle[]) => void;
        /** @internal */
        _emitterWorldMatrix: Matrix;
        /** @internal */
        _emitterInverseWorldMatrix: Matrix;
        private _startDirectionFunction;
        /**
         * This function can be defined to specify initial direction for every new particle.
         * It by default use the emitterType defined function
         */
        get startDirectionFunction(): Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>;
        set startDirectionFunction(value: Nullable<(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>);
        private _startPositionFunction;
        /**
         * This function can be defined to specify initial position for every new particle.
         * It by default use the emitterType defined function
         */
        get startPositionFunction(): Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>;
        set startPositionFunction(value: Nullable<(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean) => void>);
        /**
         * @internal
         */
        _inheritedVelocityOffset: Vector3;
        /**
         * An event triggered when the system is disposed
         */
        onDisposeObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is stopped
         */
        onStoppedObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is started
         */
        onStartedObservable: Observable<IParticleSystem>;
        private _onDisposeObserver;
        /**
         * Sets a callback that will be triggered when the system is disposed
         */
        set onDispose(callback: () => void);
        /** @internal */
        _noiseTextureSize: Nullable<ISize>;
        /** @internal */
        _noiseTextureData: Nullable<Uint8Array>;
        private _particles;
        private _epsilon;
        private _capacity;
        private _stockParticles;
        private _newPartsExcess;
        private _vertexData;
        private _vertexBuffer;
        private _vertexBuffers;
        private _spriteBuffer;
        private _indexBuffer;
        private _linesIndexBuffer;
        private _linesIndexBufferUseInstancing;
        private _drawWrappers;
        /** @internal */
        _customWrappers: {
            [blendMode: number]: Nullable<DrawWrapper>;
        };
        /** @internal */
        _scaledColorStep: Color4;
        /** @internal */
        _colorDiff: Color4;
        /** @internal */
        _scaledGravity: Vector3;
        private _currentRenderId;
        private _alive;
        private _useInstancing;
        private _vertexArrayObject;
        /** @internal */
        _useFixedCapacityForSnapshot: boolean;
        private _fixedCapacityHighWaterMark;
        private _isDisposed;
        /**
         * Gets a boolean indicating that the particle system was disposed
         */
        get isDisposed(): boolean;
        private _started;
        private _stopped;
        /** @internal */
        _actualFrame: number;
        /** @internal */
        _scaledUpdateSpeed: number;
        private _vertexBufferSize;
        /** @internal */
        _currentEmitRateGradient: Nullable<FactorGradient>;
        /** @internal */
        _currentEmitRate1: number;
        /** @internal */
        _currentEmitRate2: number;
        /** @internal */
        _currentStartSizeGradient: Nullable<FactorGradient>;
        /** @internal */
        _currentStartSize1: number;
        /** @internal */
        _currentStartSize2: number;
        /** Indicates that the update of particles is done in the animate function */
        readonly updateInAnimate = true;
        private readonly _rawTextureWidth;
        private _rampGradientsTexture;
        private _useRampGradients;
        /** @internal */
        _updateQueueStart: Nullable<_IExecutionQueueItem>;
        protected _colorProcessing: _IExecutionQueueItem;
        protected _angularSpeedGradientProcessing: _IExecutionQueueItem;
        protected _angularSpeedProcessing: _IExecutionQueueItem;
        protected _velocityGradientProcessing: _IExecutionQueueItem;
        protected _directionProcessing: _IExecutionQueueItem;
        protected _limitVelocityGradientProcessing: _IExecutionQueueItem;
        protected _positionProcessing: _IExecutionQueueItem;
        protected _dragGradientProcessing: _IExecutionQueueItem;
        protected _noiseProcessing: _IExecutionQueueItem;
        protected _gravityProcessing: _IExecutionQueueItem;
        protected _sizeGradientProcessing: _IExecutionQueueItem;
        protected _remapGradientProcessing: _IExecutionQueueItem;
        /** @internal */
        _lifeTimeCreation: _IExecutionQueueItem;
        /** @internal */
        _positionCreation: _IExecutionQueueItem;
        private _isLocalCreation;
        /** @internal */
        _directionCreation: _IExecutionQueueItem;
        private _emitPowerCreation;
        /** @internal */
        _sizeCreation: _IExecutionQueueItem;
        private _startSizeCreation;
        /** @internal */
        _angleCreation: _IExecutionQueueItem;
        private _velocityCreation;
        private _limitVelocityCreation;
        private _dragCreation;
        /** @internal */
        _colorCreation: _IExecutionQueueItem;
        /** @internal */
        _colorDeadCreation: _IExecutionQueueItem;
        private _sheetCreation;
        private _rampCreation;
        private _noiseCreation;
        private _createQueueStart;
        /** @internal */
        _tempScaledUpdateSpeed: number;
        /** @internal */
        _ratio: number;
        /** @internal */
        _emitPower: number;
        /** Gets or sets a matrix to use to compute projection */
        defaultProjectionMatrix: Matrix;
        /** Gets or sets a matrix to use to compute view */
        defaultViewMatrix: Matrix;
        /** Gets or sets a boolean indicating that ramp gradients must be used
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro#ramp-gradients
         */
        get useRampGradients(): boolean;
        set useRampGradients(value: boolean);
        private _isLocal;
        /**
         * Specifies if the particles are updated in emitter local space or world space
         */
        get isLocal(): boolean;
        set isLocal(value: boolean);
        /** Indicates that the particle system is CPU based */
        readonly isGPU = false;
        /**
         * Gets the current list of active particles
         */
        get particles(): Particle[];
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /** @internal */
        get _isAnimationSheetEnabled(): boolean;
        set _isAnimationSheetEnabled(value: boolean);
        /**
         * Gets the number of particles active at the same time.
         * @returns The number of active particles.
         */
        getActiveCount(): number;
        /**
         * Returns the string "ParticleSystem"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating that the system is stopping
         * @returns true if the system is currently stopping
         */
        isStopping(): boolean;
        /**
         * Gets the custom effect used to render the particles
         * @param blendMode Blend mode for which the effect should be retrieved
         * @returns The effect
         */
        getCustomEffect(blendMode?: number): Nullable<Effect>;
        private _getCustomDrawWrapper;
        /**
         * Sets the custom effect used to render the particles
         * @param effect The effect to set
         * @param blendMode Blend mode for which the effect should be set
         */
        setCustomEffect(effect: Nullable<Effect>, blendMode?: number): void;
        /** @internal */
        private _onBeforeDrawParticlesObservable;
        /**
         * Observable that will be called just before the particles are drawn
         */
        get onBeforeDrawParticlesObservable(): Observable<Nullable<Effect>>;
        /**
         * Gets the name of the particle vertex shader
         */
        get vertexShaderName(): string;
        /**
         * Gets the vertex buffers used by the particle system
         */
        get vertexBuffers(): Immutable<{
            [key: string]: VertexBuffer;
        }>;
        /**
         * Gets the index buffer used by the particle system (or null if no index buffer is used (if _useInstancing=true))
         */
        get indexBuffer(): Nullable<DataBuffer>;
        /**
         * Gets or sets a texture used to add random noise to particle positions
         */
        get noiseTexture(): Nullable<ProceduralTexture>;
        set noiseTexture(value: Nullable<ProceduralTexture>);
        /**
         * Instantiates a particle system.
         * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
         * @param name The name of the particle system
         * @param capacity The max number of particles alive at the same time
         * @param sceneOrEngine The scene the particle system belongs to or the engine to use if no scene
         * @param customEffect a custom effect used to change the way particles are rendered by default
         * @param isAnimationSheetEnabled Must be true if using a spritesheet to animate the particles texture
         * @param epsilon Offset used to render the particles
         * @param noUpdateQueue If true, the particle system will start with an empty update queue
         */
        constructor(name: string, capacity: number, sceneOrEngine: Scene | AbstractEngine, customEffect?: Nullable<Effect>, isAnimationSheetEnabled?: boolean, epsilon?: number, noUpdateQueue?: boolean);
        /** @internal */
        _emitFromParticle: (particle: Particle) => void;
        /**
         * Serializes the particle system to a JSON object.
         * @param _serializeTexture Whether to serialize the texture information
         */
        serialize(_serializeTexture: boolean): void;
        /**
         * Clones the particle system.
         * @param name The name of the cloned object
         * @param newEmitter The new emitter to use
         * @param _cloneTexture Also clone the textures if true
         */
        clone(name: string, newEmitter: any, _cloneTexture?: boolean): ThinParticleSystem;
        private _syncLifeTimeCreation;
        private _syncStartSizeCreation;
        /**
         * The amount of time the particle system is running (depends of the overall update speed).
         */
        get targetStopDuration(): number;
        set targetStopDuration(value: number);
        /**
         * Adds a new life time gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the life time factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLifeTimeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific life time gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLifeTimeGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new size gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the size factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeSizeGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new color remap gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param min defines the color remap minimal range
         * @param max defines the color remap maximal range
         * @returns the current particle system
         */
        addColorRemapGradient(gradient: number, min: number, max: number): IParticleSystem;
        /**
         * Remove a specific color remap gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeColorRemapGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new alpha remap gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param min defines the alpha remap minimal range
         * @param max defines the alpha remap maximal range
         * @returns the current particle system
         */
        addAlphaRemapGradient(gradient: number, min: number, max: number): IParticleSystem;
        /**
         * Remove a specific alpha remap gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeAlphaRemapGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new angular speed gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the angular speed  to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific angular speed gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeAngularSpeedGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the velocity to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeVelocityGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new limit velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the limit velocity value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific limit velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLimitVelocityGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new drag gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the drag value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addDragGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific drag gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeDragGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new start size gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the start size value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addStartSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific start size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeStartSizeGradient(gradient: number): IParticleSystem;
        private _createRampGradientTexture;
        /**
         * Gets the current list of ramp gradients.
         * You must use addRampGradient and removeRampGradient to update this list
         * @returns the list of ramp gradients
         */
        getRampGradients(): Nullable<Array<Color3Gradient>>;
        /** Force the system to rebuild all gradients that need to be resync */
        forceRefreshGradients(): void;
        private _syncRampGradientTexture;
        /**
         * Adds a new ramp gradient used to remap particle colors
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param color defines the color to affect to the specified gradient
         * @returns the current particle system
         */
        addRampGradient(gradient: number, color: Color3): ThinParticleSystem;
        /**
         * Remove a specific ramp gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeRampGradient(gradient: number): ThinParticleSystem;
        /**
         * Adds a new color gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param color1 defines the color to affect to the specified gradient
         * @param color2 defines an additional color used to define a range ([color, color2]) with main color to pick the final color from
         * @returns this particle system
         */
        addColorGradient(gradient: number, color1: Color4, color2?: Color4): IParticleSystem;
        /**
         * Remove a specific color gradient
         * @param gradient defines the gradient to remove
         * @returns this particle system
         */
        removeColorGradient(gradient: number): IParticleSystem;
        /**
         * Resets the draw wrappers cache
         */
        resetDrawCache(): void;
        /** @internal */
        _fetchR(u: number, v: number, width: number, height: number, pixels: Uint8Array | Uint8ClampedArray): number;
        protected _reset(): void;
        private _resetEffect;
        private _createVertexBuffers;
        private _createIndexBuffer;
        /**
         * Gets the maximum number of particles active at the same time.
         * @returns The max number of active particles.
         */
        getCapacity(): number;
        /**
         * Gets whether there are still active particles in the system.
         * @returns True if it is alive, otherwise false.
         */
        isAlive(): boolean;
        /**
         * Gets if the system has been started. (Note: this will still be true after stop is called)
         * @returns True if it has been started, otherwise false.
         */
        isStarted(): boolean;
        /** @internal */
        _preStart(): void;
        /**
         * Starts the particle system and begins to emit
         * @param delay defines the delay in milliseconds before starting the system (this.startDelay by default)
         */
        start(delay?: number): void;
        /**
         * Stops the particle system.
         * @param stopSubEmitters if true it will stop the current system and all created sub-Systems if false it will stop the current root system only, this param is used by the root particle system only. The default value is true.
         */
        stop(stopSubEmitters?: boolean): void;
        /** @internal */
        _postStop(_stopSubEmitters: boolean): void;
        /**
         * Remove all active particles
         */
        reset(): void;
        /**
         * @internal (for internal use only)
         */
        _appendParticleVertex(index: number, particle: Particle, offsetX: number, offsetY: number): void;
        /**
         * "Recycles" one of the particle by copying it back to the "stock" of particles and removing it from the active list.
         * Its lifetime will start back at 0.
         * @param particle
         */
        recycleParticle: (particle: Particle) => void;
        private _createParticle;
        /** @internal */
        _prepareParticle(_particle: Particle): void;
        private _createNewOnes;
        private _update;
        /**
         * @internal
         */
        static _GetAttributeNamesOrOptions(isAnimationSheetEnabled?: boolean, isBillboardBased?: boolean, useRampGradients?: boolean): string[];
        /**
         * @internal
         */
        static _GetEffectCreationOptions(isAnimationSheetEnabled?: boolean, useLogarithmicDepth?: boolean, applyFog?: boolean): string[];
        /**
         * Fill the defines array according to the current settings of the particle system
         * @param defines Array to be updated
         * @param blendMode blend mode to take into account when updating the array
         * @param fillImageProcessing fills the image processing defines
         */
        fillDefines(defines: Array<string>, blendMode: number, fillImageProcessing?: boolean): void;
        /**
         * Fill the uniforms, attributes and samplers arrays according to the current settings of the particle system
         * @param uniforms Uniforms array to fill
         * @param attributes Attributes array to fill
         * @param samplers Samplers array to fill
         */
        fillUniformsAttributesAndSamplerNames(uniforms: Array<string>, attributes: Array<string>, samplers: Array<string>): void;
        /**
         * @internal
         */
        private _getWrapper;
        /**
         * Gets or sets a boolean indicating that the particle system is paused (no animation will be done).
         */
        paused: boolean;
        /**
         * Animates the particle system for the current frame by emitting new particles and or animating the living ones.
         * @param preWarmOnly will prevent the system from updating the vertex buffer (default is false)
         */
        animate(preWarmOnly?: boolean): void;
        /** @internal */
        _initFixedCapacitySnapshotData(): boolean;
        /** @internal */
        _clearFixedCapacitySnapshotData(): void;
        /**
         * Internal only. Calculates the current emit rate based on the gradients if any.
         * @returns The emit rate
         * @internal
         */
        _calculateEmitRate(): number;
        private _appendParticleVertices;
        /**
         * Rebuilds the particle system.
         */
        rebuild(): void;
        private _shadersLoaded;
        private _initShaderSourceAsync;
        /**
         * Is this system ready to be used/rendered
         * @returns true if the system is ready
         */
        isReady(): boolean;
        private _render;
        /**
         * Renders the particle system in its current state.
         * @returns the current number of particles
         */
        render(): number;
        /** @internal */
        _onDispose(_disposeAttachedSubEmitters?: boolean, _disposeEndSubEmitters?: boolean): void;
        /**
         * Disposes the particle system and free the associated resources
         * @param disposeTexture defines if the particle texture must be disposed as well (true by default)
         * @param disposeAttachedSubEmitters defines if the attached sub-emitters must be disposed as well (false by default)
         * @param disposeEndSubEmitters defines if the end type sub-emitters must be disposed as well (false by default)
         */
        dispose(disposeTexture?: boolean, disposeAttachedSubEmitters?: boolean, disposeEndSubEmitters?: boolean): void;
    }


    /** Color */
    /** @internal */
    export function _CreateColorData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateColorDeadData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateColorGradientsData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessColorGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessColor(particle: Particle, system: ThinParticleSystem): void;
    /** Angular speed */
    /** @internal */
    export function _ProcessAngularSpeedGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessAngularSpeed(particle: Particle, system: ThinParticleSystem): void;
    /** Velocity & direction */
    /** @internal */
    export function _CreateDirectionData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateCustomDirectionData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateVelocityGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateLimitVelocityGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessVelocityGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessLimitVelocityGradients(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessDirection(particle: Particle): void;
    /** Position */
    /** @internal */
    export function _CreatePositionData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateCustomPositionData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateIsLocalData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessPosition(particle: Particle, system: ThinParticleSystem): void;
    /** Drag */
    /** @internal */
    export function _CreateDragData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessDragGradients(particle: Particle, system: ThinParticleSystem): void;
    /** Noise */
    /** @internal */
    export function _CreateNoiseData(particle: Particle, _system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessNoise(particle: Particle, system: ThinParticleSystem): void;
    /** Gravity */
    /** @internal */
    export function _ProcessGravity(particle: Particle, system: ThinParticleSystem): void;
    /** Size */
    /** @internal */
    export function _CreateSizeData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateSizeGradientsData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateStartSizeGradientsData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _ProcessSizeGradients(particle: Particle, system: ThinParticleSystem): void;
    /** Ramp */
    /** @internal */
    export function _CreateRampData(particle: Particle, _system: ThinParticleSystem): void;
    /** Remap */
    /** @internal */
    export function _ProcessRemapGradients(particle: Particle, system: ThinParticleSystem): void;
    /** Life */
    /** @internal */
    export function _CreateLifeGradientsData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateLifetimeData(particle: Particle, system: ThinParticleSystem): void;
    /** Emit power */
    /** @internal */
    export function _CreateEmitPowerData(particle: Particle, system: ThinParticleSystem): void;
    /** Angle */
    /** @internal */
    export function _CreateAngleData(particle: Particle, system: ThinParticleSystem): void;
    /** @internal */
    export function _CreateAngleGradientsData(particle: Particle, system: ThinParticleSystem): void;
    /** Sheet */
    /** @internal */
    export function _CreateSheetData(particle: Particle, system: ThinParticleSystem): void;




    /**
     * Type of sub emitter
     */
    export enum SubEmitterType {
        /**
         * Attached to the particle over it's lifetime
         */
        ATTACHED = 0,
        /**
         * Created when the particle dies
         */
        END = 1
    }
    /**
     * Sub emitter class used to emit particles from an existing particle
     */
    export class SubEmitter {
        /**
         * the particle system to be used by the sub emitter
         */
        particleSystem: ParticleSystem;
        /**
         * Type of the submitter (Default: END)
         */
        type: SubEmitterType;
        /**
         * If the particle should inherit the direction from the particle it's attached to. (+Y will face the direction the particle is moving) (Default: false)
         * Note: This only is supported when using an emitter of type Mesh
         */
        inheritDirection: boolean;
        /**
         * How much of the attached particles speed should be added to the sub emitted particle (default: 0)
         */
        inheritedVelocityAmount: number;
        /**
         * Creates a sub emitter
         * @param particleSystem the particle system to be used by the sub emitter
         */
        constructor(
        /**
         * the particle system to be used by the sub emitter
         */
        particleSystem: ParticleSystem);
        /**
         * Clones the sub emitter
         * @returns the cloned sub emitter
         */
        clone(): SubEmitter;
        /**
         * Serialize current object to a JSON object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns the serialized object
         */
        serialize(serializeTexture?: boolean): any;
        /**
         * @internal
         */
        static _ParseParticleSystem(system: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string, doNotStart?: boolean): ParticleSystem;
        /**
         * Creates a new SubEmitter from a serialized JSON version
         * @param serializationObject defines the JSON object to read from
         * @param sceneOrEngine defines the hosting scene or the hosting engine
         * @param rootUrl defines the rootUrl for data loading
         * @returns a new SubEmitter
         */
        static Parse(serializationObject: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string): SubEmitter;
        /** Release associated resources */
        dispose(): void;
    }


    /**
     * The SPS is a single updatable mesh. The solid particles are simply separate parts or faces of this big mesh.
     *As it is just a mesh, the SPS has all the same properties than any other BJS mesh : not more, not less. It can be scaled, rotated, translated, enlighted, textured, moved, etc.
     * The SPS is also a particle system. It provides some methods to manage the particles.
     * However it is behavior agnostic. This means it has no emitter, no particle physics, no particle recycler. You have to implement your own behavior.
     *
     * Full documentation here : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_intro
     */
    export class SolidParticleSystem implements IDisposable {
        /**
         *  The SPS array of Solid Particle objects. Just access each particle as with any classic array.
         *  Example : var p = SPS.particles[i];
         */
        particles: SolidParticle[];
        /**
         * The SPS total number of particles. Read only. Use SPS.counter instead if you need to set your own value.
         */
        nbParticles: number;
        /**
         * If the particles must ever face the camera (default false). Useful for planar particles.
         */
        billboard: boolean;
        /**
         * Recompute normals when adding a shape
         */
        recomputeNormals: boolean;
        /**
         * This a counter ofr your own usage. It's not set by any SPS functions.
         */
        counter: number;
        /**
         * The SPS name. This name is also given to the underlying mesh.
         */
        name: string;
        /**
         * The SPS mesh. It's a standard BJS Mesh, so all the methods from the Mesh class are available.
         */
        mesh: Mesh;
        /**
         * This empty object is intended to store some SPS specific or temporary values in order to lower the Garbage Collector activity.
         * Please read : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/optimize_sps#limit-garbage-collection
         */
        vars: any;
        /**
         * This array is populated when the SPS is set as 'pickable'.
         * Each key of this array is a `faceId` value that you can get from a pickResult object.
         * Each element of this array is an object `{idx: int, faceId: int}`.
         * `idx` is the picked particle index in the `SPS.particles` array
         * `faceId` is the picked face index counted within this particle.
         * This array is the first element of the pickedBySubMesh array : sps.pickBySubMesh[0].
         * It's not pertinent to use it when using a SPS with the support for MultiMaterial enabled.
         * Use the method SPS.pickedParticle(pickingInfo) instead.
         * Please read : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/picking_sps
         */
        pickedParticles: {
            idx: number;
            faceId: number;
        }[];
        /**
         * This array is populated when the SPS is set as 'pickable'
         * Each key of this array is a submesh index.
         * Each element of this array is a second array defined like this :
         * Each key of this second array is a `faceId` value that you can get from a pickResult object.
         * Each element of this second array is an object `{idx: int, faceId: int}`.
         * `idx` is the picked particle index in the `SPS.particles` array
         * `faceId` is the picked face index counted within this particle.
         * It's better to use the method SPS.pickedParticle(pickingInfo) rather than using directly this array.
         * Please read : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/picking_sps
         */
        pickedBySubMesh: {
            idx: number;
            faceId: number;
        }[][];
        /**
         * This array is populated when `enableDepthSort` is set to true.
         * Each element of this array is an instance of the class DepthSortedParticle.
         */
        depthSortedParticles: DepthSortedParticle[];
        /**
         * If the particle intersection must be computed only with the bounding sphere (no bounding box computation, so faster). (Internal use only)
         * @internal
         */
        _bSphereOnly: boolean;
        /**
         * A number to multiply the bounding sphere radius by in order to reduce it for instance. (Internal use only)
         * @internal
         */
        _bSphereRadiusFactor: number;
        protected _scene: Scene;
        protected _positions: number[];
        protected _indices: number[];
        protected _normals: number[];
        protected _colors: number[];
        protected _uvs: number[];
        protected _indices32: IndicesArray;
        protected _positions32: Float32Array;
        protected _normals32: Float32Array;
        protected _fixedNormal32: Float32Array;
        protected _colors32: Float32Array;
        protected _uvs32: Float32Array;
        protected _index: number;
        protected _updatable: boolean;
        protected _pickable: boolean;
        protected _isVisibilityBoxLocked: boolean;
        protected _alwaysVisible: boolean;
        protected _depthSort: boolean;
        protected _expandable: boolean;
        protected _shapeCounter: number;
        protected _copy: SolidParticle;
        protected _color: Color4;
        protected _computeParticleColor: boolean;
        protected _computeParticleTexture: boolean;
        protected _computeParticleRotation: boolean;
        protected _computeParticleVertex: boolean;
        protected _computeBoundingBox: boolean;
        protected _autoFixFaceOrientation: boolean;
        protected _depthSortParticles: boolean;
        protected _camera: TargetCamera;
        protected _mustUnrotateFixedNormals: boolean;
        protected _particlesIntersect: boolean;
        protected _needs32Bits: boolean;
        protected _isNotBuilt: boolean;
        protected _lastParticleId: number;
        protected _idxOfId: number[];
        protected _multimaterialEnabled: boolean;
        protected _useModelMaterial: boolean;
        protected _indicesByMaterial: number[];
        protected _materialIndexes: number[];
        protected _depthSortFunction: (p1: DepthSortedParticle, p2: DepthSortedParticle) => number;
        protected _materialSortFunction: (p1: DepthSortedParticle, p2: DepthSortedParticle) => number;
        protected _materials: Material[];
        protected _multimaterial: MultiMaterial;
        protected _materialIndexesById: any;
        protected _defaultMaterial: Material;
        protected _autoUpdateSubMeshes: boolean;
        protected _tmpVertex: SolidParticleVertex;
        protected _recomputeInvisibles: boolean;
        protected _started: boolean;
        protected _stopped: boolean;
        protected _onBeforeRenderObserver: Nullable<Observer<Scene>>;
        /**
         * The overall motion speed (0.01 is default update speed, faster updates = faster animation)
         */
        updateSpeed: number;
        /** @internal */
        protected _scaledUpdateSpeed: number;
        /**
         * Creates a SPS (Solid Particle System) object.
         * @param name (String) is the SPS name, this will be the underlying mesh name.
         * @param scene (Scene) is the scene in which the SPS is added.
         * @param options defines the options of the sps e.g.
         * * updatable (optional boolean, default true) : if the SPS must be updatable or immutable.
         * * isPickable (optional boolean, default false) : if the solid particles must be pickable.
         * * enableDepthSort (optional boolean, default false) : if the solid particles must be sorted in the geometry according to their distance to the camera.
         * * useModelMaterial (optional boolean, default false) : if the model materials must be used to create the SPS multimaterial. This enables the multimaterial supports of the SPS.
         * * enableMultiMaterial (optional boolean, default false) : if the solid particles can be given different materials.
         * * expandable (optional boolean, default false) : if particles can still be added after the initial SPS mesh creation.
         * * particleIntersection (optional boolean, default false) : if the solid particle intersections must be computed.
         * * boundingSphereOnly (optional boolean, default false) : if the particle intersection must be computed only with the bounding sphere (no bounding box computation, so faster).
         * * bSphereRadiusFactor (optional float, default 1.0) : a number to multiply the bounding sphere radius by in order to reduce it for instance.
         * * computeBoundingBox (optional boolean, default false): if the bounding box of the entire SPS will be computed (for occlusion detection, for example). If it is false, the bounding box will be the bounding box of the first particle.
         * * autoFixFaceOrientation (optional boolean, default false): if the particle face orientations will be flipped for transformations that change orientation (scale (-1, 1, 1), for example)
         * * camera (optional Camera) : the camera to use with the particule system. If not provided, use the scene active camera.
         * @param options.updatable
         * @param options.isPickable
         * @param options.enableDepthSort
         * @param options.particleIntersection
         * @param options.boundingSphereOnly
         * @param options.bSphereRadiusFactor
         * @param options.expandable
         * @param options.useModelMaterial
         * @param options.enableMultiMaterial
         * @param options.computeBoundingBox
         * @param options.autoFixFaceOrientation
         * @param options.camera
         * @example bSphereRadiusFactor = 1.0 / Math.sqrt(3.0) => the bounding sphere exactly matches a spherical mesh.
         */
        constructor(name: string, scene: Scene, options?: {
            updatable?: boolean;
            isPickable?: boolean;
            enableDepthSort?: boolean;
            particleIntersection?: boolean;
            boundingSphereOnly?: boolean;
            bSphereRadiusFactor?: number;
            expandable?: boolean;
            useModelMaterial?: boolean;
            enableMultiMaterial?: boolean;
            computeBoundingBox?: boolean;
            autoFixFaceOrientation?: boolean;
            camera?: TargetCamera;
        });
        /**
         * Builds the SPS underlying mesh. Returns a standard Mesh.
         * If no model shape was added to the SPS, the returned mesh is just a single triangular plane.
         * @returns the created mesh
         */
        buildMesh(): Mesh;
        private _getUVKind;
        /**
         * Digests the mesh and generates as many solid particles in the system as wanted. Returns the SPS.
         * These particles will have the same geometry than the mesh parts and will be positioned at the same localisation than the mesh original places.
         * Thus the particles generated from `digest()` have their property `position` set yet.
         * @param mesh ( Mesh ) is the mesh to be digested
         * @param options {facetNb} (optional integer, default 1) is the number of mesh facets per particle, this parameter is overridden by the parameter `number` if any
         * {delta} (optional integer, default 0) is the random extra number of facets per particle , each particle will have between `facetNb` and `facetNb + delta` facets
         * {number} (optional positive integer) is the wanted number of particles : each particle is built with `mesh_total_facets / number` facets
         * {storage} (optional existing array) is an array where the particles will be stored for a further use instead of being inserted in the SPS.
         * {uvKind} (optional positive integer, default 0) is the kind of UV to read from. Use -1 to deduce it from the diffuse/albedo texture (if any) of the mesh material
         * @param options.facetNb
         * @param options.number
         * @param options.delta
         * @param options.storage
         * @param options.uvKind
         * @returns the current SPS
         */
        digest(mesh: Mesh, options?: {
            facetNb?: number;
            number?: number;
            delta?: number;
            storage?: [];
            uvKind?: number;
        }): SolidParticleSystem;
        /**
         * Unrotate the fixed normals in case the mesh was built with pre-rotated particles, ex : use of positionFunction in addShape()
         * @internal
         */
        protected _unrotateFixedNormals(): void;
        /**
         * Resets the temporary working copy particle
         * @internal
         */
        protected _resetCopy(): void;
        /**
         * Inserts the shape model geometry in the global SPS mesh by updating the positions, indices, normals, colors, uvs arrays
         * @param p the current index in the positions array to be updated
         * @param ind the current index in the indices array
         * @param shape a Vector3 array, the shape geometry
         * @param positions the positions array to be updated
         * @param meshInd the shape indices array
         * @param indices the indices array to be updated
         * @param meshUV the shape uv array
         * @param uvs the uv array to be updated
         * @param meshCol the shape color array
         * @param colors the color array to be updated
         * @param meshNor the shape normals array
         * @param normals the normals array to be updated
         * @param idx the particle index
         * @param idxInShape the particle index in its shape
         * @param options the addShape() method  passed options
         * @param model
         * @model the particle model
         * @internal
         */
        protected _meshBuilder(p: number, ind: number, shape: Vector3[], positions: number[], meshInd: IndicesArray, indices: number[], meshUV: FloatArray, uvs: number[], meshCol: FloatArray, colors: number[], meshNor: FloatArray, normals: number[], idx: number, idxInShape: number, options: any, model: ModelShape): SolidParticle;
        /**
         * Returns a shape Vector3 array from positions float array
         * @param positions float array
         * @returns a vector3 array
         * @internal
         */
        protected _posToShape(positions: FloatArray): Vector3[];
        /**
         * Returns a shapeUV array from a float uvs (array deep copy)
         * @param uvs as a float array
         * @returns a shapeUV array
         * @internal
         */
        protected _uvsToShapeUV(uvs: FloatArray): number[];
        /**
         * Adds a new particle object in the particles array
         * @param idx particle index in particles array
         * @param id particle id
         * @param idxpos positionIndex : the starting index of the particle vertices in the SPS "positions" array
         * @param idxind indiceIndex : he starting index of the particle indices in the SPS "indices" array
         * @param model particle ModelShape object
         * @param shapeId model shape identifier
         * @param idxInShape index of the particle in the current model
         * @param bInfo model bounding info object
         * @param storage target storage array, if any
         * @internal
         */
        protected _addParticle(idx: number, id: number, idxpos: number, idxind: number, model: ModelShape, shapeId: number, idxInShape: number, bInfo?: Nullable<BoundingInfo>, storage?: Nullable<[]>): SolidParticle;
        private _normalizeMeshVertexColors;
        /**
         * Adds some particles to the SPS from the model shape. Returns the shape id.
         * Please read the doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/immutable_sps
         * @param mesh is any Mesh object that will be used as a model for the solid particles. If the mesh does not have vertex normals, it will turn on the recomputeNormals attribute.
         * @param nb (positive integer) the number of particles to be created from this model
         * @param options {positionFunction} is an optional javascript function to called for each particle on SPS creation.
         * {vertexFunction} is an optional javascript function to called for each vertex of each particle on SPS creation
         * {storage} (optional existing array) is an array where the particles will be stored for a further use instead of being inserted in the SPS.
         * @param options.positionFunction
         * @param options.vertexFunction
         * @param options.storage
         * @returns the number of shapes in the system
         */
        addShape(mesh: AbstractMesh, nb: number, options?: {
            positionFunction?: any;
            vertexFunction?: any;
            storage?: [];
        }): number;
        /**
         * Rebuilds a particle back to its just built status : if needed, recomputes the custom positions and vertices
         * @internal
         */
        protected _rebuildParticle(particle: SolidParticle, reset?: boolean): void;
        /**
         * Rebuilds the whole mesh and updates the VBO : custom positions and vertices are recomputed if needed.
         * @param reset boolean, default false : if the particles must be reset at position and rotation zero, scaling 1, color white, initial UVs and not parented.
         * @returns the SPS.
         */
        rebuildMesh(reset?: boolean): SolidParticleSystem;
        /** Removes the particles from the start-th to the end-th included from an expandable SPS (required).
         *  Returns an array with the removed particles.
         *  If the number of particles to remove is lower than zero or greater than the global remaining particle number, then an empty array is returned.
         *  The SPS can't be empty so at least one particle needs to remain in place.
         *  Under the hood, the VertexData array, so the VBO buffer, is recreated each call.
         * @param start index of the first particle to remove
         * @param end index of the last particle to remove (included)
         * @returns an array populated with the removed particles
         */
        removeParticles(start: number, end: number): SolidParticle[];
        /**
         * Inserts some pre-created particles in the solid particle system so that they can be managed by setParticles().
         * @param solidParticleArray an array populated with Solid Particles objects
         * @returns the SPS
         */
        insertParticlesFromArray(solidParticleArray: SolidParticle[]): SolidParticleSystem;
        /**
         * Creates a new particle and modifies the SPS mesh geometry :
         * - calls _meshBuilder() to increase the SPS mesh geometry step by step
         * - calls _addParticle() to populate the particle array
         * factorized code from addShape() and insertParticlesFromArray()
         * @param idx particle index in the particles array
         * @param i particle index in its shape
         * @param modelShape particle ModelShape object
         * @param shape shape vertex array
         * @param meshInd shape indices array
         * @param meshUV shape uv array
         * @param meshCol shape color array
         * @param meshNor shape normals array
         * @param bbInfo shape bounding info
         * @param storage target particle storage
         * @param options
         * @options addShape() passed options
         * @internal
         */
        protected _insertNewParticle(idx: number, i: number, modelShape: ModelShape, shape: Vector3[], meshInd: IndicesArray, meshUV: FloatArray, meshCol: FloatArray, meshNor: FloatArray, bbInfo: Nullable<BoundingInfo>, storage: Nullable<[]>, options: any): Nullable<SolidParticle>;
        /**
         *  Sets all the particles : this method actually really updates the mesh according to the particle positions, rotations, colors, textures, etc.
         *  This method calls `updateParticle()` for each particle of the SPS.
         *  For an animated SPS, it is usually called within the render loop.
         * This methods does nothing if called on a non updatable or not yet built SPS. Example : buildMesh() not called after having added or removed particles from an expandable SPS.
         * @param start The particle index in the particle array where to start to compute the particle property values _(default 0)_
         * @param end The particle index in the particle array where to stop to compute the particle property values _(default nbParticle - 1)_
         * @param update If the mesh must be finally updated on this call after all the particle computations _(default true)_
         * @returns the SPS.
         */
        setParticles(start?: number, end?: number, update?: boolean): SolidParticleSystem;
        /**
         * Disposes the SPS.
         */
        dispose(): void;
        /** Returns an object {idx: number faceId: number} for the picked particle from the passed pickingInfo object.
         * idx is the particle index in the SPS
         * faceId is the picked face index counted within this particle.
         * Returns null if the pickInfo can't identify a picked particle.
         * @param pickingInfo (PickingInfo object)
         * @returns {idx: number, faceId: number} or null
         */
        pickedParticle(pickingInfo: PickingInfo): Nullable<{
            idx: number;
            faceId: number;
        }>;
        /**
         * Returns a SolidParticle object from its identifier : particle.id
         * @param id (integer) the particle Id
         * @returns the searched particle or null if not found in the SPS.
         */
        getParticleById(id: number): Nullable<SolidParticle>;
        /**
         * Returns a new array populated with the particles having the passed shapeId.
         * @param shapeId (integer) the shape identifier
         * @returns a new solid particle array
         */
        getParticlesByShapeId(shapeId: number): SolidParticle[];
        /**
         * Populates the passed array "ref" with the particles having the passed shapeId.
         * @param shapeId the shape identifier
         * @param ref array to populate
         * @returns the SPS
         */
        getParticlesByShapeIdToRef(shapeId: number, ref: SolidParticle[]): SolidParticleSystem;
        /**
         * Computes the required SubMeshes according the materials assigned to the particles.
         * @returns the solid particle system.
         * Does nothing if called before the SPS mesh is built.
         */
        computeSubMeshes(): SolidParticleSystem;
        /**
         * Sorts the solid particles by material when MultiMaterial is enabled.
         * Updates the indices32 array.
         * Updates the indicesByMaterial array.
         * Updates the mesh indices array.
         * @returns the SPS
         * @internal
         */
        protected _sortParticlesByMaterial(): SolidParticleSystem;
        /**
         * Sets the material indexes by id materialIndexesById[id] = materialIndex
         * @internal
         */
        protected _setMaterialIndexesById(): void;
        /**
         * Returns an array with unique values of Materials from the passed array
         * @param array the material array to be checked and filtered
         * @internal
         */
        protected _filterUniqueMaterialId(array: Material[]): Material[];
        /**
         * Sets a new Standard Material as _defaultMaterial if not already set.
         * @internal
         */
        protected _setDefaultMaterial(): Material;
        /**
         * Visibility helper : Recomputes the visible size according to the mesh bounding box
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         * @returns the SPS.
         */
        refreshVisibleSize(): SolidParticleSystem;
        /**
         * Visibility helper : Sets the size of a visibility box, this sets the underlying mesh bounding box.
         * @param size the size (float) of the visibility box
         * note : this doesn't lock the SPS mesh bounding box.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         */
        setVisibilityBox(size: number): void;
        /**
         * Gets whether the SPS as always visible or not
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         */
        get isAlwaysVisible(): boolean;
        /**
         * Sets the SPS as always visible or not
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         */
        set isAlwaysVisible(val: boolean);
        /**
         * Sets the SPS visibility box as locked or not. This enables/disables the underlying mesh bounding box updates.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         */
        set isVisibilityBoxLocked(val: boolean);
        /**
         * Gets if the SPS visibility box as locked or not. This enables/disables the underlying mesh bounding box updates.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_visibility
         */
        get isVisibilityBoxLocked(): boolean;
        /**
         * Tells to `setParticles()` to compute the particle rotations or not.
         * Default value : true. The SPS is faster when it's set to false.
         * Note : the particle rotations aren't stored values, so setting `computeParticleRotation` to false will prevents the particle to rotate.
         */
        set computeParticleRotation(val: boolean);
        /**
         * Tells to `setParticles()` to compute the particle colors or not.
         * Default value : true. The SPS is faster when it's set to false.
         * Note : the particle colors are stored values, so setting `computeParticleColor` to false will keep yet the last colors set.
         */
        set computeParticleColor(val: boolean);
        set computeParticleTexture(val: boolean);
        /**
         * Tells to `setParticles()` to call the vertex function for each vertex of each particle, or not.
         * Default value : false. The SPS is faster when it's set to false.
         * Note : the particle custom vertex positions aren't stored values.
         */
        set computeParticleVertex(val: boolean);
        /**
         * Tells to `setParticles()` to compute or not the mesh bounding box when computing the particle positions.
         */
        set computeBoundingBox(val: boolean);
        /**
         * Tells to `setParticles()` to sort or not the distance between each particle and the camera.
         * Skipped when `enableDepthSort` is set to `false` (default) at construction time.
         * Default : `true`
         */
        set depthSortParticles(val: boolean);
        /**
         * Gets if `setParticles()` computes the particle rotations or not.
         * Default value : true. The SPS is faster when it's set to false.
         * Note : the particle rotations aren't stored values, so setting `computeParticleRotation` to false will prevents the particle to rotate.
         */
        get computeParticleRotation(): boolean;
        /**
         * Gets if `setParticles()` computes the particle colors or not.
         * Default value : true. The SPS is faster when it's set to false.
         * Note : the particle colors are stored values, so setting `computeParticleColor` to false will keep yet the last colors set.
         */
        get computeParticleColor(): boolean;
        /**
         * Gets if `setParticles()` computes the particle textures or not.
         * Default value : true. The SPS is faster when it's set to false.
         * Note : the particle textures are stored values, so setting `computeParticleTexture` to false will keep yet the last colors set.
         */
        get computeParticleTexture(): boolean;
        /**
         * Gets if `setParticles()` calls the vertex function for each vertex of each particle, or not.
         * Default value : false. The SPS is faster when it's set to false.
         * Note : the particle custom vertex positions aren't stored values.
         */
        get computeParticleVertex(): boolean;
        /**
         * Gets if `setParticles()` computes or not the mesh bounding box when computing the particle positions.
         */
        get computeBoundingBox(): boolean;
        /**
         * Gets if `setParticles()` sorts or not the distance between each particle and the camera.
         * Skipped when `enableDepthSort` is set to `false` (default) at construction time.
         * Default : `true`
         */
        get depthSortParticles(): boolean;
        /**
         * Gets if the SPS is created as expandable at construction time.
         * Default : `false`
         */
        get expandable(): boolean;
        /**
         * Gets if the SPS supports the Multi Materials
         */
        get multimaterialEnabled(): boolean;
        /**
         * Gets if the SPS uses the model materials for its own multimaterial.
         */
        get useModelMaterial(): boolean;
        /**
         * The SPS used material array.
         */
        get materials(): Material[];
        /**
         * Sets the SPS MultiMaterial from the passed materials.
         * Note : the passed array is internally copied and not used then by reference.
         * @param materials an array of material objects. This array indexes are the materialIndex values of the particles.
         */
        setMultiMaterial(materials: Material[]): void;
        /**
         * The SPS computed multimaterial object
         */
        get multimaterial(): MultiMaterial;
        set multimaterial(mm: MultiMaterial);
        /**
         * If the subMeshes must be updated on the next call to setParticles()
         */
        get autoUpdateSubMeshes(): boolean;
        set autoUpdateSubMeshes(val: boolean);
        /**
         * This function does nothing. It may be overwritten to set all the particle first values.
         * The SPS doesn't call this function, you may have to call it by your own.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/manage_sps_particles
         */
        initParticles(): void;
        /**
         * This function does nothing. It may be overwritten to recycle a particle.
         * The SPS doesn't call this function, you may have to call it by your own.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/manage_sps_particles
         * @param particle The particle to recycle
         * @returns the recycled particle
         */
        recycleParticle(particle: SolidParticle): SolidParticle;
        /**
         * Updates a particle : this function should  be overwritten by the user.
         * It is called on each particle by `setParticles()`. This is the place to code each particle behavior.
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/manage_sps_particles
         * @example : just set a particle position or velocity and recycle conditions
         * @param particle The particle to update
         * @returns the updated particle
         */
        updateParticle(particle: SolidParticle): SolidParticle;
        /**
         * Updates a vertex of a particle : it can be overwritten by the user.
         * This will be called on each vertex particle by `setParticles()` if `computeParticleVertex` is set to true only.
         * @param particle the current particle
         * @param vertex the current vertex of the current particle : a SolidParticleVertex object
         * @param pt the index of the current vertex in the particle shape
         * doc : https://doc.babylonjs.com/features/featuresDeepDive/particles/solid_particle_system/sps_vertices
         * @example : just set a vertex particle position or color
         * @returns the sps
         */
        updateParticleVertex(particle: SolidParticle, vertex: SolidParticleVertex, pt: number): SolidParticleSystem;
        /**
         * This will be called before any other treatment by `setParticles()` and will be passed three parameters.
         * This does nothing and may be overwritten by the user.
         * @param start the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param stop the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param update the boolean update value actually passed to setParticles()
         */
        beforeUpdateParticles(start?: number, stop?: number, update?: boolean): void;
        /**
         * This will be called  by `setParticles()` after all the other treatments and just before the actual mesh update.
         * This will be passed three parameters.
         * This does nothing and may be overwritten by the user.
         * @param start the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param stop the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param update the boolean update value actually passed to setParticles()
         */
        afterUpdateParticles(start?: number, stop?: number, update?: boolean): void;
        /**
         * Starts the particle system and begins to emit.
         * This will call buildMesh(), initParticles(), setParticles() and register the update loop.
         * @param delay defines the delay in milliseconds before starting the system (0 by default)
         */
        start(delay?: number): void;
        /**
         * Stops the particle system.
         */
        stop(): void;
        /**
         * Gets if the particle system is started
         */
        get started(): boolean;
        /**
         * Gets if the particle system is stopped
         */
        get stopped(): boolean;
    }


    /**
     * Represents one particle of a solid particle system.
     */
    export class SolidParticle {
        /**
         * particle global index
         */
        idx: number;
        /**
         * particle identifier
         */
        id: number;
        /**
         * The color of the particle
         */
        color: Nullable<Color4>;
        /**
         * The world space position of the particle.
         */
        position: Vector3;
        /**
         * The world space rotation of the particle. (Not use if rotationQuaternion is set)
         */
        rotation: Vector3;
        /**
         * The world space rotation quaternion of the particle.
         */
        rotationQuaternion: Nullable<Quaternion>;
        /**
         * The scaling of the particle.
         */
        scaling: Vector3;
        /**
         * The uvs of the particle.
         */
        uvs: Vector4;
        /**
         * The current speed of the particle.
         */
        velocity: Vector3;
        /**
         * The pivot point in the particle local space.
         */
        pivot: Vector3;
        /**
         * Must the particle be translated from its pivot point in its local space ?
         * In this case, the pivot point is set at the origin of the particle local space and the particle is translated.
         * Default : false
         */
        translateFromPivot: boolean;
        /**
         * Is the particle active or not ?
         */
        alive: boolean;
        /**
         * Is the particle visible or not ?
         */
        isVisible: boolean;
        /**
         * Defines how long will the life of the particle be.
         * Set to Infinity for particles that should never die (default behavior for SolidParticleSystem).
         */
        lifeTime: number;
        /**
         * The current age of the particle.
         */
        age: number;
        /**
         * Index of this particle in the global "positions" array (Internal use)
         * @internal
         */
        _pos: number;
        /**
         * @internal Index of this particle in the global "indices" array (Internal use)
         */
        _ind: number;
        /**
         * @internal ModelShape of this particle (Internal use)
         */
        _model: ModelShape;
        /**
         * ModelShape id of this particle
         */
        shapeId: number;
        /**
         * Index of the particle in its shape id
         */
        idxInShape: number;
        /**
         * @internal Reference to the shape model BoundingInfo object (Internal use)
         */
        _modelBoundingInfo: BoundingInfo;
        private _boundingInfo;
        /**
         * @internal Reference to the SPS what the particle belongs to (Internal use)
         */
        _sps: SolidParticleSystem;
        /**
         * @internal Still set as invisible in order to skip useless computations (Internal use)
         */
        _stillInvisible: boolean;
        /**
         * @internal Last computed particle rotation matrix
         */
        _rotationMatrix: number[];
        /**
         * Parent particle Id, if any.
         * Default null.
         */
        parentId: Nullable<number>;
        /**
         * The particle material identifier (integer) when MultiMaterials are enabled in the SPS.
         */
        materialIndex: Nullable<number>;
        /**
         * Custom object or properties.
         */
        props: Nullable<any>;
        /**
         * The culling strategy to use to check whether the solid particle must be culled or not when using isInFrustum().
         * The possible values are :
         * - AbstractMesh.CULLINGSTRATEGY_STANDARD
         * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY
         * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION
         * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY
         * The default value for solid particles is AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY
         * Please read each static variable documentation in the class AbstractMesh to get details about the culling process.
         * */
        cullingStrategy: number;
        /**
         * @internal Internal global position in the SPS.
         */
        _globalPosition: Vector3;
        /**
         * Particle BoundingInfo object
         * @returns a BoundingInfo
         */
        getBoundingInfo(): BoundingInfo;
        /**
         * Returns true if there is already a bounding info
         */
        get hasBoundingInfo(): boolean;
        /**
         * Creates a Solid Particle object.
         * Don't create particles manually, use instead the Solid Particle System internal tools like _addParticle()
         * @param particleIndex (integer) is the particle index in the Solid Particle System pool.
         * @param particleId (integer) is the particle identifier. Unless some particles are removed from the SPS, it's the same value than the particle idx.
         * @param positionIndex (integer) is the starting index of the particle vertices in the SPS "positions" array.
         * @param indiceIndex (integer) is the starting index of the particle indices in the SPS "indices" array.
         * @param model (ModelShape) is a reference to the model shape on what the particle is designed.
         * @param shapeId (integer) is the model shape identifier in the SPS.
         * @param idxInShape (integer) is the index of the particle in the current model (ex: the 10th box of addShape(box, 30))
         * @param sps defines the sps it is associated to
         * @param modelBoundingInfo is the reference to the model BoundingInfo used for intersection computations.
         * @param materialIndex is the particle material identifier (integer) when the MultiMaterials are enabled in the SPS.
         */
        constructor(particleIndex: number, particleId: number, positionIndex: number, indiceIndex: number, model: Nullable<ModelShape>, shapeId: number, idxInShape: number, sps: SolidParticleSystem, modelBoundingInfo?: Nullable<BoundingInfo>, materialIndex?: Nullable<number>);
        /**
         * Copies the particle property values into the existing target : position, rotation, scaling, uvs, colors, pivot, parent, visibility, alive
         * @param target the particle target
         * @returns the current particle
         */
        copyToRef(target: SolidParticle): SolidParticle;
        /**
         * Legacy support, changed scale to scaling
         */
        get scale(): Vector3;
        /**
         * Legacy support, changed scale to scaling
         */
        set scale(scale: Vector3);
        /**
         * Legacy support, changed quaternion to rotationQuaternion
         */
        get quaternion(): Nullable<Quaternion>;
        /**
         * Legacy support, changed quaternion to rotationQuaternion
         */
        set quaternion(q: Nullable<Quaternion>);
        /**
         * Returns a boolean. True if the particle intersects another particle or another mesh, else false.
         * The intersection is computed on the particle bounding sphere and Axis Aligned Bounding Box (AABB)
         * @param target is the object (solid particle or mesh) what the intersection is computed against.
         * @returns true if it intersects
         */
        intersectsMesh(target: Mesh | SolidParticle): boolean;
        /**
         * Returns `true` if the solid particle is within the frustum defined by the passed array of planes.
         * A particle is in the frustum if its bounding box intersects the frustum
         * @param frustumPlanes defines the frustum to test
         * @returns true if the particle is in the frustum planes
         */
        isInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * get the rotation matrix of the particle
         * @internal
         */
        getRotationMatrix(m: Matrix): void;
    }
    /**
     * Represents the shape of the model used by one particle of a solid particle system.
     * SPS internal tool, don't use it manually.
     */
    export class ModelShape {
        /**
         * Get or set the shapeId
         * @deprecated Please use shapeId instead
         */
        get shapeID(): number;
        set shapeID(shapeID: number);
        /**
         * The shape id
         * @internal
         */
        shapeId: number;
        /**
         * flat array of model positions (internal use)
         * @internal
         */
        _shape: Vector3[];
        /**
         * flat array of model UVs (internal use)
         * @internal
         */
        _shapeUV: number[];
        /**
         * color array of the model
         * @internal
         */
        _shapeColors: number[];
        /**
         * indices array of the model
         * @internal
         */
        _indices: number[];
        /**
         * normals array of the model
         * @internal
         */
        _normals: number[];
        /**
         * length of the shape in the model indices array (internal use)
         * @internal
         */
        _indicesLength: number;
        /**
         * Custom position function (internal use)
         * @internal
         */
        _positionFunction: Nullable<(particle: SolidParticle, i: number, s: number) => void>;
        /**
         * Custom vertex function (internal use)
         * @internal
         */
        _vertexFunction: Nullable<(particle: SolidParticle, vertex: Vector3, i: number) => void>;
        /**
         * Model material (internal use)
         * @internal
         */
        _material: Nullable<Material>;
        /**
         * Creates a ModelShape object. This is an internal simplified reference to a mesh used as for a model to replicate particles from by the SPS.
         * SPS internal tool, don't use it manually.
         * @internal
         */
        constructor(id: number, shape: Vector3[], indices: number[], normals: number[], colors: number[], shapeUV: number[], posFunction: Nullable<(particle: SolidParticle, i: number, s: number) => void>, vtxFunction: Nullable<(particle: SolidParticle, vertex: Vector3, i: number) => void>, material: Nullable<Material>);
    }
    /**
     * Represents a Depth Sorted Particle in the solid particle system.
     * @internal
     */
    export class DepthSortedParticle {
        /**
         * Particle index
         */
        idx: number;
        /**
         * Index of the particle in the "indices" array
         */
        ind: number;
        /**
         * Length of the particle shape in the "indices" array
         */
        indicesLength: number;
        /**
         * Squared distance from the particle to the camera
         */
        sqDistance: number;
        /**
         * Material index when used with MultiMaterials
         */
        materialIndex: number;
        /**
         * Creates a new sorted particle
         * @param idx
         * @param ind
         * @param indLength
         * @param materialIndex
         */
        constructor(idx: number, ind: number, indLength: number, materialIndex: number);
    }
    /**
     * Represents a solid particle vertex
     */
    export class SolidParticleVertex {
        /**
         * Vertex position
         */
        position: Vector3;
        /**
         * Vertex color
         */
        color: Color4;
        /**
         * Vertex UV
         */
        uv: Vector2;
        /**
         * Creates a new solid particle vertex
         */
        constructor();
        /** Vertex x coordinate */
        get x(): number;
        set x(val: number);
        /** Vertex y coordinate */
        get y(): number;
        set y(val: number);
        /** Vertex z coordinate */
        get z(): number;
        set z(val: number);
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** Defines the 4 color options */
    export enum PointColor {
        /** color value */
        Color = 2,
        /** uv value */
        UV = 1,
        /** random value */
        Random = 0,
        /** stated value */
        Stated = 3
    }
    /**
     * The PointCloudSystem (PCS) is a single updatable mesh. The points corresponding to the vertices of this big mesh.
     * As it is just a mesh, the PointCloudSystem has all the same properties as any other BJS mesh : not more, not less. It can be scaled, rotated, translated, enlighted, textured, moved, etc.
     * The PointCloudSystem is also a particle system, with each point being a particle. It provides some methods to manage the particles.
     * However it is behavior agnostic. This means it has no emitter, no particle physics, no particle recycler. You have to implement your own behavior.
     *
     * Full documentation here : TO BE ENTERED
     */
    export class PointsCloudSystem implements IDisposable {
        /**
         *  The PCS array of cloud point objects. Just access each particle as with any classic array.
         *  Example : var p = SPS.particles[i];
         */
        particles: CloudPoint[];
        /**
         * The PCS total number of particles. Read only. Use PCS.counter instead if you need to set your own value.
         */
        nbParticles: number;
        /**
         * This a counter for your own usage. It's not set by any SPS functions.
         */
        counter: number;
        /**
         * The PCS name. This name is also given to the underlying mesh.
         */
        name: string;
        /**
         * The PCS mesh. It's a standard BJS Mesh, so all the methods from the Mesh class are available.
         */
        mesh?: Mesh;
        /**
         * This empty object is intended to store some PCS specific or temporary values in order to lower the Garbage Collector activity.
         * Please read :
         */
        vars: any;
        /**
         * @internal
         */
        _size: number;
        private _scene;
        private _promises;
        private _positions;
        private _indices;
        private _normals;
        private _colors;
        private _uvs;
        private _indices32;
        private _positions32;
        private _colors32;
        private _uvs32;
        private _updatable;
        private _isVisibilityBoxLocked;
        private _alwaysVisible;
        private _groups;
        private _groupCounter;
        private _computeParticleColor;
        private _computeParticleTexture;
        private _computeParticleRotation;
        private _computeBoundingBox;
        private _isReady;
        /**
         * Gets the particle positions computed by the Point Cloud System
         */
        get positions(): Float32Array;
        /**
         * Gets the particle colors computed by the Point Cloud System
         */
        get colors(): Float32Array;
        /**
         * Gets the particle uvs computed by the Point Cloud System
         */
        get uvs(): Float32Array;
        /**
         * Creates a PCS (Points Cloud System) object
         * @param name (String) is the PCS name, this will be the underlying mesh name
         * @param pointSize (number) is the size for each point. Has no effect on a WebGPU engine.
         * @param scene (Scene) is the scene in which the PCS is added
         * @param options defines the options of the PCS e.g.
         * * updatable (optional boolean, default true) : if the PCS must be updatable or immutable
         */
        constructor(name: string, pointSize: number, scene: Scene, options?: {
            updatable?: boolean;
        });
        /**
         * Builds the PCS underlying mesh. Returns a standard Mesh.
         * If no points were added to the PCS, the returned mesh is just a single point.
         * @param material The material to use to render the mesh. If not provided, will create a default one
         * @returns a promise for the created mesh
         */
        buildMeshAsync(material?: Material): Promise<Mesh>;
        private _buildMeshAsync;
        private _addParticle;
        private _randomUnitVector;
        private _getColorIndicesForCoord;
        private _setPointsColorOrUV;
        private _colorFromTexture;
        private _calculateDensity;
        /**
         * Adds points to the PCS in random positions within a unit sphere
         * @param nb (positive integer) the number of particles to be created from this model
         * @param pointFunction is an optional javascript function to be called for each particle on PCS creation
         * @returns the number of groups in the system
         */
        addPoints(nb: number, pointFunction?: any): number;
        /**
         * Adds points to the PCS from the surface of the model shape
         * @param mesh is any Mesh object that will be used as a surface model for the points
         * @param nb (positive integer) the number of particles to be created from this model
         * @param colorWith determines whether a point is colored using color (default), uv, random, stated or none (invisible)
         * @param color (color4) to be used when colorWith is stated or color (number) when used to specify texture position
         * @param range (number from 0 to 1) to determine the variation in shape and tone for a stated color
         * @returns the number of groups in the system
         */
        addSurfacePoints(mesh: Mesh, nb: number, colorWith?: number, color?: Color4 | number, range?: number): number;
        /**
         * Adds points to the PCS inside the model shape
         * @param mesh is any Mesh object that will be used as a surface model for the points
         * @param nb (positive integer) the number of particles to be created from this model
         * @param colorWith determines whether a point is colored using color (default), uv, random, stated or none (invisible)
         * @param color (color4) to be used when colorWith is stated or color (number) when used to specify texture position
         * @param range (number from 0 to 1) to determine the variation in shape and tone for a stated color
         * @returns the number of groups in the system
         */
        addVolumePoints(mesh: Mesh, nb: number, colorWith?: number, color?: Color4 | number, range?: number): number;
        /**
         *  Sets all the particles : this method actually really updates the mesh according to the particle positions, rotations, colors, textures, etc.
         *  This method calls `updateParticle()` for each particle of the SPS.
         *  For an animated SPS, it is usually called within the render loop.
         * @param start The particle index in the particle array where to start to compute the particle property values _(default 0)_
         * @param end The particle index in the particle array where to stop to compute the particle property values _(default nbParticle - 1)_
         * @param update If the mesh must be finally updated on this call after all the particle computations _(default true)_
         * @returns the PCS.
         */
        setParticles(start?: number, end?: number, update?: boolean): PointsCloudSystem;
        /**
         * Disposes the PCS.
         */
        dispose(): void;
        /**
         * Visibility helper : Recomputes the visible size according to the mesh bounding box
         * doc :
         * @returns the PCS.
         */
        refreshVisibleSize(): PointsCloudSystem;
        /**
         * Visibility helper : Sets the size of a visibility box, this sets the underlying mesh bounding box.
         * @param size the size (float) of the visibility box
         * note : this doesn't lock the PCS mesh bounding box.
         * doc :
         */
        setVisibilityBox(size: number): void;
        /**
         * Gets whether the PCS is always visible or not
         * doc :
         */
        get isAlwaysVisible(): boolean;
        /**
         * Sets the PCS as always visible or not
         * doc :
         */
        set isAlwaysVisible(val: boolean);
        /**
         * Tells to `setParticles()` to compute the particle rotations or not
         * Default value : false. The PCS is faster when it's set to false
         * Note : particle rotations are only applied to parent particles
         * Note : the particle rotations aren't stored values, so setting `computeParticleRotation` to false will prevents the particle to rotate
         */
        set computeParticleRotation(val: boolean);
        /**
         * Tells to `setParticles()` to compute the particle colors or not.
         * Default value : true. The PCS is faster when it's set to false.
         * Note : the particle colors are stored values, so setting `computeParticleColor` to false will keep yet the last colors set.
         */
        set computeParticleColor(val: boolean);
        set computeParticleTexture(val: boolean);
        /**
         * Gets if `setParticles()` computes the particle colors or not.
         * Default value : false. The PCS is faster when it's set to false.
         * Note : the particle colors are stored values, so setting `computeParticleColor` to false will keep yet the last colors set.
         */
        get computeParticleColor(): boolean;
        /**
         * Gets if `setParticles()` computes the particle textures or not.
         * Default value : false. The PCS is faster when it's set to false.
         * Note : the particle textures are stored values, so setting `computeParticleTexture` to false will keep yet the last colors set.
         */
        get computeParticleTexture(): boolean;
        /**
         * Tells to `setParticles()` to compute or not the mesh bounding box when computing the particle positions.
         */
        set computeBoundingBox(val: boolean);
        /**
         * Gets if `setParticles()` computes or not the mesh bounding box when computing the particle positions.
         */
        get computeBoundingBox(): boolean;
        /**
         * This function does nothing. It may be overwritten to set all the particle first values.
         * The PCS doesn't call this function, you may have to call it by your own.
         * doc :
         */
        initParticles(): void;
        /**
         * This function does nothing. It may be overwritten to recycle a particle
         * The PCS doesn't call this function, you can to call it
         * doc :
         * @param particle The particle to recycle
         * @returns the recycled particle
         */
        recycleParticle(particle: CloudPoint): CloudPoint;
        /**
         * Updates a particle : this function should  be overwritten by the user.
         * It is called on each particle by `setParticles()`. This is the place to code each particle behavior.
         * doc :
         * @example : just set a particle position or velocity and recycle conditions
         * @param particle The particle to update
         * @returns the updated particle
         */
        updateParticle(particle: CloudPoint): CloudPoint;
        /**
         * This will be called before any other treatment by `setParticles()` and will be passed three parameters.
         * This does nothing and may be overwritten by the user.
         * @param start the particle index in the particle array where to start to iterate, same than the value passed to setParticle()
         * @param stop the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param update the boolean update value actually passed to setParticles()
         */
        beforeUpdateParticles(start?: number, stop?: number, update?: boolean): void;
        /**
         * This will be called  by `setParticles()` after all the other treatments and just before the actual mesh update.
         * This will be passed three parameters.
         * This does nothing and may be overwritten by the user.
         * @param start the particle index in the particle array where to start to iterate, same than the value passed to setParticle()
         * @param stop the particle index in the particle array where to stop to iterate, same than the value passed to setParticle()
         * @param update the boolean update value actually passed to setParticles()
         */
        afterUpdateParticles(start?: number, stop?: number, update?: boolean): void;
    }


    /**
     * Represents a set of particle systems working together to create a specific effect
     */
    export class ParticleSystemSet implements IDisposable {
        /**
         * Gets or sets base Assets URL
         * Only used when parsing particle systems from JSON, not part of the core assets
         */
        static BaseAssetsUrl: string;
        private _emitterCreationOptions;
        private _emitterNode;
        private _emitterNodeIsOwned;
        /**
         * Gets the particle system list
         */
        systems: IParticleSystem[];
        /**
         * Gets or sets the emitter node used with this set
         */
        get emitterNode(): Nullable<AbstractMesh | Vector3>;
        set emitterNode(value: Nullable<AbstractMesh | Vector3>);
        /**
         * Creates a new emitter mesh as a sphere
         * @param options defines the options used to create the sphere
         * @param options.diameter
         * @param options.segments
         * @param options.color
         * @param renderingGroupId defines the renderingGroupId to use for the sphere
         * @param scene defines the hosting scene
         */
        setEmitterAsSphere(options: {
            diameter: number;
            segments: number;
            color: Color3;
        }, renderingGroupId: number, scene: Scene): void;
        /**
         * Starts all particle systems of the set
         * @param emitter defines an optional mesh to use as emitter for the particle systems
         */
        start(emitter?: AbstractMesh): void;
        /**
         * Release all associated resources
         */
        dispose(): void;
        /**
         * Serialize the set into a JSON compatible object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns a JSON compatible representation of the set
         */
        serialize(serializeTexture?: boolean): any;
        /**
         * Parse a new ParticleSystemSet from a serialized source
         * @param data defines a JSON compatible representation of the set
         * @param scene defines the hosting scene
         * @param gpu defines if we want GPU particles or CPU particles
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns a new ParticleSystemSet
         */
        static Parse(data: any, scene: Scene, gpu?: boolean, capacity?: number): ParticleSystemSet;
    }


        interface AbstractEngine {
            /**
             * Create an effect to use with particle systems.
             * Please note that some parameters like animation sheets or not being billboard are not supported in this configuration, except if you pass
             * the particle system for which you want to create a custom effect in the last parameter
             * @param fragmentName defines the base name of the effect (The name of file without .fragment.fx)
             * @param uniformsNames defines a list of attribute names
             * @param samplers defines an array of string used to represent textures
             * @param defines defines the string containing the defines to use to compile the shaders
             * @param fallbacks defines the list of potential fallbacks to use if shader compilation fails
             * @param onCompiled defines a function to call when the effect creation is successful
             * @param onError defines a function to call when the effect creation has failed
             * @param particleSystem the particle system you want to create the effect for
             * @param shaderLanguage defines the shader language to use
             * @param vertexName defines the vertex base name of the effect (The name of file without .vertex.fx)
             * @returns the new Effect
             */
            createEffectForParticles(fragmentName: string, uniformsNames: string[], samplers: string[], defines: string, fallbacks?: EffectFallbacks, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void, particleSystem?: IParticleSystem, shaderLanguage?: ShaderLanguage, vertexName?: string): Effect;
        }
        interface Mesh {
            /**
             * Returns an array populated with IParticleSystem objects whose the mesh is the emitter
             * @returns an array of IParticleSystem
             */
            getEmittedParticleSystems(): IParticleSystem[];
            /**
             * Returns an array populated with IParticleSystem objects whose the mesh or its children are the emitter
             * @returns an array of IParticleSystem
             */
            getHierarchyEmittedParticleSystems(): IParticleSystem[];
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for particleSystemComponent.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleSystemComponent(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleSystemComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a particle system in Babylon.
     * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
     * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.
     * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
     */
    export class ParticleSystem extends ThinParticleSystem {
        /**
         * Billboard mode will only apply to Y axis
         */
        static readonly BILLBOARDMODE_Y = 2;
        /**
         * Billboard mode will apply to all axes
         */
        static readonly BILLBOARDMODE_ALL = 7;
        /**
         * Special billboard mode where the particle will be biilboard to the camera but rotated to align with direction
         */
        static readonly BILLBOARDMODE_STRETCHED = 8;
        /**
         * Special billboard mode where the particle will be billboard to the camera but only around the axis of the direction of particle emission
         */
        static readonly BILLBOARDMODE_STRETCHED_LOCAL = 9;
        private _rootParticleSystem;
        /**
         * The Sub-emitters templates that will be used to generate the sub particle system to be associated with the system, this property is used by the root particle system only.
         * When a particle is spawned, an array will be chosen at random and all the emitters in that array will be attached to the particle.  (Default: [])
         */
        subEmitters: Array<ParticleSystem | SubEmitter | Array<SubEmitter>>;
        private _subEmitters;
        /**
         * @internal
         * If the particle systems emitter should be disposed when the particle system is disposed
         */
        _disposeEmitterOnDispose: boolean;
        /**
         * The current active Sub-systems, this property is used by the root particle system only.
         */
        activeSubSystems: Array<ParticleSystem>;
        /**
         * Specifies if the particle system should be serialized
         */
        doNotSerialize: boolean;
        /**
         * Gets or sets a function indicating if the particle system can start.
         * @returns true if the particle system can start, false otherwise.
         */
        canStart: () => boolean;
        /** Flow map */
        private _flowMap;
        private _flowMapUpdate;
        /** @internal */
        _source: Nullable<NodeParticleSystemSet>;
        /** @internal */
        _blockReference: number;
        /**
         * Gets the NodeParticleSystemSet that this particle system belongs to.
         */
        get source(): Nullable<NodeParticleSystemSet>;
        /**
         * Returns true if the particle system was generated by a node particle system set
         */
        get isNodeGenerated(): boolean;
        /**
         * The strength of the flow map
         */
        flowMapStrength: number;
        /** Gets or sets the current flow map */
        get flowMap(): Nullable<FlowMap>;
        set flowMap(value: Nullable<FlowMap>);
        /** Attractors */
        private _attractorUpdate;
        /**
         * Gets or sets an object used to store user defined information for the particle system
         */
        metadata: any;
        /**
         * Add an attractor to the particle system. Attractors are used to change the direction of the particles in the system.
         * @param attractor The attractor to add to the particle system
         */
        addAttractor(attractor: Attractor): void;
        /**
         * Removes an attractor from the particle system. Attractors are used to change the direction of the particles in the system.
         * @param attractor The attractor to remove from the particle system
         */
        removeAttractor(attractor: Attractor): void;
        /**
         * Starts the particle system and begins to emit
         * @param delay defines the delay in milliseconds before starting the system (this.startDelay by default)
         */
        start(delay?: number): void;
        private _prepareSubEmitterInternalArray;
        private _stopSubEmitters;
        private _removeFromRoot;
        /** @internal */
        _emitFromParticle: (particle: Particle) => void;
        /** @internal */
        _preStart(): void;
        /** @internal */
        _postStop(stopSubEmitters: boolean): void;
        /** @internal */
        _prepareParticle(particle: Particle): void;
        /** @internal */
        _onDispose(disposeAttachedSubEmitters?: boolean, disposeEndSubEmitters?: boolean): void;
        /**
         * @internal
         */
        static _Parse(parsedParticleSystem: any, particleSystem: IParticleSystem, sceneOrEngine: Scene | AbstractEngine, rootUrl: string): void;
        /**
         * Parses a JSON object to create a particle system.
         * @param parsedParticleSystem The JSON object to parse
         * @param sceneOrEngine The scene or the engine to create the particle system in
         * @param rootUrl The root url to use to load external dependencies like texture
         * @param doNotStart Ignore the preventAutoStart attribute and does not start
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns the Parsed particle system
         */
        static Parse(parsedParticleSystem: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string, doNotStart?: boolean, capacity?: number): ParticleSystem;
        /**
         * Serializes the particle system to a JSON object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns the JSON object
         */
        serialize(serializeTexture?: boolean): any;
        /**
         * @internal
         */
        static _Serialize(serializationObject: any, particleSystem: IParticleSystem, serializeTexture: boolean): void;
        /**
         * Clones the particle system.
         * @param name The name of the cloned object
         * @param newEmitter The new emitter to use
         * @param cloneTexture Also clone the textures if true
         * @returns the cloned particle system
         */
        clone(name: string, newEmitter: any, cloneTexture?: boolean): ParticleSystem;
    }
    /**
     * Register side effects for particleSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleSystem(): void;


    /**
     * Creates a Point Emitter for the particle system (emits directly from the emitter position)
     * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
     * @param direction2 Particles are emitted between the direction1 and direction2 from within the box
     * @returns the emitter
     */
    export function CreatePointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter;
    /**
     * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)
     * @param radius The radius of the hemisphere to emit from
     * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
     * @returns the emitter
     */
    export function CreateHemisphericEmitter(radius?: number, radiusRange?: number): HemisphericParticleEmitter;
    /**
     * Creates a Sphere Emitter for the particle system (emits along the sphere radius)
     * @param radius The radius of the sphere to emit from
     * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
     * @returns the emitter
     */
    export function CreateSphereEmitter(radius?: number, radiusRange?: number): SphereParticleEmitter;
    /**
     * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)
     * @param radius The radius of the sphere to emit from
     * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere
     * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere
     * @returns the emitter
     */
    export function CreateDirectedSphereEmitter(radius?: number, direction1?: Vector3, direction2?: Vector3): SphereDirectedParticleEmitter;
    /**
     * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)
     * @param radius The radius of the emission cylinder
     * @param height The height of the emission cylinder
     * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius
     * @param directionRandomizer How much to randomize the particle direction [0-1]
     * @returns the emitter
     */
    export function CreateCylinderEmitter(radius?: number, height?: number, radiusRange?: number, directionRandomizer?: number): CylinderParticleEmitter;
    /**
     * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)
     * @param radius The radius of the cylinder to emit from
     * @param height The height of the emission cylinder
     * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)
     * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder
     * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder
     * @returns the emitter
     */
    export function CreateDirectedCylinderEmitter(radius?: number, height?: number, radiusRange?: number, direction1?: Vector3, direction2?: Vector3): CylinderDirectedParticleEmitter;
    /**
     * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)
     * @param radius The radius of the cone to emit from
     * @param angle The base angle of the cone
     * @returns the emitter
     */
    export function CreateConeEmitter(radius?: number, angle?: number): ConeParticleEmitter;
    export function CreateDirectedConeEmitter(radius?: number, angle?: number, direction1?: Vector3, direction2?: Vector3): ConeDirectedParticleEmitter;
    /**
     * Creates a Box Emitter for the particle system.
     * Direction and box bounds are configured on the returned emitter instance.
     * @returns the emitter
     */
    export function CreateBoxEmitter(): BoxParticleEmitter;
    /**
     * Creates a Mesh Emitter for the particle system (emits from the surface of a mesh)
     * @param mesh The mesh to use as the emitter source
     * @returns the emitter
     */
    export function CreateMeshEmitter(mesh?: Nullable<AbstractMesh>): MeshParticleEmitter;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * This class is made for on one-liner static method to help creating particle system set.
     */
    export class ParticleHelper {
        /**
         * Gets or sets base Assets URL
         */
        static BaseAssetsUrl: string;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /**
         * Create a default particle system that you can tweak
         * @param emitter defines the emitter to use
         * @param capacity defines the system capacity (default is 500 particles)
         * @param scene defines the hosting scene
         * @param useGPU defines if a GPUParticleSystem must be created (default is false)
         * @returns the new Particle system
         */
        static CreateDefault(emitter: Nullable<AbstractMesh | Vector3>, capacity?: number, scene?: Scene, useGPU?: boolean): IParticleSystem;
        /**
         * This is the main static method (one-liner) of this helper to create different particle systems
         * @param type This string represents the type to the particle system to create
         * @param scene The scene where the particle system should live
         * @param gpu If the system will use gpu
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns the ParticleSystemSet created
         */
        static CreateAsync(type: string, scene: Nullable<Scene>, gpu?: boolean, capacity?: number): Promise<ParticleSystemSet>;
        /**
         * Static function used to export a particle system to a ParticleSystemSet variable.
         * Please note that the emitter shape is not exported
         * @param systems defines the particle systems to export
         * @returns the created particle system set
         */
        static ExportSet(systems: IParticleSystem[]): ParticleSystemSet;
        /**
         * Creates a particle system from a snippet saved in a remote file
         * @param name defines the name of the particle system to create (can be null or empty to use the one from the json data)
         * @param url defines the url to load from
         * @param scene defines the hosting scene
         * @param gpu If the system will use gpu
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns a promise that will resolve to the new particle system
         */
        static ParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, gpu?: boolean, rootUrl?: string, capacity?: number): Promise<IParticleSystem>;
        /**
         * Creates a particle system from a snippet saved by the particle system editor
         * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
         * @param scene defines the hosting scene
         * @param gpu If the system will use gpu
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns a promise that will resolve to the new particle system
         */
        static ParseFromSnippetAsync(snippetId: string, scene: Scene, gpu?: boolean, rootUrl?: string, capacity?: number): Promise<IParticleSystem>;
        /**
         * Creates a particle system from a snippet saved by the particle system editor
         * @deprecated Please use ParseFromSnippetAsync instead
         * @param snippetId defines the snippet to load (can be set to _BLANK to create a default one)
         * @param scene defines the hosting scene
         * @param gpu If the system will use gpu
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns a promise that will resolve to the new particle system
         */
        static CreateFromSnippetAsync: typeof ParticleHelper.ParseFromSnippetAsync;
    }


    /**
     * @internal
     * Holds all internal properties of a Particle, grouped into a single sub-object
     * to keep the Particle's own property count low (V8 in-object property limit).
     */
    class ParticleInternalProperties {
        /** @internal */
        randomCellOffset?: number;
        /** @internal */
        initialDirection: Nullable<Vector3>;
        /** @internal */
        attachedSubEmitters: Nullable<Array<SubEmitter>>;
        /** @internal */
        initialStartSpriteCellId: number;
        /** @internal */
        initialEndSpriteCellId: number;
        /** @internal */
        initialSpriteCellLoop: boolean;
        /** @internal */
        currentColorGradient: Nullable<ColorGradient>;
        /** @internal */
        currentColor1: Color4;
        /** @internal */
        currentColor2: Color4;
        /** @internal */
        currentSizeGradient: Nullable<FactorGradient>;
        /** @internal */
        currentSize1: number;
        /** @internal */
        currentSize2: number;
        /** @internal */
        currentAngularSpeedGradient: Nullable<FactorGradient>;
        /** @internal */
        currentAngularSpeed1: number;
        /** @internal */
        currentAngularSpeed2: number;
        /** @internal */
        currentVelocityGradient: Nullable<FactorGradient>;
        /** @internal */
        currentVelocity1: number;
        /** @internal */
        currentVelocity2: number;
        /** @internal */
        directionScale: number;
        /** @internal */
        scaledDirection: Vector3;
        /** @internal */
        currentLimitVelocityGradient: Nullable<FactorGradient>;
        /** @internal */
        currentLimitVelocity1: number;
        /** @internal */
        currentLimitVelocity2: number;
        /** @internal */
        currentDragGradient: Nullable<FactorGradient>;
        /** @internal */
        currentDrag1: number;
        /** @internal */
        currentDrag2: number;
        /** @internal */
        randomNoiseCoordinates1: Nullable<Vector3>;
        /** @internal */
        randomNoiseCoordinates2: Nullable<Vector3>;
        /** @internal */
        localPosition?: Vector3;
        /**
         * Callback triggered when the particle is reset
         */
        onReset: Nullable<() => void>;
        /** @internal */
        reset(): void;
    }
    /**
     * A particle represents one of the element emitted by a particle system.
     * This is mainly define by its coordinates, direction, velocity and age.
     */
    export class Particle {
        /**
         * The particle system the particle belongs to.
         */
        particleSystem: ThinParticleSystem;
        private static _Count;
        /**
         * Unique ID of the particle
         */
        id: number;
        /**
         * The world position of the particle in the scene.
         */
        position: Vector3;
        /**
         * The world direction of the particle in the scene.
         */
        direction: Vector3;
        /**
         * The color of the particle.
         */
        color: Color4;
        /**
         * The color change of the particle per step.
         */
        colorStep: Color4;
        /**
         * The creation color of the particle.
         */
        initialColor: Color4;
        /**
         * The color used when the end of life of the particle.
         */
        colorDead: Color4;
        /**
         * Defines how long will the life of the particle be.
         */
        lifeTime: number;
        /**
         * The current age of the particle.
         */
        age: number;
        /**
         * The current size of the particle.
         */
        size: number;
        /**
         * The current scale of the particle.
         */
        scale: Vector2;
        /**
         * The current angle of the particle.
         */
        angle: number;
        /**
         * Defines how fast is the angle changing.
         */
        angularSpeed: number;
        /**
         * Defines the cell index used by the particle to be rendered from a sprite.
         */
        cellIndex: number;
        /**
         * The information required to support color remapping
         */
        remapData: Vector4;
        /**
         * Gets or sets an object used to store user defined information for the particle
         */
        metadata: any;
        /** @internal */
        _properties: ParticleInternalProperties;
        /**
         * Creates a new instance Particle
         * @param particleSystem the particle system the particle belongs to
         */
        constructor(
        /**
         * The particle system the particle belongs to.
         */
        particleSystem: ThinParticleSystem);
        private _updateCellInfoFromSystem;
        /**
         * Defines how the sprite cell index is updated for the particle
         */
        updateCellIndex(): void;
        /**
         * @internal
         */
        _inheritParticleInfoToSubEmitter(subEmitter: SubEmitter): void;
        /** @internal */
        _inheritParticleInfoToSubEmitters(): void;
        /** @internal */
        _reset(): void;
        /**
         * Copy the properties of particle to another one.
         * @param other the particle to copy the information to.
         */
        copyTo(other: Particle): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * This represents a GPU particle system in Babylon
     * This is the fastest particle system in Babylon as it uses the GPU to update the individual particle data
     * @see https://www.babylonjs-playground.com/#PU4WYI#4
     */
    export class GPUParticleSystem extends BaseParticleSystem implements IDisposable, IParticleSystem, IAnimatable {
        /**
         * The layer mask we are rendering the particles through.
         */
        layerMask: number;
        private _capacity;
        private _maxActiveParticleCount;
        private _currentActiveCount;
        private _accumulatedCount;
        private _writePointer;
        private _emitIndex;
        private _emitCount;
        private _emitRateControl;
        private _updateBuffer;
        private _buffer0;
        private _buffer1;
        private _spriteBuffer;
        private _renderVertexBuffers;
        private _linesIndexBufferUseInstancing;
        private _targetIndex;
        private _sourceBuffer;
        private _targetBuffer;
        /** Set to true when any entry in `_colorGradients` has a `color2` (per-particle random color range). */
        private _hasColorGradientColor2;
        private _currentRenderId;
        private _currentRenderingCameraUniqueId;
        private _started;
        private _stopped;
        private _timeDelta;
        /** @internal */
        _randomTexture: RawTexture;
        /** @internal */
        _randomTexture2: RawTexture;
        /** Indicates that the update of particles is done in the animate function (and not in render). Default: false */
        updateInAnimate: boolean;
        private _attributesStrideSize;
        private _cachedUpdateDefines;
        private _randomTextureSize;
        private _actualFrame;
        private _drawWrappers;
        private _customWrappers;
        private _renderShadersLoaded;
        private readonly _rawTextureWidth;
        private _platform;
        private _rebuildingAfterContextLost;
        /**
         * Whether the particle buffer needs to store the initial emission direction.
         * True when particles are not billboarded (they orient by direction) or when
         * using stretched-local billboard mode (stretches along initial direction).
         * @internal
         */
        get _needsInitialDirection(): boolean;
        private _currentEmitRateGradient;
        private _currentEmitRate1;
        private _currentEmitRate2;
        private _currentStartSizeGradient;
        private _currentStartSize1;
        private _currentStartSize2;
        private _startSizeGradientFactor;
        private _lifeTimeGradientMin;
        private _lifeTimeGradientMax;
        /**
         * Specifies if the particle system should be serialized
         */
        doNotSerialize: boolean;
        /**
         * Gets a boolean indicating if the GPU particles can be rendered on current browser
         */
        static get IsSupported(): boolean;
        /**
         * An event triggered when the system is disposed.
         */
        onDisposeObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is stopped
         */
        onStoppedObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is started
         */
        onStartedObservable: Observable<IParticleSystem>;
        private _createIndexBuffer;
        /**
         * Gets the maximum number of particles active at the same time.
         * @returns The max number of active particles.
         */
        getCapacity(): number;
        /**
         * Gets whether emit rate control is enabled.
         * When true, the GPU particle system limits the number of active particles
         * to approximately emitRate * maxLifeTime (matching CPU particle behavior)
         * and uses a circular buffer to recycle particle slots.
         * When false (default), all dead particles are recycled immediately,
         * which is the legacy GPU particle behavior.
         */
        get emitRateControl(): boolean;
        /**
         * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls
         * to override the particles.
         */
        forceDepthWrite: boolean;
        /**
         * Gets or set the number of active particles
         * The value cannot be greater than "capacity" (if it is, it will be limited to "capacity").
         */
        get maxActiveParticleCount(): number;
        set maxActiveParticleCount(value: number);
        /**
         * Gets or set the number of active particles
         * @deprecated Please use maxActiveParticleCount instead.
         */
        get activeParticleCount(): number;
        set activeParticleCount(value: number);
        private _preWarmDone;
        /**
         * Specifies if the particles are updated in emitter local space or world space.
         */
        isLocal: boolean;
        /** Indicates that the particle system is GPU based */
        readonly isGPU = true;
        /** Attractors */
        /**
         * Maximum number of attractors for this GPU particle system instance.
         * Determined at construction time via the `maxAttractors` option (default 8).
         * Limited by the fixed-size uniform arrays in the update shaders.
         */
        readonly maxAttractors: number;
        /**
         * Add an attractor to the particle system. Attractors are used to change the direction of the particles in the system.
         * @param attractor - The attractor to add to the particle system
         */
        addAttractor(attractor: Attractor): void;
        /** Gets or sets a matrix to use to compute projection */
        defaultProjectionMatrix: Matrix;
        /**
         * Gets or sets an object used to store user defined information for the particle system
         */
        metadata: any;
        /** Flow map */
        /** @internal */
        _flowMap: Nullable<Texture>;
        /**
         * The strength of the flow map
         */
        flowMapStrength: number;
        /** Gets or sets the current flow map */
        get flowMap(): Nullable<Texture>;
        set flowMap(value: Nullable<Texture>);
        /** Mesh emitter textures */
        /** @internal */
        _meshPositionTexture: Nullable<RawTexture>;
        /** @internal */
        _meshNormalTexture: Nullable<RawTexture>;
        /** @internal */
        _meshTriangleCount: number;
        /** @internal */
        _meshTextureWidth: number;
        private _meshEmitterMeshId;
        private _meshEmitterUsedNormals;
        /**
         * Is this system ready to be used/rendered
         * @returns true if the system is ready
         */
        isReady(): boolean;
        /**
         * Gets if the system has been started. (Note: this will still be true after stop is called)
         * @returns True if it has been started, otherwise false.
         */
        isStarted(): boolean;
        /**
         * Gets if the system has been stopped. (Note: rendering is still happening but the system is frozen)
         * @returns True if it has been stopped, otherwise false.
         */
        isStopped(): boolean;
        /**
         * Gets a boolean indicating that the system is stopping
         * @returns true if the system is currently stopping
         */
        isStopping(): boolean;
        /**
         * Gets the number of particles active at the same time.
         * @returns The number of active particles.
         */
        getActiveCount(): number;
        /**
         * Starts the particle system and begins to emit
         * @param delay defines the delay in milliseconds before starting the system (this.startDelay by default)
         */
        start(delay?: number): void;
        /**
         * Stops the particle system.
         */
        stop(): void;
        /**
         * Remove all active particles
         */
        reset(): void;
        /**
         * Returns the string "GPUParticleSystem"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Gets the custom effect used to render the particles
         * @param blendMode Blend mode for which the effect should be retrieved
         * @returns The effect
         */
        getCustomEffect(blendMode?: number): Nullable<Effect>;
        private _getCustomDrawWrapper;
        /**
         * Sets the custom effect used to render the particles
         * @param effect The effect to set
         * @param blendMode Blend mode for which the effect should be set
         */
        setCustomEffect(effect: Nullable<Effect>, blendMode?: number): void;
        /** @internal */
        protected _onBeforeDrawParticlesObservable: Nullable<Observable<Nullable<Effect>>>;
        /**
         * Observable that will be called just before the particles are drawn
         */
        get onBeforeDrawParticlesObservable(): Observable<Nullable<Effect>>;
        /**
         * Gets the name of the particle vertex shader
         */
        get vertexShaderName(): string;
        /**
         * Gets the vertex buffers used by the particle system
         * Should be called after render() has been called for the current frame so that the buffers returned are the ones that have been updated
         * in the current frame (there's a ping-pong between two sets of buffers - for a given frame, one set is used as the source and the other as the destination)
         */
        get vertexBuffers(): Immutable<{
            [key: string]: VertexBuffer;
        }>;
        /**
         * Gets the index buffer used by the particle system (null for GPU particle systems)
         */
        get indexBuffer(): Nullable<DataBuffer>;
        /** @internal */
        _colorGradientsTexture: RawTexture;
        protected _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: RawTexture): BaseParticleSystem;
        /**
         * Adds a new color gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param color1 defines the color to affect to the specified gradient
         * @param color2 defines an optional second color to be used to produce a random color per particle at the gradient (lerped with color1 using a per-particle random value)
         * @returns the current particle system
         */
        addColorGradient(gradient: number, color1: Color4, color2?: Color4): GPUParticleSystem;
        private _refreshColorGradient;
        /** Force the system to rebuild all gradients that need to be resync */
        forceRefreshGradients(): void;
        /**
         * Remove a specific color gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeColorGradient(gradient: number): GPUParticleSystem;
        /**
         * Resets the draw wrappers cache
         */
        resetDrawCache(): void;
        /** @internal */
        _angularSpeedGradientsTexture: RawTexture;
        /** @internal */
        _sizeGradientsTexture: RawTexture;
        /** @internal */
        _velocityGradientsTexture: RawTexture;
        /** @internal */
        _limitVelocityGradientsTexture: RawTexture;
        /** @internal */
        _dragGradientsTexture: RawTexture;
        /**
         * Adds a new size gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the size factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addSizeGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
        /**
         * Remove a specific size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeSizeGradient(gradient: number): GPUParticleSystem;
        private _refreshFactorGradient;
        /**
         * Adds a new angular speed gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the angular speed to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
        /**
         * Remove a specific angular speed gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeAngularSpeedGradient(gradient: number): GPUParticleSystem;
        /**
         * Adds a new velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the velocity to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addVelocityGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
        /**
         * Remove a specific velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeVelocityGradient(gradient: number): GPUParticleSystem;
        /**
         * Adds a new limit velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the limit velocity value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
        /**
         * Remove a specific limit velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLimitVelocityGradient(gradient: number): GPUParticleSystem;
        /**
         * Adds a new drag gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the drag value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addDragGradient(gradient: number, factor: number, factor2?: number): GPUParticleSystem;
        /**
         * Remove a specific drag gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeDragGradient(gradient: number): GPUParticleSystem;
        /**
         * Adds a new start size gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the start size factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addStartSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific start size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeStartSizeGradient(gradient: number): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        addColorRemapGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        removeColorRemapGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        addAlphaRemapGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        removeAlphaRemapGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        addRampGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the current particle system
         */
        removeRampGradient(): IParticleSystem;
        /**
         * Not supported by GPUParticleSystem
         * @returns the list of ramp gradients
         */
        getRampGradients(): Nullable<Array<Color3Gradient>>;
        /**
         * Not supported by GPUParticleSystem
         * Gets or sets a boolean indicating that ramp gradients must be used
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro#ramp-gradients
         */
        get useRampGradients(): boolean;
        set useRampGradients(value: boolean);
        /**
         * Adds a new life time gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the life time factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLifeTimeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific life time gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLifeTimeGradient(gradient: number): IParticleSystem;
        /**
         * Instantiates a GPU particle system.
         * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
         * @param name The name of the particle system
         * @param options The options used to create the system
         * @param sceneOrEngine The scene the particle system belongs to or the engine to use if no scene
         * @param customEffect a custom effect used to change the way particles are rendered by default
         * @param isAnimationSheetEnabled Must be true if using a spritesheet to animate the particles texture
         */
        constructor(name: string, options: Partial<{
            capacity: number;
            randomTextureSize: number;
            emitRateControl: boolean;
            maxAttractors: number;
        }>, sceneOrEngine: Scene | AbstractEngine, customEffect?: Nullable<Effect>, isAnimationSheetEnabled?: boolean);
        protected _reset(): void;
        private _createVertexBuffers;
        private _initialize;
        /**
         * Forces the update effect to be recreated on the next render.
         */
        private _resetEffect;
        /** @internal */
        _recreateUpdateEffect(): boolean;
        /**
         * @internal
         */
        _getWrapper(blendMode: number): DrawWrapper;
        /**
         * @internal
         */
        static _GetAttributeNamesOrOptions(hasColorGradients?: boolean, isAnimationSheetEnabled?: boolean, isBillboardBased?: boolean, isBillboardStretched?: boolean, isBillboardStretchedLocal?: boolean, hasColorGradientColor2?: boolean): string[];
        /**
         * @internal
         */
        static _GetEffectCreationOptions(isAnimationSheetEnabled?: boolean, useLogarithmicDepth?: boolean, applyFog?: boolean): string[];
        /**
         * Fill the defines array according to the current settings of the particle system
         * @param defines Array to be updated
         * @param blendMode blend mode to take into account when updating the array
         * @param fillImageProcessing fills the image processing defines
         */
        fillDefines(defines: Array<string>, blendMode?: number, fillImageProcessing?: boolean): void;
        /**
         * Fill the uniforms, attributes and samplers arrays according to the current settings of the particle system
         * @param uniforms Uniforms array to fill
         * @param attributes Attributes array to fill
         * @param samplers Samplers array to fill
         */
        fillUniformsAttributesAndSamplerNames(uniforms: Array<string>, attributes: Array<string>, samplers: Array<string>): void;
        /**
         * Animates the particle system for the current frame by emitting new particles and or animating the living ones.
         * @param preWarm defines if we are in the pre-warmimg phase
         */
        animate(preWarm?: boolean): void;
        private _createFactorGradientTexture;
        private _createSizeGradientTexture;
        private _createAngularSpeedGradientTexture;
        private _createVelocityGradientTexture;
        private _createLimitVelocityGradientTexture;
        private _createDragGradientTexture;
        private _disposeMeshEmitterTextures;
        private _createMeshEmitterTextures;
        private _createColorGradientTexture;
        private _render;
        /** @internal */
        _update(emitterWM?: Matrix): void;
        /**
         * Renders the particle system in its current state
         * @param preWarm defines if the system should only update the particles but not render them
         * @param forceUpdateOnly if true, force to only update the particles and never display them (meaning, even if preWarm=false, when forceUpdateOnly=true the particles won't be displayed)
         * @returns the current number of particles
         */
        render(preWarm?: boolean, forceUpdateOnly?: boolean): number;
        /**
         * Rebuilds the particle system
         */
        rebuild(): void;
        private _releaseBuffers;
        /**
         * Disposes the particle system and free the associated resources
         * @param disposeTexture defines if the particule texture must be disposed as well (true by default)
         */
        dispose(disposeTexture?: boolean): void;
        /**
         * Clones the particle system.
         * @param name The name of the cloned object
         * @param newEmitter The new emitter to use
         * @param cloneTexture Also clone the textures if true
         * @returns the cloned particle system
         */
        clone(name: string, newEmitter: any, cloneTexture?: boolean): GPUParticleSystem;
        /**
         * Creates a new GPUParticleSystem from an existing CPU ParticleSystem, copying all shared properties.
         * Features that are not supported on the GPU (sub-emitters, custom `startDirectionFunction` /
         * `startPositionFunction`, `customShader`, ramp/remap gradients) are logged as warnings and skipped.
         * Flow maps are converted: the CPU `FlowMap` image data is uploaded to a new `RawTexture` which is
         * assigned to the result.
         *
         * Note: a custom `updateFunction` on the source cannot be detected (the property is always assigned
         * to a default) and has no equivalent on the GPU path, so any custom per-frame update logic will be
         * silently dropped.
         *
         * Textures (particleTexture, noiseTexture) are shared by reference between the source and the result.
         * All other mutable state (colors, vectors, emitter type, gradients, attractors) is cloned so that
         * the two systems can be modified independently after the call.
         *
         * Note: unlike the GPUParticleSystem constructor, `emitRateControl` defaults to `true` here so that
         * changes to `emitRate` on the converted system behave the same as on the CPU source. Pass
         * `{ emitRateControl: false }` explicitly to opt out.
         * @param source The CPU ParticleSystem to convert
         * @param sceneOrEngine The scene or engine the new GPU particle system belongs to
         * @param options Optional options forwarded to the new GPU particle system (capacity, randomTextureSize, emitRateControl, maxAttractors). `capacity` defaults to the source capacity and `emitRateControl` defaults to `true`.
         * @returns A new GPUParticleSystem with shared properties copied from the source
         */
        static fromParticleSystem(source: ParticleSystem, sceneOrEngine: Scene | AbstractEngine, options?: Partial<{
            capacity: number;
            randomTextureSize: number;
            emitRateControl: boolean;
            maxAttractors: number;
        }>): GPUParticleSystem;
        /**
         * Serializes the particle system to a JSON object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns the JSON object
         */
        serialize(serializeTexture?: boolean): any;
        /**
         * Parses a JSON object to create a GPU particle system.
         * @param parsedParticleSystem The JSON object to parse
         * @param sceneOrEngine The scene or the engine to create the particle system in
         * @param rootUrl The root url to use to load external dependencies like texture
         * @param doNotStart Ignore the preventAutoStart attribute and does not start
         * @param capacity defines the system capacity (if null or undefined the sotred capacity will be used)
         * @returns the parsed GPU particle system
         */
        static Parse(parsedParticleSystem: any, sceneOrEngine: Scene | AbstractEngine, rootUrl: string, doNotStart?: boolean, capacity?: number): GPUParticleSystem;
    }




    /**
     * Represents an object that can move or be influenced by FlowMap
     */
    export interface IFlowable {
        /**
         * The direction vector indicating the flow or movement direction of the object.
         */
        direction: Vector3;
        /**
         * The current position of the object in 3D space.
         */
        position: Vector3;
    }
    /**
     * Class used to represent a particle flow map.
     * #5DM02T#7
     * GPUParts: #5DM02T#12 (webgl2)
     * GPUParts: #5DM02T#13 (webgpu)
     */
    export class FlowMap {
        readonly width: number;
        readonly height: number;
        readonly data: Uint8ClampedArray;
        /**
         * Create a new flow map.
         * @param width defines the width of the flow map
         * @param height defines the height of the flow map
         * @param data defines the data of the flow map
         */
        constructor(width: number, height: number, data: Uint8ClampedArray);
        /**
         * Applies the flow map to a flowable object.
         * @param flowable defines the object to update
         * @param strength defines the strength of the flow map influence
         * @param flowMapSamplePosOrTransformationMatrix defines the flow map sample position or transformation matrix
         */
        processFlowable(flowable: IFlowable, strength?: number, flowMapSamplePosOrTransformationMatrix?: IVector3Like | Matrix): void;
        /** @internal */
        _processParticle(particle: Particle, strength?: number, matrix?: Matrix): void;
        /**
         * Creates a FlowMap from a url.
         * @param url The url of the image to load
         * @returns a promise that resolves to a FlowMap object
         */
        static FromUrlAsync(url: string): Promise<FlowMap>;
        /**
         * Load from a texture
         * @param texture defines the source texture
         * @returns a promise fulfilled when image data is loaded
         */
        static ExtractFromTextureAsync(texture: Texture): Promise<FlowMap>;
    }


    /** This file must only contain pure code and pure imports */
    /** @internal */
    export class ComputeShaderParticleSystem implements IGPUParticleSystemPlatform {
        private _parent;
        private _engine;
        private _updateComputeShader;
        private _simParamsComputeShader;
        private _bufferComputeShader;
        private _renderVertexBuffers;
        /** @internal */
        readonly alignDataInBuffer = true;
        /** @internal */
        constructor(parent: GPUParticleSystem, engine: WebGPUEngine);
        /** @internal */
        contextLost(): void;
        /** @internal */
        isUpdateBufferCreated(): boolean;
        /** @internal */
        isUpdateBufferReady(): boolean;
        /** @internal */
        createUpdateBuffer(defines: string): UniformBufferEffectCommonAccessor;
        /** @internal */
        createVertexBuffers(updateBuffer: Buffer, renderVertexBuffers: {
            [key: string]: VertexBuffer;
        }): void;
        /** @internal */
        createParticleBuffer(data: number[]): DataArray | DataBuffer;
        /** @internal */
        bindDrawBuffers(index: number, effect: Effect, indexBuffer: Nullable<DataBuffer>): void;
        /** @internal */
        preUpdateParticleBuffer(): void;
        /** @internal */
        updateParticleBuffer(index: number, targetBuffer: Buffer, currentActiveCount: number): void;
        /** @internal */
        releaseBuffers(): void;
        /** @internal */
        releaseVertexBuffers(): void;
    }
    /**
     * Register side effects for computeShaderParticleSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterComputeShaderParticleSystem(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import computeShaderParticleSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Represents one particle of a points cloud system.
     */
    export class CloudPoint {
        /**
         * particle global index
         */
        idx: number;
        /**
         * The color of the particle
         */
        color: Nullable<Color4>;
        /**
         * The world space position of the particle.
         */
        position: Vector3;
        /**
         * The world space rotation of the particle. (Not use if rotationQuaternion is set)
         */
        rotation: Vector3;
        /**
         * The world space rotation quaternion of the particle.
         */
        rotationQuaternion: Nullable<Quaternion>;
        /**
         * The uv of the particle.
         */
        uv: Nullable<Vector2>;
        /**
         * The current speed of the particle.
         */
        velocity: Vector3;
        /**
         * The pivot point in the particle local space.
         */
        pivot: Vector3;
        /**
         * Must the particle be translated from its pivot point in its local space ?
         * In this case, the pivot point is set at the origin of the particle local space and the particle is translated.
         * Default : false
         */
        translateFromPivot: boolean;
        /**
         * Index of this particle in the global "positions" array (Internal use)
         * @internal
         */
        _pos: number;
        /**
         * @internal Index of this particle in the global "indices" array (Internal use)
         */
        _ind: number;
        /**
         * Group this particle belongs to
         */
        _group: PointsGroup;
        /**
         * Group id of this particle
         */
        groupId: number;
        /**
         * Index of the particle in its group id (Internal use)
         */
        idxInGroup: number;
        /**
         * @internal Particle BoundingInfo object (Internal use)
         */
        _boundingInfo: BoundingInfo;
        /**
         * @internal Reference to the PCS that the particle belongs to (Internal use)
         */
        _pcs: PointsCloudSystem;
        /**
         * @internal Still set as invisible in order to skip useless computations (Internal use)
         */
        _stillInvisible: boolean;
        /**
         * @internal Last computed particle rotation matrix
         */
        _rotationMatrix: number[];
        /**
         * Parent particle Id, if any.
         * Default null.
         */
        parentId: Nullable<number>;
        /**
         * @internal Internal global position in the PCS.
         */
        _globalPosition: Vector3;
        /**
         * Creates a Point Cloud object.
         * Don't create particles manually, use instead the PCS internal tools like _addParticle()
         * @param particleIndex (integer) is the particle index in the PCS pool. It's also the particle identifier.
         * @param group (PointsGroup) is the group the particle belongs to
         * @param groupId (integer) is the group identifier in the PCS.
         * @param idxInGroup (integer) is the index of the particle in the current point group (ex: the 10th point of addPoints(30))
         * @param pcs defines the PCS it is associated to
         */
        constructor(particleIndex: number, group: PointsGroup, groupId: number, idxInGroup: number, pcs: PointsCloudSystem);
        /**
         * get point size
         */
        get size(): Vector3;
        /**
         * Set point size
         */
        set size(scale: Vector3);
        /**
         * Legacy support, changed quaternion to rotationQuaternion
         */
        get quaternion(): Nullable<Quaternion>;
        /**
         * Legacy support, changed quaternion to rotationQuaternion
         */
        set quaternion(q: Nullable<Quaternion>);
        /**
         * Returns a boolean. True if the particle intersects a mesh, else false
         * The intersection is computed on the particle position and Axis Aligned Bounding Box (AABB) or Sphere
         * @param target is the object (point or mesh) what the intersection is computed against
         * @param isSphere is boolean flag when false (default) bounding box of mesh is used, when true the bounding sphere is used
         * @returns true if it intersects
         */
        intersectsMesh(target: Mesh, isSphere: boolean): boolean;
        /**
         * get the rotation matrix of the particle
         * @internal
         */
        getRotationMatrix(m: Matrix): void;
    }
    /**
     * Represents a group of points in a points cloud system
     *  * PCS internal tool, don't use it manually.
     */
    export class PointsGroup {
        /**
         * Get or set the groupId
         * @deprecated Please use groupId instead
         */
        get groupID(): number;
        set groupID(groupID: number);
        /**
         * The group id
         * @internal
         */
        groupId: number;
        /**
         * image data for group (internal use)
         * @internal
         */
        _groupImageData: Nullable<ArrayBufferView>;
        /**
         * Image Width (internal use)
         * @internal
         */
        _groupImgWidth: number;
        /**
         * Image Height (internal use)
         * @internal
         */
        _groupImgHeight: number;
        /**
         * Custom position function (internal use)
         * @internal
         */
        _positionFunction: Nullable<(particle: CloudPoint, i?: number, s?: number) => void>;
        /**
         * density per facet for surface points
         * @internal
         */
        _groupDensity: number[];
        /**
         * Only when points are colored by texture carries pointer to texture list array
         * @internal
         */
        _textureNb: number;
        /**
         * Creates a points group object. This is an internal reference to produce particles for the PCS.
         * PCS internal tool, don't use it manually.
         * @internal
         */
        constructor(id: number, posFunction: Nullable<(particle: CloudPoint, i?: number, s?: number) => void>);
    }


    /** This file must only contain pure code and pure imports */
    /**
     * This represents the base class for particle system in Babylon.
     * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
     * Particles can take different shapes while emitted like box, sphere, cone or you can write your custom function.
     * @example https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/particle_system_intro
     */
    export class BaseParticleSystem implements IClipPlanesHolder {
        /**
         * Source color is added to the destination color without alpha affecting the result. Great for additive glow effects (fire, magic, lasers)
         */
        static BLENDMODE_ONEONE: number;
        /**
         * Blend current color and particle color using particle’s alpha. Same as Constants.ALPHA_COMBINE, the go-to for transparency. 100% alpha means source, 0% alpha means background. Glass, UI fade, smoke
         */
        static BLENDMODE_STANDARD: number;
        /**
         * Add current color and particle color multiplied by particle’s alpha
         */
        static BLENDMODE_ADD: number;
        /**
         * Multiply current color with particle color
         */
        static BLENDMODE_MULTIPLY: number;
        /**
         * Multiply current color with particle color then add current color and particle color multiplied by particle’s alpha
         */
        static BLENDMODE_MULTIPLYADD: number;
        /**
         * Subtracts source (particle) from destination (current color), leading to darker results
         * - NOTE: Init as -1 so we can properly map all modes to Engine Const's (otherwise ALPHA_SUBTRACT will conflict with BLENDMODE_MULTIPLY since both use 3)
         */
        static BLENDMODE_SUBTRACT: number;
        /**
         * List of animations used by the particle system.
         */
        animations: Animation[];
        /**
         * Gets or sets the unique id of the particle system
         */
        uniqueId: number;
        /**
         * The id of the Particle system.
         */
        id: string;
        /**
         * The friendly name of the Particle system.
         */
        name: string;
        /**
         * Snippet ID if the particle system was created from the snippet server
         */
        snippetId: string;
        /**
         * The rendering group used by the Particle system to chose when to render.
         */
        renderingGroupId: number;
        /**
         * The emitter represents the Mesh or position we are attaching the particle system to.
         */
        emitter: Nullable<AbstractMesh | Vector3>;
        /**
         * The maximum number of particles to emit per frame
         */
        emitRate: number;
        /**
         * If you want to launch only a few particles at once, that can be done, as well.
         */
        manualEmitCount: number;
        /**
         * The overall motion speed (0.01 is default update speed, faster updates = faster animation)
         */
        updateSpeed: number;
        /** @internal */
        _targetStopDuration: number;
        /**
         * The amount of time the particle system is running (depends of the overall update speed).
         */
        get targetStopDuration(): number;
        set targetStopDuration(value: number);
        /**
         * Specifies whether the particle system will be disposed once it reaches the end of the animation.
         */
        disposeOnStop: boolean;
        /**
         * Minimum power of emitting particles.
         */
        minEmitPower: number;
        /**
         * Maximum power of emitting particles.
         */
        maxEmitPower: number;
        /**
         * Minimum life time of emitting particles.
         */
        minLifeTime: number;
        /**
         * Maximum life time of emitting particles.
         */
        maxLifeTime: number;
        /**
         * Minimum Size of emitting particles.
         */
        minSize: number;
        /**
         * Maximum Size of emitting particles.
         */
        maxSize: number;
        /**
         * Minimum scale of emitting particles on X axis.
         */
        minScaleX: number;
        /**
         * Maximum scale of emitting particles on X axis.
         */
        maxScaleX: number;
        /**
         * Minimum scale of emitting particles on Y axis.
         */
        minScaleY: number;
        /**
         * Maximum scale of emitting particles on Y axis.
         */
        maxScaleY: number;
        /**
         * Gets or sets the minimal initial rotation in radians.
         */
        minInitialRotation: number;
        /**
         * Gets or sets the maximal initial rotation in radians.
         */
        maxInitialRotation: number;
        /**
         * Minimum angular speed of emitting particles (Z-axis rotation for each particle).
         */
        minAngularSpeed: number;
        /**
         * Maximum angular speed of emitting particles (Z-axis rotation for each particle).
         */
        maxAngularSpeed: number;
        /**
         * The texture used to render each particle. (this can be a spritesheet)
         */
        particleTexture: Nullable<BaseTexture>;
        /**
         * The layer mask we are rendering the particles through.
         */
        layerMask: number;
        /**
         * This can help using your own shader to render the particle system.
         * The according effect will be created
         */
        customShader: any;
        /**
         * By default particle system starts as soon as they are created. This prevents the
         * automatic start to happen and let you decide when to start emitting particles.
         */
        preventAutoStart: boolean;
        /**
         * Gets or sets a boolean indicating that this particle system will allow fog to be rendered on it (false by default)
         */
        applyFog: boolean;
        /** @internal */
        _wasDispatched: boolean;
        protected _rootUrl: string;
        protected _noiseTexture: Nullable<ProceduralTexture>;
        /**
         * Returns true if the particle system was generated by a node particle system set
         */
        get isNodeGenerated(): boolean;
        /**
         * Gets or sets a texture used to add random noise to particle positions
         */
        get noiseTexture(): Nullable<ProceduralTexture>;
        set noiseTexture(value: Nullable<ProceduralTexture>);
        /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */
        noiseStrength: Vector3;
        /** @internal */
        protected _attractors: Attractor[];
        /**
         * The list of attractors used to change the direction of the particles in the system.
         * Please note that this is a copy of the internal array. If you want to modify it, please use the addAttractor and removeAttractor methods.
         */
        get attractors(): Attractor[];
        /**
         * Add an attractor to the particle system. Attractors are used to change the direction of the particles in the system.
         * @param attractor - The attractor to add to the particle system
         */
        addAttractor(attractor: Attractor): void;
        /**
         * Removes an attractor from the particle system. Attractors are used to change the direction of the particles in the system.
         * @param attractor - The attractor to remove from the particle system
         */
        removeAttractor(attractor: Attractor): void;
        /**
         * Callback triggered when the particle animation is ending.
         */
        onAnimationEnd: Nullable<() => void>;
        /**
         * Blend mode use to render the particle
         * For original blend modes which are exposed from ParticleSystem (OneOne, Standard, Add, Multiply, MultiplyAdd, and Subtract), use ParticleSystem.BLENDMODE_FOO
         * For all other blend modes, use Engine Constants.ALPHA_FOO blend modes
         */
        blendMode: number;
        /**
         * Forces the particle to write their depth information to the depth buffer. This can help preventing other draw calls
         * to override the particles.
         */
        forceDepthWrite: boolean;
        /** Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0 */
        preWarmCycles: number;
        /** Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1) */
        preWarmStepOffset: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)
         */
        spriteCellChangeSpeed: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display
         */
        startSpriteCellID: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display
         */
        endSpriteCellID: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use
         */
        spriteCellWidth: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use
         */
        spriteCellHeight: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines wether the sprite animation is looping
         */
        spriteCellLoop: boolean;
        /**
         * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID
         */
        spriteRandomStartCell: boolean;
        /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */
        translationPivot: Vector2;
        protected _animationSheetEnabled: boolean;
        /** @internal */
        get _isAnimationSheetEnabled(): boolean;
        set _isAnimationSheetEnabled(value: boolean);
        /**
         * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called
         */
        beginAnimationOnStart: boolean;
        /**
         * Gets or sets the frame to start the animation from when beginAnimationOnStart is true
         */
        beginAnimationFrom: number;
        /**
         * Gets or sets the frame to end the animation on when beginAnimationOnStart is true
         */
        beginAnimationTo: number;
        /**
         * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true
         */
        beginAnimationLoop: boolean;
        /**
         * Gets or sets a world offset applied to all particles
         */
        worldOffset: Vector3;
        /**
         * Gets or sets the active clipplane 1
         */
        clipPlane: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 2
         */
        clipPlane2: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 3
         */
        clipPlane3: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 4
         */
        clipPlane4: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 5
         */
        clipPlane5: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 6
         */
        clipPlane6: Nullable<Plane>;
        /**
         * Gets or sets whether an animation sprite sheet is enabled or not on the particle system
         */
        get isAnimationSheetEnabled(): boolean;
        set isAnimationSheetEnabled(value: boolean);
        private _useLogarithmicDepth;
        /**
         * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.
         */
        get useLogarithmicDepth(): boolean;
        set useLogarithmicDepth(value: boolean);
        /**
         * Get hosting scene
         * @returns the scene
         */
        getScene(): Nullable<Scene>;
        /**
         * You can use gravity if you want to give an orientation to your particles.
         */
        gravity: Vector3;
        /** @internal */
        _colorGradients: Nullable<Array<ColorGradient>>;
        /** @internal */
        _sizeGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _lifeTimeGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _angularSpeedGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _velocityGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _limitVelocityGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _dragGradients: Nullable<Array<FactorGradient>>;
        protected _emitRateGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _startSizeGradients: Nullable<Array<FactorGradient>>;
        protected _rampGradients: Nullable<Array<Color3Gradient>>;
        /** @internal */
        _colorRemapGradients: Nullable<Array<FactorGradient>>;
        /** @internal */
        _alphaRemapGradients: Nullable<Array<FactorGradient>>;
        protected _hasTargetStopDurationDependantGradient(): boolean | null;
        protected _setEngineBasedOnBlendMode(blendMode: number): void;
        /**
         * Defines the delay in milliseconds before starting the system (0 by default)
         */
        startDelay: number;
        /**
         * Gets the current list of drag gradients.
         * You must use addDragGradient and removeDragGradient to update this list
         * @returns the list of drag gradients
         */
        getDragGradients(): Nullable<Array<FactorGradient>>;
        /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */
        limitVelocityDamping: number;
        /**
         * Gets the current list of limit velocity gradients.
         * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list
         * @returns the list of limit velocity gradients
         */
        getLimitVelocityGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of color gradients.
         * You must use addColorGradient and removeColorGradient to update this list
         * @returns the list of color gradients
         */
        getColorGradients(): Nullable<Array<ColorGradient>>;
        /**
         * Gets the current list of size gradients.
         * You must use addSizeGradient and removeSizeGradient to update this list
         * @returns the list of size gradients
         */
        getSizeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of color remap gradients.
         * You must use addColorRemapGradient and removeColorRemapGradient to update this list
         * @returns the list of color remap gradients
         */
        getColorRemapGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of alpha remap gradients.
         * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list
         * @returns the list of alpha remap gradients
         */
        getAlphaRemapGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of life time gradients.
         * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list
         * @returns the list of life time gradients
         */
        getLifeTimeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of angular speed gradients.
         * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list
         * @returns the list of angular speed gradients
         */
        getAngularSpeedGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of velocity gradients.
         * You must use addVelocityGradient and removeVelocityGradient to update this list
         * @returns the list of velocity gradients
         */
        getVelocityGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of start size gradients.
         * You must use addStartSizeGradient and removeStartSizeGradient to update this list
         * @returns the list of start size gradients
         */
        getStartSizeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of emit rate gradients.
         * You must use addEmitRateGradient and removeEmitRateGradient to update this list
         * @returns the list of emit rate gradients
         */
        getEmitRateGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new emit rate gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the emit rate value to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addEmitRateGradient(gradient: number, factor: number, factor2?: number): this;
        /**
         * Remove a specific emit rate gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeEmitRateGradient(gradient: number): this;
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         * This only works when particleEmitterTyps is a BoxParticleEmitter
         */
        get direction1(): Vector3;
        set direction1(value: Vector3);
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         * This only works when particleEmitterTyps is a BoxParticleEmitter
         */
        get direction2(): Vector3;
        set direction2(value: Vector3);
        /**
         * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
         * This only works when particleEmitterTyps is a BoxParticleEmitter
         */
        get minEmitBox(): Vector3;
        set minEmitBox(value: Vector3);
        /**
         * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
         * This only works when particleEmitterTyps is a BoxParticleEmitter
         */
        get maxEmitBox(): Vector3;
        set maxEmitBox(value: Vector3);
        /**
         * Random color of each particle after it has been emitted, between color1 and color2 vectors
         */
        color1: Color4;
        /**
         * Random color of each particle after it has been emitted, between color1 and color2 vectors
         */
        color2: Color4;
        /**
         * Color the particle will have at the end of its lifetime
         */
        colorDead: Color4;
        /**
         * An optional mask to filter some colors out of the texture, or filter a part of the alpha channel
         */
        textureMask: Color4;
        /**
         * The particle emitter type defines the emitter used by the particle system.
         * It can be for example box, sphere, or cone...
         */
        particleEmitterType: IParticleEmitterType;
        /** @internal */
        _isSubEmitter: boolean;
        /** @internal */
        _billboardMode: number;
        /**
         * Gets or sets the billboard mode to use when isBillboardBased = true.
         * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED, ParticleSystem.PARTICLES_BILLBOARDMODE_STRETCHED_LOCAL
         */
        get billboardMode(): number;
        set billboardMode(value: number);
        /** @internal */
        _isBillboardBased: boolean;
        /**
         * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction
         */
        get isBillboardBased(): boolean;
        set isBillboardBased(value: boolean);
        /**
         * The scene the particle system belongs to.
         */
        protected _scene: Nullable<Scene>;
        /**
         * The engine the particle system belongs to.
         */
        protected _engine: AbstractEngine;
        /**
         * Local cache of defines for image processing.
         */
        protected _imageProcessingConfigurationDefines: ImageProcessingConfigurationDefines;
        /**
         * Default configuration related to image processing available in the standard Material.
         */
        protected _imageProcessingConfiguration: Nullable<ImageProcessingConfiguration>;
        /**
         * Gets the image processing configuration used either in this material.
         */
        get imageProcessingConfiguration(): Nullable<ImageProcessingConfiguration>;
        /**
         * Sets the Default image processing configuration used either in the this material.
         *
         * If sets to null, the scene one is in use.
         */
        set imageProcessingConfiguration(value: Nullable<ImageProcessingConfiguration>);
        /**
         * Attaches a new image processing configuration to the Standard Material.
         * @param configuration
         */
        protected _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
        /** @internal */
        protected _reset(): void;
        /**
         * Adds a new factor gradient to the given array, sorted by gradient value.
         * @param factorGradients - The array of factor gradients to add to
         * @param gradient - The gradient value (between 0 and 1)
         * @param factor - The first factor value
         * @param factor2 - Optional second factor value for per-particle randomization
         */
        protected _addFactorGradient(factorGradients: FactorGradient[], gradient: number, factor: number, factor2?: number): void;
        /**
         * Removes a factor gradient from the given array by its gradient value.
         * @param factorGradients - The array of factor gradients to remove from
         * @param gradient - The gradient value to match for removal
         */
        protected _removeFactorGradient(factorGradients: Nullable<FactorGradient[]>, gradient: number): void;
        /**
         * @internal
         */
        protected _removeGradientAndTexture(gradient: number, gradients: Nullable<IValueGradient[]>, texture: Nullable<RawTexture>): BaseParticleSystem;
        /**
         * Instantiates a particle system.
         * Particles are often small sprites used to simulate hard-to-reproduce phenomena like fire, smoke, water, or abstract visual effects like magic glitter and faery dust.
         * @param name The name of the particle system
         */
        constructor(name: string);
        /**
         * Creates a Point Emitter for the particle system (emits directly from the emitter position)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the box
         * @returns the emitter
         */
        createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter;
        /**
         * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)
         * @param radius The radius of the hemisphere to emit from
         * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
         * @returns the emitter
         */
        createHemisphericEmitter(radius?: number, radiusRange?: number): HemisphericParticleEmitter;
        /**
         * Creates a Sphere Emitter for the particle system (emits along the sphere radius)
         * @param radius The radius of the sphere to emit from
         * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
         * @returns the emitter
         */
        createSphereEmitter(radius?: number, radiusRange?: number): SphereParticleEmitter;
        /**
         * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)
         * @param radius The radius of the sphere to emit from
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere
         * @returns the emitter
         */
        createDirectedSphereEmitter(radius?: number, direction1?: Vector3, direction2?: Vector3): SphereDirectedParticleEmitter;
        /**
         * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)
         * @param radius The radius of the emission cylinder
         * @param height The height of the emission cylinder
         * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius
         * @param directionRandomizer How much to randomize the particle direction [0-1]
         * @returns the emitter
         */
        createCylinderEmitter(radius?: number, height?: number, radiusRange?: number, directionRandomizer?: number): CylinderParticleEmitter;
        /**
         * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)
         * @param radius The radius of the cylinder to emit from
         * @param height The height of the emission cylinder
         * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder
         * @returns the emitter
         */
        createDirectedCylinderEmitter(radius?: number, height?: number, radiusRange?: number, direction1?: Vector3, direction2?: Vector3): CylinderDirectedParticleEmitter;
        /**
         * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)
         * @param radius The radius of the cone to emit from
         * @param angle The base angle of the cone
         * @returns the emitter
         */
        createConeEmitter(radius?: number, angle?: number): ConeParticleEmitter;
        /**
         * Creates a Directed Cone Emitter for the particle system (emits between direction1 and direction2)
         * @param radius The radius of the cone to emit from
         * @param angle The base angle of the cone
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the cone
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the cone
         * @returns the emitter
         */
        createDirectedConeEmitter(radius?: number, angle?: number, direction1?: Vector3, direction2?: Vector3): ConeDirectedParticleEmitter;
        /**
         * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from within the box defined by minEmitBox and maxEmitBox)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the box
         * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox
         * @param maxEmitBox  Particles are emitted from the box between minEmitBox and maxEmitBox
         * @returns the emitter
         */
        createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter;
        /**
         * Creates a Mesh Emitter for the particle system (emits from the surface of a mesh)
         * @param mesh The mesh to use as the emitter source
         * @returns the emitter
         */
        createMeshEmitter(mesh?: Nullable<AbstractMesh>): MeshParticleEmitter;
    }
    /**
     * Register side effects for baseParticleSystem.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBaseParticleSystem(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import baseParticleSystem.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class representing an attractor in a particle system.
     * #DEZ79M#40
     */
    export class Attractor {
        /**
         * Gets or sets the strength of the attractor.
         * A positive value attracts particles, while a negative value repels them.
         */
        strength: number;
        /**
         * Gets or sets the position of the attractor in 3D space.
         */
        position: Vector3;
        /** @internal */
        _processParticle(particle: Particle, system: ThinParticleSystem): void;
        /**
         * Serializes the attractor to a JSON object.
         * @returns The serialized JSON object.
         */
        serialize(): any;
    }


    /**
     * Interface representing a particle system in Babylon.js.
     * This groups the common functionalities that needs to be implemented in order to create a particle system.
     * A particle system represents a way to manage particles from their emission to their animation and rendering.
     */
    export interface IParticleSystem {
        /**
         * Gets or sets the unique id of the particle system.
         */
        uniqueId: number;
        /**
         * List of animations used by the particle system.
         */
        animations: Animation[];
        /**
         * The id of the Particle system.
         */
        id: string;
        /**
         * The name of the Particle system.
         */
        name: string;
        /**
         * The emitter represents the Mesh or position we are attaching the particle system to.
         */
        emitter: Nullable<AbstractMesh | Vector3>;
        /**
         * Gets or sets a boolean indicating if the particles must be rendered as billboard or aligned with the direction
         */
        isBillboardBased: boolean;
        /**
         * The rendering group used by the Particle system to chose when to render.
         */
        renderingGroupId: number;
        /**
         * The layer mask we are rendering the particles through.
         */
        layerMask: number;
        /**
         * The overall motion speed (0.01 is default update speed, faster updates = faster animation)
         */
        updateSpeed: number;
        /**
         * The amount of time the particle system is running (depends of the overall update speed).
         */
        targetStopDuration: number;
        /**
         * The texture used to render each particle. (this can be a spritesheet)
         */
        particleTexture: Nullable<BaseTexture>;
        /**
         * Blend mode use to render the particle. It can be any of the ParticleSystem.BLENDMODE_* constants
         */
        blendMode: number;
        /**
         * Minimum life time of emitting particles.
         */
        minLifeTime: number;
        /**
         * Maximum life time of emitting particles.
         */
        maxLifeTime: number;
        /**
         * Minimum Size of emitting particles.
         */
        minSize: number;
        /**
         * Maximum Size of emitting particles.
         */
        maxSize: number;
        /**
         * Minimum scale of emitting particles on X axis.
         */
        minScaleX: number;
        /**
         * Maximum scale of emitting particles on X axis.
         */
        maxScaleX: number;
        /**
         * Minimum scale of emitting particles on Y axis.
         */
        minScaleY: number;
        /**
         * Maximum scale of emitting particles on Y axis.
         */
        maxScaleY: number;
        /**
         * Random color of each particle after it has been emitted, between color1 and color2 vectors.
         */
        color1: Color4;
        /**
         * Random color of each particle after it has been emitted, between color1 and color2 vectors.
         */
        color2: Color4;
        /**
         * Color the particle will have at the end of its lifetime.
         */
        colorDead: Color4;
        /**
         * The maximum number of particles to emit per frame until we reach the activeParticleCount value
         */
        emitRate: number;
        /**
         * You can use gravity if you want to give an orientation to your particles.
         */
        gravity: Vector3;
        /**
         * Minimum power of emitting particles.
         */
        minEmitPower: number;
        /**
         * Maximum power of emitting particles.
         */
        maxEmitPower: number;
        /**
         * Minimum angular speed of emitting particles (Z-axis rotation for each particle).
         */
        minAngularSpeed: number;
        /**
         * Maximum angular speed of emitting particles (Z-axis rotation for each particle).
         */
        maxAngularSpeed: number;
        /**
         * Gets or sets the minimal initial rotation in radians.
         */
        minInitialRotation: number;
        /**
         * Gets or sets the maximal initial rotation in radians.
         */
        maxInitialRotation: number;
        /**
         * The particle emitter type defines the emitter used by the particle system.
         * It can be for example box, sphere, or cone...
         */
        particleEmitterType: Nullable<IParticleEmitterType>;
        /**
         * Defines the delay in milliseconds before starting the system (0 by default)
         */
        startDelay: number;
        /**
         * Gets or sets a value indicating how many cycles (or frames) must be executed before first rendering (this value has to be set before starting the system). Default is 0
         */
        preWarmCycles: number;
        /**
         * Gets or sets a value indicating the time step multiplier to use in pre-warm mode (default is 1)
         */
        preWarmStepOffset: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the speed of the sprite loop (default is 1 meaning the animation will play once during the entire particle lifetime)
         */
        spriteCellChangeSpeed: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the first sprite cell to display
         */
        startSpriteCellID: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled) defines the last sprite cell to display
         */
        endSpriteCellID: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines whether the sprite animation is looping
         */
        spriteCellLoop: boolean;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell width to use
         */
        spriteCellWidth: number;
        /**
         * If using a spritesheet (isAnimationSheetEnabled), defines the sprite cell height to use
         */
        spriteCellHeight: number;
        /**
         * This allows the system to random pick the start cell ID between startSpriteCellID and endSpriteCellID
         */
        spriteRandomStartCell: boolean;
        /**
         * Gets or sets a boolean indicating if a spritesheet is used to animate the particles texture
         */
        isAnimationSheetEnabled: boolean;
        /** Gets or sets a Vector2 used to move the pivot (by default (0,0)) */
        translationPivot: Vector2;
        /**
         * Gets or sets a texture used to add random noise to particle positions
         */
        noiseTexture: Nullable<BaseTexture>;
        /** Gets or sets the strength to apply to the noise value (default is (10, 10, 10)) */
        noiseStrength: Vector3;
        /**
         * Gets or sets the billboard mode to use when isBillboardBased = true.
         * Value can be: ParticleSystem.BILLBOARDMODE_ALL, ParticleSystem.BILLBOARDMODE_Y, ParticleSystem.BILLBOARDMODE_STRETCHED
         */
        billboardMode: number;
        /**
         * Gets or sets a boolean enabling the use of logarithmic depth buffers, which is good for wide depth buffers.
         */
        useLogarithmicDepth: boolean;
        /** Gets or sets a value indicating the damping to apply if the limit velocity factor is reached */
        limitVelocityDamping: number;
        /**
         * Gets or sets a boolean indicating that hosted animations (in the system.animations array) must be started when system.start() is called
         */
        beginAnimationOnStart: boolean;
        /**
         * Gets or sets the frame to start the animation from when beginAnimationOnStart is true
         */
        beginAnimationFrom: number;
        /**
         * Gets or sets the frame to end the animation on when beginAnimationOnStart is true
         */
        beginAnimationTo: number;
        /**
         * Gets or sets a boolean indicating if animations must loop when beginAnimationOnStart is true
         */
        beginAnimationLoop: boolean;
        /**
         * Specifies whether the particle system will be disposed once it reaches the end of the animation.
         */
        disposeOnStop: boolean;
        /**
         * If you want to launch only a few particles at once, that can be done, as well.
         */
        manualEmitCount: number;
        /**
         * Specifies if the particles are updated in emitter local space or world space
         */
        isLocal: boolean;
        /** Snippet ID if the particle system was created from the snippet server */
        snippetId: string;
        /** Gets or sets a matrix to use to compute projection */
        defaultProjectionMatrix: Matrix;
        /** Indicates that the update of particles is done in the animate function (and not in render) */
        updateInAnimate: boolean;
        /** @internal */
        _wasDispatched: boolean;
        /**
         * Returns true if the particle system was generated by a node particle system set
         */
        isNodeGenerated: boolean;
        /**
         * Specifies if the particle system should be serialized
         */
        doNotSerialize?: boolean;
        /**
         * Gets the maximum number of particles active at the same time.
         * @returns The max number of active particles.
         */
        getCapacity(): number;
        /**
         * Gets the number of particles active at the same time.
         * @returns The number of active particles.
         */
        getActiveCount(): number;
        /**
         * Gets if the system has been started. (Note: this will still be true after stop is called)
         * @returns True if it has been started, otherwise false.
         */
        isStarted(): boolean;
        /**
         * Animates the particle system for this frame.
         */
        animate(): void;
        /**
         * Renders the particle system in its current state.
         * @returns the current number of particles
         */
        render(): number;
        /**
         * Dispose the particle system and frees its associated resources.
         * @param disposeTexture defines if the particle texture must be disposed as well (true by default)
         * @param disposeAttachedSubEmitters defines if the attached sub-emitters must be disposed as well (false by default)
         * @param disposeEndSubEmitters defines if the end type sub-emitters must be disposed as well (false by default)
         */
        dispose(disposeTexture?: boolean, disposeAttachedSubEmitters?: boolean, disposeEndSubEmitters?: boolean): void;
        /**
         * An event triggered when the system is disposed
         */
        onDisposeObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is stopped
         */
        onStoppedObservable: Observable<IParticleSystem>;
        /**
         * An event triggered when the system is started
         */
        onStartedObservable: Observable<IParticleSystem>;
        /**
         * Clones the particle system.
         * @param name The name of the cloned object
         * @param newEmitter The new emitter to use
         * @returns the cloned particle system
         */
        clone(name: string, newEmitter: any): Nullable<IParticleSystem>;
        /**
         * Serializes the particle system to a JSON object
         * @param serializeTexture defines if the texture must be serialized as well
         * @returns the JSON object
         */
        serialize(serializeTexture: boolean): any;
        /**
         * Rebuild the particle system
         */
        rebuild(): void;
        /** Force the system to rebuild all gradients that need to be resync */
        forceRefreshGradients(): void;
        /**
         * Starts the particle system and begins to emit
         * @param delay defines the delay in milliseconds before starting the system (0 by default)
         */
        start(delay?: number): void;
        /**
         * Stops the particle system.
         */
        stop(): void;
        /**
         * Remove all active particles
         */
        reset(): void;
        /**
         * Gets a boolean indicating that the system is stopping
         * @returns true if the system is currently stopping
         */
        isStopping(): boolean;
        /**
         * Is this system ready to be used/rendered
         * @returns true if the system is ready
         */
        isReady(): boolean;
        /**
         * Returns the string "ParticleSystem"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Gets the custom effect used to render the particles
         * @param blendMode Blend mode for which the effect should be retrieved
         * @returns The effect
         */
        getCustomEffect(blendMode: number): Nullable<Effect>;
        /**
         * Sets the custom effect used to render the particles
         * @param effect The effect to set
         * @param blendMode Blend mode for which the effect should be set
         */
        setCustomEffect(effect: Nullable<Effect>, blendMode: number): void;
        /**
         * Fill the defines array according to the current settings of the particle system
         * @param defines Array to be updated
         * @param blendMode blend mode to take into account when updating the array
         * @param fillImageProcessing fills the image processing defines
         */
        fillDefines(defines: Array<string>, blendMode: number, fillImageProcessing?: boolean): void;
        /**
         * Fill the uniforms, attributes and samplers arrays according to the current settings of the particle system
         * @param uniforms Uniforms array to fill
         * @param attributes Attributes array to fill
         * @param samplers Samplers array to fill
         */
        fillUniformsAttributesAndSamplerNames(uniforms: Array<string>, attributes: Array<string>, samplers: Array<string>): void;
        /**
         * Observable that will be called just before the particles are drawn
         */
        onBeforeDrawParticlesObservable: Observable<Nullable<Effect>>;
        /**
         * Gets the name of the particle vertex shader
         */
        vertexShaderName: string;
        /**
         * Gets the vertex buffers used by the particle system
         */
        vertexBuffers: Immutable<{
            [key: string]: VertexBuffer;
        }>;
        /**
         * Gets the index buffer used by the particle system (or null if no index buffer is used)
         */
        indexBuffer: Nullable<DataBuffer>;
        /**
         * Adds a new color gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param color1 defines the color to affect to the specified gradient
         * @param color2 defines an additional color used to define a range ([color, color2]) with main color to pick the final color from
         * @returns the current particle system
         */
        addColorGradient(gradient: number, color1: Color4, color2?: Color4): IParticleSystem;
        /**
         * Remove a specific color gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeColorGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new size gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the size factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeSizeGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of color gradients.
         * You must use addColorGradient and removeColorGradient to update this list
         * @returns the list of color gradients
         */
        getColorGradients(): Nullable<Array<ColorGradient>>;
        /**
         * Gets the current list of size gradients.
         * You must use addSizeGradient and removeSizeGradient to update this list
         * @returns the list of size gradients
         */
        getSizeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of angular speed gradients.
         * You must use addAngularSpeedGradient and removeAngularSpeedGradient to update this list
         * @returns the list of angular speed gradients
         */
        getAngularSpeedGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new angular speed gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the angular speed to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addAngularSpeedGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific angular speed gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeAngularSpeedGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of velocity gradients.
         * You must use addVelocityGradient and removeVelocityGradient to update this list
         * @returns the list of velocity gradients
         */
        getVelocityGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the velocity to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeVelocityGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of limit velocity gradients.
         * You must use addLimitVelocityGradient and removeLimitVelocityGradient to update this list
         * @returns the list of limit velocity gradients
         */
        getLimitVelocityGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new limit velocity gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the limit velocity to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLimitVelocityGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific limit velocity gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLimitVelocityGradient(gradient: number): IParticleSystem;
        /**
         * Adds a new drag gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the drag to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addDragGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific drag gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeDragGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of drag gradients.
         * You must use addDragGradient and removeDragGradient to update this list
         * @returns the list of drag gradients
         */
        getDragGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new emit rate gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the emit rate to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addEmitRateGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific emit rate gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeEmitRateGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of emit rate gradients.
         * You must use addEmitRateGradient and removeEmitRateGradient to update this list
         * @returns the list of emit rate gradients
         */
        getEmitRateGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new start size gradient (please note that this will only work if you set the targetStopDuration property)
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the start size to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addStartSizeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific start size gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeStartSizeGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of start size gradients.
         * You must use addStartSizeGradient and removeStartSizeGradient to update this list
         * @returns the list of start size gradients
         */
        getStartSizeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new life time gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param factor defines the life time factor to affect to the specified gradient
         * @param factor2 defines an additional factor used to define a range ([factor, factor2]) with main value to pick the final value from
         * @returns the current particle system
         */
        addLifeTimeGradient(gradient: number, factor: number, factor2?: number): IParticleSystem;
        /**
         * Remove a specific life time gradient
         * @param gradient defines the gradient to remove
         * @returns the current particle system
         */
        removeLifeTimeGradient(gradient: number): IParticleSystem;
        /**
         * Gets the current list of life time gradients.
         * You must use addLifeTimeGradient and removeLifeTimeGradient to update this list
         * @returns the list of life time gradients
         */
        getLifeTimeGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Gets the current list of color gradients.
         * You must use addColorGradient and removeColorGradient to update this list
         * @returns the list of color gradients
         */
        getColorGradients(): Nullable<Array<ColorGradient>>;
        /**
         * Adds a new ramp gradient used to remap particle colors
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param color defines the color to affect to the specified gradient
         * @returns the current particle system
         */
        addRampGradient(gradient: number, color: Color3): IParticleSystem;
        /**
         * Gets the current list of ramp gradients.
         * You must use addRampGradient and removeRampGradient to update this list
         * @returns the list of ramp gradients
         */
        getRampGradients(): Nullable<Array<Color3Gradient>>;
        /** Gets or sets a boolean indicating that ramp gradients must be used
         * @see https://doc.babylonjs.com/features/featuresDeepDive/particles/particle_system/ramps_and_blends
         */
        useRampGradients: boolean;
        /**
         * Adds a new color remap gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param min defines the color remap minimal range
         * @param max defines the color remap maximal range
         * @returns the current particle system
         */
        addColorRemapGradient(gradient: number, min: number, max: number): IParticleSystem;
        /**
         * Gets the current list of color remap gradients.
         * You must use addColorRemapGradient and removeColorRemapGradient to update this list
         * @returns the list of color remap gradients
         */
        getColorRemapGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Adds a new alpha remap gradient
         * @param gradient defines the gradient to use (between 0 and 1)
         * @param min defines the alpha remap minimal range
         * @param max defines the alpha remap maximal range
         * @returns the current particle system
         */
        addAlphaRemapGradient(gradient: number, min: number, max: number): IParticleSystem;
        /**
         * Gets the current list of alpha remap gradients.
         * You must use addAlphaRemapGradient and removeAlphaRemapGradient to update this list
         * @returns the list of alpha remap gradients
         */
        getAlphaRemapGradients(): Nullable<Array<FactorGradient>>;
        /**
         * Creates a Point Emitter for the particle system (emits directly from the emitter position)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the box
         * @returns the emitter
         */
        createPointEmitter(direction1: Vector3, direction2: Vector3): PointParticleEmitter;
        /**
         * Creates a Hemisphere Emitter for the particle system (emits along the hemisphere radius)
         * @param radius The radius of the hemisphere to emit from
         * @param radiusRange The range of the hemisphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
         * @returns the emitter
         */
        createHemisphericEmitter(radius: number, radiusRange: number): HemisphericParticleEmitter;
        /**
         * Creates a Sphere Emitter for the particle system (emits along the sphere radius)
         * @param radius The radius of the sphere to emit from
         * @param radiusRange The range of the sphere to emit from [0-1] 0 Surface Only, 1 Entire Radius
         * @returns the emitter
         */
        createSphereEmitter(radius: number, radiusRange: number): SphereParticleEmitter;
        /**
         * Creates a Directed Sphere Emitter for the particle system (emits between direction1 and direction2)
         * @param radius The radius of the sphere to emit from
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the sphere
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the sphere
         * @returns the emitter
         */
        createDirectedSphereEmitter(radius: number, direction1: Vector3, direction2: Vector3): SphereDirectedParticleEmitter;
        /**
         * Creates a Cylinder Emitter for the particle system (emits from the cylinder to the particle position)
         * @param radius The radius of the emission cylinder
         * @param height The height of the emission cylinder
         * @param radiusRange The range of emission [0-1] 0 Surface only, 1 Entire Radius
         * @param directionRandomizer How much to randomize the particle direction [0-1]
         * @returns the emitter
         */
        createCylinderEmitter(radius: number, height: number, radiusRange: number, directionRandomizer: number): CylinderParticleEmitter;
        /**
         * Creates a Directed Cylinder Emitter for the particle system (emits between direction1 and direction2)
         * @param radius The radius of the cylinder to emit from
         * @param height The height of the emission cylinder
         * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the cylinder
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the cylinder
         * @returns the emitter
         */
        createDirectedCylinderEmitter(radius: number, height: number, radiusRange: number, direction1: Vector3, direction2: Vector3): CylinderDirectedParticleEmitter;
        /**
         * Creates a Cone Emitter for the particle system (emits from the cone to the particle position)
         * @param radius The radius of the cone to emit from
         * @param angle The base angle of the cone
         * @returns the emitter
         */
        createConeEmitter(radius: number, angle: number): ConeParticleEmitter;
        createDirectedConeEmitter(radius: number, angle: number, direction1: Vector3, direction2: Vector3): ConeDirectedParticleEmitter;
        /**
         * Creates a Box Emitter for the particle system. (emits between direction1 and direction2 from withing the box defined by minEmitBox and maxEmitBox)
         * @param direction1 Particles are emitted between the direction1 and direction2 from within the box
         * @param direction2 Particles are emitted between the direction1 and direction2 from within the box
         * @param minEmitBox Particles are emitted from the box between minEmitBox and maxEmitBox
         * @param maxEmitBox  Particles are emitted from the box between minEmitBox and maxEmitBox
         * @returns the emitter
         */
        createBoxEmitter(direction1: Vector3, direction2: Vector3, minEmitBox: Vector3, maxEmitBox: Vector3): BoxParticleEmitter;
        /**
         * Creates a Mesh Emitter for the particle system (emits from the surface of a mesh)
         * @param mesh The mesh to use as the emitter source
         * @returns the emitter
         */
        createMeshEmitter(mesh: Nullable<AbstractMesh>): MeshParticleEmitter;
        /**
         * Get hosting scene
         * @returns the scene
         */
        getScene(): Nullable<Scene>;
    }


    /** @internal */
    export interface IGPUParticleSystemPlatform {
        alignDataInBuffer: boolean;
        contextLost: () => void;
        isUpdateBufferCreated: () => boolean;
        isUpdateBufferReady: () => boolean;
        createUpdateBuffer: (defines: string) => UniformBufferEffectCommonAccessor;
        createVertexBuffers: (updateBuffer: Buffer, renderVertexBuffers: {
            [key: string]: VertexBuffer;
        }) => void;
        createParticleBuffer: (data: number[]) => DataArray | DataBuffer;
        bindDrawBuffers: (index: number, effect: Effect, indexBuffer: Nullable<DataBuffer>) => void;
        preUpdateParticleBuffer: () => void;
        updateParticleBuffer: (index: number, targetBuffer: Buffer, currentActiveCount: number) => void;
        releaseBuffers: () => void;
        releaseVertexBuffers: () => void;
    }


    /** @internal */
    export interface _IExecutionQueueItem {
        /** @internal */
        process: (particle: Particle, system: ThinParticleSystem) => void;
        /** @internal */
        previousItem: Nullable<_IExecutionQueueItem>;
        /** @internal */
        nextItem: Nullable<_IExecutionQueueItem>;
    }
    /** @internal */
    export function _ConnectBefore(newOne: _IExecutionQueueItem, activeOne: _IExecutionQueueItem): void;
    /** @internal */
    export function _ConnectAfter(newOne: _IExecutionQueueItem, activeOne: _IExecutionQueueItem): void;
    /** @internal */
    export function _ConnectAtTheEnd(newOne: _IExecutionQueueItem, root: _IExecutionQueueItem): void;
    /** @internal */
    export function _RemoveFromQueue(item: _IExecutionQueueItem): void;


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Converts a ParticleSystem to a NodeParticleSystemSet.
     * @param name The name of the node particle system set.
     * @param particleSystemsList The particle systems to convert.
     * @returns The converted node particle system set or null if conversion failed.
     */
    export function ConvertToNodeParticleSystemSetAsync(name: string, particleSystemsList: ParticleSystem[]): Promise<Nullable<NodeParticleSystemSet>>;


    /**
     * Interface used to configure the node particle editor
     */
    export interface INodeParticleEditorOptions {
        /** Define the URL to load node editor script from */
        editorURL?: string;
        /** Additional configuration for the NPE */
        nodeEditorConfig?: {
            backgroundColor?: Color4;
            /** If true, the node particle system set will be disposed when the editor is closed (default: true) */
            disposeOnClose?: boolean;
        };
    }
    /**
     * Defines a set of particle systems defined as a node graph.
     * NPE: #K6F1ZB#1
     * PG: #ZT509U#1
     */
    export class NodeParticleSystemSet {
        private _systemBlocks;
        private _buildId;
        /** Define the Url to load node editor script */
        static EditorURL: string;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /**
         * Snippet ID if the material was created from the snippet server
         */
        snippetId: string;
        /**
         * Gets an array of blocks that needs to be serialized even if they are not yet connected
         */
        attachedBlocks: NodeParticleBlock[];
        /**
         * Gets or sets data used by visual editor
         * @see https://npe.babylonjs.com
         */
        editorData: any;
        /**
         * Observable raised when the particle set is built
         */
        onBuildObservable: Observable<NodeParticleSystemSet>;
        /**
         * The name of the set
         */
        name: string;
        /**
         * A free comment about the set
         */
        comment: string;
        /**
         * Gets the system blocks
         */
        get systemBlocks(): SystemBlock[];
        /**
         * Gets the list of input blocks attached to this material
         * @returns an array of InputBlocks
         */
        get inputBlocks(): ParticleInputBlock[];
        /**
         * Get a block by its name
         * @param name defines the name of the block to retrieve
         * @returns the required block or null if not found
         */
        getBlockByName(name: string): NodeParticleBlock | null;
        /**
         * Get a block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required block or null if not found
         */
        getBlockByPredicate(predicate: (block: NodeParticleBlock) => boolean): NodeParticleBlock | null;
        /**
         * Get an input block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required input block or null if not found
         */
        getInputBlockByPredicate(predicate: (block: ParticleInputBlock) => boolean): Nullable<ParticleInputBlock>;
        /**
         * Creates a new set
         * @param name defines the name of the set
         */
        constructor(name: string);
        /**
         * Gets the current class name of the node particle set e.g. "NodeParticleSystemSet"
         * @returns the class name
         */
        getClassName(): string;
        private _initializeBlock;
        private BJSNODEPARTICLEEDITOR;
        /** Get the editor from bundle or global
         * @returns the global NPE
         */
        private _getGlobalNodeParticleEditor;
        /** Creates the node editor window.
         * @param additionalConfig Define the configuration of the editor
         */
        private _createNodeParticleEditor;
        /**
         * Launch the node particle editor
         * @param config Define the configuration of the editor
         * @returns a promise fulfilled when the node editor is visible
         */
        editAsync(config?: INodeParticleEditorOptions): Promise<void>;
        /**
         * Builds the particle system set from the defined blocks.
         * @param scene defines the hosting scene
         * @param verbose defines whether to log detailed information during the build process (false by default)
         * @returns a promise that resolves to the built particle system set
         */
        buildAsync(scene: Scene, verbose?: boolean): Promise<ParticleSystemSet>;
        /**
         * Clear the current node particle set
         */
        clear(): void;
        /**
         * Clear the current set and restore it to a default state
         */
        setToDefault(): void;
        /**
         * Remove a block from the current system set
         * @param block defines the block to remove
         */
        removeBlock(block: NodeParticleBlock): void;
        /**
         * Clear the current graph and load a new one from a serialization object
         * @param source defines the JSON representation of the particle set
         * @param merge defines whether or not the source must be merged or replace the current content
         */
        parseSerializedObject(source: any, merge?: boolean): void;
        private _restoreConnections;
        /**
         * Serializes this node particle set in a JSON representation
         * @param selectedBlocks defines the list of blocks to save (if null the whole node particle set will be saved)
         * @returns the serialized particle system set object
         */
        serialize(selectedBlocks?: NodeParticleBlock[]): any;
        /**
         * Makes a duplicate of the current particle system set.
         * @param name defines the name to use for the new particle system set
         * @returns the cloned particle system set
         */
        clone(name: string): NodeParticleSystemSet;
        /**
         * Disposes the resources
         */
        dispose(): void;
        /**
         * Creates a new node particle set set to default basic configuration
         * @param name defines the name of the particle set
         * @returns a new NodeParticleSystemSet
         */
        static CreateDefault(name: string): NodeParticleSystemSet;
        /**
         * Creates a node particle set from parsed data
         * @param source defines the JSON representation of the particle set
         * @returns a new node particle set
         */
        static Parse(source: any): NodeParticleSystemSet;
        /**
         * Creates a node particle set from a snippet saved in a remote file
         * @param name defines the name of the node particle set to create
         * @param url defines the url to load from
         * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)
         * @returns a promise that will resolve to the new node particle set
         */
        static ParseFromFileAsync(name: string, url: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet>;
        /**
         * Creates a node particle set from a snippet saved by the node particle editor
         * @param snippetId defines the snippet to load
         * @param nodeParticleSet defines a node particle set to update (instead of creating a new one)
         * @returns a promise that will resolve to the new node particle set
         */
        static ParseFromSnippetAsync(snippetId: string, nodeParticleSet?: NodeParticleSystemSet): Promise<NodeParticleSystemSet>;
    }


    /**
     * Class used to store node based geometry build state
     */
    export class NodeParticleBuildState {
        private _buildPromises;
        /**
         * Gets the capactity of the particle system to build
         */
        capacity: number;
        /**
         * Gets the scene where the particle system is built
         */
        scene: Scene;
        /** Gets or sets the build identifier */
        buildId: number;
        /** Gets or sets the list of non connected mandatory inputs */
        notConnectedNonOptionalInputs: NodeParticleConnectionPoint[];
        /** Gets or sets a boolean indicating that verbose mode is on */
        verbose: boolean;
        /**
         * Gets or sets the particle context for contextual data
         */
        particleContext: Nullable<Particle>;
        /**
         * Gets or sets the system context for contextual data
         */
        systemContext: Nullable<ThinParticleSystem>;
        /**
         * Gets or sets the index of the gradient to use
         */
        gradientIndex: number;
        /**
         * Gets or sets next gradient in line
         */
        nextGradientIndex: number;
        /**
         * Gets or sets the next gradient value
         */
        nextGradientValue: any;
        /**
         * Emits errors if any
         */
        emitErrors(): void;
        /**
         * Registers an asynchronous operation that must complete before the node particle system is ready.
         * @param promise defines the promise to wait for
         */
        registerBuildPromise(promise: Promise<void>): void;
        /**
         * Waits for all asynchronous build operations to complete.
         * @returns a promise that resolves when all registered build operations are complete
         */
        waitForBuildPromisesAsync(): Promise<void>;
        /**
         * Adapt a value to a target type
         * @param source defines the value to adapt
         * @param targetType defines the target type
         * @returns the adapted value
         */
        adapt(source: NodeParticleConnectionPoint, targetType: NodeParticleBlockConnectionPointTypes): any;
        /**
         * Gets the value associated with a contextual source
         * @param source Source of the contextual value
         * @returns the value associated with the source
         */
        getContextualValue(source: NodeParticleContextualSources): number | Color4 | Vector2 | Nullable<Vector3>;
        /**
         * Gets the emitter world matrix
         */
        get emitterWorldMatrix(): Matrix | null;
        /**
         * Gets the emitter inverse world matrix
         */
        get emitterInverseWorldMatrix(): Matrix | null;
        /**
         * Gets the emitter position
         */
        get emitterPosition(): Nullable<Vector3>;
        /**
         * Gets the value associated with a system source
         * @param source Source of the system value
         * @returns the value associated with the source
         */
        getSystemValue(source: NodeParticleSystemSources): number | Nullable<Vector3>;
    }


    /**
     * Enum used to define the compatibility state between two connection points
     */
    export enum NodeParticleConnectionPointCompatibilityStates {
        /** Points are compatibles */
        Compatible = 0,
        /** Points are incompatible because of their types */
        TypeIncompatible = 1,
        /** Points are incompatible because they are in the same hierarchy **/
        HierarchyIssue = 2
    }
    /**
     * Defines the direction of a connection point
     */
    export enum NodeParticleConnectionPointDirection {
        /** Input */
        Input = 0,
        /** Output */
        Output = 1
    }
    /**
     * Defines a connection point for a block
     */
    export class NodeParticleConnectionPoint {
        /** @internal */
        _ownerBlock: NodeParticleBlock;
        /** @internal */
        _connectedPoint: Nullable<NodeParticleConnectionPoint>;
        /** @internal */
        _storedValue: any;
        /** @internal */
        _storedFunction: Nullable<(state: NodeParticleBuildState) => any>;
        /** @internal */
        _acceptedConnectionPointType: Nullable<NodeParticleConnectionPoint>;
        private _endpoints;
        private _direction;
        private _type;
        /** @internal */
        _linkedConnectionSource: Nullable<NodeParticleConnectionPoint>;
        /** @internal */
        _typeConnectionSource: Nullable<NodeParticleConnectionPoint>;
        /** @internal */
        _typeConnectionSourceTranslation: Nullable<(source: NodeParticleBlockConnectionPointTypes) => NodeParticleBlockConnectionPointTypes>;
        /** @internal */
        _defaultConnectionPointType: Nullable<NodeParticleBlockConnectionPointTypes>;
        /** @internal */
        _isMainLinkSource: boolean;
        /** Gets the direction of the point */
        get direction(): NodeParticleConnectionPointDirection;
        /**
         * Gets or sets the additional types supported by this connection point
         */
        acceptedConnectionPointTypes: NodeParticleBlockConnectionPointTypes[];
        /**
         * Gets or sets the additional types excluded by this connection point
         */
        excludedConnectionPointTypes: NodeParticleBlockConnectionPointTypes[];
        /**
         * Observable triggered when this point is connected
         */
        onConnectionObservable: Observable<NodeParticleConnectionPoint>;
        /**
         * Observable triggered when this point is disconnected
         */
        onDisconnectionObservable: Observable<NodeParticleConnectionPoint>;
        /**
         * Gets or sets a boolean indicating that this connection point is exposed on a frame
         */
        isExposedOnFrame: boolean;
        /**
         * Gets or sets number indicating the position that the port is exposed to on a frame
         */
        exposedPortPosition: number;
        /**
         * Gets the default value used for this point at creation time
         */
        defaultValue: Nullable<any>;
        /**
         * Gets or sets the default value used for this point if nothing is connected
         */
        value: Nullable<any>;
        /**
         * Gets or sets the min value accepted for this point if nothing is connected
         */
        valueMin: Nullable<any>;
        /**
         * Gets or sets the max value accepted for this point if nothing is connected
         */
        valueMax: Nullable<any>;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeParticleBlockConnectionPointTypes;
        set type(value: NodeParticleBlockConnectionPointTypes);
        /**
         * Gets or sets the connection point name
         */
        name: string;
        /**
         * Gets or sets the connection point display name
         */
        displayName: string;
        /**
         * Gets or sets a boolean indicating that this connection point can be omitted
         */
        isOptional: boolean;
        /**
         * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock
         */
        get isConnected(): boolean;
        /** Get the other side of the connection (if any) */
        get connectedPoint(): Nullable<NodeParticleConnectionPoint>;
        /** Get the block that owns this connection point */
        get ownerBlock(): NodeParticleBlock;
        /** Get the block connected on the other side of this connection (if any) */
        get sourceBlock(): Nullable<NodeParticleBlock>;
        /** Get the block connected on the endpoints of this connection (if any) */
        get connectedBlocks(): Array<NodeParticleBlock>;
        /** Gets the list of connected endpoints */
        get endpoints(): NodeParticleConnectionPoint[];
        /** Gets a boolean indicating if that output point is connected to at least one input */
        get hasEndpoints(): boolean;
        /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */
        get innerType(): NodeParticleBlockConnectionPointTypes;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         */
        constructor(name: string, ownerBlock: NodeParticleBlock, direction: NodeParticleConnectionPointDirection);
        /**
         * Gets the current class name e.g. "NodeMaterialConnectionPoint"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value represented by this connection point
         * @param state current evaluation state
         * @returns the connected value or the value if nothing is connected
         */
        getConnectedValue(state: NodeParticleBuildState): any;
        /**
         * Gets a boolean indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a boolean
         */
        canConnectTo(connectionPoint: NodeParticleConnectionPoint): boolean;
        /**
         * Gets a number indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a number defining the compatibility state
         */
        checkCompatibilityState(connectionPoint: NodeParticleConnectionPoint): NodeParticleConnectionPointCompatibilityStates;
        /**
         * Connect this point to another connection point
         * @param connectionPoint defines the other connection point
         * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)
         * @returns the current connection point
         */
        connectTo(connectionPoint: NodeParticleConnectionPoint, ignoreConstraints?: boolean): NodeParticleConnectionPoint;
        /**
         * Disconnect this point from one of his endpoint
         * @param endpoint defines the other connection point
         * @returns the current connection point
         */
        disconnectFrom(endpoint: NodeParticleConnectionPoint): NodeParticleConnectionPoint;
        /**
         * Fill the list of excluded connection point types with all types other than those passed in the parameter
         * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list
         */
        addExcludedConnectionPointFromAllowedTypes(mask: number): void;
        /**
         * Serializes this point in a JSON representation
         * @param isInput defines if the connection point is an input (default is true)
         * @returns the serialized point object
         */
        serialize(isInput?: boolean): any;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /**
     * Defines a block that can be used inside a node based particle system
     */
    export class NodeParticleBlock {
        private _name;
        protected _buildId: number;
        protected _isInput: boolean;
        protected _isSystem: boolean;
        protected _isDebug: boolean;
        protected _isTeleportOut: boolean;
        protected _isTeleportIn: boolean;
        /**
         * Gets or sets the unique id of the node
         */
        uniqueId: number;
        /** @internal */
        _inputs: NodeParticleConnectionPoint[];
        /** @internal */
        _outputs: NodeParticleConnectionPoint[];
        /**
         * Gets an observable raised when the block is built
         */
        onBuildObservable: Observable<NodeParticleBlock>;
        /**
         * Gets an observable raised when the block is disposed
         */
        onDisposeObservable: Observable<NodeParticleBlock>;
        /**
         * Gets an observable raised when the inputs of the block change
         */
        onInputChangedObservable: Observable<NodeParticleConnectionPoint>;
        /**
         * Gets a boolean indicating if this block is a teleport out
         */
        get isTeleportOut(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport in
         */
        get isTeleportIn(): boolean;
        /**
         * Gets a boolean indicating that this block is a system block
         */
        get isSystem(): boolean;
        /**
         * Gets a boolean indicating that this block is an input block
         */
        get isInput(): boolean;
        /**
         * Gets a boolean indicating if this block is a debug block
         */
        get isDebug(): boolean;
        /**
         * A free comment about the block
         */
        comments: string;
        /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */
        visibleOnFrame: boolean;
        /**
         * Gets or set the name of the block
         */
        get name(): string;
        set name(value: string);
        /**
         * Gets the current class name e.g. "NodeParticleBlock"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the list of input points
         */
        get inputs(): NodeParticleConnectionPoint[];
        /** Gets the list of output points */
        get outputs(): NodeParticleConnectionPoint[];
        /**
         * Creates a new NodeParticleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeParticleBlock): boolean;
        /**
         * Checks if the current block is an ancestor of a given type
         * @param type defines the potential type to check
         * @returns true if block is a descendant
         */
        isAnAncestorOfType(type: string): boolean;
        /**
         * Find an input by its name
         * @param name defines the name of the input to look for
         * @returns the input or null if not found
         */
        getInputByName(name: string): NodeParticleConnectionPoint | null;
        protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling?: boolean): void;
        /**
         * Register a new input. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param isOptional defines a boolean indicating that this input can be omitted
         * @param value value to return if there is no connection
         * @param valueMin min value accepted for value
         * @param valueMax max value accepted for value
         * @returns the current block
         */
        registerInput(name: string, type: NodeParticleBlockConnectionPointTypes, isOptional?: boolean, value?: any, valueMin?: any, valueMax?: any): this;
        /**
         * Register a new output. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerOutput(name: string, type: NodeParticleBlockConnectionPointTypes, point?: NodeParticleConnectionPoint): this;
        /**
         * Builds the block. Must be implemented by derived classes.
         * @param _state defines the current build state
         */
        _build(_state: NodeParticleBuildState): void;
        protected _customBuildStep(_state: NodeParticleBuildState): void;
        /**
         * Builds the block
         * @param state defines the current build state
         * @returns the built block
         */
        build(state: NodeParticleBuildState): boolean;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * @internal
         */
        _deserialize(serializationObject: any): void;
        private _deserializePortDisplayNamesAndExposedOnFrame;
        /**
         * Clone the current block to a new identical block
         * @returns a copy of the current block
         */
        clone(): NodeParticleBlock | null;
        /**
         * Release resources
         */
        dispose(): void;
    }




    /**
     * Enum used to define system values e.g. values automatically provided by the system
     */
    export enum NodeParticleSystemSources {
        /** None */
        None = 0,
        /** Time */
        Time = 1,
        /** Delta time */
        Delta = 2,
        /** Emitter */
        Emitter = 3,
        /** Camera position */
        CameraPosition = 4
    }


    /**
     * Defines the kind of contextual sources for node particles
     */
    export enum NodeParticleContextualSources {
        /** None */
        None = 0,
        /** Position */
        Position = 1,
        /** Direction */
        Direction = 2,
        /** Age */
        Age = 3,
        /** Lifetime */
        Lifetime = 4,
        /** Color */
        Color = 5,
        /** ScaledDirection */
        ScaledDirection = 6,
        /** Scale */
        Scale = 7,
        /** AgeGradient */
        AgeGradient = 8,
        /** Angle */
        Angle = 9,
        /** SpriteCellIndex */
        SpriteCellIndex = 16,
        /** SpriteCellStart */
        SpriteCellStart = 17,
        /** SpriteCellEnd */
        SpriteCellEnd = 18,
        /** Initial Color */
        InitialColor = 19,
        /** Color Dead*/
        ColorDead = 20,
        /** Initial Direction */
        InitialDirection = 21,
        /** Color Step */
        ColorStep = 22,
        /** Scaled Color Step */
        ScaledColorStep = 23,
        /** Local Position Updated */
        LocalPositionUpdated = 24,
        /** Size */
        Size = 25,
        /** Direction Scale */
        DirectionScale = 32
    }


    /**
     * Defines the kind of connection point for node geometry
     */
    export enum NodeParticleBlockConnectionPointTypes {
        /** Int */
        Int = 1,
        /** Float */
        Float = 2,
        /** Vector2 */
        Vector2 = 4,
        /** Vector3 */
        Vector3 = 8,
        /** Matrix */
        Matrix = 16,
        /** Particle */
        Particle = 32,
        /** Texture */
        Texture = 64,
        /** Color4 */
        Color4 = 128,
        /** FloatGradient */
        FloatGradient = 256,
        /** Vector2Gradient */
        Vector2Gradient = 512,
        /** Vector3Gradient */
        Vector3Gradient = 1024,
        /** Color4Gradient */
        Color4Gradient = 2048,
        /** System */
        System = 4096,
        /** Detect type based on connection */
        AutoDetect = 8192,
        /** Output type that will be defined by input type */
        BasedOnInput = 16384,
        /** Undefined */
        Undefined = 32768,
        /** Bitmask of all types */
        All = 65535
    }


    /** This file must only contain pure code and pure imports */
    type CustomShader = {
        shaderPath: {
            fragmentElement: string;
        };
        shaderOptions: {
            uniforms: string[];
            samplers: string[];
            defines: string[];
        };
    };
    /**
     * Block used to get a system of particles
     */
    export class SystemBlock extends NodeParticleBlock {
        private static _IdCounter;
        /**
         * Gets or sets the blend mode for the particle system
         */
        blendMode: number;
        /**
         * Gets or sets the epsilon value used for comparison
         */
        capacity: number;
        /**
         * Gets or sets the manual emit count
         */
        manualEmitCount: number;
        /**
         * Gets or sets the target stop duration for the particle system
         */
        startDelay: number;
        /**
         * Gets or sets the target stop duration for the particle system
         */
        updateSpeed: number;
        /**
         * Gets or sets the number of pre-warm cycles before rendering the particle system
         */
        preWarmCycles: number;
        /**
         * Gets or sets the time step multiplier used for pre-warm
         */
        preWarmStepOffset: number;
        /**
         * Gets or sets a boolean indicating if the system is billboard based
         */
        isBillboardBased: boolean;
        /**
         * Gets or sets the billboard mode for the particle system
         */
        billBoardMode: number;
        /**
         * Gets or sets a boolean indicating if the system coordinate space is local or global
         */
        isLocal: boolean;
        /**
         * Gets or sets a boolean indicating if the system should be disposed when stopped
         */
        disposeOnStop: boolean;
        /**
         * Gets or sets a boolean indicating if the system should not start automatically
         */
        doNoStart: boolean;
        /**
         * Gets or sets the rendering group id for the particle system (0 by default)
         */
        renderingGroupId: number;
        /** @internal */
        _internalId: number;
        /**
         * Gets or sets the custom shader configuration used to render the particles.
         * This can be used to set your own shader to render the particle system.
         */
        customShader: Nullable<CustomShader>;
        /**
         * Gets or sets the emitter for the particle system.
         */
        emitter: Nullable<AbstractMesh | Vector3>;
        /**
         * Create a new SystemBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle input component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the emitRate input component
         */
        get emitRate(): NodeParticleConnectionPoint;
        /**
         * Gets the texture input component
         */
        get texture(): NodeParticleConnectionPoint;
        /**
         * Gets the translationPivot input component
         */
        get translationPivot(): NodeParticleConnectionPoint;
        /**
         * Gets the textureMask input component
         */
        get textureMask(): NodeParticleConnectionPoint;
        /**
         * Gets the targetStopDuration input component
         */
        get targetStopDuration(): NodeParticleConnectionPoint;
        /**
         * Gets the onStart input component
         */
        get onStart(): NodeParticleConnectionPoint;
        /**
         * Gets the onEnd input component
         */
        get onEnd(): NodeParticleConnectionPoint;
        /**
         * Gets the system output component
         */
        get system(): NodeParticleConnectionPoint;
        /**
         * Builds the block and return a functional particle system
         * @param state defines the building state
         * @returns the built particle system
         */
        createSystem(state: NodeParticleBuildState): ParticleSystem;
        /**
         * Serializes the system block
         * @returns The serialized object
         */
        serialize(): any;
        /**
         * Deserializes the system block
         * @param serializationObject The serialized system
         */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for systemBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSystemBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import systemBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Vector Math block
     */
    export enum ParticleVectorMathBlockOperations {
        /** Dot product */
        Dot = 0,
        /** Distance between two vectors */
        Distance = 1
    }
    /**
     * Block used to apply math operations that only apply to vectors
     */
    export class ParticleVectorMathBlock extends NodeParticleBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: ParticleVectorMathBlockOperations;
        /**
         * Create a new ParticleVectorMathBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * Deserializes the block from a JSON object
         * @param serializationObject the JSON object to deserialize from
         */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleVectorMathBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleVectorMathBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleVectorMathBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute vector length
     */
    export class ParticleVectorLengthBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleVectorLengthBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input operand input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
    }
    /**
     * Register side effects for particleVectorLengthBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleVectorLengthBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleVectorLengthBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Trigonometry block
     */
    export enum ParticleTrigonometryBlockOperations {
        /** Cos */
        Cos = 0,
        /** Sin */
        Sin = 1,
        /** Abs */
        Abs = 2,
        /** Exp */
        Exp = 3,
        /** Exp2 */
        Exp2 = 4,
        /** Round */
        Round = 5,
        /** Floor */
        Floor = 6,
        /** Ceiling */
        Ceiling = 7,
        /** Square root */
        Sqrt = 8,
        /** Log */
        Log = 9,
        /** Tangent */
        Tan = 10,
        /** Arc tangent */
        ArcTan = 11,
        /** Arc cosinus */
        ArcCos = 12,
        /** Arc sinus */
        ArcSin = 13,
        /** Sign */
        Sign = 14,
        /** Negate */
        Negate = 15,
        /** OneMinus */
        OneMinus = 16,
        /** Reciprocal */
        Reciprocal = 17,
        /** ToDegrees */
        ToDegrees = 18,
        /** ToRadians */
        ToRadians = 19,
        /** Fract */
        Fract = 20
    }
    /**
     * Block used to apply trigonometry operation to floats
     */
    export class ParticleTrigonometryBlock extends NodeParticleBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: ParticleTrigonometryBlockOperations;
        /**
         * Creates a new GeometryTrigonometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): this | undefined;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleTrigonometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleTrigonometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleTrigonometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to step a value
     */
    export class ParticleStepBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleStepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeParticleConnectionPoint;
        /**
         * Gets the edge operand input component
         */
        get edge(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): this | undefined;
    }
    /**
     * Register side effects for particleStepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleStepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Interface used to define texture data
     */
    export interface INodeParticleTextureData {
        /** Width of the texture in pixels */
        width: number;
        /** Height of the texture in pixels */
        height: number;
        /** RGBA pixel data */
        data: Uint8ClampedArray;
    }
    /**
     * Block used to provide a texture for particles in a particle system
     */
    export class ParticleTextureSourceBlock extends NodeParticleBlock {
        private _url;
        private _textureDataUrl;
        private _sourceTexture;
        private _cachedData;
        private _clonedTextures;
        /**
         * Gets or sets the strenght of the flow map effect
         */
        invertY: boolean;
        /**
         * Indicates if the texture data should be serialized as a base64 string.
         */
        serializedCachedData: boolean;
        /**
         * Gets or sets the URL of the texture to be used by this block.
         */
        get url(): string;
        set url(value: string);
        /**
         * Gets or sets the data URL of the texture to be used by this block.
         * This is a base64 encoded string representing the texture data.
         */
        get textureDataUrl(): string;
        set textureDataUrl(value: string);
        /**
         * Gets the texture directly set on this block.
         * This value will not be serialized.
         */
        get sourceTexture(): Nullable<BaseTexture>;
        /**
         * Directly sets the texture to be used by this block.
         * This value will not be serialized.
         */
        set sourceTexture(value: Nullable<BaseTexture>);
        /**
         * Gets the texture set on this block.
         * This value will not be serialized.
         */
        get texture(): Nullable<BaseTexture>;
        /**
         * Sets the texture to be used by this block.
         * This value will not be serialized.
         */
        set texture(value: Nullable<BaseTexture>);
        /**
         * Create a new ParticleTextureSourceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the texture output component
         */
        get textureOutput(): NodeParticleConnectionPoint;
        /**
         * Gets the texture content as a promise
         * @returns a promise that resolves to the texture content, including width, height, and pixel data
         */
        extractTextureContentAsync(): Promise<INodeParticleTextureData | null>;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
        /**
         * Serializes this block
         * @returns the serialization object
         */
        serialize(): any;
        /**
         * Deserializes this block from a serialization object
         * @param serializationObject the serialization object
         */
        _deserialize(serializationObject: any): void;
        /**
         * Disposes the block and its associated resources
         */
        dispose(): void;
        /**
         * Copies texture properties from source to target texture
         * @param source - The source texture to copy properties from
         * @param target - The target texture to copy properties to
         */
        private _copyTextureProperties;
    }
    /**
     * Register side effects for particleSourceTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleSourceTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleSourceTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to smooth step a value
     */
    export class ParticleSmoothStepBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleSmoothStepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeParticleConnectionPoint;
        /**
         * Gets the first edge operand input component
         */
        get edge0(): NodeParticleConnectionPoint;
        /**
         * Gets the second edge operand input component
         */
        get edge1(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): this | undefined;
    }
    /**
     * Register side effects for particleSmoothStepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleSmoothStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleSmoothStepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Locks supported by the random block
     */
    export enum ParticleRandomBlockLocks {
        /** None */
        None = 0,
        /** PerParticle */
        PerParticle = 1,
        /** PerSystem */
        PerSystem = 2,
        /** OncePerParticle */
        OncePerParticle = 3
    }
    /**
     * Block used to get a random number
     */
    export class ParticleRandomBlock extends NodeParticleBlock {
        private _currentLockId;
        private _oncePerParticleMap;
        /**
         * Gets or sets a value indicating if that block will lock its value for a specific event
         */
        lockMode: ParticleRandomBlockLocks;
        /**
         * Create a new ParticleRandomBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the min input component
         */
        get min(): NodeParticleConnectionPoint;
        /**
         * Gets the max input component
         */
        get max(): NodeParticleConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleRandomBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleRandomBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleRandomBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Number Math block
     */
    export enum ParticleNumberMathBlockOperations {
        /** Modulo */
        Modulo = 0,
        /** Power */
        Pow = 1
    }
    /**
     * Block used to apply math operations that only appply to numbers (int/float)
     */
    export class ParticleNumberMathBlock extends NodeParticleBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: ParticleNumberMathBlockOperations;
        private readonly _connectionObservers;
        /**
         * Create a new ParticleNumberMathBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        private _updateInputOutputTypes;
        /**
         * Release resources
         */
        dispose(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * Deserializes the block from a JSON object
         * @param serializationObject the JSON object to deserialize from
         */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleNumberMathBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleNumberMathBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleNumberMathBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to normalize lerp between 2 values
     */
    export class ParticleNLerpBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleNLerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(_state: NodeParticleBuildState): this | undefined;
    }
    /**
     * Register side effects for particleNLerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleNLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleNLerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Math block
     */
    export enum ParticleMathBlockOperations {
        /** Add */
        Add = 0,
        /** Subtract */
        Subtract = 1,
        /** Multiply */
        Multiply = 2,
        /** Divide */
        Divide = 3,
        /** Max */
        Max = 4,
        /** Min */
        Min = 5
    }
    /**
     * Block used to apply math functions
     */
    export class ParticleMathBlock extends NodeParticleBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: ParticleMathBlockOperations;
        private readonly _connectionObservers;
        /**
         * Create a new ParticleMathBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        private _updateInputOutputTypes;
        /**
         * Release resources
         */
        dispose(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * Deserializes the block from a JSON object
         * @param serializationObject the JSON object to deserialize from
         */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleMathBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleMathBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleMathBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export enum ParticleLocalVariableBlockScope {
        Particle = 0,
        Loop = 1
    }
    /**
     * Defines a block used to store local values
     * #A1OS53#5
     */
    export class ParticleLocalVariableBlock extends NodeParticleBlock {
        /**
         * Gets or sets the scope used by the block
         */
        scope: ParticleLocalVariableBlockScope;
        private _storage;
        /**
         * Create a new ParticleLocalVariableBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
        dispose(): void;
    }
    /**
     * Register side effects for particleLocalVariableBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleLocalVariableBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleLocalVariableBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to lerp between 2 values
     */
    export class ParticleLerpBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleLerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
    }
    /**
     * Register side effects for particleLerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleLerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to expose an input value
     */
    export class ParticleInputBlock extends NodeParticleBlock {
        private _storedValue;
        private _valueCallback;
        private _type;
        /** Gets or set a value used to limit the range of float values */
        min: number;
        /** Gets or set a value used to limit the range of float values */
        max: number;
        /** Gets or sets the group to use to display this block in the Inspector */
        groupInInspector: string;
        /**
         * Gets or sets a boolean indicating that this input is displayed in the Inspector
         */
        displayInInspector: boolean;
        /** Gets an observable raised when the value is changed */
        onValueChangedObservable: Observable<ParticleInputBlock>;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeParticleBlockConnectionPointTypes;
        /** @internal */
        private _systemSource;
        /**
         * Gets a boolean indicating that the current connection point is a system source
         */
        get isSystemSource(): boolean;
        /**
         * Gets or sets the system source used by this input block
         */
        get systemSource(): NodeParticleSystemSources;
        set systemSource(value: NodeParticleSystemSources);
        private _contextualSource;
        /**
         * Gets a boolean indicating that the current connection point is a contextual value
         */
        get isContextual(): boolean;
        /**
         * Gets or sets the current contextual value
         */
        get contextualValue(): NodeParticleContextualSources;
        set contextualValue(value: NodeParticleContextualSources);
        /**
         * Creates a new InputBlock
         * @param name defines the block name
         * @param type defines the type of the input (can be set to NodeParticleBlockConnectionPointTypes.AutoDetect)
         */
        constructor(name: string, type?: NodeParticleBlockConnectionPointTypes);
        /**
         * Gets or sets the value of that point.
         * Please note that this value will be ignored if valueCallback is defined
         */
        get value(): any;
        set value(value: any);
        /**
         * Gets or sets a callback used to get the value of that point.
         * Please note that setting this value will force the connection point to ignore the value property
         */
        get valueCallback(): () => any;
        set valueCallback(value: () => any);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Set the input block to its default value (based on its type)
         */
        setDefaultValue(): void;
        _build(state: NodeParticleBuildState): void;
        dispose(): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleInputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleInputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleInputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to define a gradient entry for a gradient block
     */
    export class ParticleGradientValueBlock extends NodeParticleBlock {
        /**
         * Gets or sets the epsilon value used for comparison
         */
        reference: number;
        /**
         * Creates a new ParticleGradientEntryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleGradientValueBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleGradientValueBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleGradientValueBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to define a list of gradient entries
     */
    export class ParticleGradientBlock extends NodeParticleBlock {
        private _entryCount;
        /**
         * Creates a new ParticleGradientBlock
         * @param name defines the block name
         */
        constructor(name: string);
        private _extend;
        private _reduce;
        private _manageExtendedInputs;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleGradientBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleGradientBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleGradientBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the FloatToInt block
     */
    export enum ParticleFloatToIntBlockOperations {
        /** Round */
        Round = 0,
        /** Ceil */
        Ceil = 1,
        /** Floor */
        Floor = 2,
        /** Truncate */
        Truncate = 3
    }
    /**
     * Block used to transform a float to an int
     */
    export class ParticleFloatToIntBlock extends NodeParticleBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: ParticleFloatToIntBlockOperations;
        /**
         * Creates a new ParticleFloatToIntBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleFloatToIntBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleFloatToIntBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleFloatToIntBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as a pass through
     */
    export class ParticleElbowBlock extends NodeParticleBlock {
        /**
         * Creates a new ParticleElbowBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for particleElbowBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleElbowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleElbowBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to debug values going through it
     */
    export class ParticleDebugBlock extends NodeParticleBlock {
        /**
         * Gets the log entries
         */
        log: string[][];
        /**
         * Gets or sets the number of logs to keep
         */
        stackSize: number;
        /**
         * Create a new ParticleDebugBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Observable raised when data is collected
         */
        onDataCollectedObservable: Observable<ParticleDebugBlock>;
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
        dispose(): void;
    }
    /**
     * Register side effects for particleDebugBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleDebugBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleDebugBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to create a Vector2/3 and Color4 out of individual or partial inputs
     */
    export class ParticleConverterBlock extends NodeParticleBlock {
        /**
         * Create a new ParticleConverterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color component (input)
         */
        get colorIn(): NodeParticleConnectionPoint;
        /**
         * Gets the xyz component (input)
         */
        get xyzIn(): NodeParticleConnectionPoint;
        /**
         * Gets the xy component (input)
         */
        get xyIn(): NodeParticleConnectionPoint;
        /**
         * Gets the zw component (input)
         */
        get zwIn(): NodeParticleConnectionPoint;
        /**
         * Gets the x component (input)
         */
        get xIn(): NodeParticleConnectionPoint;
        /**
         * Gets the y component (input)
         */
        get yIn(): NodeParticleConnectionPoint;
        /**
         * Gets the z component (input)
         */
        get zIn(): NodeParticleConnectionPoint;
        /**
         * Gets the w component (input)
         */
        get wIn(): NodeParticleConnectionPoint;
        /**
         * Gets the xyzw component (output)
         */
        get colorOut(): NodeParticleConnectionPoint;
        /**
         * Gets the xyz component (output)
         */
        get xyzOut(): NodeParticleConnectionPoint;
        /**
         * Gets the xy component (output)
         */
        get xyOut(): NodeParticleConnectionPoint;
        /**
         * Gets the zw component (output)
         */
        get zwOut(): NodeParticleConnectionPoint;
        /**
         * Gets the x component (output)
         */
        get xOut(): NodeParticleConnectionPoint;
        /**
         * Gets the y component (output)
         */
        get yOut(): NodeParticleConnectionPoint;
        /**
         * Gets the z component (output)
         */
        get zOut(): NodeParticleConnectionPoint;
        /**
         * Gets the w component (output)
         */
        get wOut(): NodeParticleConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for particleConverterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleConverterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleConverterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clamp a float
     */
    export class ParticleClampBlock extends NodeParticleBlock {
        /** Gets or sets the minimum range */
        get minimum(): number;
        set minimum(value: number);
        /** Gets or sets the maximum range */
        get maximum(): number;
        set maximum(value: number);
        /**
         * Creates a new ParticleClampBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeParticleConnectionPoint;
        /**
         * Gets the min input component
         */
        get min(): NodeParticleConnectionPoint;
        /**
         * Gets the max input component
         */
        get max(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): this | undefined;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleClampBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleClampBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleClampBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Registers all condition node particle blocks for deserialization.
     */
    export function RegisterNodeParticleConditionsBlocks(): void;
    /**
     * Registers all emitter node particle blocks for deserialization.
     */
    export function RegisterNodeParticleEmittersBlocks(): void;
    /**
     * Registers all teleport node particle blocks for deserialization.
     */
    export function RegisterNodeParticleTeleportBlocks(): void;
    /**
     * Registers all trigger node particle blocks for deserialization.
     */
    export function RegisterNodeParticleTriggersBlocks(): void;
    /**
     * Registers all update node particle blocks for deserialization.
     */
    export function RegisterNodeParticleUpdateBlocks(): void;
    /**
     * Registers all root-level (math/utility) node particle blocks for deserialization.
     */
    export function RegisterNodeParticleMathBlocks(): void;
    /**
     * Registers all node particle blocks for deserialization.
     * Call this function when you need to deserialize node particle systems from JSON/snippets.
     *
     * This is the tree-shakeable replacement for:
     * ```ts
     * import "@babylonjs/core/Particles/Node/Blocks/index";
     * ```
     */
    export function RegisterAllNodeParticleBlocks(): void;




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the sprite cell index of a particle
     */
    export class UpdateSpriteCellIndexBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateSpriteCellIndexBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the cellIndex input component
         */
        get cellIndex(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateSpriteCellIndexBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateSpriteCellIndexBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateSpriteCellIndexBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the size of a particle
     */
    export class UpdateSizeBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateSizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the size input component
         */
        get size(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateSizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateSizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateSizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the scale of a particle
     */
    export class UpdateScaleBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateScaleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the scale input component
         */
        get scale(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateScaleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateScaleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateScaleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the position of a particle
     */
    export class UpdatePositionBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateDirectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the position input component
         */
        get position(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updatePositionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdatePositionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updatePositionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update particle position based on a noise texture
     */
    export class UpdateNoiseBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateNoiseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the noiseTexture input component
         */
        get noiseTexture(): NodeParticleConnectionPoint;
        /**
         * Gets the strength input component
         */
        get strength(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateNoiseBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateNoiseBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateNoiseBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update particle position based on a flow map
     */
    export class UpdateFlowMapBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateFlowMapBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the flowMap input component
         */
        get flowMap(): NodeParticleConnectionPoint;
        /**
         * Gets the strength input component
         */
        get strength(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateFlowMapBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateFlowMapBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateFlowMapBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the direction of a particle
     */
    export class UpdateDirectionBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateDirectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the direction input component
         */
        get direction(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateDirectionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateDirectionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateDirectionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the color of a particle
     */
    export class UpdateColorBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateColorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the color input component
         */
        get color(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateColorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateColorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateColorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update particle position based on an attractor
     */
    export class UpdateAttractorBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateAttractorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the attractor input component
         */
        get attractor(): NodeParticleConnectionPoint;
        /**
         * Gets the strength input component
         */
        get strength(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateAttractorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateAttractorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateAttractorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the angle of a particle
     */
    export class UpdateAngleBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateAngleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the angle input component
         */
        get angle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateAngleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateAngleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateAngleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to update the age of a particle
     */
    export class UpdateAgeBlock extends NodeParticleBlock {
        /**
         * Create a new UpdateAgeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the age input component
         */
        get age(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for updateAgeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterUpdateAgeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import updateAgeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide the basic update functionality for particle sprite index.
     */
    export class BasicSpriteUpdateBlock extends NodeParticleBlock {
        /**
         * Create a new BasicSpriteUpdateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for basicSpriteUpdateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBasicSpriteUpdateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import basicSpriteUpdateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide the basic update functionality for particles.
     */
    export class BasicPositionUpdateBlock extends NodeParticleBlock {
        /**
         * Create a new BasicPositionUpdateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for basicPositionUpdateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBasicPositionUpdateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import basicPositionUpdateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide the basic update functionality for particle colors.
     */
    export class BasicColorUpdateBlock extends NodeParticleBlock {
        /**
         * Create a new BasicColorUpdateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for basicColorUpdateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBasicColorUpdateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import basicColorUpdateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to align the angle of a particle to its direction
     * We assume the sprite is facing +Y
     * NPE: #W5054F
     * PG: #H5RP91
     */
    export class AlignAngleBlock extends NodeParticleBlock {
        /**
         * Gets or sets the strenght of the flow map effect
         */
        alignment: number;
        /**
         * Create a new AlignAngleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Builds the block
         * @param state defines the current build state
         */
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for alignAngleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAlignAngleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import alignAngleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * @internal
     * Tools for managing particle triggers and sub-emitter systems.
     */
    export function _TriggerSubEmitter(template: SystemBlock, scene: Scene, location: Vector3): ParticleSystem;


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to trigger a particle system based on a condition.
     */
    export class ParticleTriggerBlock extends NodeParticleBlock {
        private _triggerCount;
        /**
         * Gets or sets the emit rate
         */
        limit: number;
        /**
         * Gets or sets the emit rate
         */
        delay: number;
        /**
         * Create a new ParticleTriggerBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Gets the condition input component
         */
        get condition(): NodeParticleConnectionPoint;
        /**
         * Gets the target system input component
         */
        get system(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        private _previousOne;
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
        dispose(): void;
    }
    /**
     * Register side effects for particleTriggerBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleTriggerBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleTriggerBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to receive a value from a teleport entry point
     */
    export class ParticleTeleportOutBlock extends NodeParticleBlock {
        /** @internal */
        _entryPoint: Nullable<ParticleTeleportInBlock>;
        /** @internal */
        _tempEntryPointUniqueId: Nullable<number>;
        /**
         * Create a new ParticleTeleportOutBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the entry point
         */
        get entryPoint(): Nullable<ParticleTeleportInBlock>;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /** Detach from entry point */
        detach(): void;
        _build(): void;
        protected _customBuildStep(state: NodeParticleBuildState): void;
        /**
         * Clone the current block to a new identical block
         * @returns a copy of the current block
         */
        clone(): NodeParticleBlock | null;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleTeleportOutBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleTeleportOutBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleTeleportOutBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to teleport a value to an endpoint
     */
    export class ParticleTeleportInBlock extends NodeParticleBlock {
        private _endpoints;
        /** Gets the list of attached endpoints */
        get endpoints(): ParticleTeleportOutBlock[];
        /**
         * Create a new ParticleTeleportInBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeParticleConnectionPoint;
        /**
         * Checks if the current block is an ancestor of a given type
         * @param type defines the potential type to check
         * @returns true if block is a descendant
         */
        isAnAncestorOfType(type: string): boolean;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeParticleBlock): boolean;
        /**
         * Add an enpoint to this block
         * @param endpoint define the endpoint to attach to
         */
        attachToEndpoint(endpoint: ParticleTeleportOutBlock): void;
        /**
         * Remove enpoint from this block
         * @param endpoint define the endpoint to remove
         */
        detachFromEndpoint(endpoint: ParticleTeleportOutBlock): void;
        _build(): void;
    }
    /**
     * Register side effects for particleTeleportInBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleTeleportInBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleTeleportInBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide a flow of particles emitted from a sphere shape.
     * DirectionRandomizer will be used for the particles initial direction unless both direction1 and direction2 are connected.
     */
    export class SphereShapeBlock extends NodeParticleBlock implements IShapeBlock {
        /**
         * Gets or sets a boolean indicating whether to emit in a hemispheric mode (top half of the sphere) or not
         */
        isHemispheric: boolean;
        /**
         * Create a new SphereShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the radius input component
         */
        get radius(): NodeParticleConnectionPoint;
        /**
         * Gets the radiusRange input component
         */
        get radiusRange(): NodeParticleConnectionPoint;
        /**
         * Gets the directionRandomizer input component
         */
        get directionRandomizer(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for sphereShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSphereShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sphereShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as configure the sprite sheet for particles
     */
    export class SetupSpriteSheetBlock extends NodeParticleBlock {
        /**
         * Gets or sets the start cell of the sprite sheet
         */
        start: number;
        /**
         * Gets or sets the end cell of the sprite sheet
         */
        end: number;
        /**
         * Gets or sets the width of the sprite sheet
         */
        width: number;
        /**
         * Gets or sets the height of the sprite sheet
         */
        height: number;
        /**
         * Gets or sets the speed of the cell change
         */
        spriteCellChangeSpeed: number;
        /**
         * Gets or sets a boolean indicating if the sprite sheet should loop
         */
        loop: boolean;
        /**
         * Gets or sets a boolean indicating if the sprite sheet should start at a random cell
         */
        randomStartCell: boolean;
        /**
         * Creates a new SetupSpriteSheetBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(state: NodeParticleBuildState): void;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setupSpriteSheetBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetupSpriteSheetBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setupSpriteSheetBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide a flow of particles emitted from a point.
     */
    export class PointShapeBlock extends NodeParticleBlock implements IShapeBlock {
        /**
         * Create a new PointShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for pointShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPointShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pointShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate particle shape from mesh geometry data
     */
    export class MeshShapeBlock extends NodeParticleBlock implements IShapeBlock {
        private _mesh;
        private _cachedVertexData;
        private _indices;
        private _positions;
        private _normals;
        private _colors;
        private _storedNormal;
        /**
         * Gets or sets a boolean indicating that this block should serialize its cached data
         */
        serializedCachedData: boolean;
        /**
         * Gets or sets a boolean indicating if the mesh normals should be used for particle direction
         */
        useMeshNormalsForDirection: boolean;
        /**
         * Gets or sets a boolean indicating if the mesh colors should be used for particle color
         */
        useMeshColorForColor: boolean;
        /**
         * Gets or sets a boolean indicating if the coordinates should be in world space (local space by default)
         */
        worldSpace: boolean;
        /**
         * Gets or sets the mesh to use to get vertex data
         */
        get mesh(): Nullable<Mesh>;
        set mesh(value: Nullable<Mesh>);
        /**
         * Create a new MeshShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating if the block is using cached data
         */
        get isUsingCachedData(): boolean;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Remove stored data
         */
        cleanData(): void;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for meshShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import meshShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Creates the local position data for the particle
     * @param particle The particle to update
     */
    export function _CreateLocalPositionData(particle: Particle): void;


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide a flow of particles emitted from a cylinder shape.
     * DirectionRandomizer will be used for the particles initial direction unless both direction1 and direction2 are connected.
     */
    export class CylinderShapeBlock extends NodeParticleBlock implements IShapeBlock {
        private _tempVector;
        /**
         * Create a new CylinderShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the radius input component
         */
        get radius(): NodeParticleConnectionPoint;
        /**
         * Gets the height input component
         */
        get height(): NodeParticleConnectionPoint;
        /**
         * Gets the radiusRange input component
         */
        get radiusRange(): NodeParticleConnectionPoint;
        /**
         * Gets the directionRandomizer input component
         */
        get directionRandomizer(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for cylinderShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCylinderShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cylinderShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /** Function that generates particle position/direction data */
    type ParticleGeneratorFunction = (index: number, particle: Nullable<Particle>, outPosition: Vector3) => void;
    /**
     * Block used to provide a flow of particles emitted from a custom position.
     */
    export class CustomShapeBlock extends NodeParticleBlock implements IShapeBlock {
        /** The particle position generator function */
        particlePositionGenerator: ParticleGeneratorFunction;
        /** The particle destination generator function */
        particleDestinationGenerator: ParticleGeneratorFunction;
        /** The particle direction generator function */
        particleDirectionGenerator: ParticleGeneratorFunction;
        /**
         * Create a new CustomShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for customShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCustomShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import customShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     */
    export class CreateParticleBlock extends NodeParticleBlock {
        /**
         * Create a new CreateParticleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the emitPower input component
         */
        get emitPower(): NodeParticleConnectionPoint;
        /**
         * Gets the lifeTime input component
         */
        get lifeTime(): NodeParticleConnectionPoint;
        /**
         * Gets the color input component
         */
        get color(): NodeParticleConnectionPoint;
        /**
         * Gets the color dead input component
         */
        get colorDead(): NodeParticleConnectionPoint;
        /**
         * Gets the scale input component
         */
        get scale(): NodeParticleConnectionPoint;
        /**
         * Gets the angle input component
         */
        get angle(): NodeParticleConnectionPoint;
        /**
         * Gets the size component
         */
        get size(): NodeParticleConnectionPoint;
        /**
         * Gets the particle output component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * @internal
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for createParticleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCreateParticleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import createParticleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide a flow of particles emitted from a cone shape.
     */
    export class ConeShapeBlock extends NodeParticleBlock implements IShapeBlock {
        /**
         * Gets or sets a boolean indicating if the system should emit only from the spawn point
         * DirectionRandomizer will be used for the particles initial direction unless both direction1 and direction2 are connected.
         */
        emitFromSpawnPointOnly: boolean;
        /**
         * Create a new ConeShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle input component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the radius input component
         */
        get radius(): NodeParticleConnectionPoint;
        /**
         * Gets the angle input component
         */
        get angle(): NodeParticleConnectionPoint;
        /**
         * Gets the radiusRange input component
         */
        get radiusRange(): NodeParticleConnectionPoint;
        /**
         * Gets the heightRange input component
         */
        get heightRange(): NodeParticleConnectionPoint;
        /**
         * Gets the directionRandomizer input component
         */
        get directionRandomizer(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
        private _calculateHeight;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for coneShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterConeShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import coneShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide a flow of particles emitted from a box shape.
     */
    export class BoxShapeBlock extends NodeParticleBlock implements IShapeBlock {
        /**
         * Create a new BoxShapeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the particle input component
         */
        get particle(): NodeParticleConnectionPoint;
        /**
         * Gets the direction1 input component
         */
        get direction1(): NodeParticleConnectionPoint;
        /**
         * Gets the direction2 input component
         */
        get direction2(): NodeParticleConnectionPoint;
        /**
         * Gets the minEmitBox input component
         */
        get minEmitBox(): NodeParticleConnectionPoint;
        /**
         * Gets the maxEmitBox input component
         */
        get maxEmitBox(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        /**
         * Builds the block
         * @param state defines the build state
         */
        _build(state: NodeParticleBuildState): void;
    }
    /**
     * Register side effects for boxShapeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBoxShapeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import boxShapeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Interface for shape blocks in the particle system.
     */
    export interface IShapeBlock {
        /**
         * Gets the particle component
         */
        particle: NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        output: NodeParticleConnectionPoint;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Conditions supported by the condition block
     */
    export enum ParticleConditionBlockTests {
        /** Equal */
        Equal = 0,
        /** NotEqual */
        NotEqual = 1,
        /** LessThan */
        LessThan = 2,
        /** GreaterThan */
        GreaterThan = 3,
        /** LessOrEqual */
        LessOrEqual = 4,
        /** GreaterOrEqual */
        GreaterOrEqual = 5,
        /** Logical Exclusive OR */
        Xor = 6,
        /** Logical Or */
        Or = 7,
        /** Logical And */
        And = 8
    }
    /**
     * Block used to evaluate a condition and return a true or false value as a float (1 or 0).
     */
    export class ParticleConditionBlock extends NodeParticleBlock {
        /**
         * Gets or sets the test used by the block
         */
        test: ParticleConditionBlockTests;
        /**
         * Gets or sets the epsilon value used for comparison
         */
        epsilon: number;
        /**
         * Create a new ParticleConditionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeParticleConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeParticleConnectionPoint;
        /**
         * Gets the ifTrue input component
         */
        get ifTrue(): NodeParticleConnectionPoint;
        /**
         * Gets the ifFalse input component
         */
        get ifFalse(): NodeParticleConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeParticleConnectionPoint;
        _build(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for particleConditionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleConditionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleConditionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Particle emitter emitting particles from the inside of a sphere.
     * It emits the particles alongside the sphere radius. The emission direction might be randomized.
     */
    export class SphereParticleEmitter implements IParticleEmitterType {
        /**
         * [1] The radius of the emission sphere.
         */
        radius: number;
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange: number;
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer: number;
        /**
         * Creates a new instance SphereParticleEmitter
         * @param radius the radius of the emission sphere (1 by default)
         * @param radiusRange the range of the emission sphere [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param directionRandomizer defines how much to randomize the particle direction [0-1]
         */
        constructor(
        /**
         * [1] The radius of the emission sphere.
         */
        radius?: number, 
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange?: number, 
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer?: number);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): SphereParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "SphereParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }
    /**
     * Particle emitter emitting particles from the inside of a sphere.
     * It emits the particles randomly between two vectors.
     */
    export class SphereDirectedParticleEmitter extends SphereParticleEmitter {
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1: Vector3;
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2: Vector3;
        /**
         * Creates a new instance SphereDirectedParticleEmitter
         * @param radius the radius of the emission sphere (1 by default)
         * @param direction1 the min limit of the emission direction (up vector by default)
         * @param direction2 the max limit of the emission direction (up vector by default)
         */
        constructor(radius?: number, 
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1?: Vector3, 
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2?: Vector3);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): SphereDirectedParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "SphereDirectedParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Particle emitter emitting particles from a point.
     * It emits the particles randomly between 2 given directions.
     */
    export class PointParticleEmitter implements IParticleEmitterType {
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction1: Vector3;
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction2: Vector3;
        /**
         * Creates a new instance PointParticleEmitter
         */
        constructor();
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): PointParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "PointParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /**
     * Particle emitter emitting particles from the inside of a box.
     * It emits the particles randomly between 2 given directions.
     */
    export class MeshParticleEmitter implements IParticleEmitterType {
        private _indices;
        private _positions;
        private _normals;
        private _storedNormal;
        private _mesh;
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction1: Vector3;
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction2: Vector3;
        /**
         * Gets or sets a boolean indicating that particle directions must be built from mesh face normals
         */
        useMeshNormalsForDirection: boolean;
        /** Defines the mesh to use as source */
        get mesh(): Nullable<AbstractMesh>;
        set mesh(value: Nullable<AbstractMesh>);
        /**
         * Creates a new instance MeshParticleEmitter
         * @param mesh defines the mesh to use as source
         */
        constructor(mesh?: Nullable<AbstractMesh>);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): MeshParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "BoxParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         * @param scene defines the hosting scene
         */
        parse(serializationObject: any, scene: Nullable<Scene>): void;
    }




    /**
     * Particle emitter emitting particles from the inside of a hemisphere.
     * It emits the particles alongside the hemisphere radius. The emission direction might be randomized.
     */
    export class HemisphericParticleEmitter implements IParticleEmitterType {
        /**
         * [1] The radius of the emission hemisphere.
         */
        radius: number;
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange: number;
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer: number;
        /**
         * Creates a new instance HemisphericParticleEmitter
         * @param radius the radius of the emission hemisphere (1 by default)
         * @param radiusRange the range of the emission hemisphere [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param directionRandomizer defines how much to randomize the particle direction [0-1]
         */
        constructor(
        /**
         * [1] The radius of the emission hemisphere.
         */
        radius?: number, 
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange?: number, 
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer?: number);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): HemisphericParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "HemisphericParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /**
     * Particle emitter emitting particles from the inside of a cylinder.
     * It emits the particles alongside the cylinder radius. The emission direction might be randomized.
     */
    export class CylinderParticleEmitter implements IParticleEmitterType {
        /**
         * [1] The radius of the emission cylinder.
         */
        radius: number;
        /**
         * [1] The height of the emission cylinder.
         */
        height: number;
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange: number;
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer: number;
        private _tempVector;
        /**
         * Creates a new instance CylinderParticleEmitter
         * @param radius the radius of the emission cylinder (1 by default)
         * @param height the height of the emission cylinder (1 by default)
         * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param directionRandomizer defines how much to randomize the particle direction [0-1]
         */
        constructor(
        /**
         * [1] The radius of the emission cylinder.
         */
        radius?: number, 
        /**
         * [1] The height of the emission cylinder.
         */
        height?: number, 
        /**
         * [1] The range of emission [0-1] 0 Surface only, 1 Entire Radius.
         */
        radiusRange?: number, 
        /**
         * [0] How much to randomize the particle direction [0-1].
         */
        directionRandomizer?: number);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         * @param inverseWorldMatrix defines the inverted world matrix to use if isLocal is false
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean, inverseWorldMatrix: Matrix): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): CylinderParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "CylinderParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }
    /**
     * Particle emitter emitting particles from the inside of a cylinder.
     * It emits the particles randomly between two vectors.
     */
    export class CylinderDirectedParticleEmitter extends CylinderParticleEmitter {
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1: Vector3;
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2: Vector3;
        /**
         * Creates a new instance CylinderDirectedParticleEmitter
         * @param radius the radius of the emission cylinder (1 by default)
         * @param height the height of the emission cylinder (1 by default)
         * @param radiusRange the range of the emission cylinder [0-1] 0 Surface only, 1 Entire Radius (1 by default)
         * @param direction1 the min limit of the emission direction (up vector by default)
         * @param direction2 the max limit of the emission direction (up vector by default)
         */
        constructor(radius?: number, height?: number, radiusRange?: number, 
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1?: Vector3, 
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2?: Vector3);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param _particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, _particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): CylinderDirectedParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "CylinderDirectedParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /** Represents and empty generator function */
    export const EmptyGeneratorFunc: () => void;
    /**
     * Particle emitter emitting particles from a custom list of positions.
     */
    export class CustomParticleEmitter implements IParticleEmitterType {
        /**
         * Gets or sets the position generator that will create the initial position of each particle.
         * Index will be provided when used with GPU particle. Particle will be provided when used with CPU particles
         */
        particlePositionGenerator: (index: number, particle: Nullable<Particle>, outPosition: Vector3) => void;
        /**
         * Gets or sets the destination generator that will create the final destination of each particle.
         *  * Index will be provided when used with GPU particle. Particle will be provided when used with CPU particles
         */
        particleDestinationGenerator: (index: number, particle: Nullable<Particle>, outDestination: Vector3) => void;
        /**
         * Gets or sets the direction generator that will create the initial direction of each particle.
         *  * Index will be provided when used with GPU particle. Particle will be provided when used with CPU particles
         */
        particleDirectionGenerator: (index: number, particle: Nullable<Particle>, outDestination: Vector3) => void;
        /**
         * Creates a new instance CustomParticleEmitter
         */
        constructor();
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): CustomParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "PointParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /**
     * Particle emitter emitting particles from the inside of a cone.
     * It emits the particles alongside the cone volume from the base to the particle.
     * The emission direction might be randomized.
     */
    export class ConeParticleEmitter implements IParticleEmitterType {
        /** [0] defines how much to randomize the particle direction [0-1] (default is 0) */
        directionRandomizer: number;
        private _radius;
        private _angle;
        private _height;
        /**
         * Gets or sets a value indicating where on the radius the start position should be picked (1 = everywhere, 0 = only surface)
         */
        radiusRange: number;
        /**
         * Gets or sets a value indicating where on the height the start position should be picked (1 = everywhere, 0 = only surface)
         */
        heightRange: number;
        /**
         * Gets or sets a value indicating if all the particles should be emitted from the spawn point only (the base of the cone)
         */
        emitFromSpawnPointOnly: boolean;
        /**
         * Gets or sets the radius of the emission cone
         */
        get radius(): number;
        set radius(value: number);
        /**
         * Gets or sets the angle of the emission cone
         */
        get angle(): number;
        set angle(value: number);
        private _buildHeight;
        /**
         * Creates a new instance ConeParticleEmitter
         * @param radius the radius of the emission cone (1 by default)
         * @param angle the cone base angle (PI by default)
         * @param directionRandomizer defines how much to randomize the particle direction [0-1] (default is 0)
         */
        constructor(radius?: number, angle?: number, 
        /** [0] defines how much to randomize the particle direction [0-1] (default is 0) */
        directionRandomizer?: number);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): ConeParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "ConeParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }
    export class ConeDirectedParticleEmitter extends ConeParticleEmitter {
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1: Vector3;
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2: Vector3;
        constructor(radius?: number, angle?: number, 
        /**
         * [Up vector] The min limit of the emission direction.
         */
        direction1?: Vector3, 
        /**
         * [Up vector] The max limit of the emission direction.
         */
        direction2?: Vector3);
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): ConeDirectedParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "ConeDirectedParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /**
     * Particle emitter emitting particles from the inside of a box.
     * It emits the particles randomly between 2 given directions.
     */
    export class BoxParticleEmitter implements IParticleEmitterType {
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction1: Vector3;
        /**
         * Random direction of each particle after it has been emitted, between direction1 and direction2 vectors.
         */
        direction2: Vector3;
        /**
         * Minimum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
         */
        minEmitBox: Vector3;
        /**
         * Maximum box point around our emitter. Our emitter is the center of particles source, but if you want your particles to emit from more than one point, then you can tell it to do so.
         */
        maxEmitBox: Vector3;
        /**
         * Creates a new instance BoxParticleEmitter
         */
        constructor();
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): BoxParticleEmitter;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns a string containing the defines string
         */
        getEffectDefines(): string;
        /**
         * Returns the string "BoxParticleEmitter"
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         */
        parse(serializationObject: any): void;
    }


    /**
     * Particle emitter represents a volume emitting particles.
     * This is the responsibility of the implementation to define the volume shape like cone/sphere/box.
     */
    export interface IParticleEmitterType {
        /**
         * Called by the particle System when the direction is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param directionToUpdate is the direction vector to update with the result
         * @param particle is the particle we are computed the direction for
         * @param isLocal defines if the direction should be set in local space
         * @param inverseWorldMatrix defines the inverted world matrix to use if isLocal is false
         */
        startDirectionFunction(worldMatrix: Matrix, directionToUpdate: Vector3, particle: Particle, isLocal: boolean, inverseWorldMatrix: Matrix): void;
        /**
         * Called by the particle System when the position is computed for the created particle.
         * @param worldMatrix is the world matrix of the particle system
         * @param positionToUpdate is the position vector to update with the result
         * @param particle is the particle we are computed the position for
         * @param isLocal defines if the position should be set in local space
         */
        startPositionFunction(worldMatrix: Matrix, positionToUpdate: Vector3, particle: Particle, isLocal: boolean): void;
        /**
         * Clones the current emitter and returns a copy of it
         * @returns the new emitter
         */
        clone(): IParticleEmitterType;
        /**
         * Called by the GPUParticleSystem to setup the update shader
         * @param uboOrEffect defines the update shader
         */
        applyToShader(uboOrEffect: UniformBufferEffectCommonAccessor): void;
        /**
         * Creates the structure of the ubo for this particle emitter
         * @param ubo ubo to create the structure for
         */
        buildUniformLayout(ubo: UniformBuffer): void;
        /**
         * Returns a string to use to update the GPU particles update shader
         * @returns the effect defines string
         */
        getEffectDefines(): string;
        /**
         * Returns a string representing the class name
         * @returns a string containing the class name
         */
        getClassName(): string;
        /**
         * Serializes the particle system to a JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parse properties from a JSON object
         * @param serializationObject defines the JSON object
         * @param scene defines the hosting scene
         */
        parse(serializationObject: any, scene: Nullable<Scene>): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * Class used to enable access to IndexedDB
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached
     */
    export class Database implements IOfflineProvider {
        private _currentSceneUrl;
        private _db;
        private _enableSceneOffline;
        private _enableTexturesOffline;
        private _manifestVersionFound;
        private _mustUpdateResources;
        private _hasReachedQuota;
        private _isSupported;
        private _idbFactory;
        /** Gets a boolean indicating if the user agent supports blob storage (this value will be updated after creating the first Database object) */
        private static _IsUaSupportingBlobStorage;
        /**
         * Gets a boolean indicating if Database storage is enabled (off by default)
         */
        static IDBStorageEnabled: boolean;
        /**
         * Gets a boolean indicating if scene must be saved in the database
         */
        get enableSceneOffline(): boolean;
        /**
         * Gets a boolean indicating if textures must be saved in the database
         */
        get enableTexturesOffline(): boolean;
        /**
         * Creates a new Database
         * @param urlToScene defines the url to load the scene
         * @param callbackManifestChecked defines the callback to use when manifest is checked
         * @param disableManifestCheck defines a boolean indicating that we want to skip the manifest validation (it will be considered validated and up to date)
         */
        constructor(urlToScene: string, callbackManifestChecked: (checked: boolean) => any, disableManifestCheck?: boolean);
        private static _ParseURL;
        private static _ReturnFullUrlLocation;
        private _checkManifestFile;
        /**
         * Open the database and make it available
         * @param successCallback defines the callback to call on success
         * @param errorCallback defines the callback to call on error
         */
        open(successCallback: () => void, errorCallback: () => void): void;
        /**
         * Loads an image from the database
         * @param url defines the url to load from
         * @param image defines the target DOM image
         */
        loadImage(url: string, image: HTMLImageElement): void;
        private _loadImageFromDB;
        private _saveImageIntoDB;
        private _checkVersionFromDB;
        private _loadVersionFromDB;
        private _saveVersionIntoDB;
        /**
         * Loads a file from database
         * @param url defines the URL to load from
         * @param sceneLoaded defines a callback to call on success
         * @param progressCallBack defines a callback to call when progress changed
         * @param errorCallback defines a callback to call on error
         * @param useArrayBuffer defines a boolean to use array buffer instead of text string
         */
        loadFile(url: string, sceneLoaded: (data: any) => void, progressCallBack?: (data: any) => void, errorCallback?: () => void, useArrayBuffer?: boolean): void;
        private _loadFile;
        private _saveFile;
        /**
         * Validates if xhr data is correct
         * @param xhr defines the request to validate
         * @param dataType defines the expected data type
         * @returns true if data is correct
         */
        private static _ValidateXHRData;
    }
    /**
     * Register side effects for database.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDatabase(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import database.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to enable access to offline support
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimizeCached
     */
    export interface IOfflineProvider {
        /**
         * Gets a boolean indicating if scene must be saved in the database
         */
        enableSceneOffline: boolean;
        /**
         * Gets a boolean indicating if textures must be saved in the database
         */
        enableTexturesOffline: boolean;
        /**
         * Open the offline support and make it available
         * @param successCallback defines the callback to call on success
         * @param errorCallback defines the callback to call on error
         */
        open(successCallback: () => void, errorCallback: () => void): void;
        /**
         * Loads an image from the offline support
         * @param url defines the url to load from
         * @param image defines the target DOM image
         */
        loadImage(url: string, image: HTMLImageElement): void;
        /**
         * Loads a file from offline support
         * @param url defines the URL to load from
         * @param sceneLoaded defines a callback to call on success
         * @param progressCallBack defines a callback to call when progress changed
         * @param errorCallback defines a callback to call on error
         * @param useArrayBuffer defines a boolean to use array buffer instead of text string
         */
        loadFile(url: string, sceneLoaded: (data: any) => void, progressCallBack?: (data: any) => void, errorCallback?: () => void, useArrayBuffer?: boolean): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * A container with an original object and information about that object.
     * on some other object.
     */
    export interface IObjectInfo<T, O = any> {
        /**
         * The original object.
         */
        object: O;
        /**
         * Information about the object.
         */
        info: T;
    }
    /**
     * Interface for a converter that takes a string path and transforms
     * it into an ObjectAccessorContainer.
     */
    export interface IPathToObjectConverter<T> {
        /**
         * Convert a path to an object that can be used to access properties of a base object
         * @param path the path to convert
         * @returns an object that can be used to access properties of a base object
         */
        convert(path: string): IObjectInfo<T>;
    }




    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * Navigation plugin interface to add navigation constrained by a navigation mesh
     */
    export interface INavigationEnginePlugin {
        /**
         * plugin name
         */
        name: string;
        /**
         * Creates a navigation mesh
         * @param meshes array of all the geometry used to compute the navigation mesh
         * @param parameters bunch of parameters used to filter geometry
         */
        createNavMesh(meshes: Array<Mesh>, parameters: INavMeshParameters): void;
        /**
         * Create a navigation mesh debug mesh
         * @param scene is where the mesh will be added
         * @returns debug display mesh
         */
        createDebugNavMesh(scene: Scene): Mesh;
        /**
         * Get a navigation mesh constrained position, closest to the parameter position
         * @param position world position
         * @returns the closest point to position constrained by the navigation mesh
         */
        getClosestPoint(position: Vector3): Vector3;
        /**
         * Get a navigation mesh constrained position, closest to the parameter position
         * @param position world position
         * @param result output the closest point to position constrained by the navigation mesh
         */
        getClosestPointToRef(position: Vector3, result: Vector3): void;
        /**
         * Get a navigation mesh constrained position, within a particular radius
         * @param position world position
         * @param maxRadius the maximum distance to the constrained world position
         * @returns the closest point to position constrained by the navigation mesh
         */
        getRandomPointAround(position: Vector3, maxRadius: number): Vector3;
        /**
         * Get a navigation mesh constrained position, within a particular radius
         * @param position world position
         * @param maxRadius the maximum distance to the constrained world position
         * @param result output the closest point to position constrained by the navigation mesh
         */
        getRandomPointAroundToRef(position: Vector3, maxRadius: number, result: Vector3): void;
        /**
         * Compute the final position from a segment made of destination-position
         * @param position world position
         * @param destination world position
         * @returns the resulting point along the navmesh
         */
        moveAlong(position: Vector3, destination: Vector3): Vector3;
        /**
         * Compute the final position from a segment made of destination-position
         * @param position world position
         * @param destination world position
         * @param result output the resulting point along the navmesh
         */
        moveAlongToRef(position: Vector3, destination: Vector3, result: Vector3): void;
        /**
         * Compute a navigation path from start to end. Returns an empty array if no path can be computed.
         * Path is straight.
         * @param start world position
         * @param end world position
         * @returns array containing world position composing the path
         */
        computePath(start: Vector3, end: Vector3): Vector3[];
        /**
         * Compute a navigation path from start to end. Returns an empty array if no path can be computed.
         * Path follows navigation mesh geometry.
         * @param start world position
         * @param end world position
         * @returns array containing world position composing the path
         */
        computePathSmooth(start: Vector3, end: Vector3): Vector3[];
        /**
         * If this plugin is supported
         * @returns true if plugin is supported
         */
        isSupported(): boolean;
        /**
         * Create a new Crowd so you can add agents
         * @param maxAgents the maximum agent count in the crowd
         * @param maxAgentRadius the maximum radius an agent can have
         * @param scene to attach the crowd to
         * @returns the crowd you can add agents to
         */
        createCrowd(maxAgents: number, maxAgentRadius: number, scene: Scene): ICrowd;
        /**
         * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...)
         * The queries will try to find a solution within those bounds
         * default is (1,1,1)
         * @param extent x,y,z value that define the extent around the queries point of reference
         */
        setDefaultQueryExtent(extent: Vector3): void;
        /**
         * Get the Bounding box extent specified by setDefaultQueryExtent
         * @returns the box extent values
         */
        getDefaultQueryExtent(): Vector3;
        /**
         * build the navmesh from a previously saved state using getNavmeshData
         * @param data the Uint8Array returned by getNavmeshData
         */
        buildFromNavmeshData(data: Uint8Array): void;
        /**
         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
         * @returns data the Uint8Array that can be saved and reused
         */
        getNavmeshData(): Uint8Array;
        /**
         * Get the Bounding box extent result specified by setDefaultQueryExtent
         * @param result output the box extent values
         */
        getDefaultQueryExtentToRef(result: Vector3): void;
        /**
         * Set the time step of the navigation tick update.
         * Default is 1/60.
         * A value of 0 will disable fixed time update
         * @param newTimeStep the new timestep to apply to this world.
         */
        setTimeStep(newTimeStep: number): void;
        /**
         * Get the time step of the navigation tick update.
         * @returns the current time step
         */
        getTimeStep(): number;
        /**
         * If delta time in navigation tick update is greater than the time step
         * a number of sub iterations are done. If more iterations are needed to reach deltatime
         * they will be discarded.
         * A value of 0 will set to no maximum and update will use as many substeps as needed
         * @param newStepCount the maximum number of iterations
         */
        setMaximumSubStepCount(newStepCount: number): void;
        /**
         * Get the maximum number of iterations per navigation tick update
         * @returns the maximum number of iterations
         */
        getMaximumSubStepCount(): number;
        /**
         * Creates a cylinder obstacle and add it to the navigation
         * @param position world position
         * @param radius cylinder radius
         * @param height cylinder height
         * @returns the obstacle freshly created
         */
        addCylinderObstacle(position: Vector3, radius: number, height: number): Nullable<IObstacle>;
        /**
         * Creates an oriented box obstacle and add it to the navigation
         * @param position world position
         * @param extent box size
         * @param angle angle in radians of the box orientation on Y axis
         * @returns the obstacle freshly created
         */
        addBoxObstacle(position: Vector3, extent: Vector3, angle: number): Nullable<IObstacle>;
        /**
         * Removes an obstacle created by addCylinderObstacle or addBoxObstacle
         * @param obstacle obstacle to remove from the navigation
         */
        removeObstacle(obstacle: IObstacle): void;
        /**
         * Release all resources
         */
        dispose(): void;
    }
    /**
     * Obstacle type
     */
    export type IObstacle = {
        type: "box";
        ref: unknown;
        position: Vector3;
        halfExtents: Vector3;
        angle: number;
    } | {
        type: "cylinder";
        ref: unknown;
        position: Vector3;
        radius: number;
        height: number;
    };
    /**
     * Crowd Interface. A Crowd is a collection of moving agents constrained by a navigation mesh
     */
    export interface ICrowd {
        /**
         * Add a new agent to the crowd with the specified parameter a corresponding transformNode.
         * You can attach anything to that node. The node position is updated in the scene update tick.
         * @param pos world position that will be constrained by the navigation mesh
         * @param parameters agent parameters
         * @param transform hooked to the agent that will be update by the scene
         * @returns agent index
         */
        addAgent(pos: Vector3, parameters: IAgentParameters, transform: TransformNode): number;
        /**
         * Returns the agent position in world space
         * @param index agent index returned by addAgent
         * @returns world space position
         */
        getAgentPosition(index: number): Vector3;
        /**
         * Gets the agent position result in world space
         * @param index agent index returned by addAgent
         * @param result output world space position
         */
        getAgentPositionToRef(index: number, result: Vector3): void;
        /**
         * Gets the agent velocity in world space
         * @param index agent index returned by addAgent
         * @returns world space velocity
         */
        getAgentVelocity(index: number): Vector3;
        /**
         * Gets the agent velocity result in world space
         * @param index agent index returned by addAgent
         * @param result output world space velocity
         */
        getAgentVelocityToRef(index: number, result: Vector3): void;
        /**
         * Gets the agent next target point on the path
         * @param index agent index returned by addAgent
         * @returns world space position
         */
        getAgentNextTargetPath(index: number): Vector3;
        /**
         * Gets the agent state
         * @param index agent index returned by addAgent
         * @returns agent state
         */
        getAgentState(index: number): number;
        /**
         * returns true if the agent in over an off mesh link connection
         * @param index agent index returned by addAgent
         * @returns true if over an off mesh link connection
         */
        overOffmeshConnection(index: number): boolean;
        /**
         * Gets the agent next target point on the path
         * @param index agent index returned by addAgent
         * @param result output world space position
         */
        getAgentNextTargetPathToRef(index: number, result: Vector3): void;
        /**
         * remove a particular agent previously created
         * @param index agent index returned by addAgent
         */
        removeAgent(index: number): void;
        /**
         * get the list of all agents attached to this crowd
         * @returns list of agent indices
         */
        getAgents(): number[];
        /**
         * Tick update done by the Scene. Agent position/velocity/acceleration is updated by this function
         * @param deltaTime in seconds
         */
        update(deltaTime: number): void;
        /**
         * Asks a particular agent to go to a destination. That destination is constrained by the navigation mesh
         * @param index agent index returned by addAgent
         * @param destination targeted world position
         */
        agentGoto(index: number, destination: Vector3): void;
        /**
         * Teleport the agent to a new position
         * @param index agent index returned by addAgent
         * @param destination targeted world position
         */
        agentTeleport(index: number, destination: Vector3): void;
        /**
         * Update agent parameters
         * @param index agent index returned by addAgent
         * @param parameters agent parameters
         */
        updateAgentParameters(index: number, parameters: IAgentParameters): void;
        /**
         * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...)
         * The queries will try to find a solution within those bounds
         * default is (1,1,1)
         * @param extent x,y,z value that define the extent around the queries point of reference
         */
        setDefaultQueryExtent(extent: Vector3): void;
        /**
         * Get the Bounding box extent specified by setDefaultQueryExtent
         * @returns the box extent values
         */
        getDefaultQueryExtent(): Vector3;
        /**
         * Get the Bounding box extent result specified by setDefaultQueryExtent
         * @param result output the box extent values
         */
        getDefaultQueryExtentToRef(result: Vector3): void;
        /**
         * Get the next corner points composing the path (max 4 points)
         * @param index agent index returned by addAgent
         * @returns array containing world position composing the path
         */
        getCorners(index: number): Vector3[];
        /**
         * Release all resources
         */
        dispose(): void;
    }
    /**
     * Configures an agent
     */
    export interface IAgentParameters {
        /**
         *  Agent radius. [Limit: >= 0]
         */
        radius: number;
        /**
         * Agent height. [Limit: > 0]
         */
        height: number;
        /**
         *  Maximum allowed acceleration. [Limit: >= 0]
         */
        maxAcceleration: number;
        /**
         * Maximum allowed speed. [Limit: >= 0]
         */
        maxSpeed: number;
        /**
         * Defines how close a collision element must be before it is considered for steering behaviors. [Limits: > 0]
         */
        collisionQueryRange: number;
        /**
         * The path visibility optimization range. [Limit: > 0]
         */
        pathOptimizationRange: number;
        /**
         * How aggressive the agent manager should be at avoiding collisions with this agent. [Limit: >= 0]
         */
        separationWeight: number;
        /**
         * Observers will be notified when agent gets inside the virtual circle with this Radius around destination point.
         * Default is agent radius
         */
        reachRadius?: number;
    }
    /**
     * Configures the navigation mesh creation
     */
    export interface INavMeshParameters {
        /**
         * The xz-plane cell size to use for fields. [Limit: > 0] [Units: wu]
         */
        cs: number;
        /**
         * The y-axis cell size to use for fields. [Limit: > 0] [Units: wu]
         */
        ch: number;
        /**
         * The maximum slope that is considered walkable. [Limits: 0 <= value < 90] [Units: Degrees]
         */
        walkableSlopeAngle: number;
        /**
         * Minimum floor to 'ceiling' height that will still allow the floor area to
         * be considered walkable. [Limit: >= 3] [Units: vx]
         */
        walkableHeight: number;
        /**
         * Maximum ledge height that is considered to still be traversable. [Limit: >=0] [Units: vx]
         */
        walkableClimb: number;
        /**
         * The distance to erode/shrink the walkable area of the heightfield away from
         * obstructions.  [Limit: >=0] [Units: vx]
         */
        walkableRadius: number;
        /**
         * The maximum allowed length for contour edges along the border of the mesh. [Limit: >=0] [Units: vx]
         */
        maxEdgeLen: number;
        /**
         * The maximum distance a simplified contour's border edges should deviate
         * the original raw contour. [Limit: >=0] [Units: vx]
         */
        maxSimplificationError: number;
        /**
         * The minimum number of cells allowed to form isolated island areas. [Limit: >=0] [Units: vx]
         */
        minRegionArea: number;
        /**
         * Any regions with a span count smaller than this value will, if possible,
         * be merged with larger regions. [Limit: >=0] [Units: vx]
         */
        mergeRegionArea: number;
        /**
         * The maximum number of vertices allowed for polygons generated during the
         * contour to polygon conversion process. [Limit: >= 3]
         */
        maxVertsPerPoly: number;
        /**
         * Sets the sampling distance to use when generating the detail mesh.
         * (For height detail only.) [Limits: 0 or >= 0.9] [Units: wu]
         */
        detailSampleDist: number;
        /**
         * The maximum distance the detail mesh surface should deviate from heightfield
         * data. (For height detail only.) [Limit: >=0] [Units: wu]
         */
        detailSampleMaxError: number;
        /**
         * If using obstacles, the navmesh must be subdivided internally by tiles.
         * This member defines the tile cube side length in world units.
         * If no obstacles are needed, leave it undefined or 0.
         */
        tileSize?: number;
        /**
         * The size of the non-navigable border around the heightfield.
         */
        borderSize?: number;
    }


    /**
     * RecastJS navigation plugin
     */
    export class RecastJSPlugin implements INavigationEnginePlugin {
        /**
         * Reference to the Recast library
         */
        bjsRECAST: any;
        /**
         * plugin name
         */
        name: string;
        /**
         * the first navmesh created. We might extend this to support multiple navmeshes
         */
        navMesh: any;
        private _maximumSubStepCount;
        private _timeStep;
        private _timeFactor;
        private _tempVec1;
        private _tempVec2;
        private _worker;
        /**
         * Initializes the recastJS plugin
         * @param recastInjection can be used to inject your own recast reference
         */
        constructor(recastInjection?: any);
        /**
         * Set worker URL to be used when generating a new navmesh
         * @param workerURL url string
         * @returns boolean indicating if worker is created
         */
        setWorkerURL(workerURL: string | URL): boolean;
        /**
         * Set the time step of the navigation tick update.
         * Default is 1/60.
         * A value of 0 will disable fixed time update
         * @param newTimeStep the new timestep to apply to this world.
         */
        setTimeStep(newTimeStep?: number): void;
        /**
         * Get the time step of the navigation tick update.
         * @returns the current time step
         */
        getTimeStep(): number;
        /**
         * If delta time in navigation tick update is greater than the time step
         * a number of sub iterations are done. If more iterations are needed to reach deltatime
         * they will be discarded.
         * A value of 0 will set to no maximum and update will use as many substeps as needed
         * @param newStepCount the maximum number of iterations
         */
        setMaximumSubStepCount(newStepCount?: number): void;
        /**
         * Get the maximum number of iterations per navigation tick update
         * @returns the maximum number of iterations
         */
        getMaximumSubStepCount(): number;
        /**
         * Time factor applied when updating crowd agents (default 1). A value of 0 will pause crowd updates.
         * @param value the time factor applied at update
         */
        set timeFactor(value: number);
        /**
         * Get the time factor used for crowd agent update
         * @returns the time factor
         */
        get timeFactor(): number;
        /**
         * Creates a navigation mesh
         * @param meshes array of all the geometry used to compute the navigation mesh
         * @param parameters bunch of parameters used to filter geometry
         * @param completion callback when data is available from the worker. Not used without a worker
         */
        createNavMesh(meshes: Array<Mesh>, parameters: INavMeshParameters, completion?: (navmeshData: Uint8Array) => void): void;
        /**
         * Create a navigation mesh debug mesh
         * @param scene is where the mesh will be added
         * @returns debug display mesh
         */
        createDebugNavMesh(scene: Scene): Mesh;
        /**
         * Get a navigation mesh constrained position, closest to the parameter position
         * @param position world position
         * @returns the closest point to position constrained by the navigation mesh
         */
        getClosestPoint(position: Vector3): Vector3;
        /**
         * Get a navigation mesh constrained position, closest to the parameter position
         * @param position world position
         * @param result output the closest point to position constrained by the navigation mesh
         */
        getClosestPointToRef(position: Vector3, result: Vector3): void;
        /**
         * Get a navigation mesh constrained position, within a particular radius
         * @param position world position
         * @param maxRadius the maximum distance to the constrained world position
         * @returns the closest point to position constrained by the navigation mesh
         */
        getRandomPointAround(position: Vector3, maxRadius: number): Vector3;
        /**
         * Get a navigation mesh constrained position, within a particular radius
         * @param position world position
         * @param maxRadius the maximum distance to the constrained world position
         * @param result output the closest point to position constrained by the navigation mesh
         */
        getRandomPointAroundToRef(position: Vector3, maxRadius: number, result: Vector3): void;
        /**
         * Compute the final position from a segment made of destination-position
         * @param position world position
         * @param destination world position
         * @returns the resulting point along the navmesh
         */
        moveAlong(position: Vector3, destination: Vector3): Vector3;
        /**
         * Compute the final position from a segment made of destination-position
         * @param position world position
         * @param destination world position
         * @param result output the resulting point along the navmesh
         */
        moveAlongToRef(position: Vector3, destination: Vector3, result: Vector3): void;
        private _convertNavPathPoints;
        /**
         * Compute a navigation path from start to end. Returns an empty array if no path can be computed
         * Path is straight.
         * @param start world position
         * @param end world position
         * @returns array containing world position composing the path
         */
        computePath(start: Vector3, end: Vector3): Vector3[];
        /**
         * Compute a navigation path from start to end. Returns an empty array if no path can be computed.
         * Path follows navigation mesh geometry.
         * @param start world position
         * @param end world position
         * @returns array containing world position composing the path
         */
        computePathSmooth(start: Vector3, end: Vector3): Vector3[];
        /**
         * Create a new Crowd so you can add agents
         * @param maxAgents the maximum agent count in the crowd
         * @param maxAgentRadius the maximum radius an agent can have
         * @param scene to attach the crowd to
         * @returns the crowd you can add agents to
         */
        createCrowd(maxAgents: number, maxAgentRadius: number, scene: Scene): ICrowd;
        /**
         * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...)
         * The queries will try to find a solution within those bounds
         * default is (1,1,1)
         * @param extent x,y,z value that define the extent around the queries point of reference
         */
        setDefaultQueryExtent(extent: Vector3): void;
        /**
         * Get the Bounding box extent specified by setDefaultQueryExtent
         * @returns the box extent values
         */
        getDefaultQueryExtent(): Vector3;
        /**
         * build the navmesh from a previously saved state using getNavmeshData
         * @param data the Uint8Array returned by getNavmeshData
         */
        buildFromNavmeshData(data: Uint8Array): void;
        /**
         * returns the navmesh data that can be used later. The navmesh must be built before retrieving the data
         * @returns data the Uint8Array that can be saved and reused
         */
        getNavmeshData(): Uint8Array;
        /**
         * Get the Bounding box extent result specified by setDefaultQueryExtent
         * @param result output the box extent values
         */
        getDefaultQueryExtentToRef(result: Vector3): void;
        /**
         * Disposes of the plugin resources
         */
        dispose(): void;
        /**
         * Creates a cylinder obstacle and add it to the navigation
         * @param position world position
         * @param radius cylinder radius
         * @param height cylinder height
         * @returns the obstacle freshly created
         */
        addCylinderObstacle(position: Vector3, radius: number, height: number): Nullable<IObstacle>;
        /**
         * Creates an oriented box obstacle and add it to the navigation
         * @param position world position
         * @param extent box size
         * @param angle angle in radians of the box orientation on Y axis
         * @returns the obstacle freshly created
         */
        addBoxObstacle(position: Vector3, extent: Vector3, angle: number): Nullable<IObstacle>;
        /**
         * Removes an obstacle created by addCylinderObstacle or addBoxObstacle
         * @param obstacle obstacle to remove from the navigation
         */
        removeObstacle(obstacle: IObstacle): void;
        /**
         * If this plugin is supported
         * @returns true if plugin is supported
         */
        isSupported(): boolean;
        /**
         * Returns the seed used for randomized functions like `getRandomPointAround`
         * @returns seed number
         */
        getRandomSeed(): number;
        /**
         * Set the seed used for randomized functions like `getRandomPointAround`
         * @param seed number used as seed for random functions
         */
        setRandomSeed(seed: number): void;
    }
    /**
     * Recast detour crowd implementation
     */
    export class RecastJSCrowd implements ICrowd {
        /**
         * Recast/detour plugin
         */
        bjsRECASTPlugin: RecastJSPlugin;
        /**
         * Link to the detour crowd
         */
        recastCrowd: any;
        /**
         * One transform per agent
         */
        transforms: TransformNode[];
        /**
         * All agents created
         */
        agents: number[];
        /**
         * agents reach radius
         */
        reachRadii: number[];
        /**
         * true when a destination is active for an agent and notifier hasn't been notified of reach
         */
        private _agentDestinationArmed;
        /**
         * agent current target
         */
        private _agentDestination;
        /**
         * Link to the scene is kept to unregister the crowd from the scene
         */
        private _scene;
        /**
         * Observer for crowd updates
         */
        private _onBeforeAnimationsObserver;
        /**
         * Fires each time an agent is in reach radius of its destination
         */
        onReachTargetObservable: Observable<{
            agentIndex: number;
            destination: Vector3;
        }>;
        /**
         * Constructor
         * @param plugin recastJS plugin
         * @param maxAgents the maximum agent count in the crowd
         * @param maxAgentRadius the maximum radius an agent can have
         * @param scene to attach the crowd to
         * @returns the crowd you can add agents to
         */
        constructor(plugin: RecastJSPlugin, maxAgents: number, maxAgentRadius: number, scene: Scene);
        /**
         * Add a new agent to the crowd with the specified parameter a corresponding transformNode.
         * You can attach anything to that node. The node position is updated in the scene update tick.
         * @param pos world position that will be constrained by the navigation mesh
         * @param parameters agent parameters
         * @param transform hooked to the agent that will be update by the scene
         * @returns agent index
         */
        addAgent(pos: Vector3, parameters: IAgentParameters, transform: TransformNode): number;
        /**
         * Returns the agent position in world space
         * @param index agent index returned by addAgent
         * @returns world space position
         */
        getAgentPosition(index: number): Vector3;
        /**
         * Returns the agent position result in world space
         * @param index agent index returned by addAgent
         * @param result output world space position
         */
        getAgentPositionToRef(index: number, result: Vector3): void;
        /**
         * Returns the agent velocity in world space
         * @param index agent index returned by addAgent
         * @returns world space velocity
         */
        getAgentVelocity(index: number): Vector3;
        /**
         * Returns the agent velocity result in world space
         * @param index agent index returned by addAgent
         * @param result output world space velocity
         */
        getAgentVelocityToRef(index: number, result: Vector3): void;
        /**
         * Returns the agent next target point on the path
         * @param index agent index returned by addAgent
         * @returns world space position
         */
        getAgentNextTargetPath(index: number): Vector3;
        /**
         * Returns the agent next target point on the path
         * @param index agent index returned by addAgent
         * @param result output world space position
         */
        getAgentNextTargetPathToRef(index: number, result: Vector3): void;
        /**
         * Gets the agent state
         * @param index agent index returned by addAgent
         * @returns agent state
         */
        getAgentState(index: number): number;
        /**
         * returns true if the agent in over an off mesh link connection
         * @param index agent index returned by addAgent
         * @returns true if over an off mesh link connection
         */
        overOffmeshConnection(index: number): boolean;
        /**
         * Asks a particular agent to go to a destination. That destination is constrained by the navigation mesh
         * @param index agent index returned by addAgent
         * @param destination targeted world position
         */
        agentGoto(index: number, destination: Vector3): void;
        /**
         * Teleport the agent to a new position
         * @param index agent index returned by addAgent
         * @param destination targeted world position
         */
        agentTeleport(index: number, destination: Vector3): void;
        /**
         * Update agent parameters
         * @param index agent index returned by addAgent
         * @param parameters agent parameters
         */
        updateAgentParameters(index: number, parameters: IAgentParameters): void;
        /**
         * remove a particular agent previously created
         * @param index agent index returned by addAgent
         */
        removeAgent(index: number): void;
        /**
         * get the list of all agents attached to this crowd
         * @returns list of agent indices
         */
        getAgents(): number[];
        /**
         * Tick update done by the Scene. Agent position/velocity/acceleration is updated by this function
         * @param deltaTime in seconds
         */
        update(deltaTime: number): void;
        /**
         * Set the Bounding box extent for doing spatial queries (getClosestPoint, getRandomPointAround, ...)
         * The queries will try to find a solution within those bounds
         * default is (1,1,1)
         * @param extent x,y,z value that define the extent around the queries point of reference
         */
        setDefaultQueryExtent(extent: Vector3): void;
        /**
         * Get the Bounding box extent specified by setDefaultQueryExtent
         * @returns the box extent values
         */
        getDefaultQueryExtent(): Vector3;
        /**
         * Get the Bounding box extent result specified by setDefaultQueryExtent
         * @param result output the box extent values
         */
        getDefaultQueryExtentToRef(result: Vector3): void;
        /**
         * Get the next corner points composing the path (max 4 points)
         * @param index agent index returned by addAgent
         * @returns array containing world position composing the path
         */
        getCorners(index: number): Vector3[];
        /**
         * Release all resources
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * This class is used to deform meshes using morphing between different targets
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets
     */
    export class MorphTargetManager implements IDisposable {
        meshName?: string | undefined;
        /** Enable storing morph target data into textures when set to true (true by default) */
        static EnableTextureStorage: boolean;
        /** Maximum number of active morph targets supported in the "vertex attribute" mode (i.e., not the "texture" mode) */
        static MaxActiveMorphTargetsInVertexAttributeMode: number;
        /**
         * When used in texture mode, if greather than 0, this will override the the morph manager numMaxInfluencers value.
         */
        static ConstantTargetCountForTextureMode: number;
        private _targets;
        private _targetInfluenceChangedObservers;
        private _targetDataLayoutChangedObservers;
        private _activeTargets;
        private _scene;
        private _influences;
        private _supportsPositions;
        private _supportsNormals;
        private _supportsTangents;
        private _supportsUVs;
        private _supportsUV2s;
        private _supportsColors;
        private _vertexCount;
        private _uniqueId;
        private _tempInfluences;
        private _canUseTextureForTargets;
        private _blockCounter;
        private _mustSynchronize;
        private _forceUpdateWhenUnfrozen;
        /** @internal */
        _textureVertexStride: number;
        /** @internal */
        _textureWidth: number;
        /** @internal */
        _textureHeight: number;
        /** @internal */
        _morphTargetTextureIndices: Float32Array;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /** @internal */
        _targetStoreTexture: Nullable<RawTexture2DArray>;
        /**
         * Gets or sets a boolean indicating if influencers must be optimized (eg. recompiling the shader if less influencers are used)
         */
        optimizeInfluencers: boolean;
        /**
         * Gets or sets a boolean indicating if positions must be morphed
         */
        enablePositionMorphing: boolean;
        /**
         * Gets or sets a boolean indicating if normals must be morphed
         */
        enableNormalMorphing: boolean;
        /**
         * Gets or sets a boolean indicating if tangents must be morphed
         */
        enableTangentMorphing: boolean;
        /**
         * Gets or sets a boolean indicating if UV must be morphed
         */
        enableUVMorphing: boolean;
        /**
         * Gets or sets a boolean indicating if UV2 must be morphed
         */
        enableUV2Morphing: boolean;
        /**
         * Gets or sets a boolean indicating if colors must be morphed
         */
        enableColorMorphing: boolean;
        /**
         * Sets a boolean indicating that adding new target or updating an existing target will not update the underlying data buffers
         */
        set areUpdatesFrozen(block: boolean);
        get areUpdatesFrozen(): boolean;
        /**
         * Creates a new MorphTargetManager
         * @param scene defines the current scene
         * @param meshName name of the mesh this morph target manager is associated with
         */
        constructor(scene?: Nullable<Scene>, meshName?: string | undefined);
        private _numMaxInfluencers;
        /**
         * Gets or sets the maximum number of influencers (targets) (default value: 0).
         * Setting a value for this property can lead to a smoother experience, as only one shader will be compiled, which will use this value as the maximum number of influencers.
         * If you leave the value at 0 (default), a new shader will be compiled every time the number of active influencers changes. This can cause problems, as compiling a shader takes time.
         * If you assign a non-zero value to this property, you need to ensure that this value is greater than the maximum number of (active) influencers you'll need for this morph manager.
         * Otherwise, the number of active influencers will be truncated at the value you set for this property, which can lead to unexpected results.
         * Note that this property has no effect if "useTextureToStoreTargets" is false.
         * Note as well that if MorphTargetManager.ConstantTargetCountForTextureMode is greater than 0, this property will be ignored and the constant value will be used instead.
         */
        get numMaxInfluencers(): number;
        set numMaxInfluencers(value: number);
        /**
         * Gets the unique ID of this manager
         */
        get uniqueId(): number;
        /**
         * Gets the number of vertices handled by this manager
         */
        get vertexCount(): number;
        /**
         * Gets a boolean indicating if this manager supports morphing of positions
         */
        get supportsPositions(): boolean;
        /**
         * Gets a boolean indicating if this manager supports morphing of normals
         */
        get supportsNormals(): boolean;
        /**
         * Gets a boolean indicating if this manager supports morphing of tangents
         */
        get supportsTangents(): boolean;
        /**
         * Gets a boolean indicating if this manager supports morphing of texture coordinates
         */
        get supportsUVs(): boolean;
        /**
         * Gets a boolean indicating if this manager supports morphing of texture coordinates 2
         */
        get supportsUV2s(): boolean;
        /**
         * Gets a boolean indicating if this manager supports morphing of colors
         */
        get supportsColors(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing positions
         */
        get hasPositions(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing normals
         */
        get hasNormals(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing tangents
         */
        get hasTangents(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing texture coordinates
         */
        get hasUVs(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing texture coordinates 2
         */
        get hasUV2s(): boolean;
        /**
         * Gets a boolean indicating if this manager has data for morphing colors
         */
        get hasColors(): boolean;
        /**
         * Gets the number of targets stored in this manager
         */
        get numTargets(): number;
        /**
         * Gets the number of influencers (ie. the number of targets with influences > 0)
         */
        get numInfluencers(): number;
        /**
         * Gets the list of influences (one per target)
         */
        get influences(): Float32Array;
        private _useTextureToStoreTargets;
        /**
         * Gets or sets a boolean indicating that targets should be stored as a texture instead of using vertex attributes (default is true).
         * Please note that this option is not available if the hardware does not support it
         */
        get useTextureToStoreTargets(): boolean;
        set useTextureToStoreTargets(value: boolean);
        /**
         * Gets a boolean indicating that the targets are stored into a texture (instead of as attributes)
         */
        get isUsingTextureForTargets(): boolean;
        /**
         * Gets or sets an object used to store user defined information for the MorphTargetManager
         */
        metadata: any;
        /**
         * Gets the active target at specified index. An active target is a target with an influence > 0
         * @param index defines the index to check
         * @returns the requested target
         */
        getActiveTarget(index: number): MorphTarget;
        /**
         * Gets the target at specified index
         * @param index defines the index to check
         * @returns the requested target
         */
        getTarget(index: number): MorphTarget;
        /**
         * Gets the first target with the specified name
         * @param name defines the name to check
         * @returns the requested target
         */
        getTargetByName(name: string): Nullable<MorphTarget>;
        private _influencesAreDirty;
        private _needUpdateInfluences;
        /**
         * Add a new target to this manager
         * @param target defines the target to add
         */
        addTarget(target: MorphTarget): void;
        /**
         * Removes a target from the manager
         * @param target defines the target to remove
         */
        removeTarget(target: MorphTarget): void;
        /**
         * @internal
         */
        _bind(effect: Effect): void;
        /**
         * Clone the current manager
         * @returns a new MorphTargetManager
         */
        clone(): MorphTargetManager;
        /**
         * Serializes the current manager into a Serialization object
         * @returns the serialized object
         */
        serialize(): any;
        private _syncActiveTargets;
        /**
         * Synchronize the targets with all the meshes using this morph target manager
         */
        synchronize(): void;
        /**
         * Release all resources
         */
        dispose(): void;
        /**
         * Creates a new MorphTargetManager from serialized data
         * @param serializationObject defines the serialized data
         * @param scene defines the hosting scene
         * @returns the new MorphTargetManager
         */
        static Parse(serializationObject: any, scene: Scene): MorphTargetManager;
    }


    /**
     * Defines a target to use with MorphTargetManager
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets
     */
    export class MorphTarget implements IAnimatable {
        name: string;
        /**
         * Gets or sets the list of animations
         */
        animations: Animation[];
        private _scene;
        private _positions;
        private _normals;
        private _tangents;
        private _uvs;
        private _uv2s;
        private _colors;
        private _influence;
        private _uniqueId;
        /**
         * Observable raised when the influence changes
         */
        onInfluenceChanged: Observable<boolean>;
        /** @internal */
        _onDataLayoutChanged: Observable<void>;
        /**
         * Gets or sets the influence of this target (ie. its weight in the overall morphing)
         */
        get influence(): number;
        set influence(influence: number);
        /**
         * Gets or sets the id of the morph Target
         */
        id: string;
        /**
         * Gets or sets the morph target manager this morph target is associated with
         */
        morphTargetManager: Nullable<MorphTargetManager>;
        private _animationPropertiesOverride;
        /**
         * Gets or sets the animation properties override
         */
        get animationPropertiesOverride(): Nullable<AnimationPropertiesOverride>;
        set animationPropertiesOverride(value: Nullable<AnimationPropertiesOverride>);
        /**
         * Creates a new MorphTarget
         * @param name defines the name of the target
         * @param influence defines the influence to use
         * @param scene defines the scene the morphtarget belongs to
         * @param morphTargetManager morph target manager this morph target is associated with
         */
        constructor(name: string, influence?: number, scene?: Nullable<Scene>, morphTargetManager?: Nullable<MorphTargetManager>);
        /**
         * Gets the unique ID of this manager
         */
        get uniqueId(): number;
        /**
         * Gets a boolean defining if the target contains position data
         */
        get hasPositions(): boolean;
        /**
         * Gets a boolean defining if the target contains normal data
         */
        get hasNormals(): boolean;
        /**
         * Gets a boolean defining if the target contains tangent data
         */
        get hasTangents(): boolean;
        /**
         * Gets a boolean defining if the target contains texture coordinates data
         */
        get hasUVs(): boolean;
        /**
         * Gets a boolean defining if the target contains texture coordinates 2 data
         */
        get hasUV2s(): boolean;
        get hasColors(): boolean;
        /**
         * Gets the number of vertices stored in this target
         */
        get vertexCount(): number;
        /**
         * Affects position data to this target
         * @param data defines the position data to use
         */
        setPositions(data: Nullable<FloatArray>): void;
        /**
         * Gets the position data stored in this target
         * @returns a FloatArray containing the position data (or null if not present)
         */
        getPositions(): Nullable<FloatArray>;
        /**
         * Affects normal data to this target
         * @param data defines the normal data to use
         */
        setNormals(data: Nullable<FloatArray>): void;
        /**
         * Gets the normal data stored in this target
         * @returns a FloatArray containing the normal data (or null if not present)
         */
        getNormals(): Nullable<FloatArray>;
        /**
         * Affects tangent data to this target
         * @param data defines the tangent data to use
         */
        setTangents(data: Nullable<FloatArray>): void;
        /**
         * Gets the tangent data stored in this target
         * @returns a FloatArray containing the tangent data (or null if not present)
         */
        getTangents(): Nullable<FloatArray>;
        /**
         * Affects texture coordinates data to this target
         * @param data defines the texture coordinates data to use
         */
        setUVs(data: Nullable<FloatArray>): void;
        /**
         * Gets the texture coordinates data stored in this target
         * @returns a FloatArray containing the texture coordinates data (or null if not present)
         */
        getUVs(): Nullable<FloatArray>;
        /**
         * Affects texture coordinates 2 data to this target
         * @param data defines the texture coordinates 2 data to use
         */
        setUV2s(data: Nullable<FloatArray>): void;
        /**
         * Gets the texture coordinates 2 data stored in this target
         * @returns a FloatArray containing the texture coordinates 2 data (or null if not present)
         */
        getUV2s(): Nullable<FloatArray>;
        /**
         * Affects color data to this target
         * @param data defines the color data to use
         */
        setColors(data: Nullable<FloatArray>): void;
        /**
         * Gets the color data stored in this target
         * @returns a FloatArray containing the color data (or null if not present)
         */
        getColors(): Nullable<FloatArray>;
        /**
         * Clone the current target
         * @returns a new MorphTarget
         */
        clone(): MorphTarget;
        /**
         * Serializes the current target into a Serialization object
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Returns the string "MorphTarget"
         * @returns "MorphTarget"
         */
        getClassName(): string;
        /**
         * Creates a new target from serialized data
         * @param serializationObject defines the serialized data to use
         * @param scene defines the hosting scene
         * @param morphTargetManager morph target manager this morph target is associated with
         * @returns a new MorphTarget
         */
        static Parse(serializationObject: any, scene?: Scene, morphTargetManager?: Nullable<MorphTargetManager>): MorphTarget;
        /**
         * Creates a MorphTarget from mesh data
         * @param mesh defines the source mesh
         * @param name defines the name to use for the new target
         * @param influence defines the influence to attach to the target
         * @returns a new MorphTarget
         */
        static FromMesh(mesh: AbstractMesh, name?: string, influence?: number): MorphTarget;
    }




    interface IWorkerInfo {
        workerPromise: Promise<Worker>;
        idle: boolean;
        timeoutId?: ReturnType<typeof setTimeout>;
    }
    /**
     * Helper class to push actions to a pool of workers.
     */
    export class WorkerPool implements IDisposable {
        protected _workerInfos: Array<IWorkerInfo>;
        protected _pendingActions: ((worker: Worker, onComplete: () => void) => void)[];
        /**
         * Constructor
         * @param workers Array of workers to use for actions
         */
        constructor(workers: Array<Worker>);
        /**
         * Terminates all workers and clears any pending actions.
         */
        dispose(): void;
        /**
         * Pushes an action to the worker pool. If all the workers are active, the action will be
         * pended until a worker has completed its action.
         * @param action The action to perform. Call onComplete when the action is complete.
         */
        push(action: (worker: Worker, onComplete: () => void) => void): void;
        protected _executeOnIdleWorker(action: (worker: Worker, onComplete: () => void) => void): boolean;
        protected _execute(workerInfo: IWorkerInfo, action: (worker: Worker, onComplete: () => void) => void): void;
    }
    /**
     * Options for AutoReleaseWorkerPool
     */
    export interface AutoReleaseWorkerPoolOptions {
        /**
         * Idle time elapsed before workers are terminated.
         */
        idleTimeElapsedBeforeRelease: number;
    }
    /**
     * Similar to the WorkerPool class except it creates and destroys workers automatically with a maximum of `maxWorkers` workers.
     * Workers are terminated when it is idle for at least `idleTimeElapsedBeforeRelease` milliseconds.
     */
    export class AutoReleaseWorkerPool extends WorkerPool {
        /**
         * Default options for the constructor.
         * Override to change the defaults.
         */
        static DefaultOptions: AutoReleaseWorkerPoolOptions;
        private readonly _maxWorkers;
        private readonly _createWorkerAsync;
        private readonly _options;
        constructor(maxWorkers: number, createWorkerAsync: () => Promise<Worker>, options?: AutoReleaseWorkerPoolOptions);
        push(action: (worker: Worker, onComplete: () => void) => void): void;
        protected _execute(workerInfo: IWorkerInfo, action: (worker: Worker, onComplete: () => void) => void): void;
    }


    /**
     * Fetches a resource from the network
     * @param url defines the url to fetch the resource from
     * @param options defines the options to use when fetching the resource
     * @returns a promise that resolves when the resource is fetched
     * @internal
     */
    export function _FetchAsync(url: string, options: Partial<{
        method: string;
        responseHeaders?: string[];
    }>): Promise<{
        response: Response;
        headerValues: {
            [key: string]: string;
        };
    }>;


    /**
     * Extended version of XMLHttpRequest with support for customizations (headers, ...)
     */
    export class WebRequest implements IWebRequest {
        private readonly _xhr;
        /**
         * Custom HTTP Request Headers to be sent with XMLHttpRequests
         * i.e. when loading files, where the server/service expects an Authorization header
         */
        static CustomRequestHeaders: {
            [key: string]: string;
        };
        /**
         * Add callback functions in this array to update all the requests before they get sent to the network
         */
        static CustomRequestModifiers: ((request: XMLHttpRequest, url: string) => string | void)[];
        /**
         * If set to true, requests to Babylon.js CDN requests will not be modified
         */
        static SkipRequestModificationForBabylonCDN: boolean;
        /**
         * This function can be called to check if there are request modifiers for network requests
         * @returns true if there are any custom requests available
         */
        static get IsCustomRequestAvailable(): boolean;
        private static _CleanUrl;
        private static _ShouldSkipRequestModifications;
        /**
         * Merges `CustomRequestHeaders` and `CustomRequestModifiers` into a plain headers record and returns the
         * (possibly rewritten) URL. Can be used to apply URL and header customizations without making a network
         * request (e.g. for streaming media where the download is handled by the browser natively).
         * @param url - The initial URL to modify.
         * @param baseHeaders - An optional set of headers to start with (e.g. from the caller's options) that modifiers can further modify.
         * @returns An object containing the final URL and the merged headers after applying all modifiers and header customizations.
         * @internal
         */
        static _CollectCustomizations(url: string, baseHeaders?: Record<string, string>): {
            url: string;
            headers: Record<string, string>;
        };
        /**
         * Performs a network request using the Fetch API when available on the platform, falling back to XMLHttpRequest.
         * `WebRequest.CustomRequestHeaders` and `WebRequest.CustomRequestModifiers` are applied in both cases.
         *
         * For `CustomRequestModifiers`, a minimal proxy XHR is provided to each modifier so that calls to
         * `setRequestHeader` on it are captured and forwarded to the underlying request. The URL returned by a
         * modifier (if any) replaces the current URL before the next modifier runs.
         *
         * @param url - The URL to request.
         * @param options - Optional request options (method, headers, body).
         * @returns A Promise that resolves to a `Response`.
         */
        static FetchAsync(url: string, options?: {
            method?: string;
            headers?: Record<string, string>;
            body?: BodyInit | null;
        }): Promise<Response>;
        private _requestURL;
        /**
         * Returns the requested URL once open has been called
         */
        get requestURL(): string;
        /**
         * Gets or sets a function to be called when loading progress changes
         */
        get onprogress(): ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null;
        set onprogress(value: ((this: XMLHttpRequest, ev: ProgressEvent) => any) | null);
        /**
         * Returns client's state
         */
        get readyState(): number;
        /**
         * Returns client's status
         */
        get status(): number;
        /**
         * Returns client's status as a text
         */
        get statusText(): string;
        /**
         * Returns client's response
         */
        get response(): any;
        /**
         * Returns client's response url
         */
        get responseURL(): string;
        /**
         * Returns client's response as text
         */
        get responseText(): string;
        /**
         * Gets or sets the expected response type
         */
        get responseType(): XMLHttpRequestResponseType;
        set responseType(value: XMLHttpRequestResponseType);
        /**
         * Gets or sets the timeout value in milliseconds
         */
        get timeout(): number;
        set timeout(value: number);
        /** @internal */
        addEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
        /** @internal */
        removeEventListener<K extends keyof XMLHttpRequestEventMap>(type: K, listener: (this: XMLHttpRequest, ev: XMLHttpRequestEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
        /**
         * Cancels any network activity
         */
        abort(): void;
        /**
         * Initiates the request. The optional argument provides the request body. The argument is ignored if request method is GET or HEAD
         * @param body defines an optional request body
         */
        send(body?: Document | XMLHttpRequestBodyInit | null): void;
        /**
         * Sets the request method, request URL
         * @param method defines the method to use (GET, POST, etc..)
         * @param url defines the url to connect with
         * @param baseHeaders optional headers to include as a base before applying CustomRequestHeaders and modifiers
         */
        open(method: string, url: string, baseHeaders?: Record<string, string>): void;
        /**
         * Sets the value of a request header.
         * @param name The name of the header whose value is to be set
         * @param value The value to set as the body of the header
         */
        setRequestHeader(name: string, value: string): void;
        /**
         * Get the string containing the text of a particular header's value.
         * @param name The name of the header
         * @returns The string containing the text of the given header name
         */
        getResponseHeader(name: string): Nullable<string>;
    }


    /**
     * Defines the potential axis of a Joystick
     */
    export enum JoystickAxis {
        /** X axis */
        X = 0,
        /** Y axis */
        Y = 1,
        /** Z axis */
        Z = 2
    }
    /**
     * Represents the different customization options available
     * for VirtualJoystick
     */
    interface IVirtualJoystickCustomizations {
        /**
         * Size of the joystick's puck
         */
        puckSize: number;
        /**
         * Size of the joystick's container
         */
        containerSize: number;
        /**
         * Color of the joystick && puck
         */
        color: string;
        /**
         * Image URL for the joystick's puck
         */
        puckImage?: string;
        /**
         * Image URL for the joystick's container
         */
        containerImage?: string;
        /**
         * Defines the unmoving position of the joystick container
         */
        position?: {
            x: number;
            y: number;
        };
        /**
         * Defines whether or not the joystick container is always visible
         */
        alwaysVisible: boolean;
        /**
         * Defines whether or not to limit the movement of the puck to the joystick's container
         */
        limitToContainer: boolean;
    }
    /**
     * Class used to define virtual joystick (used in touch mode)
     */
    export class VirtualJoystick {
        /**
         * Gets or sets a boolean indicating that left and right values must be inverted
         */
        reverseLeftRight: boolean;
        /**
         * Gets or sets a boolean indicating that up and down values must be inverted
         */
        reverseUpDown: boolean;
        /**
         * Gets the offset value for the position (ie. the change of the position value)
         */
        deltaPosition: Vector3;
        /**
         * Gets a boolean indicating if the virtual joystick was pressed
         */
        pressed: boolean;
        /**
         * Canvas the virtual joystick will render onto, default z-index of this is 5
         */
        static Canvas: Nullable<HTMLCanvasElement>;
        /**
         * boolean indicating whether or not the joystick's puck's movement should be limited to the joystick's container area
         */
        limitToContainer: boolean;
        private static _GlobalJoystickIndex;
        private static _AlwaysVisibleSticks;
        private static _VjCanvasContext;
        private static _VjCanvasWidth;
        private static _VjCanvasHeight;
        private static _HalfWidth;
        private static _GetDefaultOptions;
        private _action;
        private _axisTargetedByLeftAndRight;
        private _axisTargetedByUpAndDown;
        private _joystickSensibility;
        private _inversedSensibility;
        private _joystickPointerId;
        private _joystickColor;
        private _joystickPointerPos;
        private _joystickPreviousPointerPos;
        private _joystickPointerStartPos;
        private _deltaJoystickVector;
        private _leftJoystick;
        private _touches;
        private _joystickPosition;
        private _alwaysVisible;
        private _puckImage;
        private _containerImage;
        private _released;
        private _joystickPuckSize;
        private _joystickContainerSize;
        private _clearPuckSize;
        private _clearContainerSize;
        private _clearPuckSizeOffset;
        private _clearContainerSizeOffset;
        private _onPointerDownHandlerRef;
        private _onPointerMoveHandlerRef;
        private _onPointerUpHandlerRef;
        private _onResize;
        /**
         * Creates a new virtual joystick
         * @param leftJoystick defines that the joystick is for left hand (false by default)
         * @param customizations Defines the options we want to customize the VirtualJoystick
         */
        constructor(leftJoystick?: boolean, customizations?: Partial<IVirtualJoystickCustomizations>);
        /**
         * Defines joystick sensibility (ie. the ratio between a physical move and virtual joystick position change)
         * @param newJoystickSensibility defines the new sensibility
         */
        setJoystickSensibility(newJoystickSensibility: number): void;
        private _onPointerDown;
        private _onPointerMove;
        private _onPointerUp;
        /**
         * Change the color of the virtual joystick
         * @param newColor a string that must be a CSS color value (like "red") or the hexa value (like "#FF0000")
         */
        setJoystickColor(newColor: string): void;
        /**
         * Size of the joystick's container
         */
        set containerSize(newSize: number);
        get containerSize(): number;
        /**
         * Size of the joystick's puck
         */
        set puckSize(newSize: number);
        get puckSize(): number;
        /**
         * Clears the set position of the joystick
         */
        clearPosition(): void;
        /**
         * Defines whether or not the joystick container is always visible
         */
        set alwaysVisible(value: boolean);
        get alwaysVisible(): boolean;
        /**
         * Sets the constant position of the Joystick container
         * @param x X axis coordinate
         * @param y Y axis coordinate
         */
        setPosition(x: number, y: number): void;
        /**
         * Defines a callback to call when the joystick is touched
         * @param action defines the callback
         */
        setActionOnTouch(action: () => any): void;
        /**
         * Defines which axis you'd like to control for left & right
         * @param axis defines the axis to use
         */
        setAxisForLeftRight(axis: JoystickAxis): void;
        /**
         * Defines which axis you'd like to control for up & down
         * @param axis defines the axis to use
         */
        setAxisForUpDown(axis: JoystickAxis): void;
        /**
         * Clears the canvas from the previous puck / container draw
         */
        private _clearPreviousDraw;
        /**
         * Loads `urlPath` to be used for the container's image
         * @param urlPath defines the urlPath of an image to use
         */
        setContainerImage(urlPath: string): void;
        /**
         * Loads `urlPath` to be used for the puck's image
         * @param urlPath defines the urlPath of an image to use
         */
        setPuckImage(urlPath: string): void;
        /**
         * Draws the Virtual Joystick's container
         */
        private _drawContainer;
        /**
         * Draws the Virtual Joystick's puck
         */
        private _drawPuck;
        private _drawVirtualJoystick;
        /**
         * Release internal HTML canvas
         */
        releaseCanvas(): void;
    }


    /**
     * This represents the different options available for the video capture.
     */
    export interface VideoRecorderOptions {
        /** The canvas you want to record */
        canvas?: HTMLCanvasElement;
        /** Defines the mime type of the video. */
        mimeType: string;
        /** Defines the FPS the video should be recorded at. */
        fps: number;
        /** Defines the chunk size for the recording data. */
        recordChunckSize: number;
        /** The audio tracks to attach to the recording. */
        audioTracks?: MediaStreamTrack[];
    }
    /**
     * This can help with recording videos from BabylonJS.
     * This is based on the available WebRTC functionalities of the browser.
     *
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToVideo
     */
    export class VideoRecorder {
        private static readonly _DefaultOptions;
        /**
         * Returns whether or not the VideoRecorder is available in your browser.
         * @param engine Defines the Babylon Engine.
         * @param canvas Defines the canvas to record. If not provided, the engine canvas will be used.
         * @returns true if supported otherwise false.
         */
        static IsSupported(engine: AbstractEngine, canvas?: HTMLCanvasElement): boolean;
        private readonly _options;
        private _canvas;
        private _mediaRecorder;
        private _recordedChunks;
        private _fileName;
        private _resolve;
        private _reject;
        private _isRecording;
        /**
         * True when a recording is already in progress.
         */
        get isRecording(): boolean;
        /**
         * Create a new VideoCapture object which can help converting what you see in Babylon to a video file.
         * @param engine Defines the BabylonJS Engine you wish to record.
         * @param options Defines options that can be used to customize the capture.
         */
        constructor(engine: AbstractEngine, options?: Partial<VideoRecorderOptions>);
        /**
         * Stops the current recording before the default capture timeout passed in the startRecording function.
         */
        stopRecording(): void;
        /**
         * Starts recording the canvas for a max duration specified in parameters.
         * @param fileName Defines the name of the file to be downloaded when the recording stop.
         * If null no automatic download will start and you can rely on the promise to get the data back.
         * @param maxDuration Defines the maximum recording time in seconds.
         * It defaults to 7 seconds. A value of zero will not stop automatically, you would need to call stopRecording manually.
         * @returns A promise callback at the end of the recording with the video data in Blob.
         */
        startRecording(fileName?: Nullable<string>, maxDuration?: number): Promise<Blob>;
        /**
         * Releases internal resources used during the recording.
         */
        dispose(): void;
        private _handleDataAvailable;
        private _handleError;
        private _handleStop;
    }


    /**
     * Gets the file extension from a URL.
     * @param url The URL to get the file extension from.
     * @returns The file extension, or an empty string if no extension is found.
     */
    export function GetExtensionFromUrl(url: string): string;


    /**
     * Helper class used to generate session unique ID
     */
    export class UniqueIdGenerator {
        private static _UniqueIdCounter;
        /**
         * Gets an unique (relatively to the current scene) Id
         */
        static get UniqueId(): number;
    }


    /**
     * @internal
     */
    export function RegisterClass(className: string, type: object): void;
    /**
     * @internal
     */
    export function GetClass(fqdn: string): any;
    /**
     * @internal
     */
    export function GetClassName(obj: any): string;


    /**
     * A 3D trajectory consisting of an order list of vectors describing a
     * path of motion through 3D space.
     */
    export class Trajectory {
        private _points;
        private readonly _segmentLength;
        /**
         * Serialize to JSON.
         * @returns serialized JSON string
         */
        serialize(): string;
        /**
         * Deserialize from JSON.
         * @param json serialized JSON string
         * @returns deserialized Trajectory
         */
        static Deserialize(json: string): Trajectory;
        /**
         * Create a new empty Trajectory.
         * @param segmentLength radius of discretization for Trajectory points
         */
        constructor(segmentLength?: number);
        /**
         * Get the length of the Trajectory.
         * @returns length of the Trajectory
         */
        getLength(): number;
        /**
         * Append a new point to the Trajectory.
         * NOTE: This implementation has many allocations.
         * @param point point to append to the Trajectory
         */
        add(point: DeepImmutable<Vector3>): void;
        /**
         * Create a new Trajectory with a segment length chosen to make it
         * probable that the new Trajectory will have a specified number of
         * segments. This operation is imprecise.
         * @param targetResolution number of segments desired
         * @returns new Trajectory with approximately the requested number of segments
         */
        resampleAtTargetResolution(targetResolution: number): Trajectory;
        /**
         * Convert Trajectory segments into tokenized representation. This
         * representation is an array of numbers where each nth number is the
         * index of the token which is most similar to the nth segment of the
         * Trajectory.
         * @param tokens list of vectors which serve as discrete tokens
         * @returns list of indices of most similar token per segment
         */
        tokenize(tokens: DeepImmutable<Vector3[]>): number[];
        private static _ForwardDir;
        private static _InverseFromVec;
        private static _UpDir;
        private static _FromToVec;
        private static _LookMatrix;
        /**
         * Transform the rotation (i.e., direction) of a segment to isolate
         * the relative transformation represented by the segment. This operation
         * may or may not succeed due to singularities in the equations that define
         * motion relativity in this context.
         * @param priorVec the origin of the prior segment
         * @param fromVec the origin of the current segment
         * @param toVec the destination of the current segment
         * @param result reference to output variable
         * @returns whether or not transformation was successful
         */
        private static _TransformSegmentDirToRef;
        private static _BestMatch;
        private static _Score;
        private static _BestScore;
        /**
         * Determine which token vector is most similar to the
         * segment vector.
         * @param segment segment vector
         * @param tokens token vector list
         * @returns index of the most similar token to the segment
         */
        private static _TokenizeSegment;
    }
    /**
     * Class representing a set of known, named trajectories to which Trajectories can be
     * added and using which Trajectories can be recognized.
     */
    export class TrajectoryClassifier {
        private _maximumAllowableMatchCost;
        private _vector3Alphabet;
        private _levenshteinAlphabet;
        private _nameToDescribedTrajectory;
        /**
         * Serialize to JSON.
         * @returns JSON serialization
         */
        serialize(): string;
        /**
         * Deserialize from JSON.
         * @param json JSON serialization
         * @returns deserialized TrajectorySet
         */
        static Deserialize(json: string): TrajectoryClassifier;
        /**
         * Initialize a new empty TrajectorySet with auto-generated Alphabets.
         * VERY naive, need to be generating these things from known
         * sets. Better version later, probably eliminating this one.
         * @returns auto-generated TrajectorySet
         */
        static Generate(): TrajectoryClassifier;
        private constructor();
        /**
         * Add a new Trajectory to the set with a given name.
         * @param trajectory new Trajectory to be added
         * @param classification name to which to add the Trajectory
         */
        addTrajectoryToClassification(trajectory: Trajectory, classification: string): void;
        /**
         * Remove a known named trajectory and all Trajectories associated with it.
         * @param classification name to remove
         * @returns whether anything was removed
         */
        deleteClassification(classification: string): boolean;
        /**
         * Attempt to recognize a Trajectory from among all the classifications
         * already known to the classifier.
         * @param trajectory Trajectory to be recognized
         * @returns classification of Trajectory if recognized, null otherwise
         */
        classifyTrajectory(trajectory: Trajectory): Nullable<string>;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Class containing a set of static utilities functions
     */
    export class Tools {
        /**
         * Gets or sets the base URL to use to load assets
         */
        static get BaseUrl(): string;
        static set BaseUrl(value: string);
        /**
         * Gets or sets the clean URL function to use to load assets
         */
        static get CleanUrl(): (url: string) => string;
        static set CleanUrl(value: (url: string) => string);
        /**
         * This function checks whether a URL is absolute or not.
         * It will also detect data and blob URLs
         * @param url the url to check
         * @returns is the url absolute or relative
         */
        static IsAbsoluteUrl(url: string): boolean;
        /**
         * Sets the base URL to use to load scripts
         */
        static set ScriptBaseUrl(value: string);
        static get ScriptBaseUrl(): string;
        /**
         * The base URL to use to load assets. If empty the default base url is used.
         */
        static AssetBaseUrl: string;
        /**
         * Sets both the script base URL and the assets base URL to the same value.
         * Setter only!
         */
        static set CDNBaseUrl(value: string);
        /**
         * Sets a preprocessing function to run on a source URL before importing it
         * Note that this function will execute AFTER the base URL is appended to the URL
         */
        static set ScriptPreprocessUrl(func: (source: string) => string);
        static get ScriptPreprocessUrl(): (source: string) => string;
        /**
         * Enable/Disable Custom HTTP Request Headers globally.
         * default = false
         * @see CustomRequestHeaders
         */
        static UseCustomRequestHeaders: boolean;
        /**
         * Custom HTTP Request Headers to be sent with XMLHttpRequests
         * i.e. when loading files, where the server/service expects an Authorization header
         */
        static CustomRequestHeaders: {
            [key: string]: string;
        };
        /**
         * Gets or sets the retry strategy to apply when an error happens while loading an asset
         */
        static get DefaultRetryStrategy(): (url: string, request: WebRequest, retryIndex: number) => number;
        static set DefaultRetryStrategy(strategy: (url: string, request: WebRequest, retryIndex: number) => number);
        /**
         * Default behavior for cors in the application.
         * It can be a string if the expected behavior is identical in the entire app.
         * Or a callback to be able to set it per url or on a group of them (in case of Video source for instance)
         */
        static get CorsBehavior(): string | ((url: string | string[]) => string);
        static set CorsBehavior(value: string | ((url: string | string[]) => string));
        /**
         * Gets or sets a global variable indicating if fallback texture must be used when a texture cannot be loaded
         * @ignorenaming
         */
        static get UseFallbackTexture(): boolean;
        static set UseFallbackTexture(value: boolean);
        /**
         * Use this object to register external classes like custom textures or material
         * to allow the loaders to instantiate them
         */
        static get RegisteredExternalClasses(): {
            [key: string]: object;
        };
        static set RegisteredExternalClasses(classes: {
            [key: string]: object;
        });
        /**
         * Texture content used if a texture cannot loaded
         * @ignorenaming
         */
        static get fallbackTexture(): string;
        static set fallbackTexture(value: string);
        /**
         * Read the content of a byte array at a specified coordinates (taking in account wrapping)
         * @param u defines the coordinate on X axis
         * @param v defines the coordinate on Y axis
         * @param width defines the width of the source data
         * @param height defines the height of the source data
         * @param pixels defines the source byte array
         * @param color defines the output color
         */
        static FetchToRef(u: number, v: number, width: number, height: number, pixels: Uint8Array, color: IColor4Like): void;
        /**
         * Interpolates between a and b via alpha
         * @param a The lower value (returned when alpha = 0)
         * @param b The upper value (returned when alpha = 1)
         * @param alpha The interpolation-factor
         * @returns The mixed value
         */
        static Mix(a: number, b: number, alpha: number): number;
        /**
         * Tries to instantiate a new object from a given class name
         * @param className defines the class name to instantiate
         * @returns the new object or null if the system was not able to do the instantiation
         */
        static Instantiate(className: string): any;
        /**
         * Polyfill for setImmediate
         * @param action defines the action to execute after the current execution block
         */
        static SetImmediate(action: () => void): void;
        /**
         * Function indicating if a number is an exponent of 2
         * @param value defines the value to test
         * @returns true if the value is an exponent of 2
         */
        static IsExponentOfTwo(value: number): boolean;
        /**
         * Returns the nearest 32-bit single precision float representation of a Number
         * @param value A Number.  If the parameter is of a different type, it will get converted
         * to a number or to NaN if it cannot be converted
         * @returns number
         */
        static FloatRound(value: number): number;
        /**
         * Extracts the filename from a path
         * @param path defines the path to use
         * @returns the filename
         */
        static GetFilename(path: string): string;
        /**
         * Extracts the "folder" part of a path (everything before the filename).
         * @param uri The URI to extract the info from
         * @param returnUnchangedIfNoSlash Do not touch the URI if no slashes are present
         * @returns The "folder" part of the path
         */
        static GetFolderPath(uri: string, returnUnchangedIfNoSlash?: boolean): string;
        /**
         * Extracts text content from a DOM element hierarchy
         * Back Compat only, please use GetDOMTextContent instead.
         */
        static GetDOMTextContent: typeof GetDOMTextContent;
        /**
         * Convert an angle in radians to degrees
         * @param angle defines the angle to convert
         * @returns the angle in degrees
         */
        static ToDegrees(angle: number): number;
        /**
         * Convert an angle in degrees to radians
         * @param angle defines the angle to convert
         * @returns the angle in radians
         */
        static ToRadians(angle: number): number;
        /**
         * Smooth angle changes (kind of low-pass filter), in particular for device orientation "shaking"
         * Use trigonometric functions to avoid discontinuity (0/360, -180/180)
         * @param previousAngle defines last angle value, in degrees
         * @param newAngle defines new angle value, in degrees
         * @param smoothFactor defines smoothing sensitivity; min 0: no smoothing, max 1: new data ignored
         * @returns the angle in degrees
         */
        static SmoothAngleChange(previousAngle: number, newAngle: number, smoothFactor?: number): number;
        /**
         * Returns an array if obj is not an array
         * @param obj defines the object to evaluate as an array
         * @param allowsNullUndefined defines a boolean indicating if obj is allowed to be null or undefined
         * @returns either obj directly if obj is an array or a new array containing obj
         */
        static MakeArray(obj: any, allowsNullUndefined?: boolean): Nullable<Array<any>>;
        /**
         * Gets the pointer prefix to use
         * @param engine defines the engine we are finding the prefix for
         * @returns "pointer" if touch is enabled. Else returns "mouse"
         */
        static GetPointerPrefix(engine: AbstractEngine): string;
        /**
         * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.
         * @param url define the url we are trying
         * @param element define the dom element where to configure the cors policy
         * @param element.crossOrigin
         */
        static SetCorsBehavior(url: string | string[], element: {
            crossOrigin: string | null;
        }): void;
        /**
         * Sets the referrerPolicy behavior on a dom element.
         * @param referrerPolicy define the referrer policy to use
         * @param element define the dom element where to configure the referrer policy
         * @param element.referrerPolicy
         */
        static SetReferrerPolicyBehavior(referrerPolicy: Nullable<ReferrerPolicy>, element: {
            referrerPolicy: string | null;
        }): void;
        /**
         * Gets or sets a function used to pre-process url before using them to load assets
         */
        static get PreprocessUrl(): (url: string) => string;
        static set PreprocessUrl(processor: (url: string) => string);
        /**
         * Loads an image as an HTMLImageElement.
         * @param input url string, ArrayBuffer, or Blob to load
         * @param onLoad callback called when the image successfully loads
         * @param onError callback called when the image fails to load
         * @param offlineProvider offline provider for caching
         * @param mimeType optional mime type
         * @param imageBitmapOptions optional the options to use when creating an ImageBitmap
         * @returns the HTMLImageElement of the loaded image
         */
        static LoadImage(input: string | ArrayBuffer | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string, imageBitmapOptions?: ImageBitmapOptions): Nullable<HTMLImageElement>;
        /**
         * Loads a file from a url
         * @param url url string, ArrayBuffer, or Blob to load
         * @param onSuccess callback called when the file successfully loads
         * @param onProgress callback called while file is loading (if the server supports this mode)
         * @param offlineProvider defines the offline provider for caching
         * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
         * @param onError callback called when the file fails to load
         * @returns a file request object
         */
        static LoadFile(url: string, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (data: any) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: any) => void): IFileRequest;
        static LoadFileAsync(url: string, useArrayBuffer?: true): Promise<ArrayBuffer>;
        static LoadFileAsync(url: string, useArrayBuffer?: false): Promise<string>;
        /**
         * @internal
         */
        static readonly _DefaultCdnUrl = "https://cdn.babylonjs.com";
        /**
         * The CDN version to use when constructing versioned CDN URLs.
         * Injected at build time by the version update script.
         * When set, unversioned CDN URLs will be rewritten to include this version prefix.
         * @internal
         */
        static _CdnVersion: string;
        /**
         * @internal
         */
        static readonly _DefaultAssetsUrl = "https://assets.babylonjs.com/core";
        /**
         * This function will convert asset URLs if the AssetBaseUrl parameter is set.
         * Any URL with `assets.babylonjs.com/core` will be replaced with the value of AssetBaseUrl.
         * @param url the URL to convert
         * @returns a new URL
         */
        static GetAssetUrl(url: string): string;
        /**
         * Get a script URL including preprocessing
         * @param scriptUrl the script Url to process
         * @param forceAbsoluteUrl force the script to be an absolute url (adding the current base url if necessary)
         * @returns a modified URL to use
         */
        static GetBabylonScriptURL(scriptUrl: Nullable<string>, forceAbsoluteUrl?: boolean): string;
        /**
         * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the
         * content of this file is added into a new script element, attached to the DOM (body element)
         * @param scriptUrl defines the url of the script to load
         * @param onSuccess defines the callback called when the script is loaded
         * @param onError defines the callback to call if an error occurs
         * @param scriptId defines the id of the script element
         */
        static LoadBabylonScript(scriptUrl: string, onSuccess: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string): void;
        /**
         * Load an asynchronous script (identified by an url). When the url returns, the
         * content of this file is added into a new script element, attached to the DOM (body element)
         * @param scriptUrl defines the url of the script to laod
         * @returns a promise request object
         */
        static LoadBabylonScriptAsync(scriptUrl: string): Promise<void>;
        private static _LoadScriptNative;
        private static _LoadScriptWeb;
        /**
         * This function is used internally by babylon components to load a script (identified by an url). When the url returns, the
         * content of this file is added into a new script element, attached to the DOM (body element)
         * @param scriptUrl defines the url of the script to load
         * @param onSuccess defines the callback called when the script is loaded
         * @param onError defines the callback to call if an error occurs
         * @param scriptId defines the id of the script element
         * @param useModule defines if we should use the module strategy to load the script
         */
        static LoadScript: (scriptUrl: string, onSuccess?: () => void, onError?: (message?: string, exception?: any) => void, scriptId?: string, useModule?: boolean) => void;
        /**
         * Load an asynchronous script (identified by an url). When the url returns, the
         * content of this file is added into a new script element, attached to the DOM (body element)
         * @param scriptUrl defines the url of the script to load
         * @param scriptId defines the id of the script element
         * @returns a promise request object
         */
        static LoadScriptAsync(scriptUrl: string, scriptId?: string): Promise<void>;
        /**
         * Loads a file from a blob
         * @param fileToLoad defines the blob to use
         * @param callback defines the callback to call when data is loaded
         * @param progressCallback defines the callback to call during loading process
         * @returns a file request object
         */
        static ReadFileAsDataURL(fileToLoad: Blob, callback: (data: any) => void, progressCallback: (ev: ProgressEvent) => any): IFileRequest;
        /**
         * Reads a file from a File object
         * @param file defines the file to load
         * @param onSuccess defines the callback to call when data is loaded
         * @param onProgress defines the callback to call during loading process
         * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer
         * @param onError defines the callback to call when an error occurs
         * @returns a file request object
         */
        static ReadFile(file: File, onSuccess: (data: any) => void, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean, onError?: (error: ReadFileError) => void): IFileRequest;
        /**
         * Creates a data url from a given string content
         * @param content defines the content to convert
         * @returns the new data url link
         */
        static FileAsURL(content: string): string;
        /**
         * Format the given number to a specific decimal format
         * @param value defines the number to format
         * @param decimals defines the number of decimals to use
         * @returns the formatted string
         */
        static Format(value: number, decimals?: number): string;
        /**
         * Tries to copy an object by duplicating every property
         * @param source defines the source object
         * @param destination defines the target object
         * @param doNotCopyList defines a list of properties to avoid
         * @param mustCopyList defines a list of properties to copy (even if they start with _)
         */
        static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[]): void;
        /**
         * Gets a boolean indicating if the given object has no own property
         * @param obj defines the object to test
         * @returns true if object has no own property
         */
        static IsEmpty(obj: any): boolean;
        /**
         * Function used to register events at window level
         * @param windowElement defines the Window object to use
         * @param events defines the events to register
         */
        static RegisterTopRootEvents(windowElement: Window, events: {
            name: string;
            handler: Nullable<(e: FocusEvent) => any>;
        }[]): void;
        /**
         * Function used to unregister events from window level
         * @param windowElement defines the Window object to use
         * @param events defines the events to unregister
         */
        static UnregisterTopRootEvents(windowElement: Window, events: {
            name: string;
            handler: Nullable<(e: FocusEvent) => any>;
        }[]): void;
        /**
         * Dumps the current bound framebuffer
         * @param width defines the rendering width
         * @param height defines the rendering height
         * @param engine defines the hosting engine
         * @param successCallback defines the callback triggered once the data are available
         * @param mimeType defines the mime type of the result
         * @param fileName defines the filename to download. If present, the result will automatically be downloaded
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @returns a void promise
         */
        static DumpFramebuffer(width: number, height: number, engine: AbstractEngine, successCallback?: (data: string) => void, mimeType?: string, fileName?: string, quality?: number): Promise<void>;
        /**
         * Dumps an array buffer
         * @param width defines the rendering width
         * @param height defines the rendering height
         * @param data the data array
         * @param successCallback defines the callback triggered once the data are available
         * @param mimeType defines the mime type of the result
         * @param fileName defines the filename to download. If present, the result will automatically be downloaded
         * @param invertY true to invert the picture in the Y dimension
         * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         */
        static DumpData(width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): void;
        /**
         * Dumps an array buffer
         * @param width defines the rendering width
         * @param height defines the rendering height
         * @param data the data array
         * @param mimeType defines the mime type of the result
         * @param fileName defines the filename to download. If present, the result will automatically be downloaded
         * @param invertY true to invert the picture in the Y dimension
         * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @returns a promise that resolve to the final data
         */
        static DumpDataAsync(width: number, height: number, data: ArrayBufferView, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): Promise<string | ArrayBuffer>;
        private static _IsOffScreenCanvas;
        /**
         * Converts the canvas data to blob.
         * This acts as a polyfill for browsers not supporting the to blob function.
         * @param canvas Defines the canvas to extract the data from (can be an offscreen canvas)
         * @param successCallback Defines the callback triggered once the data are available
         * @param mimeType Defines the mime type of the result
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         */
        static ToBlob(canvas: HTMLCanvasElement | OffscreenCanvas, successCallback: (blob: Nullable<Blob>) => void, mimeType?: string, quality?: number): void;
        /**
         * Download a Blob object
         * @param blob the Blob object
         * @param fileName the file name to download
         */
        static DownloadBlob(blob: Blob, fileName?: string): void;
        /**
         * Encodes the canvas data to base 64, or automatically downloads the result if `fileName` is defined.
         * @param canvas The canvas to get the data from, which can be an offscreen canvas.
         * @param successCallback The callback which is triggered once the data is available. If `fileName` is defined, the callback will be invoked after the download occurs, and the `data` argument will be an empty string.
         * @param mimeType The mime type of the result.
         * @param fileName The name of the file to download. If defined, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         */
        static EncodeScreenshotCanvasData(canvas: HTMLCanvasElement | OffscreenCanvas, successCallback?: (data: string) => void, mimeType?: string, fileName?: string, quality?: number): void;
        /**
         * Downloads a blob in the browser
         * @param blob defines the blob to download
         * @param fileName defines the name of the downloaded file
         */
        static Download(blob: Blob, fileName: string): void;
        /**
         * Will return the right value of the noPreventDefault variable
         * Needed to keep backwards compatibility to the old API.
         *
         * @param args arguments passed to the attachControl function
         * @returns the correct value for noPreventDefault
         */
        static BackCompatCameraNoPreventDefault(args: IArguments): boolean;
        /**
         * Captures a screenshot of the current rendering
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine defines the rendering engine
         * @param camera defines the source camera
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param successCallback defines the callback receives a single parameter which contains the
         * screenshot as a string of base64-encoded characters. This string can be assigned to the
         * src parameter of an <img> to display it
         * @param mimeType defines the MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param forceDownload force the system to download the image even if a successCallback is provided
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         */
        static CreateScreenshot(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, forceDownload?: boolean, quality?: number): void;
        /**
         * Captures a screenshot of the current rendering
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine defines the rendering engine
         * @param camera defines the source camera
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param mimeType defines the MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @returns screenshot as a string of base64-encoded characters. This string can be assigned
         * to the src parameter of an <img> to display it
         */
        static CreateScreenshotAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, quality?: number): Promise<string>;
        /**
         * Generates an image screenshot from the specified camera.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine The engine to use for rendering
         * @param camera The camera to use for rendering
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param successCallback The callback receives a single parameter which contains the
         * screenshot as a string of base64-encoded characters. This string can be assigned to the
         * src parameter of an <img> to display it
         * @param mimeType The MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param samples Texture samples (default: 1)
         * @param antialiasing Whether antialiasing should be turned on or not (default: false)
         * @param fileName A name for for the downloaded file.
         * @param renderSprites Whether the sprites should be rendered or not (default: false)
         * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
         * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
         */
        static CreateScreenshotUsingRenderTarget(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void): void;
        /**
         * Generates an image screenshot from the specified camera.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine The engine to use for rendering
         * @param camera The camera to use for rendering
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param mimeType The MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param samples Texture samples (default: 1)
         * @param antialiasing Whether antialiasing should be turned on or not (default: false)
         * @param fileName A name for for the downloaded file.
         * @param renderSprites Whether the sprites should be rendered or not (default: false)
         * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
         * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
         * @returns screenshot as a string of base64-encoded characters. This string can be assigned
         * to the src parameter of an <img> to display it
         */
        static CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void): Promise<string>;
        /**
         * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523
         * Be aware Math.random() could cause collisions, but:
         * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide"
         * @returns a pseudo random id
         */
        static RandomId(): string;
        /**
         * Test if the given uri is a base64 string
         * @deprecated Please use FileTools.IsBase64DataUrl instead.
         * @param uri The uri to test
         * @returns True if the uri is a base64 string or false otherwise
         */
        static IsBase64(uri: string): boolean;
        /**
         * Decode the given base64 uri.
         * @deprecated Please use FileTools.DecodeBase64UrlToBinary instead.
         * @param uri The uri to decode
         * @returns The decoded base64 data.
         */
        static DecodeBase64(uri: string): ArrayBuffer;
        /**
         * @returns the absolute URL of a given (relative) url
         */
        static GetAbsoluteUrl: (url: string) => string;
        /**
         * No log
         */
        static readonly NoneLogLevel = 0;
        /**
         * Only message logs
         */
        static readonly MessageLogLevel = 1;
        /**
         * Only warning logs
         */
        static readonly WarningLogLevel = 2;
        /**
         * Only error logs
         */
        static readonly ErrorLogLevel = 4;
        /**
         * All logs
         */
        static readonly AllLogLevel = 7;
        /**
         * Gets a value indicating the number of loading errors
         * @ignorenaming
         */
        static get errorsCount(): number;
        /**
         * Callback called when a new log is added
         */
        static OnNewCacheEntry: (entry: string) => void;
        /**
         * Log a message to the console
         * @param message defines the message to log
         */
        static Log(message: string): void;
        /**
         * Write a warning message to the console
         * @param message defines the message to log
         */
        static Warn(message: string): void;
        /**
         * Write an error message to the console
         * @param message defines the message to log
         */
        static Error(message: string): void;
        /**
         * Gets current log cache (list of logs)
         */
        static get LogCache(): string;
        /**
         * Clears the log cache
         */
        static ClearLogCache(): void;
        /**
         * Sets the current log level (MessageLogLevel / WarningLogLevel / ErrorLogLevel)
         */
        static set LogLevels(level: number);
        /**
         * Checks if the window object exists
         * Back Compat only, please use IsWindowObjectExist instead.
         */
        static IsWindowObjectExist: typeof IsWindowObjectExist;
        /**
         * No performance log
         */
        static readonly PerformanceNoneLogLevel = 0;
        /**
         * Use user marks to log performance
         */
        static readonly PerformanceUserMarkLogLevel = 1;
        /**
         * Log performance to the console
         */
        static readonly PerformanceConsoleLogLevel = 2;
        private static _Performance;
        private static readonly _NativePerformanceCounterHandles;
        /**
         * Sets the current performance log level
         */
        static set PerformanceLogLevel(level: number);
        private static _StartPerformanceCounterDisabled;
        private static _EndPerformanceCounterDisabled;
        private static _StartUserMark;
        private static _EndUserMark;
        private static _StartPerformanceConsole;
        private static _EndPerformanceConsole;
        private static _StartMarkNative;
        private static _EndMarkNative;
        /**
         * Starts a performance counter
         */
        static StartPerformanceCounter: (counterName: string, condition?: boolean) => void;
        /**
         * Ends a specific performance counter
         */
        static EndPerformanceCounter: (counterName: string, condition?: boolean) => void;
        /**
         * Gets either window.performance.now() if supported or Date.now() else
         */
        static get Now(): number;
        /**
         * This method will return the name of the class used to create the instance of the given object.
         * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator.
         * @param object the object to get the class name from
         * @param isType defines if the object is actually a type
         * @returns the name of the class, will be "object" for a custom data type not using the @className decorator
         */
        static GetClassName(object: any, isType?: boolean): string;
        /**
         * Gets the first element of an array satisfying a given predicate
         * @param array defines the array to browse
         * @param predicate defines the predicate to use
         * @returns null if not found or the element
         */
        static First<T>(array: Array<T>, predicate: (item: T) => boolean): Nullable<T>;
        /**
         * This method will return the name of the full name of the class, including its owning module (if any).
         * It will works only on Javascript basic data types (number, string, ...) and instance of class declared with the @className decorator or implementing a method getClassName():string (in which case the module won't be specified).
         * @param object the object to get the class name from
         * @param isType defines if the object is actually a type
         * @returns a string that can have two forms: "moduleName.className" if module was specified when the class' Name was registered or "className" if there was not module specified.
         * @ignorenaming
         */
        static getFullClassName(object: any, isType?: boolean): Nullable<string>;
        /**
         * Returns a promise that resolves after the given amount of time.
         * @param delay Number of milliseconds to delay
         * @returns Promise that resolves after the given amount of time
         */
        static DelayAsync(delay: number): Promise<void>;
        /**
         * Utility function to detect if the current user agent is Safari
         * @returns whether or not the current user agent is safari
         */
        static IsSafari(): boolean;
    }
    /**
     * Use this className as a decorator on a given class definition to add it a name and optionally its module.
     * You can then use the Tools.getClassName(obj) on an instance to retrieve its class name.
     * This method is the only way to get it done in all cases, even if the .js file declaring the class is minified
     * @param name The name of the class, case should be preserved
     * @param module The name of the Module hosting the class, optional, but strongly recommended to specify if possible. Case should be preserved.
     * @returns a decorator function to apply on the class definition.
     */
    export function className(name: string, module?: string): (target: object) => void;
    /**
     * An implementation of a loop for asynchronous functions.
     */
    export class AsyncLoop {
        /**
         * Defines the number of iterations for the loop
         */
        iterations: number;
        /**
         * Defines the current index of the loop.
         */
        index: number;
        private _done;
        private _fn;
        private _successCallback;
        /**
         * Constructor.
         * @param iterations the number of iterations.
         * @param func the function to run each iteration
         * @param successCallback the callback that will be called upon successful execution
         * @param offset starting offset.
         */
        constructor(
        /**
         * Defines the number of iterations for the loop
         */
        iterations: number, func: (asyncLoop: AsyncLoop) => void, successCallback: () => void, offset?: number);
        /**
         * Execute the next iteration. Must be called after the last iteration was finished.
         */
        executeNext(): void;
        /**
         * Break the loop and run the success callback.
         */
        breakLoop(): void;
        /**
         * Create and run an async loop.
         * @param iterations the number of iterations.
         * @param fn the function to run each iteration
         * @param successCallback the callback that will be called upon successful execution
         * @param offset starting offset.
         * @returns the created async loop object
         */
        static Run(iterations: number, fn: (asyncLoop: AsyncLoop) => void, successCallback: () => void, offset?: number): AsyncLoop;
        /**
         * A for-loop that will run a given number of iterations synchronous and the rest async.
         * @param iterations total number of iterations
         * @param syncedIterations number of synchronous iterations in each async iteration.
         * @param fn the function to call each iteration.
         * @param callback a success call back that will be called when iterating stops.
         * @param breakFunction a break condition (optional)
         * @param timeout timeout settings for the setTimeout function. default - 0.
         * @returns the created async loop object
         */
        static SyncAsyncForLoop(iterations: number, syncedIterations: number, fn: (iteration: number) => void, callback: () => void, breakFunction?: () => boolean, timeout?: number): AsyncLoop;
    }
    /**
     * Register side effects for tools.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTools(): void;


    /**
     * This file is only for internal use only and should not be used in your code
     */
    /**
     * Load an asynchronous script (identified by an url) in a module way. When the url returns, the
     * content of this file is added into a new script element, attached to the DOM (body element)
     * @param scriptUrl defines the url of the script to load
     * @param scriptId defines the id of the script element
     * @returns a promise request object
     * It is up to the caller to provide a script that will do the import and prepare a "returnedValue" variable
     * @internal DO NOT USE outside of Babylon.js core
     */
    export function _LoadScriptModuleAsync(scriptUrl: string, scriptId?: string): Promise<any>;


    /**
     * Function indicating if a number is an exponent of 2
     * @param value defines the value to test
     * @returns true if the value is an exponent of 2
     */
    export function IsExponentOfTwo(value: number): boolean;
    /**
     * Interpolates between a and b via alpha
     * @param a The lower value (returned when alpha = 0)
     * @param b The upper value (returned when alpha = 1)
     * @param alpha The interpolation-factor
     * @returns The mixed value
     */
    export function Mix(a: number, b: number, alpha: number): number;
    /**
     * Find the nearest power of two.
     * @param x Number to start search from.
     * @returns Next nearest power of two.
     */
    export function NearestPOT(x: number): number;
    /**
     * Find the next highest power of two.
     * @param x Number to start search from.
     * @returns Next highest power of two.
     */
    export function CeilingPOT(x: number): number;
    /**
     * Find the next lowest power of two.
     * @param x Number to start search from.
     * @returns Next lowest power of two.
     */
    export function FloorPOT(x: number): number;
    /**
     * Get the closest exponent of two
     * @param value defines the value to approximate
     * @param max defines the maximum value to return
     * @param mode defines how to define the closest value
     * @returns closest exponent of two of the given value
     */
    export function GetExponentOfTwo(value: number, max: number, mode?: number): number;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import tools.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to provide helper for timing
     */
    export class TimingTools {
        /**
         * Execute a function after the current execution block
         * @param action defines the action to execute after the current execution block
         */
        static SetImmediate(action: () => void): void;
    }
    /**
     * @internal
     */
    export const _RetryWithInterval: (condition: () => boolean, onSuccess: () => void, onError?: (e?: any, isTimeout?: boolean) => void, step?: number, maxTimeout?: number, checkConditionOnCall?: boolean, additionalStringOnTimeout?: string) => (() => void) | null;


    /**
     * Construction options for a timer
     */
    export interface ITimerOptions<T> {
        /**
         * Time-to-end
         */
        timeout: number;
        /**
         * The context observable is used to calculate time deltas and provides the context of the timer's callbacks. Will usually be OnBeforeRenderObservable.
         * Countdown calculation is done ONLY when the observable is notifying its observers, meaning that if
         * you choose an observable that doesn't trigger too often, the wait time might extend further than the requested max time
         */
        contextObservable: Observable<T>;
        /**
         * Optional parameters when adding an observer to the observable
         */
        observableParameters?: {
            mask?: number;
            insertFirst?: boolean;
            scope?: any;
        };
        /**
         * An optional break condition that will stop the times prematurely. In this case onEnded will not be triggered!
         */
        breakCondition?: (data?: ITimerData<T>) => boolean;
        /**
         * Will be triggered when the time condition has met
         */
        onEnded?: (data: ITimerData<any>) => void;
        /**
         * Will be triggered when the break condition has met (prematurely ended)
         */
        onAborted?: (data: ITimerData<any>) => void;
        /**
         * Optional function to execute on each tick (or count)
         */
        onTick?: (data: ITimerData<any>) => void;
    }
    /**
     * An interface defining the data sent by the timer
     */
    export interface ITimerData<T> {
        /**
         * When did it start
         */
        startTime: number;
        /**
         * Time now
         */
        currentTime: number;
        /**
         * Time passed since started
         */
        deltaTime: number;
        /**
         * How much is completed, in [0.0...1.0].
         * Note that this CAN be higher than 1 due to the fact that we don't actually measure time but delta between observable calls
         */
        completeRate: number;
        /**
         * What the registered observable sent in the last count
         */
        payload: T;
    }
    /**
     * The current state of the timer
     */
    export enum TimerState {
        /**
         * Timer initialized, not yet started
         */
        INIT = 0,
        /**
         * Timer started and counting
         */
        STARTED = 1,
        /**
         * Timer ended (whether aborted or time reached)
         */
        ENDED = 2
    }
    /**
     * A simple version of the timer. Will take options and start the timer immediately after calling it
     *
     * @param options options with which to initialize this timer
     * @returns an observer that can be used to stop the timer
     */
    export function setAndStartTimer<T = any>(options: ITimerOptions<T>): Nullable<Observer<T>>;
    /**
     * An advanced implementation of a timer class
     */
    export class AdvancedTimer<T = any> implements IDisposable {
        /**
         * Will notify each time the timer calculates the remaining time
         */
        onEachCountObservable: Observable<ITimerData<T>>;
        /**
         * Will trigger when the timer was aborted due to the break condition
         */
        onTimerAbortedObservable: Observable<ITimerData<T>>;
        /**
         * Will trigger when the timer ended successfully
         */
        onTimerEndedObservable: Observable<ITimerData<T>>;
        /**
         * Will trigger when the timer state has changed
         */
        onStateChangedObservable: Observable<TimerState>;
        private _observer;
        private _contextObservable;
        private _observableParameters;
        private _startTime;
        private _timer;
        private _state;
        private _breakCondition;
        private _timeToEnd;
        private _breakOnNextTick;
        /**
         * Will construct a new advanced timer based on the options provided. Timer will not start until start() is called.
         * @param options construction options for this advanced timer
         */
        constructor(options: ITimerOptions<T>);
        /**
         * set a breaking condition for this timer. Default is to never break during count
         * @param predicate the new break condition. Returns true to break, false otherwise
         */
        set breakCondition(predicate: (data: ITimerData<T>) => boolean);
        /**
         * Reset ALL associated observables in this advanced timer
         */
        clearObservables(): void;
        /**
         * Will start a new iteration of this timer. Only one instance of this timer can run at a time.
         *
         * @param timeToEnd how much time to measure until timer ended
         */
        start(timeToEnd?: number): void;
        /**
         * Will force a stop on the next tick.
         */
        stop(): void;
        /**
         * Dispose this timer, clearing all resources
         */
        dispose(): void;
        private _setState;
        private _tick;
        private _stop;
    }


    /**
     * @internal
     */
    export enum DepthTextureType {
        NormalizedViewDepth = 0,
        ViewDepth = 1,
        ScreenDepth = 2
    }
    /**
     * @internal
     */
    export class ThinMinMaxReducerPostProcess extends EffectWrapper {
        static readonly FragmentUrl = "minmaxRedux";
        static readonly Uniforms: string[];
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        textureWidth: number;
        textureHeight: number;
        constructor(name: string, engine?: Nullable<AbstractEngine>, defines?: string, options?: EffectWrapperCreationOptions);
        bind(noDefaultBindings?: boolean): void;
    }
    /**
     * @internal
     */
    export class ThinMinMaxReducer {
        readonly onAfterReductionPerformed: Observable<{
            min: number;
            max: number;
        }>;
        readonly reductionSteps: Array<ThinMinMaxReducerPostProcess>;
        private _depthRedux;
        private _depthTextureType;
        get depthRedux(): boolean;
        set depthRedux(value: boolean);
        protected readonly _scene: Scene;
        private _textureWidth;
        private _textureHeight;
        get textureWidth(): number;
        get textureHeight(): number;
        constructor(scene: Scene, depthRedux?: boolean);
        setTextureDimensions(width: number, height: number, depthTextureType?: DepthTextureType): boolean;
        readMinMax(texture: InternalTexture): void;
        dispose(disposeAll?: boolean): void;
        private _recreatePostProcesses;
    }


    /**
     * Gets the header of a TGA file
     * @param data defines the TGA data
     * @returns the header
     */
    export function GetTGAHeader(data: Uint8Array): any;
    /**
     * Uploads TGA content to a Babylon Texture
     * @internal
     */
    export function UploadContent(texture: InternalTexture, data: Uint8Array): void;
    /**
     * @internal
     */
    function GetImageData8bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * @internal
     */
    function GetImageData16bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * @internal
     */
    function GetImageData24bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * @internal
     */
    function GetImageData32bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * @internal
     */
    function GetImageDataGrey8bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * @internal
     */
    function GetImageDataGrey16bits(header: any, palettes: Uint8Array, pixel_data: Uint8Array, y_start: number, y_step: number, y_end: number, x_start: number, x_step: number, x_end: number): Uint8Array;
    /**
     * Based on jsTGALoader - Javascript loader for TGA file
     * By Vincent Thibault
     * @see http://blog.robrowser.com/javascript-tga-loader.html
     */
    export var TGATools: {
        /**
         * Gets the header of a TGA file
         * @param data defines the TGA data
         * @returns the header
         */
        GetTGAHeader: typeof GetTGAHeader;
        /**
         * Uploads TGA content to a Babylon Texture
         * @internal
         */
        UploadContent: typeof UploadContent;
        /** @internal */
        _getImageData8bits: typeof GetImageData8bits;
        /** @internal */
        _getImageData16bits: typeof GetImageData16bits;
        /** @internal */
        _getImageData24bits: typeof GetImageData24bits;
        /** @internal */
        _getImageData32bits: typeof GetImageData32bits;
        /** @internal */
        _getImageDataGrey8bits: typeof GetImageDataGrey8bits;
        /** @internal */
        _getImageDataGrey16bits: typeof GetImageDataGrey16bits;
    };


    /**
     * Uses the GPU to create a copy texture rescaled at a given size
     * @param texture Texture to copy from
     * @param width defines the desired width
     * @param height defines the desired height
     * @param useBilinearMode defines if bilinear mode has to be used
     * @returns the generated texture
     */
    export function CreateResizedCopy(texture: Texture, width: number, height: number, useBilinearMode?: boolean): Texture;
    /**
     * Apply a post process to a texture
     * @param postProcessName name of the fragment post process
     * @param internalTexture the texture to encode
     * @param scene the scene hosting the texture
     * @param type type of the output texture. If not provided, use the one from internalTexture
     * @param samplingMode sampling mode to use to sample the source texture. If not provided, use the one from internalTexture
     * @param format format of the output texture. If not provided, use the one from internalTexture
     * @param width width of the output texture. If not provided, use the one from internalTexture
     * @param height height of the output texture. If not provided, use the one from internalTexture
     * @returns a promise with the internalTexture having its texture replaced by the result of the processing
     */
    export function ApplyPostProcess(postProcessName: string, internalTexture: InternalTexture, scene: Scene, type?: number, samplingMode?: number, format?: number, width?: number, height?: number): Promise<InternalTexture>;
    /**
     * Waits for when the given texture is ready to be used (downloaded, converted, mip mapped...)
     * @param texture the texture to wait for
     * @returns a promise that resolves when the texture is ready
     */
    export function WhenTextureReadyAsync(texture: BaseTexture): Promise<void>;
    /**
     * Gets the pixel data of the specified texture, either by reading it directly
     * or by rendering it to an intermediate RGBA texture and retrieving the bytes from it.
     * This is convenient to get 8-bit RGBA values for a texture in a GPU compressed format.
     * When direct readback returns non-RGBA channel layouts, the result is normalized to RGBA8.
     * @param texture the source texture
     * @param width the target width of the result, which does not have to match the source texture width
     * @param height the target height of the result, which does not have to match the source texture height
     * @param face if the texture has multiple faces, the face index to use for the source
     * @param lod if the texture has multiple LODs, the lod index to use for the source
     * @param forceRTT if true, forces the use of the RTT path for reading pixels (useful for cube maps to ensure correct orientation and gamma)
     * @param slice if the texture is 3D, the depth slice index to use for the source
     * @returns the 8-bit texture data
     */
    export function GetTextureDataAsync(texture: BaseTexture, width?: number, height?: number, face?: number, lod?: number, forceRTT?: boolean, slice?: number): Promise<Uint8Array>;
    /**
     * Class used to host texture specific utilities
     */
    export var TextureTools: {
        /**
         * Uses the GPU to create a copy texture rescaled at a given size
         * @param texture Texture to copy from
         * @param width defines the desired width
         * @param height defines the desired height
         * @param useBilinearMode defines if bilinear mode has to be used
         * @returns the generated texture
         */
        CreateResizedCopy: typeof CreateResizedCopy;
        /**
         * Apply a post process to a texture
         * @param postProcessName name of the fragment post process
         * @param internalTexture the texture to encode
         * @param scene the scene hosting the texture
         * @param type type of the output texture. If not provided, use the one from internalTexture
         * @param samplingMode sampling mode to use to sample the source texture. If not provided, use the one from internalTexture
         * @param format format of the output texture. If not provided, use the one from internalTexture
         * @returns a promise with the internalTexture having its texture replaced by the result of the processing
         */
        ApplyPostProcess: typeof ApplyPostProcess;
        /**
         * Converts a number to half float
         * @param value number to convert
         * @returns converted number
         */
        ToHalfFloat: typeof ToHalfFloat;
        /**
         * Converts a half float to a number
         * @param value half float to convert
         * @returns converted half float
         */
        FromHalfFloat: typeof FromHalfFloat;
        /**
         * Gets the data of the specified texture by rendering it to an intermediate RGBA texture and retrieving the bytes from it.
         * This is convienent to get 8-bit RGBA values for a texture in a GPU compressed format.
         * @param texture the source texture
         * @param width the width of the result, which does not have to match the source texture width
         * @param height the height of the result, which does not have to match the source texture height
         * @param face if the texture has multiple faces, the face index to use for the source
         * @param lod if the texture has multiple LODs, the lod index to use for the source
         * @returns the 8-bit texture data
         */
        GetTextureDataAsync: typeof GetTextureDataAsync;
    };


    /**
     * Class used to store custom tags
     */
    export class Tags {
        /**
         * Adds support for tags on the given object
         * @param obj defines the object to use
         */
        static EnableFor(obj: any): void;
        /**
         * Removes tags support
         * @param obj defines the object to use
         */
        static DisableFor(obj: any): void;
        /**
         * Gets a boolean indicating if the given object has tags
         * @param obj defines the object to use
         * @returns a boolean
         */
        static HasTags(obj: any): boolean;
        /**
         * Gets the tags available on a given object
         * @param obj defines the object to use
         * @param asString defines if the tags must be returned as a string instead of an array of strings
         * @returns the tags
         */
        static GetTags(obj: any, asString?: boolean): any;
        /**
         * Adds tags to an object
         * @param obj defines the object to use
         * @param tagsString defines the tag string. The tags 'true' and 'false' are reserved and cannot be used as tags.
         * A tag cannot start with '||', '&&', and '!'. It cannot contain whitespaces
         */
        static AddTagsTo(obj: any, tagsString: string): void;
        /**
         * @internal
         */
        static _AddTagTo(obj: any, tag: string): void;
        /**
         * Removes specific tags from a specific object
         * @param obj defines the object to use
         * @param tagsString defines the tags to remove
         */
        static RemoveTagsFrom(obj: any, tagsString: string): void;
        /**
         * @internal
         */
        static _RemoveTagFrom(obj: any, tag: string): void;
        /**
         * Defines if tags hosted on an object match a given query
         * @param obj defines the object to use
         * @param tagsQuery defines the tag query
         * @returns a boolean
         */
        static MatchesQuery(obj: any, tagsQuery: string): boolean;
    }


    /**
     * Checks for a matching suffix at the end of a string (for ES5 and lower)
     * @param str Source string
     * @param suffix Suffix to search for in the source string
     * @returns Boolean indicating whether the suffix was found (true) or not (false)
     * @deprecated Please use native string function instead
     */
    export const EndsWith: (str: string, suffix: string) => boolean;
    /**
     * Checks for a matching suffix at the beginning of a string (for ES5 and lower)
     * @param str Source string
     * @param suffix Suffix to search for in the source string
     * @returns Boolean indicating whether the suffix was found (true) or not (false)
     * @deprecated Please use native string function instead
     */
    export const StartsWith: (str: string, suffix: string) => boolean;
    /**
     * Decodes a buffer into a string
     * @param buffer The buffer to decode
     * @returns The decoded string
     */
    export const Decode: (buffer: Uint8Array | Uint16Array) => string;
    /**
     * Encode a buffer to a base64 string
     * @param buffer defines the buffer to encode
     * @returns the encoded string
     */
    export const EncodeArrayBufferToBase64: (buffer: ArrayBuffer | ArrayBufferView) => string;
    /**
     * Converts a given base64 string as an ASCII encoded stream of data
     * @param base64Data The base64 encoded string to decode
     * @returns Decoded ASCII string
     */
    export const DecodeBase64ToString: (base64Data: string) => string;
    /**
     * Converts a given base64 string into an ArrayBuffer of raw byte data
     * @param base64Data The base64 encoded string to decode
     * @returns ArrayBuffer of byte data
     */
    export const DecodeBase64ToBinary: (base64Data: string) => ArrayBuffer;
    /**
     * Converts a number to string and pads with preceding zeroes until it is of specified length.
     * @param num the number to convert and pad
     * @param length the expected length of the string
     * @returns the padded string
     */
    export const PadNumber: (num: number, length: number) => string;
    /**
     * Helper to manipulate strings
     */
    export var StringTools: {
        EndsWith: (str: string, suffix: string) => boolean;
        StartsWith: (str: string, suffix: string) => boolean;
        Decode: (buffer: Uint8Array | Uint16Array) => string;
        EncodeArrayBufferToBase64: (buffer: ArrayBuffer | ArrayBufferView) => string;
        DecodeBase64ToString: (base64Data: string) => string;
        DecodeBase64ToBinary: (base64Data: string) => ArrayBuffer;
        PadNumber: (num: number, length: number) => string;
    };


    /**
     * This class implement a typical dictionary using a string as key and the generic type T as value.
     * The underlying implementation relies on an associative array to ensure the best performances.
     * The value can be anything including 'null' but except 'undefined'
     */
    export class StringDictionary<T> {
        /**
         * This will clear this dictionary and copy the content from the 'source' one.
         * If the T value is a custom object, it won't be copied/cloned, the same object will be used
         * @param source the dictionary to take the content from and copy to this dictionary
         */
        copyFrom(source: StringDictionary<T>): void;
        /**
         * Get a value based from its key
         * @param key the given key to get the matching value from
         * @returns the value if found, otherwise undefined is returned
         */
        get(key: string): T | undefined;
        /**
         * Get a value from its key or add it if it doesn't exist.
         * This method will ensure you that a given key/data will be present in the dictionary.
         * @param key the given key to get the matching value from
         * @param factory the factory that will create the value if the key is not present in the dictionary.
         * The factory will only be invoked if there's no data for the given key.
         * @returns the value corresponding to the key.
         */
        getOrAddWithFactory(key: string, factory: (key: string) => T): T;
        /**
         * Get a value from its key if present in the dictionary otherwise add it
         * @param key the key to get the value from
         * @param val if there's no such key/value pair in the dictionary add it with this value
         * @returns the value corresponding to the key
         */
        getOrAdd(key: string, val: T): T;
        /**
         * Check if there's a given key in the dictionary
         * @param key the key to check for
         * @returns true if the key is present, false otherwise
         */
        contains(key: string): boolean;
        /**
         * Add a new key and its corresponding value
         * @param key the key to add
         * @param value the value corresponding to the key
         * @returns true if the operation completed successfully, false if we couldn't insert the key/value because there was already this key in the dictionary
         */
        add(key: string, value: T): boolean;
        /**
         * Update a specific value associated to a key
         * @param key defines the key to use
         * @param value defines the value to store
         * @returns true if the value was updated (or false if the key was not found)
         */
        set(key: string, value: T): boolean;
        /**
         * Get the element of the given key and remove it from the dictionary
         * @param key defines the key to search
         * @returns the value associated with the key or null if not found
         */
        getAndRemove(key: string): Nullable<T>;
        /**
         * Remove a key/value from the dictionary.
         * @param key the key to remove
         * @returns true if the item was successfully deleted, false if no item with such key exist in the dictionary
         */
        remove(key: string): boolean;
        /**
         * Clear the whole content of the dictionary
         */
        clear(): void;
        /**
         * Gets the current count
         */
        get count(): number;
        /**
         * Execute a callback on each key/val of the dictionary.
         * Note that you can remove any element in this dictionary in the callback implementation
         * @param callback the callback to execute on a given key/value pair
         */
        forEach(callback: (key: string, val: T) => void): void;
        /**
         * Execute a callback on every occurrence of the dictionary until it returns a valid TRes object.
         * If the callback returns null or undefined the method will iterate to the next key/value pair
         * Note that you can remove any element in this dictionary in the callback implementation
         * @param callback the callback to execute, if it return a valid T instanced object the enumeration will stop and the object will be returned
         * @returns the first item
         */
        first<TRes>(callback: (key: string, val: T) => TRes): NonNullable<TRes> | null;
        private _count;
        private _data;
    }


    /**
     * Options for the snapshot rendering helper
     */
    export interface SnapshotRenderingHelpersOptions {
        /**
         * Maximum number of influences for morph target managers
         * In FAST snapshot mode, the number of influences must be fixed and cannot change from one frame to the next.
         * morphTargetsNumMaxInfluences is the maximum number of non-zero influences allowed in a morph target manager.
         * The final value defined for a morph target manager is: Math.min(morphTargetManager.numTargets, morphTargetsNumMaxInfluences)
         * Default: 20
         */
        morphTargetsNumMaxInfluences?: number;
    }
    /**
     * A helper class to simplify work with FAST snapshot mode (WebGPU only - can be used in WebGL too, but won't do anything).
     */
    export class SnapshotRenderingHelper {
        private readonly _engine;
        private readonly _scene;
        private readonly _options;
        private readonly _onBeforeRenderObserver;
        private _onBeforeRenderObserverUpdateLayer;
        private readonly _onResizeObserver;
        private _disableRenderingRefCount;
        private _currentPerformancePriorityMode;
        private _pendingCurrentPerformancePriorityMode?;
        private _isEnabling;
        private _enableCancelFunctions;
        private _disableCancelFunctions;
        /**
         * Indicates if debug logs should be displayed
         */
        showDebugLogs: boolean;
        /**
         * Creates a new snapshot rendering helper
         * Note that creating an instance of the helper will set the snapshot rendering mode to SNAPSHOTRENDERING_FAST but will not enable snapshot rendering (engine.snapshotRendering is not updated).
         * Note also that fixMeshes() is called as part of the construction
         * @param scene The scene to use the helper in
         * @param options The options for the helper
         */
        constructor(scene: Scene, options?: SnapshotRenderingHelpersOptions);
        /**
         * Gets a value indicating if the helper is in a steady state (not in the process of enabling snapshot rendering).
         */
        get isReady(): boolean;
        /**
         * Enable snapshot rendering
         * Use this method instead of engine.snapshotRendering=true, to make sure everything is ready before enabling snapshot rendering.
         * Note that this method is ref-counted and works in pair with disableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().
         * @param debugMessage An optional message to display in debug logs to help identify the context of the call to enableSnapshotRendering
         */
        enableSnapshotRendering(debugMessage?: string): void;
        /**
         * Disable snapshot rendering
         * Note that this method is ref-counted and works in pair with enableSnapshotRendering(): you should call enableSnapshotRendering() as many times as you call disableSnapshotRendering().
         * @param debugMessage An optional message to display in debug logs to help identify the context of the call to disableSnapshotRendering
         */
        disableSnapshotRendering(debugMessage?: string): void;
        /**
         * Fix meshes for snapshot rendering.
         * This method will make sure that some features are disabled or fixed to make sure snapshot rendering works correctly.
         * @param meshes List of meshes to fix. If not provided, all meshes in the scene will be fixed.
         */
        fixMeshes(meshes?: AbstractMesh[]): void;
        /**
         * Call this method to update a mesh on the GPU after some properties have changed (position, rotation, scaling).
         * Note: in FAST snapshot mode the GPU bundle is recorded once and replayed every frame, so draw calls
         * (including instance counts) are baked in. This method updates per-mesh GPU data such as transforms and
         * `mesh.visibility`, but it cannot change whether a recorded draw call is emitted. To apply changes such as
         * `mesh.isVisible`, `setEnabled(false)`, or per-instance visibility/state changes that affect instance counts,
         * wrap the change in a disableSnapshotRendering() / enableSnapshotRendering() pair so the snapshot is
         * re-recorded.
         * @param mesh The mesh to update. Can be a single mesh or an array of meshes to update.
         * @param updateInstancedMeshes If true, the method will also update instanced meshes. Default is true. If you know instanced meshes won't move (or you don't have instanced meshes), you can set this to false to save some CPU time.
         */
        updateMesh(mesh: AbstractMesh | AbstractMesh[], updateInstancedMeshes?: boolean): void;
        private _updateInstancedMesh;
        /**
         * Update the meshes used in an effect layer to ensure that snapshot rendering works correctly for these meshes in this layer.
         * @param layer The effect layer or frame graph layer
         * @param autoUpdate If true, the helper will automatically update the meshes of the layer with each frame. If false, you'll need to call this method manually when the camera or layer meshes move or rotate.
         */
        updateMeshesForEffectLayer(layer: EffectLayer | FrameGraphBaseLayerTask, autoUpdate?: boolean): void;
        /**
         * Dispose the helper
         */
        dispose(): void;
        private get _fastSnapshotRenderingEnabled();
        private _updateMeshMatricesForRenderPassId;
        private _spriteRendererDirectMatrixUpdate;
        private _spriteRendererUpdateEffects;
        /**
         * Make a CPU particle system compatible with FAST snapshot rendering.
         * The particle system will always render at full capacity (`getCapacity()` quads), with inactive slots collapsed
         * to degenerate triangles via zero-fill. This keeps the recorded GPU bundle's draw call valid every frame, while
         * the live particle data is uploaded to the bundle-referenced vertex buffer through the normal `animate()` path.
         *
         * The helper additionally advances the particle simulation and updates view/projection (and `eyePosition`/`invView`
         * for billboard modes) into the particle system's draw wrappers each frame, because FAST snapshot replay skips the
         * normal scene particle evaluation path after the bundle is recorded.
         *
         * Notes:
         * - Call this BEFORE `enableSnapshotRendering()` so the recording sees the correct draw count.
         * - GPU particle systems (`GPUParticleSystem`) are not supported by this method.
         * - Vertex shader cost scales with `getCapacity()` rather than the live particle count, so size capacity realistically.
         * - Per-frame uniforms other than camera matrices (e.g. `textureMask`, `translationPivot`, clip planes, fog) are
         *   baked at recording time and will not update during snapshot replay.
         * @param particleSystem The particle system to fix
         */
        fixParticleSystem(particleSystem: IParticleSystem): void;
        private _updateFixedCapacityParticleSystem;
        private _particleSystemUpdateEffects;
        private _particleSystemBillboardFlags;
        private _particleSystemDirectMatrixUpdate;
        private _executeAtFrame;
        private _log;
    }


    /**
     * Defines an array and its length.
     * It can be helpful to group result from both Arrays and smart arrays in one structure.
     */
    export interface ISmartArrayLike<T> {
        /**
         * The data of the array.
         */
        data: Array<T>;
        /**
         * The active length of the array.
         */
        length: number;
    }
    /**
     * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.
     */
    export class SmartArray<T> implements ISmartArrayLike<T> {
        /**
         * The full set of data from the array.
         */
        data: Array<T>;
        /**
         * The active length of the array.
         */
        length: number;
        protected _id: number;
        /**
         * Instantiates a Smart Array.
         * @param capacity defines the default capacity of the array.
         */
        constructor(capacity: number);
        /**
         * Pushes a value at the end of the active data.
         * @param value defines the object to push in the array.
         */
        push(value: T): void;
        /**
         * Iterates over the active data and apply the lambda to them.
         * @param func defines the action to apply on each value.
         */
        forEach(func: (content: T) => void): void;
        /**
         * Sorts the full sets of data.
         * @param compareFn defines the comparison function to apply.
         */
        sort(compareFn: (a: T, b: T) => number): void;
        /**
         * Resets the active data to an empty array.
         */
        reset(): void;
        /**
         * Releases all the data from the array as well as the array.
         */
        dispose(): void;
        /**
         * Concats the active data with a given array.
         * @param array defines the data to concatenate with.
         */
        concat(array: any): void;
        /**
         * Returns the position of a value in the active data.
         * @param value defines the value to find the index for
         * @returns the index if found in the active data otherwise -1
         */
        indexOf(value: T): number;
        /**
         * Returns whether an element is part of the active data.
         * @param value defines the value to look for
         * @returns true if found in the active data otherwise false
         */
        contains(value: T): boolean;
        private static _GlobalId;
    }
    /**
     * Defines an GC Friendly array where the backfield array do not shrink to prevent over allocations.
     * The data in this array can only be present once
     */
    export class SmartArrayNoDuplicate<T> extends SmartArray<T> {
        private _duplicateId;
        /**
         * Pushes a value at the end of the active data.
         * THIS DOES NOT PREVENT DUPPLICATE DATA
         * @param value defines the object to push in the array.
         */
        push(value: T): void;
        /**
         * Pushes a value at the end of the active data.
         * If the data is already present, it won t be added again
         * @param value defines the object to push in the array.
         * @returns true if added false if it was already present
         */
        pushNoDuplicate(value: T): boolean;
        /**
         * Resets the active data to an empty array.
         */
        reset(): void;
        /**
         * Concats the active data with a given array.
         * This ensures no duplicate will be present in the result.
         * @param array defines the data to concatenate with.
         */
        concatWithNoDuplicate(array: any): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Captures a screenshot of the current rendering
     * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
     * @param engine defines the rendering engine
     * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
     * @param size This parameter can be set to a single number or to an object with the
     * following (optional) properties: precision, width, height. If a single number is passed,
     * it will be used for both width and height. If an object is passed, the screenshot size
     * will be derived from the parameters. The precision property is a multiplier allowing
     * rendering at a higher or lower resolution
     * @param successCallback defines the callback receives a single parameter which contains the
     * screenshot as a string of base64-encoded characters. This string can be assigned to the
     * src parameter of an <img> to display it
     * @param mimeType defines the MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param forceDownload force the system to download the image even if a successCallback is provided
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
     * @param clearWithSceneColor If true, the screenshot canvas will be cleared with the scene clear color before copying the render.
     */
    export function CreateScreenshot(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, forceDownload?: boolean, quality?: number, useFill?: boolean, clearWithSceneColor?: boolean): void;
    /**
     * Captures a screenshot of the current rendering
     * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
     * @param engine defines the rendering engine
     * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
     * @param size This parameter can be set to a single number or to an object with the
     * following (optional) properties: precision, width, height. If a single number is passed,
     * it will be used for both width and height. If an object is passed, the screenshot size
     * will be derived from the parameters. The precision property is a multiplier allowing
     * rendering at a higher or lower resolution
     * @param mimeType defines the MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
     * @param clearWithSceneColor If true, the screenshot canvas will be cleared with the scene clear color before copying the render.
     * @param forceDownload force the system to download the image
     * @returns screenshot as a string of base64-encoded characters. This string can be assigned
     * to the src parameter of an <img> to display it
     */
    export function CreateScreenshotAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, quality?: number, useFill?: boolean, clearWithSceneColor?: boolean, forceDownload?: boolean): Promise<string>;
    /**
     * Captures and automatically downloads a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)
     * If screenshot image data is needed, use {@link CreateScreenshotAsync} instead.
     * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
     * @param engine defines the rendering engine
     * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
     * @param width defines the expected width
     * @param height defines the expected height
     * @param mimeType defines the MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
     * @returns promise that resolves once the screenshot is taken
     */
    export function CreateScreenshotWithResizeAsync(engine: AbstractEngine, camera: Camera, width: number, height: number, mimeType?: string, quality?: number, useFill?: boolean): Promise<void>;
    /**
     * Generates an image screenshot from the specified camera.
     * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
     * @param engine The engine to use for rendering
     * @param camera The camera to use for rendering
     * @param size This parameter can be set to a single number or to an object with the
     * following (optional) properties: precision, width, height, finalWidth, finalHeight. If a single number is passed,
     * it will be used for both width and height, as well as finalWidth, finalHeight. If an object is passed, the screenshot size
     * will be derived from the parameters. The precision property is a multiplier allowing
     * rendering at a higher or lower resolution
     * @param successCallback The callback receives a single parameter which contains the
     * screenshot as a string of base64-encoded characters. This string can be assigned to the
     * src parameter of an <img> to display it
     * @param mimeType The MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param samples Texture samples (default: 1)
     * @param antialiasing Whether antialiasing should be turned on or not (default: false)
     * @param fileName A name for for the downloaded file.
     * @param renderSprites Whether the sprites should be rendered or not (default: false)
     * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
     * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
     * @param customDumpData The function to use to dump the data. If not provided, the default DumpData function will be used.
     * @param timeoutInMilliseconds The maximum time to wait for the screenshot to be ready before calling the timeoutErrorCallback (default: 30000 ms)
     * @param timeoutErrorCallback The callback that will be called if the screenshot could not be taken before the timeoutInMilliseconds
     */
    export function CreateScreenshotUsingRenderTarget(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, successCallback?: (data: string) => void, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void, customDumpData?: (width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number) => void, timeoutInMilliseconds?: number, timeoutErrorCallback?: () => void): void;
    /**
     * Generates an image screenshot from the specified camera.
     * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
     * @param engine The engine to use for rendering
     * @param camera The camera to use for rendering
     * @param size This parameter can be set to a single number or to an object with the
     * following (optional) properties: precision, width, height. If a single number is passed,
     * it will be used for both width and height. If an object is passed, the screenshot size
     * will be derived from the parameters. The precision property is a multiplier allowing
     * rendering at a higher or lower resolution
     * @param mimeType The MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param samples Texture samples (default: 1)
     * @param antialiasing Whether antialiasing should be turned on or not (default: false)
     * @param fileName A name for for the downloaded file.
     * @param renderSprites Whether the sprites should be rendered or not (default: false)
     * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
     * @param useLayerMask if the camera's layer mask should be used to filter what should be rendered (default: true)
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param customizeTexture An optional callback that can be used to modify the render target texture before taking the screenshot. This can be used, for instance, to enable camera post-processes before taking the screenshot.
     * @param customDumpData The function to use to dump the data. If not provided, the default DumpData function will be used.
     * @returns screenshot as a string of base64-encoded characters. This string can be assigned
     * to the src parameter of an <img> to display it
     */
    export function CreateScreenshotUsingRenderTargetAsync(engine: AbstractEngine, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, renderSprites?: boolean, enableStencilBuffer?: boolean, useLayerMask?: boolean, quality?: number, customizeTexture?: (texture: RenderTargetTexture) => void, customDumpData?: (width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number) => void): Promise<string>;
    /**
     * Generates an image screenshot from the specified frame graph and camera
     * Please note:
     *  - that the frame graph must write to the back buffer color for this to work! This is because the back buffer color is replaced by the texture of the screenshot during the operation.
     *  - the camera is set as the camera for the main object renderer of the frame graph during the operation, and restored afterwards.
     *    This will only work if the frame graph has a main object renderer (isMainObjectRenderer is true for one of its object renderers)
     *  - that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
     * @param frameGraph The frame graph to use for rendering
     * @param camera The camera to use for rendering
     * @param size This parameter can be set to a single number or to an object with the
     * following (optional) properties: precision, width, height. If a single number is passed,
     * it will be used for both width and height. If an object is passed, the screenshot size
     * will be derived from the parameters. The precision property is a multiplier allowing
     * rendering at a higher or lower resolution
     * @param mimeType The MIME type of the screenshot image (default: image/png).
     * Check your browser for supported MIME types
     * @param samples Texture samples (default: 1)
     * @param antialiasing Whether antialiasing should be turned on or not (default: false)
     * @param fileName A name for for the downloaded file.
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @param customDumpData The function to use to dump the data. If not provided, the default DumpData function will be used.
     * @param automaticDownload If true, the screenshot will be automatically downloaded as a file instead of being returned as a string: in this case, null is returned.
     * @param numberOfFramesToRender If provided, the number of frames to render before taking the screenshot.
     * If not provided, the screenshot will be taken after the next frame, or after 32 frames if the frame graph has at least one history texture.
     * @returns screenshot as a string of base64-encoded characters. This string can be assigned
     * to the src parameter of an <img> to display it. If automaticDownload is true, null is returned instead
     */
    export function CreateScreenshotForFrameGraphAsync(frameGraph: FrameGraph, camera: Camera, size: IScreenshotSize | number, mimeType?: string, samples?: number, antialiasing?: boolean, fileName?: string, quality?: number, customDumpData?: (width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number) => void, automaticDownload?: boolean, numberOfFramesToRender?: number): Promise<string | ArrayBuffer | null>;
    /**
     * Class containing a set of static utilities functions for screenshots
     */
    export var ScreenshotTools: {
        /**
         * Captures a screenshot of the current rendering
         * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine defines the rendering engine
         * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param successCallback defines the callback receives a single parameter which contains the
         * screenshot as a string of base64-encoded characters. This string can be assigned to the
         * src parameter of an <img> to display it
         * @param mimeType defines the MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param forceDownload force the system to download the image even if a successCallback is provided
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
         */
        CreateScreenshot: typeof CreateScreenshot;
        /**
         * Captures a screenshot of the current rendering
         * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine defines the rendering engine
         * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param mimeType defines the MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
         * @param forceDownload force the system to download the image
         * @returns screenshot as a string of base64-encoded characters. This string can be assigned
         * to the src parameter of an <img> to display it
         */
        CreateScreenshotAsync: typeof CreateScreenshotAsync;
        /**
         * Captures and automatically downloads a screenshot of the current rendering for a specific size. This will render the entire canvas but will generate a blink (due to canvas resize)
         * If screenshot image data is needed, use {@link CreateScreenshotAsync} instead.
         * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine defines the rendering engine
         * @param camera defines the source camera. If the camera is not the scene's active camera, {@link CreateScreenshotUsingRenderTarget} will be used instead, and `useFill` will be ignored
         * @param width defines the expected width
         * @param height defines the expected height
         * @param mimeType defines the MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param useFill fill the screenshot dimensions with the render canvas and clip any overflow. If false, fit the canvas within the screenshot, as in letterboxing.
         * @returns promise that resolves once the screenshot is taken
         */
        CreateScreenshotWithResizeAsync: typeof CreateScreenshotWithResizeAsync;
        /**
         * Generates an image screenshot from the specified camera.
         * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine The engine to use for rendering
         * @param camera The camera to use for rendering
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param successCallback The callback receives a single parameter which contains the
         * screenshot as a string of base64-encoded characters. This string can be assigned to the
         * src parameter of an <img> to display it
         * @param mimeType The MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param samples Texture samples (default: 1)
         * @param antialiasing Whether antialiasing should be turned on or not (default: false)
         * @param fileName A name for for the downloaded file.
         * @param renderSprites Whether the sprites should be rendered or not (default: false)
         * @param enableStencilBuffer Whether the stencil buffer should be enabled or not (default: false)
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         */
        CreateScreenshotUsingRenderTarget: typeof CreateScreenshotUsingRenderTarget;
        /**
         * Generates an image screenshot from the specified camera.
         * Please note that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/renderToPNG
         * @param engine The engine to use for rendering
         * @param camera The camera to use for rendering
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param mimeType The MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param samples Texture samples (default: 1)
         * @param antialiasing Whether antialiasing should be turned on or not (default: false)
         * @param fileName A name for for the downloaded file.
         * @param renderSprites Whether the sprites should be rendered or not (default: false)
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @returns screenshot as a string of base64-encoded characters. This string can be assigned
         * to the src parameter of an <img> to display it
         */
        CreateScreenshotUsingRenderTargetAsync: typeof CreateScreenshotUsingRenderTargetAsync;
        /**
         * Generates an image screenshot from the specified frame graph and camera
         * Please note:
         *  - that the frame graph must write to the back buffer color for this to work! This is because the back buffer color is replaced by the texture of the screenshot during the operation.
         *  - the camera is set as the camera for the main object renderer of the frame graph during the operation, and restored afterwards.
         *    This will only work if the frame graph has a main object renderer (isMainObjectRenderer is true for one of its object renderers)
         *  - that simultaneous screenshots are not supported: you must wait until one screenshot is complete before taking another.
         * @param frameGraph The frame graph to use for rendering
         * @param camera The camera to use for rendering
         * @param size This parameter can be set to a single number or to an object with the
         * following (optional) properties: precision, width, height. If a single number is passed,
         * it will be used for both width and height. If an object is passed, the screenshot size
         * will be derived from the parameters. The precision property is a multiplier allowing
         * rendering at a higher or lower resolution
         * @param mimeType The MIME type of the screenshot image (default: image/png).
         * Check your browser for supported MIME types
         * @param samples Texture samples (default: 1)
         * @param antialiasing Whether antialiasing should be turned on or not (default: false)
         * @param fileName A name for for the downloaded file.
         * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
         * @param customDumpData The function to use to dump the data. If not provided, the default DumpData function will be used.
         * @param automaticDownload If true, the screenshot will be automatically downloaded as a file instead of being returned as a string: in this case, null is returned.
         * @returns screenshot as a string of base64-encoded characters. This string can be assigned
         * to the src parameter of an <img> to display it. If automaticDownload is true, null is returned instead
         */
        CreateScreenshotForFrameGraphAsync: typeof CreateScreenshotForFrameGraphAsync;
    };
    /**
     * Register side effects for screenshotTools.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScreenshotTools(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import screenshotTools.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to serialize a scene into a string
     */
    export class SceneSerializer {
        /**
         * Clear cache used by a previous serialization
         */
        static ClearCache(): void;
        /**
         * Serialize a scene into a JSON compatible object
         * Note that if the current engine does not support synchronous texture reading (like WebGPU), you should use SerializeAsync instead
         * as else you may not retrieve the proper base64 encoded texture data (when using the Texture.ForceSerializeBuffers flag)
         * @param scene defines the scene to serialize
         * @returns a JSON compatible object
         */
        static Serialize(scene: Scene): any;
        private static _Serialize;
        /**
         * Serialize a scene into a JSON compatible object
         * @param scene defines the scene to serialize
         * @returns a JSON promise compatible object
         */
        static SerializeAsync(scene: Scene): Promise<any>;
        private static _CollectPromises;
        /**
         * Serialize a mesh into a JSON compatible object
         * @param toSerialize defines the mesh to serialize
         * @param withParents defines if parents must be serialized as well
         * @param withChildren defines if children must be serialized as well
         * @returns a JSON compatible object
         */
        static SerializeMesh(toSerialize: any, withParents?: boolean, withChildren?: boolean): any;
    }


    /**
     * Class used to record delta files between 2 scene states
     */
    export class SceneRecorder implements IDisposable {
        private _trackedScene;
        private _savedJSON;
        /**
         * Track a given scene. This means the current scene state will be considered the original state
         * @param scene defines the scene to track
         */
        track(scene: Scene): void;
        /**
         * Get the delta between current state and original state
         * @returns a any containing the delta
         */
        getDelta(): any;
        private _compareArray;
        private _compareObjects;
        private _compareCollections;
        /**
         * Dispose the recorder.
         */
        dispose(): void;
        private static GetShadowGeneratorById;
        /**
         * Apply a given delta to a given scene
         * @param deltaJSON defines the JSON containing the delta
         * @param scene defines the scene to apply the delta to
         */
        static ApplyDelta(deltaJSON: any | string, scene: Scene): void;
        private static _ApplyPropertiesToEntity;
        private static _ApplyDeltaForEntity;
    }


    /**
     * Defines the root class used to create scene optimization to use with SceneOptimizer
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class SceneOptimization {
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority: number;
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
        /**
         * Creates the SceneOptimization object
         * @param priority defines the priority of this optimization (0 by default which means first in the list)
         */
        constructor(
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority?: number);
    }
    /**
     * Defines an optimization used to reduce the size of render target textures
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class TextureOptimization extends SceneOptimization {
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority: number;
        /**
         * [1024] Defines the maximum sized allowed for textures (1024 is the default value). If a texture is bigger, it will be scaled down using a factor defined by the step parameter
         */
        maximumSize: number;
        /**
         * [0.5] Defines the factor (0.5 by default) used to scale down textures bigger than maximum sized allowed.
         */
        step: number;
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * Creates the TextureOptimization object
         * @param priority defines the priority of this optimization (0 by default which means first in the list)
         * @param maximumSize defines the maximum sized allowed for textures (1024 is the default value). If a texture is bigger, it will be scaled down using a factor defined by the step parameter
         * @param step defines the factor (0.5 by default) used to scale down textures bigger than maximum sized allowed.
         */
        constructor(
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority?: number, 
        /**
         * [1024] Defines the maximum sized allowed for textures (1024 is the default value). If a texture is bigger, it will be scaled down using a factor defined by the step parameter
         */
        maximumSize?: number, 
        /**
         * [0.5] Defines the factor (0.5 by default) used to scale down textures bigger than maximum sized allowed.
         */
        step?: number);
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to increase or decrease the rendering resolution
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class HardwareScalingOptimization extends SceneOptimization {
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority: number;
        /**
         * [2] Defines the maximum scale to use (2 by default)
         */
        maximumScale: number;
        /**
         * [0.25] Defines the step to use between two passes (0.5 by default)
         */
        step: number;
        private _currentScale;
        private _directionOffset;
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * Creates the HardwareScalingOptimization object
         * @param priority defines the priority of this optimization (0 by default which means first in the list)
         * @param maximumScale defines the maximum scale to use (2 by default)
         * @param step defines the step to use between two passes (0.5 by default)
         */
        constructor(
        /**
         * [0] Defines the priority of this optimization (0 by default which means first in the list)
         */
        priority?: number, 
        /**
         * [2] Defines the maximum scale to use (2 by default)
         */
        maximumScale?: number, 
        /**
         * [0.25] Defines the step to use between two passes (0.5 by default)
         */
        step?: number);
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to remove shadows
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class ShadowsOptimization extends SceneOptimization {
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to turn post-processes off
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class PostProcessesOptimization extends SceneOptimization {
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to turn lens flares off
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class LensFlaresOptimization extends SceneOptimization {
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization based on user defined callback.
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class CustomOptimization extends SceneOptimization {
        /**
         * Callback called to apply the custom optimization.
         */
        onApply: (scene: Scene, optimizer: SceneOptimizer) => boolean;
        /**
         * Callback called to get custom description
         */
        onGetDescription: () => string;
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to turn particles off
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class ParticlesOptimization extends SceneOptimization {
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to turn render targets off
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class RenderTargetsOptimization extends SceneOptimization {
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer): boolean;
    }
    /**
     * Defines an optimization used to merge meshes with compatible materials
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class MergeMeshesOptimization extends SceneOptimization {
        private static _UpdateSelectionTree;
        /**
         * Gets or sets a boolean which defines if optimization octree has to be updated
         */
        static get UpdateSelectionTree(): boolean;
        /**
         * Gets or sets a boolean which defines if optimization octree has to be updated
         */
        static set UpdateSelectionTree(value: boolean);
        /**
         * Gets a string describing the action executed by the current optimization
         * @returns description string
         */
        getDescription(): string;
        private _canBeMerged;
        /**
         * This function will be called by the SceneOptimizer when its priority is reached in order to apply the change required by the current optimization
         * @param scene defines the current scene where to apply this optimization
         * @param optimizer defines the current optimizer
         * @param updateSelectionTree defines that the selection octree has to be updated (false by default)
         * @returns true if everything that can be done was applied
         */
        apply(scene: Scene, optimizer: SceneOptimizer, updateSelectionTree?: boolean): boolean;
    }
    /**
     * Defines a list of options used by SceneOptimizer
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class SceneOptimizerOptions {
        /**
         * [60] Defines the target frame rate to reach (60 by default)
         */
        targetFrameRate: number;
        /**
         * [2000] Defines the interval between two checks (2000ms by default)
         */
        trackerDuration: number;
        /**
         * Gets the list of optimizations to apply
         */
        optimizations: SceneOptimization[];
        /**
         * Creates a new list of options used by SceneOptimizer
         * @param targetFrameRate defines the target frame rate to reach (60 by default)
         * @param trackerDuration defines the interval between two checks (2000ms by default)
         */
        constructor(
        /**
         * [60] Defines the target frame rate to reach (60 by default)
         */
        targetFrameRate?: number, 
        /**
         * [2000] Defines the interval between two checks (2000ms by default)
         */
        trackerDuration?: number);
        /**
         * Add a new optimization
         * @param optimization defines the SceneOptimization to add to the list of active optimizations
         * @returns the current SceneOptimizerOptions
         */
        addOptimization(optimization: SceneOptimization): SceneOptimizerOptions;
        /**
         * Add a new custom optimization
         * @param onApply defines the callback called to apply the custom optimization (true if everything that can be done was applied)
         * @param onGetDescription defines the callback called to get the description attached with the optimization.
         * @param priority defines the priority of this optimization (0 by default which means first in the list)
         * @returns the current SceneOptimizerOptions
         */
        addCustomOptimization(onApply: (scene: Scene, optimizer: SceneOptimizer) => boolean, onGetDescription: () => string, priority?: number): SceneOptimizerOptions;
        /**
         * Creates a list of pre-defined optimizations aimed to reduce the visual impact on the scene
         * @param targetFrameRate defines the target frame rate (60 by default)
         * @returns a SceneOptimizerOptions object
         */
        static LowDegradationAllowed(targetFrameRate?: number): SceneOptimizerOptions;
        /**
         * Creates a list of pre-defined optimizations aimed to have a moderate impact on the scene visual
         * @param targetFrameRate defines the target frame rate (60 by default)
         * @returns a SceneOptimizerOptions object
         */
        static ModerateDegradationAllowed(targetFrameRate?: number): SceneOptimizerOptions;
        /**
         * Creates a list of pre-defined optimizations aimed to have a big impact on the scene visual
         * @param targetFrameRate defines the target frame rate (60 by default)
         * @returns a SceneOptimizerOptions object
         */
        static HighDegradationAllowed(targetFrameRate?: number): SceneOptimizerOptions;
    }
    /**
     * Class used to run optimizations in order to reach a target frame rate
     * @description More details at https://doc.babylonjs.com/features/featuresDeepDive/scene/sceneOptimizer
     */
    export class SceneOptimizer implements IDisposable {
        private _isRunning;
        private _options;
        private _scene;
        private _currentPriorityLevel;
        private _targetFrameRate;
        private _trackerDuration;
        private _currentFrameRate;
        private _sceneDisposeObserver;
        private _improvementMode;
        /**
         * Defines an observable called when the optimizer reaches the target frame rate
         */
        onSuccessObservable: Observable<SceneOptimizer>;
        /**
         * Defines an observable called when the optimizer enables an optimization
         */
        onNewOptimizationAppliedObservable: Observable<SceneOptimization>;
        /**
         * Defines an observable called when the optimizer is not able to reach the target frame rate
         */
        onFailureObservable: Observable<SceneOptimizer>;
        /**
         * Gets or sets a boolean indicating if the optimizer is in improvement mode
         */
        get isInImprovementMode(): boolean;
        set isInImprovementMode(value: boolean);
        /**
         * Gets the current priority level (0 at start)
         */
        get currentPriorityLevel(): number;
        /**
         * Gets the current frame rate checked by the SceneOptimizer
         */
        get currentFrameRate(): number;
        /**
         * Gets or sets the current target frame rate (60 by default)
         */
        get targetFrameRate(): number;
        /**
         * Gets or sets the current target frame rate (60 by default)
         */
        set targetFrameRate(value: number);
        /**
         * Gets or sets the current interval between two checks (every 2000ms by default)
         */
        get trackerDuration(): number;
        /**
         * Gets or sets the current interval between two checks (every 2000ms by default)
         */
        set trackerDuration(value: number);
        /**
         * Gets the list of active optimizations
         */
        get optimizations(): SceneOptimization[];
        /**
         * Creates a new SceneOptimizer
         * @param scene defines the scene to work on
         * @param options defines the options to use with the SceneOptimizer
         * @param autoGeneratePriorities defines if priorities must be generated and not read from SceneOptimization property (true by default)
         * @param improvementMode defines if the scene optimizer must run the maximum optimization while staying over a target frame instead of trying to reach the target framerate (false by default)
         */
        constructor(scene: Scene, options?: SceneOptimizerOptions, autoGeneratePriorities?: boolean, improvementMode?: boolean);
        /**
         * Stops the current optimizer
         */
        stop(): void;
        /**
         * Reset the optimizer to initial step (current priority level = 0)
         */
        reset(): void;
        /**
         * Start the optimizer. By default it will try to reach a specific framerate
         * but if the optimizer is set with improvementMode === true then it will run all optimization while frame rate is above the target frame rate
         */
        start(): void;
        private _checkCurrentState;
        /**
         * Release all resources
         */
        dispose(): void;
        /**
         * Helper function to create a SceneOptimizer with one single line of code
         * @param scene defines the scene to work on
         * @param options defines the options to use with the SceneOptimizer
         * @param onSuccess defines a callback to call on success
         * @param onFailure defines a callback to call on failure
         * @returns the new SceneOptimizer object
         */
        static OptimizeAsync(scene: Scene, options?: SceneOptimizerOptions, onSuccess?: () => void, onFailure?: () => void): SceneOptimizer;
    }


    /**
     * Class used to host RGBD texture specific utilities
     */
    export class RGBDTextureTools {
        /**
         * Expand the RGBD Texture from RGBD to Half Float if possible.
         * @param texture the texture to expand.
         */
        static ExpandRGBDTexture(texture: Texture): void;
        /**
         * Encode the texture to RGBD if possible.
         * @param internalTexture the texture to encode
         * @param scene the scene hosting the texture
         * @param outputTextureType type of the texture in which the encoding is performed
         * @returns a promise with the internalTexture having its texture replaced by the result of the processing
         */
        static EncodeTextureToRGBD(internalTexture: InternalTexture, scene: Scene, outputTextureType?: number): Promise<InternalTexture>;
    }


    /**
     * Class used to define a retry strategy when error happens while loading assets
     */
    export class RetryStrategy {
        /**
         * Function used to defines an exponential back off strategy
         * @param maxRetries defines the maximum number of retries (3 by default)
         * @param baseInterval defines the interval between retries
         * @returns the strategy function to use
         */
        static ExponentialBackoff(maxRetries?: number, baseInterval?: number): (url: string, request: WebRequest, retryIndex: number) => number;
    }


    /**
     * Class used to connect with the reflector zone of the sandbox via the reflector bridge
     * @since 5.0.0
     */
    export class Reflector {
        private static readonly _SERVER_PREFIX;
        private _scene;
        private _webSocket;
        /**
         * Constructs a reflector object.
         * @param scene The scene to use
         * @param hostname The hostname of the reflector bridge
         * @param port The port of the reflector bridge
         */
        constructor(scene: Scene, hostname: string, port: number);
        /**
         * Closes the reflector connection
         */
        close(): void;
        private _handleServerMessage;
        private _handleClientMessage;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * A wrapper for the experimental pressure api which allows a callback to be called whenever certain thresholds are met.
     */
    export class PressureObserverWrapper {
        private _observer;
        private _currentState;
        /**
         * An event triggered when the cpu usage/speed meets certain thresholds.
         * Note: pressure is an experimental API.
         */
        onPressureChanged: Observable<PressureRecord[]>;
        /**
         * A pressure observer will call this callback, whenever these thresholds are met.
         * @param options An object containing the thresholds used to decide what value to to return for each update property (average of start and end of a threshold boundary).
         */
        constructor(options?: PressureObserverOptions);
        /**
         * Returns true if PressureObserver is available for use, false otherwise.
         */
        static get IsAvailable(): boolean;
        /**
         * Method that must be called to begin observing changes, and triggering callbacks.
         * @param source defines the source to observe
         */
        observe(source: PressureSource): void;
        /**
         * Method that must be called to stop observing changes and triggering callbacks (cleanup function).
         * @param source defines the source to unobserve
         */
        unobserve(source: PressureSource): void;
        /**
         * Release the associated resources.
         */
        dispose(): void;
    }


    /**
     * Class containing a set of static utilities functions for precision date
     */
    export class PrecisionDate {
        /**
         * Gets either window.performance.now() if supported or Date.now() else
         */
        static get Now(): number;
    }


    /**
     * Class containing a set of static utilities functions for managing Pivots
     * @internal
     */
    export class PivotTools {
        private static _PivotCached;
        private static _OldPivotPoint;
        private static _PivotTranslation;
        private static _PivotTmpVector;
        private static _PivotPostMultiplyPivotMatrix;
        /**
         * @internal
         */
        static _RemoveAndStorePivotPoint(mesh: TransformNode): void;
        /**
         * @internal
         */
        static _RestorePivotPoint(mesh: TransformNode): void;
    }


    /**
     * Performance monitor tracks rolling average frame-time and frame-time variance over a user defined sliding-window
     */
    export class PerformanceMonitor {
        private _enabled;
        private _rollingFrameTime;
        private _lastFrameTimeMs;
        /**
         * constructor
         * @param frameSampleSize The number of samples required to saturate the sliding window
         */
        constructor(frameSampleSize?: number);
        /**
         * Samples current frame
         * @param timeMs A timestamp in milliseconds of the current frame to compare with other frames
         */
        sampleFrame(timeMs?: number): void;
        /**
         * Returns the average frame time in milliseconds over the sliding window (or the subset of frames sampled so far)
         */
        get averageFrameTime(): number;
        /**
         * Returns the variance frame time in milliseconds over the sliding window (or the subset of frames sampled so far)
         */
        get averageFrameTimeVariance(): number;
        /**
         * Returns the frame time of the most recent frame
         */
        get instantaneousFrameTime(): number;
        /**
         * Returns the average framerate in frames per second over the sliding window (or the subset of frames sampled so far)
         */
        get averageFPS(): number;
        /**
         * Returns the average framerate in frames per second using the most recent frame time
         */
        get instantaneousFPS(): number;
        /**
         * Returns true if enough samples have been taken to completely fill the sliding window
         */
        get isSaturated(): boolean;
        /**
         * Enables contributions to the sliding window sample set
         */
        enable(): void;
        /**
         * Disables contributions to the sliding window sample set
         * Samples will not be interpolated over the disabled period
         */
        disable(): void;
        /**
         * Returns true if sampling is enabled
         */
        get isEnabled(): boolean;
        /**
         * Resets performance monitor
         */
        reset(): void;
    }
    /**
     * RollingAverage
     *
     * Utility to efficiently compute the rolling average and variance over a sliding window of samples
     */
    export class RollingAverage {
        /**
         * Current average
         */
        average: number;
        /**
         * Current variance
         */
        variance: number;
        protected _samples: Array<number>;
        protected _sampleCount: number;
        protected _pos: number;
        protected _m2: number;
        /**
         * constructor
         * @param length The number of samples required to saturate the sliding window
         */
        constructor(length: number);
        /**
         * Adds a sample to the sample set
         * @param v The sample value
         */
        add(v: number): void;
        /**
         * Returns previously added values or null if outside of history or outside the sliding window domain
         * @param i Index in history. For example, pass 0 for the most recent value and 1 for the value before that
         * @returns Value previously recorded with add() or null if outside of range
         */
        history(i: number): number;
        /**
         * Returns true if enough samples have been taken to completely fill the sliding window
         * @returns true if sample-set saturated
         */
        isSaturated(): boolean;
        /**
         * Resets the rolling average (equivalent to 0 samples taken so far)
         */
        reset(): void;
        /**
         * Wraps a value around the sample range boundaries
         * @param i Position in sample range, for example if the sample length is 5, and i is -3, then 2 will be returned.
         * @returns Wrapped position in sample range
         */
        protected _wrapPosition(i: number): number;
    }


    /**
     * This class is used to track a performance counter which is number based.
     * The user has access to many properties which give statistics of different nature.
     *
     * The implementer can track two kinds of Performance Counter: time and count.
     * For time you can optionally call fetchNewFrame() to notify the start of a new frame to monitor, then call beginMonitoring() to start and endMonitoring() to record the lapsed time. endMonitoring takes a newFrame parameter for you to specify if the monitored time should be set for a new frame or accumulated to the current frame being monitored.
     * For count you first have to call fetchNewFrame() to notify the start of a new frame to monitor, then call addCount() how many time required to increment the count value you monitor.
     */
    export class PerfCounter {
        /**
         * Gets or sets a global boolean to turn on and off all the counters
         */
        static Enabled: boolean;
        /**
         * Returns the smallest value ever
         */
        get min(): number;
        /**
         * Returns the biggest value ever
         */
        get max(): number;
        /**
         * Returns the average value since the performance counter is running
         */
        get average(): number;
        /**
         * Returns the average value of the last second the counter was monitored
         */
        get lastSecAverage(): number;
        /**
         * Returns the current value
         */
        get current(): number;
        /**
         * Gets the accumulated total
         */
        get total(): number;
        /**
         * Gets the total value count
         */
        get count(): number;
        /**
         * Creates a new counter
         */
        constructor();
        /**
         * Call this method to start monitoring a new frame.
         * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the start of the frame, then beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.
         */
        fetchNewFrame(): void;
        /**
         * Call this method to monitor a count of something (e.g. mesh drawn in viewport count)
         * @param newCount the count value to add to the monitored count
         * @param fetchResult true when it's the last time in the frame you add to the counter and you wish to update the statistics properties (min/max/average), false if you only want to update statistics.
         */
        addCount(newCount: number, fetchResult: boolean): void;
        /**
         * Start monitoring this performance counter
         */
        beginMonitoring(): void;
        /**
         * Compute the time lapsed since the previous beginMonitoring() call.
         * @param newFrame true by default to fetch the result and monitor a new frame, if false the time monitored will be added to the current frame counter
         */
        endMonitoring(newFrame?: boolean): void;
        /**
         * Call this method to end the monitoring of a frame.
         * This scenario is typically used when you accumulate monitoring time many times for a single frame, you call this method at the end of the frame, after beginMonitoring to start recording and endMonitoring(false) to accumulated the recorded time to the PerfCounter or addCount() to accumulate a monitored count.
         */
        endFrame(): void;
        /** @internal */
        _fetchResult(): void;
        private _startMonitoringTime;
        private _min;
        private _max;
        private _average;
        private _current;
        private _totalValueCount;
        private _totalAccumulated;
        private _lastSecAverage;
        private _lastSecAccumulated;
        private _lastSecTime;
        private _lastSecValueCount;
    }


    /** This file must only contain pure code and pure imports */
        interface Observable<T> {
            /**
             * Internal observable-based coroutine scheduler instance.
             */
            _coroutineScheduler?: CoroutineScheduler<void>;
            /**
             * Internal disposal method for observable-based coroutine scheduler instance.
             */
            _coroutineSchedulerDispose?: () => void;
            /**
             * Runs a coroutine asynchronously on this observable
             * @param coroutine the iterator resulting from having started the coroutine
             * @returns a promise which will be resolved when the coroutine finishes or rejected if the coroutine is cancelled
             */
            runCoroutineAsync(coroutine: AsyncCoroutine<void>): Promise<void>;
            /**
             * Cancels all coroutines currently running on this observable
             */
            cancelAllCoroutines(): void;
        }


    /**
     * Register side effects for observableCoroutine.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterObservableCoroutine(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import observableCoroutine.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A class serves as a medium between the observable and its observers
     */
    export class EventState {
        /**
         * Create a new EventState
         * @param mask defines the mask associated with this state
         * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true
         * @param target defines the original target of the state
         * @param currentTarget defines the current target of the state
         */
        constructor(mask: number, skipNextObservers?: boolean, target?: any, currentTarget?: any);
        /**
         * Initialize the current event state
         * @param mask defines the mask associated with this state
         * @param skipNextObservers defines a flag which will instruct the observable to skip following observers when set to true
         * @param target defines the original target of the state
         * @param currentTarget defines the current target of the state
         * @returns the current event state
         */
        initialize(mask: number, skipNextObservers?: boolean, target?: any, currentTarget?: any): EventState;
        /**
         * An Observer can set this property to true to prevent subsequent observers of being notified
         */
        skipNextObservers: boolean;
        /**
         * Get the mask value that were used to trigger the event corresponding to this EventState object
         */
        mask: number;
        /**
         * The object that originally notified the event
         */
        target?: any;
        /**
         * The current object in the bubbling phase
         */
        currentTarget?: any;
        /**
         * This will be populated with the return value of the last function that was executed.
         * If it is the first function in the callback chain it will be the event data.
         */
        lastReturnValue?: any;
        /**
         * User defined information that will be sent to observers
         */
        userInfo?: any;
    }
    /**
     * Represent an observer registered to a given IObservable object.
     */
    export interface IObserver {
        /**
         * Remove the observer from its observable
         * @param defer if true, the removal will be deferred to avoid callback skipping (default: false)
         */
        remove(defer?: boolean): void;
    }
    /**
     * Represent an observer registered to a given Observable object.
     */
    export class Observer<T> implements IObserver {
        /**
         * Defines the callback to call when the observer is notified
         */
        callback: (eventData: T, eventState: EventState) => void;
        /**
         * Defines the mask of the observer (used to filter notifications)
         */
        mask: number;
        /**
         * [null] Defines the current scope used to restore the JS context
         */
        scope: any;
        /** @internal */
        _willBeUnregistered: boolean;
        /**
         * Gets or sets a property defining that the observer as to be unregistered after the next notification
         */
        unregisterOnNextCall: boolean;
        /**
         * this function can be used to remove the observer from the observable.
         * It will be set by the observable that the observer belongs to.
         * @internal
         */
        _remove: Nullable<(defer?: boolean) => void>;
        /**
         * Creates a new observer
         * @param callback defines the callback to call when the observer is notified
         * @param mask defines the mask of the observer (used to filter notifications)
         * @param scope defines the current scope used to restore the JS context
         */
        constructor(
        /**
         * Defines the callback to call when the observer is notified
         */
        callback: (eventData: T, eventState: EventState) => void, 
        /**
         * Defines the mask of the observer (used to filter notifications)
         */
        mask: number, 
        /**
         * [null] Defines the current scope used to restore the JS context
         */
        scope?: any);
        /**
         * Remove the observer from its observable
         * This can be used instead of using the observable's remove function.
         * @param defer if true, the removal will be deferred to avoid callback skipping (default: false)
         */
        remove(defer?: boolean): void;
    }
    /**
     * An interface that defines the reader side of an Observable (receive notifications).
     */
    export interface IReadonlyObservable<T = unknown> {
        /**
         * Create a new Observer with the specified callback
         * @param callback the callback that will be executed for that Observer
         * @param mask the mask used to filter observers
         * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.
         * @param scope optional scope for the callback to be called from
         * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification
         * @returns the new observer created for the callback
         */
        add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: unknown, unregisterOnFirstCall?: boolean): IObserver;
        /**
         * Create a new Observer with the specified callback and unregisters after the next notification
         * @param callback the callback that will be executed for that Observer
         * @returns the new observer created for the callback
         */
        addOnce(callback: (eventData: T, eventState: EventState) => void): IObserver;
    }
    /**
     * The Observable class is a simple implementation of the Observable pattern.
     *
     * There's one slight particularity though: a given Observable can notify its observer using a particular mask value, only the Observers registered with this mask value will be notified.
     * This enable a more fine grained execution without having to rely on multiple different Observable objects.
     * For instance you may have a given Observable that have four different types of notifications: Move (mask = 0x01), Stop (mask = 0x02), Turn Right (mask = 0X04), Turn Left (mask = 0X08).
     * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.
     */
    export class Observable<T> implements IReadonlyObservable<T> {
        /**
         * [false] If set to true the observable will notify when an observer was added if the observable was already triggered.
         * This is helpful to single-state observables like the scene onReady or the dispose observable.
         */
        notifyIfTriggered: boolean;
        private _observers;
        private _numObserversMarkedAsDeleted;
        private _hasNotified;
        private _lastNotifiedValue?;
        /**
         * @internal
         */
        _eventState: EventState;
        private _onObserverAdded;
        /**
         * Create an observable from a Promise.
         * @param promise a promise to observe for fulfillment.
         * @param onErrorObservable an observable to notify if a promise was rejected.
         * @returns the new Observable
         */
        static FromPromise<T, E = Error>(promise: Promise<T>, onErrorObservable?: Observable<E>): Observable<T>;
        /**
         * Gets the list of observers
         * Note that observers that were recently deleted may still be present in the list because they are only really deleted on the next javascript tick!
         */
        get observers(): Array<Observer<T>>;
        /**
         * Creates a new observable
         * @param onObserverAdded defines a callback to call when a new observer is added
         * @param notifyIfTriggered If set to true the observable will notify when an observer was added if the observable was already triggered.
         */
        constructor(onObserverAdded?: (observer: Observer<T>) => void, 
        /**
         * [false] If set to true the observable will notify when an observer was added if the observable was already triggered.
         * This is helpful to single-state observables like the scene onReady or the dispose observable.
         */
        notifyIfTriggered?: boolean);
        /**
         * Create a new Observer with the specified callback
         * @param callback the callback that will be executed for that Observer
         * @param mask the mask used to filter observers
         * @param insertFirst if true the callback will be inserted at the first position, hence executed before the others ones. If false (default behavior) the callback will be inserted at the last position, executed after all the others already present.
         * @param scope optional scope for the callback to be called from
         * @param unregisterOnFirstCall defines if the observer as to be unregistered after the next notification
         * @returns the new observer created for the callback
         */
        add(callback?: null, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): null;
        add(callback: (eventData: T, eventState: EventState) => void, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Observer<T>;
        add(callback?: ((eventData: T, eventState: EventState) => void) | null, mask?: number, insertFirst?: boolean, scope?: any, unregisterOnFirstCall?: boolean): Nullable<Observer<T>>;
        /**
         * Create a new Observer with the specified callback and unregisters after the next notification
         * @param callback the callback that will be executed for that Observer
         * @returns the new observer created for the callback
         */
        addOnce(callback?: null): null;
        addOnce(callback: (eventData: T, eventState: EventState) => void): Observer<T>;
        addOnce(callback?: ((eventData: T, eventState: EventState) => void) | null): Nullable<Observer<T>>;
        /**
         * Remove an Observer from the Observable object
         * @param observer the instance of the Observer to remove
         * @returns false if it doesn't belong to this Observable
         */
        remove(observer: Nullable<Observer<T>>): boolean;
        /**
         * Remove a callback from the Observable object
         * @param callback the callback to remove
         * @param scope optional scope. If used only the callbacks with this scope will be removed
         * @returns false if it doesn't belong to this Observable
         */
        removeCallback(callback: (eventData: T, eventState: EventState) => void, scope?: any): boolean;
        /**
         * @internal
         */
        _deferUnregister(observer: Observer<T>): void;
        private _remove;
        /**
         * Moves the observable to the top of the observer list making it get called first when notified
         * @param observer the observer to move
         */
        makeObserverTopPriority(observer: Observer<T>): void;
        /**
         * Moves the observable to the bottom of the observer list making it get called last when notified
         * @param observer the observer to move
         */
        makeObserverBottomPriority(observer: Observer<T>): void;
        /**
         * Notify all Observers by calling their respective callback with the given data
         * Will return true if all observers were executed, false if an observer set skipNextObservers to true, then prevent the subsequent ones to execute
         * @param eventData defines the data to send to all observers
         * @param mask defines the mask of the current notification (observers with incompatible mask (ie mask & observer.mask === 0) will not be notified)
         * @param target defines the original target of the state
         * @param currentTarget defines the current target of the state
         * @param userInfo defines any user info to send to observers
         * @returns false if the complete observer chain was not processed (because one observer set the skipNextObservers to true)
         */
        notifyObservers(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): boolean;
        /**
         * Notify a specific observer
         * @param observer defines the observer to notify
         * @param eventData defines the data to be sent to each callback
         * @param mask is used to filter observers defaults to -1
         */
        notifyObserver(observer: Observer<T>, eventData: T, mask?: number): void;
        /**
         * Gets a boolean indicating if the observable has at least one observer
         * @returns true is the Observable has at least one Observer registered
         */
        hasObservers(): boolean;
        /**
         * Clear the list of observers
         */
        clear(): void;
        /**
         * Clean the last notified state - both the internal last value and the has-notified flag
         */
        cleanLastNotifiedState(): void;
        /**
         * Clone the current observable
         * @returns a new observable
         */
        clone(): Observable<T>;
        /**
         * Does this observable handles observer registered with a given mask
         * @param mask defines the mask to be tested
         * @returns whether or not one observer registered with the given mask is handled
         **/
        hasSpecificMask(mask?: number): boolean;
    }


        interface Observable<T> {
            /**
             * Calling this will execute each callback, expecting it to be a promise or return a value.
             * If at any point in the chain one function fails, the promise will fail and the execution will not continue.
             * This is useful when a chain of events (sometimes async events) is needed to initialize a certain object
             * and it is crucial that all callbacks will be executed.
             * The order of the callbacks is kept, callbacks are not executed parallel.
             *
             * @param eventData The data to be sent to each callback
             * @param mask is used to filter observers defaults to -1
             * @param target defines the callback target (see EventState)
             * @param currentTarget defines he current object in the bubbling phase
             * @param userInfo defines any user info to send to observers
             * @returns {Promise<T>} will return a Promise than resolves when all callbacks executed successfully.
             */
            notifyObserversWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any, userInfo?: any): Promise<T>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Represent a list of observers registered to multiple Observables object.
     */
    export class MultiObserver<T> {
        private _observers;
        private _observables;
        /**
         * Release associated resources
         */
        dispose(): void;
        /**
         * Raise a callback when one of the observable will notify
         * @param observables defines a list of observables to watch
         * @param callback defines the callback to call on notification
         * @param mask defines the mask used to filter notifications
         * @param scope defines the current scope used to restore the JS context
         * @returns the new MultiObserver
         */
        static Watch<T>(observables: Observable<T>[], callback: (eventData: T, eventState: EventState) => void, mask?: number, scope?: any): MultiObserver<T>;
    }
    /**
     * Register side effects for observableExtensions.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterObservableExtensions(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import observable.extensions.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * This class computes a min/max reduction from a texture: it means it computes the minimum
     * and maximum values from all values of the texture.
     * It is performed on the GPU for better performances, thanks to a succession of post processes.
     * The source values are read from the red channel of the texture.
     */
    export class MinMaxReducer {
        /**
         * Observable triggered when the computation has been performed
         */
        get onAfterReductionPerformed(): Observable<{
            min: number;
            max: number;
        }>;
        protected readonly _camera: Camera;
        protected readonly _thinMinMaxReducer: ThinMinMaxReducer;
        protected _sourceTexture: Nullable<RenderTargetTexture>;
        protected readonly _reductionSteps: Array<PostProcess>;
        protected readonly _postProcessManager: PostProcessManager;
        protected _onAfterUnbindObserver: Nullable<Observer<RenderTargetTexture>>;
        protected _forceFullscreenViewport: boolean;
        protected readonly _onContextRestoredObserver: Observer<AbstractEngine>;
        /**
         * Creates a min/max reducer
         * @param camera The camera to use for the post processes
         */
        constructor(camera: Camera);
        /**
         * Gets the texture used to read the values from.
         */
        get sourceTexture(): Nullable<RenderTargetTexture>;
        /**
         * Sets the source texture to read the values from.
         * One must indicate if the texture is a depth texture or not through the depthRedux parameter
         * because in such textures '1' value must not be taken into account to compute the maximum
         * as this value is used to clear the texture.
         * Note that the computation is not activated by calling this function, you must call activate() for that!
         * @param sourceTexture The texture to read the values from. The values should be in the red channel.
         * @param depthRedux Indicates if the texture is a depth texture or not
         * @param type The type of the textures created for the reduction (defaults to TEXTURETYPE_HALF_FLOAT)
         * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)
         */
        setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type?: number, forceFullscreenViewport?: boolean): void;
        /**
         * Defines the refresh rate of the computation.
         * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...
         */
        get refreshRate(): number;
        set refreshRate(value: number);
        protected _activated: boolean;
        /**
         * Gets the activation status of the reducer
         */
        get activated(): boolean;
        /**
         * Activates the reduction computation.
         * When activated, the observers registered in onAfterReductionPerformed are
         * called after the computation is performed
         */
        activate(): void;
        /**
         * Deactivates the reduction computation.
         */
        deactivate(): void;
        /**
         * Disposes the min/max reducer
         * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.
         */
        dispose(disposeAll?: boolean): void;
        private _disposePostProcesses;
    }




    /**
     * Class used to explode meshes (ie. to have a center and move them away from that center to better see the overall organization)
     */
    export class MeshExploder {
        private _centerMesh;
        private _meshes;
        private _meshesOrigins;
        private _toCenterVectors;
        private _scaledDirection;
        private _newPosition;
        private _centerPosition;
        /**
         * Explodes meshes from a center mesh.
         * @param meshes The meshes to explode.
         * @param centerMesh The mesh to be center of explosion.
         */
        constructor(meshes: Array<Mesh>, centerMesh?: Mesh);
        private _setCenterMesh;
        /**
         * Get class name
         * @returns "MeshExploder"
         */
        getClassName(): string;
        /**
         * "Exploded meshes"
         * @returns Array of meshes with the centerMesh at index 0.
         */
        getMeshes(): Array<Mesh>;
        /**
         * Explodes meshes giving a specific direction
         * @param direction Number to multiply distance of each mesh's origin from center. Use a negative number to implode, or zero to reset.
         */
        explode(direction?: number): void;
    }


    /**
     * Logger used throughout the application to allow configuration of
     * the log level required for the messages.
     */
    export class Logger {
        /**
         * No log
         */
        static readonly NoneLogLevel = 0;
        /**
         * Only message logs
         */
        static readonly MessageLogLevel = 1;
        /**
         * Only warning logs
         */
        static readonly WarningLogLevel = 2;
        /**
         * Only error logs
         */
        static readonly ErrorLogLevel = 4;
        /**
         * All logs
         */
        static readonly AllLogLevel = 7;
        /**
         * Message to display when a message has been logged too many times
         */
        static MessageLimitReached: string;
        private static _LogCache;
        private static _LogLimitOutputs;
        private static _Levels;
        /**
         * Gets a value indicating the number of loading errors
         * @ignorenaming
         */
        static errorsCount: number;
        /**
         * Callback called when a new log is added
         */
        static OnNewCacheEntry: (entry: string) => void;
        private static _CheckLimit;
        private static _GenerateLimitMessage;
        private static _AddLogEntry;
        private static _FormatMessage;
        private static _LogDisabled;
        private static _LogEnabled;
        /**
         * Log a message to the console
         */
        static Log: (message: string | any[], limit?: number) => void;
        /**
         * Write a warning message to the console
         */
        static Warn: (message: string | any[], limit?: number) => void;
        /**
         * Write an error message to the console
         */
        static Error: (message: string | any[], limit?: number) => void;
        /**
         * Gets current log cache (list of logs)
         */
        static get LogCache(): string;
        /**
         * Clears the log cache
         */
        static ClearLogCache(): void;
        /**
         * Sets the current log level. This property is a bit field, allowing you to combine different levels (MessageLogLevel / WarningLogLevel / ErrorLogLevel).
         * Use NoneLogLevel to disable logging and AllLogLevel for a quick way to enable all levels.
         */
        static set LogLevels(level: number);
    }


    /**
     * A class that lazily initializes a value given a factory function.
     */
    export class Lazy<T> {
        private _factory;
        private _value;
        /**
         * Creates a new instance of the Lazy class.
         * @param factory A function that creates the value.
         */
        constructor(factory: () => T);
        /**
         * Gets the lazily initialized value.
         */
        get value(): T;
    }


    export type AllowedKeys = "wasmBaseUrl" | "wasmUASTCToASTC" | "wasmUASTCToBC7" | "wasmUASTCToRGBA_UNORM" | "wasmUASTCToRGBA_SRGB" | "wasmUASTCToR8_UNORM" | "wasmUASTCToRG8_UNORM" | "wasmMSCTranscoder" | "wasmZSTDDecoder" | "jsDecoderModule" | "jsMSCTranscoder";
    export function applyConfig(urls?: {
        [key in AllowedKeys]: string;
    }, binariesAndModulesContainer?: {
        [key in AllowedKeys]: ArrayBuffer | any;
    }): void;
    export function KTX2WorkerFunction(KTX2DecoderModule: any): void;
    export function KTX2InitializeWebWorker(worker: Worker, wasmBinaries?: {
        [key in AllowedKeys]?: ArrayBuffer;
    }, urls?: {
        [key in AllowedKeys]: string;
    }): Promise<Worker>;


    /**
     * Class that defines the default KTX2 decoder options.
     *
     * This class is useful for providing options to the KTX2 decoder to control how the source data is transcoded.
     */
    export class DefaultKTX2DecoderOptions {
        private _isDirty;
        /**
         * Gets the dirty flag
         */
        get isDirty(): boolean;
        private _useRGBAIfASTCBC7NotAvailableWhenUASTC?;
        /**
         * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and ASTC + BC7 are not available as a compressed transcoded format
         */
        get useRGBAIfASTCBC7NotAvailableWhenUASTC(): boolean | undefined;
        set useRGBAIfASTCBC7NotAvailableWhenUASTC(value: boolean | undefined);
        private _useRGBAIfOnlyBC1BC3AvailableWhenUASTC?;
        /**
         * force a (uncompressed) RGBA transcoded format if transcoding a UASTC source format and only BC1 or BC3 are available as a compressed transcoded format.
         * This property is true by default to favor speed over memory, because currently transcoding from UASTC to BC1/3 is slow because the transcoder transcodes
         * to uncompressed and then recompresses the texture
         */
        get useRGBAIfOnlyBC1BC3AvailableWhenUASTC(): boolean | undefined;
        set useRGBAIfOnlyBC1BC3AvailableWhenUASTC(value: boolean | undefined);
        private _forceRGBA?;
        /**
         * force to always use (uncompressed) RGBA for transcoded format
         */
        get forceRGBA(): boolean | undefined;
        set forceRGBA(value: boolean | undefined);
        private _forceR8?;
        /**
         * force to always use (uncompressed) R8 for transcoded format
         */
        get forceR8(): boolean | undefined;
        set forceR8(value: boolean | undefined);
        private _forceRG8?;
        /**
         * force to always use (uncompressed) RG8 for transcoded format
         */
        get forceRG8(): boolean | undefined;
        set forceRG8(value: boolean | undefined);
        private _bypassTranscoders?;
        /**
         * list of transcoders to bypass when looking for a suitable transcoder. The available transcoders are:
         *      UniversalTranscoder_UASTC_ASTC
         *      UniversalTranscoder_UASTC_BC7
         *      UniversalTranscoder_UASTC_RGBA_UNORM
         *      UniversalTranscoder_UASTC_RGBA_SRGB
         *      UniversalTranscoder_UASTC_R8_UNORM
         *      UniversalTranscoder_UASTC_RG8_UNORM
         *      MSCTranscoder
         */
        get bypassTranscoders(): string[] | undefined;
        set bypassTranscoders(value: string[] | undefined);
        private _ktx2DecoderOptions;
        /** @internal */
        _getKTX2DecoderOptions(): IKTX2DecoderOptions;
    }
    /**
     * Options for the KTX2 decoder
     */
    export interface IKhronosTextureContainer2Options {
        /**
         * Number of workers to use for async operations. Specify `0` to disable web workers and run synchronously in the current context.
         */
        numWorkers?: number;
        /**
         * Worker pool to use for async operations. If set, `numWorkers` will be ignored.
         */
        workerPool?: AutoReleaseWorkerPool;
        /**
         * Optional container for the KTX2 decoder module and its dependencies. If set, the module will be used from this container and the URLs will be ignored.
         */
        binariesAndModulesContainer?: {
            [key in AllowedKeys]?: ArrayBuffer | any;
        };
    }
    /**
     * Class for loading KTX2 files
     */
    export class KhronosTextureContainer2 {
        private static _WorkerPoolPromise?;
        private static _DecoderModulePromise?;
        private static _KTX2DecoderModule?;
        /**
         * URLs to use when loading the KTX2 decoder module as well as its dependencies
         * If a url is null, the default url is used (pointing to https://preview.babylonjs.com)
         * Note that jsDecoderModule can't be null and that the other dependencies will only be loaded if necessary
         * Urls you can change:
         *     URLConfig.jsDecoderModule
         *     URLConfig.wasmUASTCToASTC
         *     URLConfig.wasmUASTCToBC7
         *     URLConfig.wasmUASTCToRGBA_UNORM
         *     URLConfig.wasmUASTCToRGBA_SRGB
         *     URLConfig.wasmUASTCToR8_UNORM
         *     URLConfig.wasmUASTCToRG8_UNORM
         *     URLConfig.jsMSCTranscoder
         *     URLConfig.wasmMSCTranscoder
         *     URLConfig.wasmZSTDDecoder
         * You can see their default values in this PG: https://playground.babylonjs.com/#EIJH8L#29
         */
        static URLConfig: {
            jsDecoderModule: string;
            wasmUASTCToASTC: Nullable<string>;
            wasmUASTCToBC7: Nullable<string>;
            wasmUASTCToRGBA_UNORM: Nullable<string>;
            wasmUASTCToRGBA_SRGB: Nullable<string>;
            wasmUASTCToR8_UNORM: Nullable<string>;
            wasmUASTCToRG8_UNORM: Nullable<string>;
            jsMSCTranscoder: Nullable<string>;
            wasmMSCTranscoder: Nullable<string>;
            wasmZSTDDecoder: Nullable<string>;
        };
        /**
         * If provided, this worker pool will be used instead of creating a new one.
         * This is useful when loading the WASM and the js modules on your own and
         * you want to use the ktxTextureLoader and not construct this class directly.
         */
        static WorkerPool?: AutoReleaseWorkerPool;
        /**
         * Default number of workers used to handle data decoding
         */
        static DefaultNumWorkers: number;
        /**
         * Default configuration for the KTX2 decoder.
         * The options defined in this way have priority over those passed when creating a KTX2 texture with new Texture(...).
         */
        static DefaultDecoderOptions: DefaultKTX2DecoderOptions;
        private static GetDefaultNumWorkers;
        private _engine;
        private static _Initialize;
        /**
         * Constructor
         * @param engine The engine to use
         * @param numWorkersOrOptions The number of workers for async operations. Specify `0` to disable web workers and run synchronously in the current context.
         */
        constructor(engine: AbstractEngine, numWorkersOrOptions?: number | IKhronosTextureContainer2Options);
        /**
         * @internal
         */
        _uploadAsync(data: ArrayBufferView, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): Promise<void>;
        protected _createTexture(data: IDecodedData, internalTexture: InternalTexture, options?: IKTX2DecoderOptions & IDecodedData): void;
        /**
         * Checks if the given data starts with a KTX2 file identifier.
         * @param data the data to check
         * @returns true if the data is a KTX2 file or false otherwise
         */
        static IsValid(data: ArrayBufferView): boolean;
    }


    /**
     * for description see https://www.khronos.org/opengles/sdk/tools/KTX/
     * for file layout see https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
     */
    export class KhronosTextureContainer {
        /** contents of the KTX container file */
        data: ArrayBufferView;
        private static HEADER_LEN;
        private static COMPRESSED_2D;
        private static COMPRESSED_3D;
        private static TEX_2D;
        private static TEX_3D;
        /**
         * Gets the openGL type
         */
        glType: number;
        /**
         * Gets the openGL type size
         */
        glTypeSize: number;
        /**
         * Gets the openGL format
         */
        glFormat: number;
        /**
         * Gets the openGL internal format
         */
        glInternalFormat: number;
        /**
         * Gets the base internal format
         */
        glBaseInternalFormat: number;
        /**
         * Gets image width in pixel
         */
        pixelWidth: number;
        /**
         * Gets image height in pixel
         */
        pixelHeight: number;
        /**
         * Gets image depth in pixels
         */
        pixelDepth: number;
        /**
         * Gets the number of array elements
         */
        numberOfArrayElements: number;
        /**
         * Gets the number of faces
         */
        numberOfFaces: number;
        /**
         * Gets the number of mipmap levels
         */
        numberOfMipmapLevels: number;
        /**
         * Gets the bytes of key value data
         */
        bytesOfKeyValueData: number;
        /**
         * Gets the load type
         */
        loadType: number;
        /**
         * If the container has been made invalid (eg. constructor failed to correctly load array buffer)
         */
        isInvalid: boolean;
        /**
         * Creates a new KhronosTextureContainer
         * @param data contents of the KTX container file
         * @param facesExpected should be either 1 or 6, based whether a cube texture or or
         */
        constructor(
        /** contents of the KTX container file */
        data: ArrayBufferView, facesExpected: number);
        /**
         * Uploads KTX content to a Babylon Texture.
         * It is assumed that the texture has already been created & is currently bound
         * @internal
         */
        uploadLevels(texture: InternalTexture, loadMipmaps: boolean): void;
        private _upload2DCompressedLevels;
        /**
         * Checks if the given data starts with a KTX file identifier.
         * @param data the data to check
         * @returns true if the data is a KTX file or false otherwise
         */
        static IsValid(data: ArrayBufferView): boolean;
    }


    /**
     * Class used to enable instantiation of objects by class name
     */
    export class InstantiationTools {
        /**
         * Use this object to register external classes like custom textures or material
         * to allow the loaders to instantiate them
         */
        static RegisteredExternalClasses: {
            [key: string]: object;
        };
        /**
         * Tries to instantiate a new object from a given class name
         * @param className defines the class name to instantiate
         * @returns the new object or null if the system was not able to do the instantiation
         */
        static Instantiate(className: string): any;
    }




    /**
     * Enum that determines the text-wrapping mode to use.
     */
    export enum InspectableType {
        /**
         * Checkbox for booleans
         */
        Checkbox = 0,
        /**
         * Sliders for numbers
         */
        Slider = 1,
        /**
         * Vector3
         */
        Vector3 = 2,
        /**
         * Quaternions
         */
        Quaternion = 3,
        /**
         * Color3
         */
        Color3 = 4,
        /**
         * String
         */
        String = 5,
        /**
         * Button
         */
        Button = 6,
        /**
         * Options
         */
        Options = 7,
        /**
         * Tab
         */
        Tab = 8,
        /**
         * File button
         */
        FileButton = 9,
        /**
         * Vector2
         */
        Vector2 = 10
    }
    /**
     * Interface used to define custom inspectable options in "Options" mode.
     * This interface is used by the inspector to display the list of options
     */
    export interface IInspectableOptions {
        /**
         * Defines the visible part of the option
         */
        label: string;
        /**
         * Defines the value part of the option (returned through the callback)
         */
        value: number | string;
        /**
         * Defines if the option should be selected or not
         */
        selected?: boolean;
    }
    /**
     * Interface used to define custom inspectable properties.
     * This interface is used by the inspector to display custom property grids
     * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
     */
    export interface IInspectable {
        /**
         * Gets the label to display
         */
        label: string;
        /**
         * Gets the name of the property to edit
         */
        propertyName: string;
        /**
         * Gets the type of the editor to use
         */
        type: InspectableType;
        /**
         * Gets the minimum value of the property when using in "slider" mode
         */
        min?: number;
        /**
         * Gets the maximum value of the property when using in "slider" mode
         */
        max?: number;
        /**
         * Gets the setp to use when using in "slider" mode
         */
        step?: number;
        /**
         * Gets the callback function when using "Button" mode
         */
        callback?: () => void;
        /**
         * Gets the callback function when using "FileButton" mode
         */
        fileCallback?: (file: File) => void;
        /**
         * Gets the list of options when using "Option" mode
         */
        options?: IInspectableOptions[];
        /**
         * Gets the extensions to accept when using "FileButton" mode.
         * The value should be a comma separated string with the list of extensions to accept e.g., ".jpg, .png, .tga, .dds, .env".
         */
        accept?: string;
    }


    /**
     * The largest finite magnitude representable by a 16-bit half-float (binary16): 65504.
     * Use this to clamp values into the half-float range before conversion instead of hardcoding the literal.
     */
    export const MaxHalfFloat = 65504;
    /**
     * Converts a 32-bit float to its 16-bit half-float bit pattern.
     * @param value the float to convert
     * @returns the half-float bit pattern, in the range 0..65535
     */
    export function ToHalfFloat(value: number): number;
    /**
     * Converts a 16-bit half-float bit pattern back to a 32-bit float.
     * @param value the half-float bit pattern, in the range 0..65535
     * @returns the decoded float
     */
    export function FromHalfFloat(value: number): number;


    /**
     * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523
     * Be aware Math.random() could cause collisions, but:
     * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide"
     * @returns a pseudo random id
     */
    export function RandomGUID(): string;
    /**
     * Class used to manipulate GUIDs
     */
    export var GUID: {
        /**
         * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523
         * Be aware Math.random() could cause collisions, but:
         * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide"
         * @returns a pseudo random id
         */
        RandomId: typeof RandomGUID;
    };


    /**
     * Tool functions for GreasedLine
     */
    export class GreasedLineTools {
        /**
         * Converts GreasedLinePoints to number[][]
         * @param points GreasedLinePoints
         * @param options GreasedLineToolsConvertPointsOptions
         * @returns number[][] with x, y, z coordinates of the points, like [[x, y, z, x, y, z, ...], [x, y, z, ...]]
         */
        static ConvertPoints(points: GreasedLinePoints, options?: GreasedLinePointsOptions): number[][];
        /**
         * Omit zero length lines predicate for the MeshesToLines function
         * @param p1 point1 position of the face
         * @param p2 point2 position of the face
         * @param p3 point3 position of the face
         * @returns original points or null if any edge length is zero
         */
        static OmitZeroLengthPredicate(p1: Vector3, p2: Vector3, p3: Vector3): Vector3[][] | null;
        /**
         * Omit duplicate lines predicate for the MeshesToLines function
         * @param p1 point1 position of the face
         * @param p2 point2 position of the face
         * @param p3 point3 position of the face
         * @param points array of points to search in
         * @returns original points or null if any edge length is zero
         */
        static OmitDuplicatesPredicate(p1: Vector3, p2: Vector3, p3: Vector3, points: Vector3[][]): Vector3[][] | null;
        private static _SearchInPoints;
        /**
         * Gets mesh triangles as line positions
         * @param meshes array of meshes
         * @param predicate predicate function which decides whether to include the mesh triangle/face in the ouput
         * @returns array of arrays of points
         */
        static MeshesToLines(meshes: AbstractMesh[], predicate?: (p1: Vector3, p2: Vector3, p3: Vector3, points: Vector3[][], indiceIndex: number, vertexIndex: number, mesh: AbstractMesh, meshIndex: number, vertices: FloatArray, indices: IndicesArray) => Vector3[][]): Vector3[][];
        /**
         * Converts number coordinates to Vector3s
         * @param points number array of x, y, z, x, y z, ... coordinates
         * @returns Vector3 array
         */
        static ToVector3Array(points: number[] | number[][]): Vector3[] | Vector3[][];
        /**
         * Gets a number array from a Vector3 array.
         * You can you for example to convert your Vector3[] offsets to the required number[] for the offsets option.
         * @param points Vector3 array
         * @returns an array of x, y, z coordinates as numbers [x, y, z, x, y, z, x, y, z, ....]
         */
        static ToNumberArray(points: Vector3[]): number[];
        /**
         * Calculates the sum of points of every line and the number of points in each line.
         * This function is useful when you are drawing multiple lines in one mesh and you want
         * to know the counts. For example for creating an offsets table.
         * @param points point array
         * @returns points count info
         */
        static GetPointsCountInfo(points: number[][]): {
            total: number;
            counts: number[];
        };
        /**
         * Gets the length of the line counting all it's segments length
         * @param data array of line points
         * @returns length of the line
         */
        static GetLineLength(data: Vector3[] | number[]): number;
        /**
         * Gets the length from the beginning to each point of the line as array.
         * @param data array of line points
         * @param buf optional pre-allocated buffer to reduce memory pressure, should be at least `data.length * 4 / 3` bytes
         * @returns length array of the line
         */
        static GetLineLengthArray(data: number[], buf?: ArrayBuffer): Float32Array;
        /**
         * Divides a segment into smaller segments.
         * A segment is a part of the line between it's two points.
         * @param point1 first point of the line
         * @param point2 second point of the line
         * @param segmentCount number of segments we want to have in the divided line
         * @returns
         */
        static SegmentizeSegmentByCount(point1: Vector3, point2: Vector3, segmentCount: number): Vector3[];
        /**
         * Divides a line into segments.
         * A segment is a part of the line between it's two points.
         * @param what line points
         * @param segmentLength length of each segment of the resulting line (distance between two line points)
         * @returns line point
         */
        static SegmentizeLineBySegmentLength(what: Vector3[] | number[] | {
            point1: Vector3;
            point2: Vector3;
            length: number;
        }[], segmentLength: number): Vector3[];
        /**
         * Divides a line into segments.
         * A segment is a part of the line between it's two points.
         * @param what line points
         * @param segmentCount number of segments
         * @returns line point
         */
        static SegmentizeLineBySegmentCount(what: Vector3[] | number[], segmentCount: number): Vector3[];
        /**
         * Gets line segments.
         * A segment is a part of the line between it's two points.
         * @param points line points
         * @returns segments information of the line segment including starting point, ending point and the distance between them
         */
        static GetLineSegments(points: Vector3[]): {
            point1: Vector3;
            point2: Vector3;
            length: number;
        }[];
        /**
         * Gets the minimum and the maximum length of a line segment in the line.
         * A segment is a part of the line between it's two points.
         * @param points line points
         * @returns
         */
        static GetMinMaxSegmentLength(points: Vector3[]): {
            min: number;
            max: number;
        };
        /**
         * Finds the last visible position in world space of the line according to the visibility parameter
         * @param lineSegments segments of the line
         * @param lineLength total length of the line
         * @param visbility normalized value of visibility
         * @param localSpace if true the result will be in local space (default is false)
         * @returns world space coordinate of the last visible piece of the line
         */
        static GetPositionOnLineByVisibility(lineSegments: {
            point1: Vector3;
            point2: Vector3;
            length: number;
        }[], lineLength: number, visbility: number, localSpace?: boolean): Vector3;
        /**
         * Creates lines in a shape of circle/arc.
         * A segment is a part of the line between it's two points.
         * @param radiusX radiusX of the circle
         * @param segments number of segments in the circle
         * @param z z coordinate of the points. Defaults to 0.
         * @param radiusY radiusY of the circle - you can draw an oval if using different values
         * @param segmentAngle angle offset of the segments. Defaults to Math.PI * 2 / segments. Change this value to draw a part of the circle.
         * @returns line points
         */
        static GetCircleLinePoints(radiusX: number, segments: number, z?: number, radiusY?: number, segmentAngle?: number): Vector3[];
        /**
         * Gets line points in a shape of a bezier curve
         * @param p0 bezier point0
         * @param p1 bezier point1
         * @param p2 bezier point2
         * @param segments number of segments in the curve
         * @returns
         */
        static GetBezierLinePoints(p0: Vector3, p1: Vector3, p2: Vector3, segments: number): number[];
        /**
         *
         * @param position position of the arrow cap (mainly you want to create a triangle, set widthUp and widthDown to the same value and omit widthStartUp and widthStartDown)
         * @param direction direction which the arrow points to
         * @param length length (size) of the arrow cap itself
         * @param widthUp the arrow width above the line
         * @param widthDown the arrow width belove the line
         * @param widthStartUp the arrow width at the start of the arrow above the line. In most scenarios this is 0.
         * @param widthStartDown the arrow width at the start of the arrow below the line. In most scenarios this is 0.
         * @returns
         */
        static GetArrowCap(position: Vector3, direction: Vector3, length: number, widthUp: number, widthDown: number, widthStartUp?: number, widthStartDown?: number): {
            points: Vector3[];
            widths: number[];
        };
        /**
         * Gets 3D positions of points from a text and font
         * @param text Text
         * @param size Size of the font
         * @param resolution Resolution of the font
         * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)
         * @param z z coordinate
         * @param includeInner include the inner parts of the font in the result. Default true. If false, only the outlines will be returned.
         * @returns number[][] of 3D positions
         */
        static GetPointsFromText(text: string, size: number, resolution: number, fontData: IFontData, z?: number, includeInner?: boolean): number[][];
        /**
         * Converts an array of Color3 to Uint8Array
         * @param colors Arrray of Color3
         * @returns Uin8Array of colors [r, g, b, a, r, g, b, a, ...]
         */
        static Color3toRGBAUint8(colors: Color3[]): Uint8Array;
        /**
         * Creates a RawTexture from an RGBA color array and sets it on the plugin material instance.
         * @param name name of the texture
         * @param colors Uint8Array of colors
         * @param colorsSampling sampling mode of the created texture
         * @param scene Scene
         * @returns the colors texture
         */
        static CreateColorsTexture(name: string, colors: Color3[], colorsSampling: number, scene: Scene): RawTexture;
        /**
         * A minimum size texture for the colors sampler2D when there is no colors texture defined yet.
         * For fast switching using the useColors property without the need to use defines.
         * @param scene Scene
         * @returns empty colors texture
         */
        static PrepareEmptyColorsTexture(scene: Scene): RawTexture;
        /**
         * Diposes the shared empty colors texture
         */
        static DisposeEmptyColorsTexture(): void;
        /**
         * Converts boolean to number.
         * @param bool the bool value
         * @returns 1 if true, 0 if false.
         */
        static BooleanToNumber(bool?: boolean): 0 | 1;
    }


    /** Interface used by value gradients (color, factor, ...) */
    export interface IValueGradient {
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number;
    }
    /** Class used to store color4 gradient */
    export class ColorGradient implements IValueGradient {
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number;
        /**
         * Gets or sets first associated color
         */
        color1: Color4;
        /**
         * Gets or sets second associated color
         */
        color2?: Color4 | undefined;
        /**
         * Creates a new color4 gradient
         * @param gradient gets or sets the gradient value (between 0 and 1)
         * @param color1 gets or sets first associated color
         * @param color2 gets or sets first second color
         */
        constructor(
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number, 
        /**
         * Gets or sets first associated color
         */
        color1: Color4, 
        /**
         * Gets or sets second associated color
         */
        color2?: Color4 | undefined);
        /**
         * Will get a color picked randomly between color1 and color2.
         * If color2 is undefined then color1 will be used
         * @param result defines the target Color4 to store the result in
         */
        getColorToRef(result: Color4): void;
    }
    /** Class used to store color 3 gradient */
    export class Color3Gradient implements IValueGradient {
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number;
        /**
         * Gets or sets the associated color
         */
        color: Color3;
        /**
         * Creates a new color3 gradient
         * @param gradient gets or sets the gradient value (between 0 and 1)
         * @param color gets or sets associated color
         */
        constructor(
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number, 
        /**
         * Gets or sets the associated color
         */
        color: Color3);
    }
    /** Class used to store factor gradient */
    export class FactorGradient implements IValueGradient {
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number;
        /**
         * Gets or sets first associated factor
         */
        factor1: number;
        /**
         * Gets or sets second associated factor
         */
        factor2?: number | undefined;
        /**
         * Creates a new factor gradient
         * @param gradient gets or sets the gradient value (between 0 and 1)
         * @param factor1 gets or sets first associated factor
         * @param factor2 gets or sets second associated factor
         */
        constructor(
        /**
         * Gets or sets the gradient value (between 0 and 1)
         */
        gradient: number, 
        /**
         * Gets or sets first associated factor
         */
        factor1: number, 
        /**
         * Gets or sets second associated factor
         */
        factor2?: number | undefined);
        /**
         * Will get a number picked randomly between factor1 and factor2.
         * If factor2 is undefined then factor1 will be used
         * @returns the picked number
         */
        getFactor(): number;
    }
    /**
     * Helper used to simplify some generic gradient tasks
     */
    export class GradientHelper {
        /**
         * Gets the current gradient from an array of IValueGradient
         * @param ratio defines the current ratio to get
         * @param gradients defines the array of IValueGradient
         * @param updateFunc defines the callback function used to get the final value from the selected gradients
         */
        static GetCurrentGradient(ratio: number, gradients: IValueGradient[], updateFunc: (current: IValueGradient, next: IValueGradient, scale: number) => void): void;
    }


    /**
     * Class used to help managing file picking and drag'n'drop
     * File Storage
     */
    export class FilesInputStore {
        /**
         * List of files ready to be loaded
         */
        static FilesToLoad: {
            [key: string]: File;
        };
    }


    /**
     * Class used to help managing file picking and drag-n-drop
     */
    export class FilesInput {
        readonly useAppend: boolean;
        readonly dontInjectRenderLoop: boolean;
        /**
         * List of files ready to be loaded
         */
        static get FilesToLoad(): {
            [key: string]: File;
        };
        /**
         * Callback called when a file is processed
         * @returns false to abort the process
         */
        onProcessFileCallback: (file: File, name: string, extension: string, setSceneFileToLoad: (sceneFile: File) => void) => boolean;
        /**
         * If a loading UI should be displayed while loading a file
         */
        displayLoadingUI: boolean;
        /**
         * Function used when loading the scene file
         * @param sceneFile defines the file to load
         * @param onProgress onProgress callback called while loading the file
         * @returns a promise completing when the load is complete
         */
        loadAsync: (sceneFile: File, onProgress: Nullable<(event: ISceneLoaderProgressEvent) => void>) => Promise<Scene>;
        private _engine;
        private _currentScene;
        private _sceneLoadedCallback;
        private _progressCallback;
        private _additionalRenderLoopLogicCallback;
        private _textureLoadingCallback;
        private _startingProcessingFilesCallback;
        private _onReloadCallback;
        private _errorCallback;
        private _elementToMonitor;
        private _sceneFileToLoad;
        private _filesToLoad;
        /**
         * Creates a new FilesInput
         * @param engine defines the rendering engine
         * @param scene defines the hosting scene
         * @param sceneLoadedCallback callback called when scene (files provided) is loaded
         * @param progressCallback callback called to track progress
         * @param additionalRenderLoopLogicCallback callback called to add user logic to the rendering loop
         * @param textureLoadingCallback callback called when a texture is loading
         * @param startingProcessingFilesCallback callback called when the system is about to process all files
         * @param onReloadCallback callback called when a reload is requested
         * @param errorCallback callback call if an error occurs
         * @param useAppend defines if the file loaded must be appended (true) or have the scene replaced (false, default behavior)
         * @param dontInjectRenderLoop defines if the render loop mustn't be injected into engine (default is false). Used only if useAppend is false.
         */
        constructor(engine: AbstractEngine, scene: Nullable<Scene>, sceneLoadedCallback: Nullable<(sceneFile: File, scene: Scene) => void>, progressCallback: Nullable<(progress: ISceneLoaderProgressEvent) => void>, additionalRenderLoopLogicCallback: Nullable<() => void>, textureLoadingCallback: Nullable<(remaining: number) => void>, startingProcessingFilesCallback: Nullable<(files?: File[]) => void>, onReloadCallback: Nullable<(sceneFile: File) => void>, errorCallback: Nullable<(sceneFile: File, scene: Nullable<Scene>, message: string) => void>, useAppend?: boolean, dontInjectRenderLoop?: boolean);
        private _dragEnterHandler;
        private _dragOverHandler;
        private _dropHandler;
        /**
         * Calls this function to listen to drag'n'drop events on a specific DOM element
         * @param elementToMonitor defines the DOM element to track
         */
        monitorElementForDragNDrop(elementToMonitor: HTMLElement): void;
        /** Gets the current list of files to load */
        get filesToLoad(): File[];
        /**
         * Release all associated resources
         */
        dispose(): void;
        private _renderFunction;
        private _drag;
        private _drop;
        private _traverseFolder;
        private _processFiles;
        /**
         * Load files from a drop event
         * @param event defines the drop event to use as source
         */
        loadFiles(event: any): void;
        private _processReload;
        /**
         * Reload the current scene from the loaded files
         */
        reload(): void;
    }


    /** This file must only contain pure code and pure imports */
    /** @ignore */
    export class LoadFileError extends RuntimeError {
        request?: WebRequest;
        file?: File;
        /**
         * Creates a new LoadFileError
         * @param message defines the message of the error
         * @param object defines the optional web request
         */
        constructor(message: string, object?: WebRequest | File);
    }
    /** @ignore */
    export class RequestFileError extends RuntimeError {
        request: WebRequest;
        /**
         * Creates a new LoadFileError
         * @param message defines the message of the error
         * @param request defines the optional web request
         */
        constructor(message: string, request: WebRequest);
    }
    /** @ignore */
    export class ReadFileError extends RuntimeError {
        file: File;
        /**
         * Creates a new ReadFileError
         * @param message defines the message of the error
         * @param file defines the optional file
         */
        constructor(message: string, file: File);
    }
    /**
     * @internal
     */
    export var FileToolsOptions: {
        DefaultRetryStrategy: (url: string, request: WebRequest, retryIndex: number) => number;
        BaseUrl: string;
        CorsBehavior: string | ((url: string | string[]) => string);
        PreprocessUrl: (url: string) => string;
        ScriptBaseUrl: string;
        ScriptPreprocessUrl: (url: string) => string;
        CleanUrl: (url: string) => string;
    };
    /**
     * Sets the cors behavior on a dom element. This will add the required Tools.CorsBehavior to the element.
     * @param url define the url we are trying
     * @param element define the dom element where to configure the cors policy
     * @internal
     */
    export var SetCorsBehavior: (url: string | string[], element: {
        crossOrigin: string | null;
    }) => void;
    /**
     * Configuration used to load images
     * @see https://playground.babylonjs.com/#DKMEZK#2
     */
    export var LoadImageConfiguration: {
        /**
         * Use this callback if you want to provide the required size of an image before loading it.
         */
        getRequiredSize: Nullable<(input: string | ArrayBuffer | ArrayBufferView | Blob) => {
            width: number;
            height: number;
        }>;
    };
    /**
     * Loads an image as an HTMLImageElement.
     * @param input url string, ArrayBuffer, or Blob to load
     * @param onLoad callback called when the image successfully loads
     * @param onError callback called when the image fails to load
     * @param offlineProvider offline provider for caching
     * @param mimeType optional mime type
     * @param imageBitmapOptions
     * @param engine the engine instance to use
     * @returns the HTMLImageElement of the loaded image
     * @internal
     */
    export const LoadImage: (input: string | ArrayBuffer | ArrayBufferView | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string, imageBitmapOptions?: ImageBitmapOptions, engine?: Nullable<AbstractEngine>) => Nullable<HTMLImageElement>;
    /**
     * Reads a file from a File object
     * @param file defines the file to load
     * @param onSuccess defines the callback to call when data is loaded
     * @param onProgress defines the callback to call during loading process
     * @param useArrayBuffer defines a boolean indicating that data must be returned as an ArrayBuffer
     * @param onError defines the callback to call when an error occurs
     * @returns a file request object
     * @internal
     */
    export const ReadFile: (file: File, onSuccess: (data: any) => void, onProgress?: (ev: ProgressEvent) => any, useArrayBuffer?: boolean, onError?: (error: ReadFileError) => void) => IFileRequest;
    /**
     * Loads a file from a url, a data url, or a file url
     * @param fileOrUrl file, url, data url, or file url to load
     * @param onSuccess callback called when the file successfully loads
     * @param onProgress callback called while file is loading (if the server supports this mode)
     * @param offlineProvider defines the offline provider for caching
     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
     * @param onError callback called when the file fails to load
     * @param onOpened
     * @returns a file request object
     * @internal
     */
    export const LoadFile: (fileOrUrl: File | string, onSuccess: (data: string | ArrayBuffer, responseURL?: string, contentType?: Nullable<string>) => void, onProgress?: (ev: ProgressEvent) => void, offlineProvider?: Nullable<IOfflineProvider>, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest;
    /**
     * Loads a file from a url
     * @param url url to load
     * @param onSuccess callback called when the file successfully loads
     * @param onProgress callback called while file is loading (if the server supports this mode)
     * @param offlineProvider defines the offline provider for caching
     * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
     * @param onError callback called when the file fails to load
     * @param onOpened callback called when the web request is opened
     * @returns a file request object
     * @internal
     */
    export const RequestFile: (url: string, onSuccess?: (data: string | ArrayBuffer, request?: WebRequest) => void, onProgress?: (event: ProgressEvent) => void, offlineProvider?: Nullable<IOfflineProvider>, useArrayBuffer?: boolean, onError?: (error: RequestFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest;
    /**
     * Reads the mime type from a URL, if available.
     * @param url
     * @returns
     */
    export const GetMimeType: (url: string) => string | undefined;
    /**
     * Checks if the loaded document was accessed via `file:`-Protocol.
     * @returns boolean
     * @internal
     */
    export const IsFileURL: () => boolean;
    /**
     * Test if the given uri is a valid base64 data url
     * @param uri The uri to test
     * @returns True if the uri is a base64 data url or false otherwise
     * @internal
     */
    export const IsBase64DataUrl: (uri: string) => boolean;
    export const TestBase64DataUrl: (uri: string) => {
        match: boolean;
        type: string;
    };
    /**
     * Decode the given base64 uri.
     * @param uri The uri to decode
     * @returns The decoded base64 data.
     * @internal
     */
    export function DecodeBase64UrlToBinary(uri: string): ArrayBuffer;
    /**
     * Decode the given base64 uri into a UTF-8 encoded string.
     * @param uri The uri to decode
     * @returns The decoded base64 data.
     * @internal
     */
    export const DecodeBase64UrlToString: (uri: string) => string;
    /**
     * This will be executed automatically for UMD and es5.
     * If esm dev wants the side effects to execute they will have to run it manually
     * Once we build native modules those need to be exported.
     * @internal
     */
    /**
     * FileTools defined as any.
     * This should not be imported or used in future releases or in any module in the framework
     * @internal
     * @deprecated import the needed function from fileTools.ts
     */
    export let FileTools: {
        DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer;
        DecodeBase64UrlToString: (uri: string) => string;
        DefaultRetryStrategy: any;
        BaseUrl: any;
        CorsBehavior: any;
        PreprocessUrl: any;
        IsBase64DataUrl: (uri: string) => boolean;
        IsFileURL: () => boolean;
        LoadFile: (fileOrUrl: string | File, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent<EventTarget>) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest;
        LoadImage: (input: string | ArrayBuffer | Blob | ArrayBufferView, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string, imageBitmapOptions?: ImageBitmapOptions) => Nullable<HTMLImageElement>;
        ReadFile: (file: File, onSuccess: (data: any) => void, onProgress?: (ev: ProgressEvent<EventTarget>) => any, useArrayBuffer?: boolean, onError?: (error: ReadFileError) => void) => IFileRequest;
        RequestFile: (url: string, onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void, onProgress?: (event: ProgressEvent<EventTarget>) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (error: RequestFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest;
        SetCorsBehavior: (url: string | string[], element: {
            crossOrigin: string | null;
        }) => void;
    };
    /**
     * @internal
     */
    export const _injectLTSFileTools: (DecodeBase64UrlToBinary: (uri: string) => ArrayBuffer, DecodeBase64UrlToString: (uri: string) => string, FileToolsOptions: {
        DefaultRetryStrategy: any;
        BaseUrl: any;
        CorsBehavior: any;
        PreprocessUrl: any;
        CleanUrl: any;
    }, IsBase64DataUrl: (uri: string) => boolean, IsFileURL: () => boolean, LoadFile: (fileOrUrl: string | File, onSuccess: (data: string | ArrayBuffer, responseURL?: string) => void, onProgress?: (ev: ProgressEvent<EventTarget>) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest, LoadImage: (input: string | ArrayBuffer | ArrayBufferView | Blob, onLoad: (img: HTMLImageElement | ImageBitmap) => void, onError: (message?: string, exception?: any) => void, offlineProvider: Nullable<IOfflineProvider>, mimeType?: string, imageBitmapOptions?: ImageBitmapOptions) => Nullable<HTMLImageElement>, ReadFile: (file: File, onSuccess: (data: any) => void, onProgress?: (ev: ProgressEvent<EventTarget>) => any, useArrayBuffer?: boolean, onError?: (error: ReadFileError) => void) => IFileRequest, RequestFile: (url: string, onSuccess: (data: string | ArrayBuffer, request?: WebRequest) => void, onProgress?: (event: ProgressEvent<EventTarget>) => void, offlineProvider?: IOfflineProvider, useArrayBuffer?: boolean, onError?: (error: RequestFileError) => void, onOpened?: (request: WebRequest) => void) => IFileRequest, SetCorsBehavior: (url: string | string[], element: {
        crossOrigin: string | null;
    }) => void) => void;
    /**
     * Register side effects for fileTools.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFileTools(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fileTools.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * File request interface
     */
    export interface IFileRequest {
        /**
         * Raised when the request is complete (success or error).
         */
        onCompleteObservable: Observable<IFileRequest>;
        /**
         * Aborts the request for a file.
         */
        abort: () => void;
    }


    /**
     * Base error. Due to limitations of typedoc-check and missing documentation
     * in lib.es5.d.ts, cannot extend Error directly for RuntimeError.
     * @ignore
     */
    export abstract class BaseError extends Error {
        protected static _setPrototypeOf: (o: any, proto: object | null) => any;
    }
    /**
     * Error codes for BaseError
     */
    export var ErrorCodes: {
        /** Invalid or empty mesh vertex positions. */
        readonly MeshInvalidPositionsError: 0;
        /** Unsupported texture found. */
        readonly UnsupportedTextureError: 1000;
        /** Unexpected magic number found in GLTF file header. */
        readonly GLTFLoaderUnexpectedMagicError: 2000;
        /** SceneLoader generic error code. Ideally wraps the inner exception. */
        readonly SceneLoaderError: 3000;
        /** Load file error */
        readonly LoadFileError: 4000;
        /** Request file error */
        readonly RequestFileError: 4001;
        /** Read file error */
        readonly ReadFileError: 4002;
    };
    /**
     * Error code type
     */
    export type ErrorCodesType = (typeof ErrorCodes)[keyof typeof ErrorCodes];
    /**
     * Application runtime error
     */
    export class RuntimeError extends BaseError {
        /**
         * The error code
         */
        errorCode: ErrorCodesType;
        /**
         * The error that caused this outer error
         */
        innerError?: Error;
        /**
         * Creates a new RuntimeError
         * @param message defines the message of the error
         * @param errorCode the error code
         * @param innerError the error that caused the outer error
         */
        constructor(message: string, errorCode: ErrorCodesType, innerError?: Error);
    }
    /**
     * Used for flow control when an operation is aborted, such as with AbortController.
     */
    export class AbortError extends BaseError {
        constructor(message?: string);
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Interface containing options related to equirectangular capture of the current scene
     */
    export interface EquiRectangularCaptureOptions {
        /**
         * This option relates to smallest dimension of the given equirectangular capture
         * Giving a 512px size would result in an image that 512 x 1024px
         */
        size: number;
        /**
         * Optional function to map which meshes should get rendered on the equirectangular map
         * This is specifically helpful when you have certain meshes that you want to skip, especially ground
         */
        meshesFilter?: (mesh: AbstractMesh) => boolean;
        /**
         * Optional argument to specify filename, passing this would auto download the given file
         */
        filename?: string;
        /**
         * Optional argument to specify position in 3D Space from where the equirectangular capture should be taken, if not specified, it would take the position of the scene's active camera or else origin
         */
        position?: Vector3;
        /**
         * Optional argument to specify probe with which the equirectangular image is generated
         * When passing this, size and position arguments are ignored
         */
        probe?: ReflectionProbe;
    }
    /**
     * @param scene This refers to the scene which would be rendered in the given equirectangular capture
     * @param options This refers to the options for a given equirectangular capture
     * @returns the requested capture's pixel-data or auto downloads the file if options.filename is specified
     */
    export function captureEquirectangularFromScene(scene: Scene, options: EquiRectangularCaptureOptions): Promise<ArrayBufferView | null>;




    /** This file must only contain pure code and pure imports */
    /**
     * Raw texture data and descriptor sufficient for WebGL texture upload
     */
    export type EnvironmentTextureInfo = EnvironmentTextureInfoV1 | EnvironmentTextureInfoV2;
    /**
     * v1 of EnvironmentTextureInfo
     */
    interface EnvironmentTextureInfoV1 {
        /**
         * Version of the environment map
         */
        version: 1;
        /**
         * Width of image
         */
        width: number;
        /**
         * Irradiance information stored in the file.
         */
        irradiance: Nullable<EnvironmentTextureIrradianceInfoV1>;
        /**
         * Specular information stored in the file.
         */
        specular: EnvironmentTextureSpecularInfoV1;
    }
    /**
     * v2 of EnvironmentTextureInfo
     */
    interface EnvironmentTextureInfoV2 {
        /**
         * Version of the environment map
         */
        version: 2;
        /**
         * Width of image
         */
        width: number;
        /**
         * Irradiance information stored in the file.
         */
        irradiance: Nullable<EnvironmentTextureIrradianceInfoV1>;
        /**
         * Specular information stored in the file.
         */
        specular: EnvironmentTextureSpecularInfoV1;
        /**
         * The mime type used to encode the image data.
         */
        imageType: string;
        /**
         * Defines where the specular Payload is located. It is a runtime value only not stored in the file.
         */
        binaryDataPosition?: number;
    }
    /**
     * Defines One Image in the file. It requires only the position in the file
     * as well as the length.
     */
    interface BufferImageData {
        /**
         * Length of the image data.
         */
        length: number;
        /**
         * Position of the data from the null terminator delimiting the end of the JSON.
         */
        position: number;
    }
    /**
     * Defines the diffuse data enclosed in the file.
     * This corresponds to the version 1 of the data.
     */
    export interface EnvironmentTextureIrradianceTextureInfoV1 {
        /**
         * Size of the texture faces.
         */
        size: number;
        /**
         * This contains all the images data needed to reconstruct the cubemap.
         */
        faces: Array<BufferImageData>;
        /**
         * The dominant direction of light in the environment texture.
         */
        dominantDirection?: Array<number>;
    }
    /**
     * Defines the specular data enclosed in the file.
     * This corresponds to the version 1 of the data.
     */
    export interface EnvironmentTextureSpecularInfoV1 {
        /**
         * This contains all the images data needed to reconstruct the cubemap.
         */
        mipmaps: Array<BufferImageData>;
        /**
         * Defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness.
         */
        lodGenerationScale: number;
    }
    /**
     * Defines the required storage to save the environment irradiance information.
     */
    interface EnvironmentTextureIrradianceInfoV1 {
        x: Array<number>;
        y: Array<number>;
        z: Array<number>;
        xx: Array<number>;
        yy: Array<number>;
        zz: Array<number>;
        yz: Array<number>;
        zx: Array<number>;
        xy: Array<number>;
        irradianceTexture?: EnvironmentTextureIrradianceTextureInfoV1 | undefined;
    }
    /**
     * Options for creating environment textures
     */
    export interface CreateEnvTextureOptions {
        /**
         * The mime type of encoded images.
         */
        imageType?: string;
        /**
         * the image quality of encoded WebP images.
         */
        imageQuality?: number;
        /**
         * Disables the generation of irradiance texture even if present on the source.
         */
        disableIrradianceTexture?: boolean;
    }
    /**
     * Gets the environment info from an env file.
     * @param data The array buffer containing the .env bytes.
     * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.
     */
    export function GetEnvInfo(data: ArrayBufferView): Nullable<EnvironmentTextureInfoV2>;
    /**
     * Normalizes any supported version of the environment file info to the latest version
     * @param info environment file info on any supported version
     * @returns environment file info in the latest supported version
     * @private
     */
    export function normalizeEnvInfo(info: EnvironmentTextureInfo): EnvironmentTextureInfoV2;
    /**
     * Creates an environment texture from a loaded cube texture.
     * @param texture defines the cube texture to convert in env file
     * @param options options for the conversion process
     * @returns a promise containing the environment data if successful.
     */
    export function CreateEnvTextureAsync(texture: BaseTexture, options?: CreateEnvTextureOptions): Promise<ArrayBuffer>;
    /**
     * Creates the ArrayBufferViews used for initializing environment texture image data.
     * @param data the image data
     * @param info parameters that determine what views will be created for accessing the underlying buffer
     * @returns the views described by info providing access to the underlying buffer
     */
    export function CreateRadianceImageDataArrayBufferViews(data: ArrayBufferView, info: EnvironmentTextureInfo): Array<Array<ArrayBufferView>>;
    /**
     * Creates the ArrayBufferViews used for initializing environment texture image data.
     * @param data the image data
     * @param info parameters that determine what views will be created for accessing the underlying buffer
     * @returns the views described by info providing access to the underlying buffer
     */
    export function CreateIrradianceImageDataArrayBufferViews(data: ArrayBufferView, info: EnvironmentTextureInfo): Array<ArrayBufferView>;
    /**
     * Uploads the texture info contained in the env file to the GPU.
     * @param texture defines the internal texture to upload to
     * @param data defines the data to load
     * @param info defines the texture info retrieved through the GetEnvInfo method
     * @returns a promise
     */
    export function UploadEnvLevelsAsync(texture: InternalTexture, data: ArrayBufferView, info: EnvironmentTextureInfo): Promise<void[]>;
    /**
     * Uploads the levels of image data to the GPU.
     * @param texture defines the internal texture to upload to
     * @param imageData defines the array buffer views of image data [mipmap][face]
     * @param imageType the mime type of the image data
     * @returns a promise
     */
    export function UploadRadianceLevelsAsync(texture: InternalTexture, imageData: ArrayBufferView[][], imageType?: string): Promise<void>;
    /**
     * Uploads the levels of image data to the GPU.
     * @param mainTexture defines the internal texture to upload to
     * @param imageData defines the array buffer views of image data [mipmap][face]
     * @param size defines the size of the texture faces
     * @param imageType the mime type of the image data
     * @param dominantDirection the dominant direction of light in the environment texture, if available
     * @returns a promise
     */
    export function UploadIrradianceLevelsAsync(mainTexture: InternalTexture, imageData: ArrayBufferView[], size: number, imageType?: string, dominantDirection?: Nullable<Vector3>): Promise<void>;
    /**
     * Uploads spherical polynomials information to the texture.
     * @param texture defines the texture we are trying to upload the information to
     * @param info defines the environment texture info retrieved through the GetEnvInfo method
     */
    export function UploadEnvSpherical(texture: InternalTexture, info: EnvironmentTextureInfo): void;
    /**
     * @internal
     */
    export function _UpdateRGBDAsync(internalTexture: InternalTexture, data: ArrayBufferView[][], sphericalPolynomial: Nullable<SphericalPolynomial>, lodScale: number, lodOffset: number): Promise<InternalTexture>;
    /**
     * Sets of helpers addressing the serialization and deserialization of environment texture
     * stored in a BabylonJS env file.
     * Those files are usually stored as .env files.
     */
    export var EnvironmentTextureTools: {
        /**
         * Gets the environment info from an env file.
         * @param data The array buffer containing the .env bytes.
         * @returns the environment file info (the json header) if successfully parsed, normalized to the latest supported version.
         */
        GetEnvInfo: typeof GetEnvInfo;
        /**
         * Creates an environment texture from a loaded cube texture.
         * @param texture defines the cube texture to convert in env file
         * @param options options for the conversion process
         * @param options.imageType the mime type for the encoded images, with support for "image/png" (default) and "image/webp"
         * @param options.imageQuality the image quality of encoded WebP images.
         * @returns a promise containing the environment data if successful.
         */
        CreateEnvTextureAsync: typeof CreateEnvTextureAsync;
        /**
         * Creates the ArrayBufferViews used for initializing environment texture image data.
         * @param data the image data
         * @param info parameters that determine what views will be created for accessing the underlying buffer
         * @returns the views described by info providing access to the underlying buffer
         */
        CreateRadianceImageDataArrayBufferViews: typeof CreateRadianceImageDataArrayBufferViews;
        /**
         * Creates the ArrayBufferViews used for initializing environment texture image data.
         * @param data the image data
         * @param info parameters that determine what views will be created for accessing the underlying buffer
         * @returns the views described by info providing access to the underlying buffer
         */
        CreateIrradianceImageDataArrayBufferViews: typeof CreateIrradianceImageDataArrayBufferViews;
        /**
         * Uploads the texture info contained in the env file to the GPU.
         * @param texture defines the internal texture to upload to
         * @param data defines the data to load
         * @param info defines the texture info retrieved through the GetEnvInfo method
         * @returns a promise
         */
        UploadEnvLevelsAsync: typeof UploadEnvLevelsAsync;
        /**
         * Uploads the levels of image data to the GPU.
         * @param texture defines the internal texture to upload to
         * @param imageData defines the array buffer views of image data [mipmap][face]
         * @param imageType the mime type of the image data
         * @returns a promise
         */
        UploadRadianceLevelsAsync: typeof UploadRadianceLevelsAsync;
        /**
         * Uploads the levels of image data to the GPU.
         * @param texture defines the internal texture to upload to
         * @param imageData defines the array buffer views of image data [mipmap][face]
         * @param imageType the mime type of the image data
         * @param dominantDirection the dominant direction of light in the environment texture, if available
         * @returns a promise
         */
        UploadIrradianceLevelsAsync: typeof UploadIrradianceLevelsAsync;
        /**
         * Uploads spherical polynomials information to the texture.
         * @param texture defines the texture we are trying to upload the information to
         * @param info defines the environment texture info retrieved through the GetEnvInfo method
         */
        UploadEnvSpherical: typeof UploadEnvSpherical;
    };




    /** This file must only contain pure code and pure imports */
    class EncodingHelper {
        /**
         * Encodes image data to the given mime type.
         * This is put into a helper class so we can apply the nativeOverride decorator to it.
         * @internal
         */
        static EncodeImageAsync(pixelData: ArrayBufferView, width: number, height: number, mimeType?: string, invertY?: boolean, quality?: number): Promise<Blob>;
    }
    /**
     * Encodes pixel data to an image
     * @param pixelData 8-bit RGBA pixel data
     * @param width the width of the image
     * @param height the height of the image
     * @param mimeType the requested MIME type
     * @param invertY true to invert the image in the Y direction
     * @param quality the quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @returns a promise that resolves to the encoded image data. Note that the `blob.type` may differ from `mimeType` if it was not supported.
     */
    export var EncodeImageAsync: typeof EncodingHelper.EncodeImageAsync;
    /**
     * Dumps the current bound framebuffer
     * @param width defines the rendering width
     * @param height defines the rendering height
     * @param engine defines the hosting engine
     * @param successCallback defines the callback triggered once the data are available
     * @param mimeType defines the mime type of the result
     * @param fileName defines the filename to download. If present, the result will automatically be downloaded
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     * @returns a void promise
     */
    export function DumpFramebuffer(width: number, height: number, engine: AbstractEngine, successCallback?: (data: string) => void, mimeType?: string, fileName?: string, quality?: number): Promise<void>;
    export function DumpDataAsync(width: number, height: number, data: ArrayBufferView, mimeType: string | undefined, fileName: string | undefined, invertY: boolean | undefined, toArrayBuffer: true, quality?: number): Promise<ArrayBuffer>;
    export function DumpDataAsync(width: number, height: number, data: ArrayBufferView, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): Promise<string>;
    /**
     * Dumps an array buffer
     * @param width defines the rendering width
     * @param height defines the rendering height
     * @param data the data array
     * @param successCallback defines the callback triggered once the data are available
     * @param mimeType defines the mime type of the result
     * @param fileName The name of the file to download. If present, the result will automatically be downloaded. If not defined, and `successCallback` is also not defined, the result will automatically be downloaded with an auto-generated file name.
     * @param invertY true to invert the picture in the Y dimension
     * @param toArrayBuffer true to convert the data to an ArrayBuffer (encoded as `mimeType`) instead of a base64 string
     * @param quality The quality of the image if lossy mimeType is used (e.g. image/jpeg, image/webp). See {@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob | HTMLCanvasElement.toBlob()}'s `quality` parameter.
     */
    export function DumpData(width: number, height: number, data: ArrayBufferView, successCallback?: (data: string | ArrayBuffer) => void, mimeType?: string, fileName?: string, invertY?: boolean, toArrayBuffer?: boolean, quality?: number): void;
    /**
     * Dispose the dump tools associated resources
     */
    export function Dispose(): void;
    /**
     * Object containing a set of static utilities functions to dump data from a canvas
     * @deprecated use functions
     */
    export var DumpTools: {
        DumpData: typeof DumpData;
        DumpDataAsync: typeof DumpDataAsync;
        DumpFramebuffer: typeof DumpFramebuffer;
        Dispose: typeof Dispose;
    };
    /**
     * Register side effects for dumpTools.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDumpTools(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import dumpTools.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Checks if the window object exists
     * @returns true if the window object exists
     */
    export function IsWindowObjectExist(): boolean;
    /**
     * Checks if the navigator object exists
     * @returns true if the navigator object exists
     */
    export function IsNavigatorAvailable(): boolean;
    /**
     * Check if the document object exists
     * @returns true if the document object exists
     */
    export function IsDocumentAvailable(): boolean;
    /**
     * Extracts text content from a DOM element hierarchy
     * @param element defines the root element
     * @returns a string
     */
    export function GetDOMTextContent(element: HTMLElement): string;
    /**
     * Sets of helpers dealing with the DOM and some of the recurrent functions needed in
     * Babylon.js
     */
    export var DomManagement: {
        /**
         * Checks if the window object exists
         * @returns true if the window object exists
         */
        IsWindowObjectExist: typeof IsWindowObjectExist;
        /**
         * Checks if the navigator object exists
         * @returns true if the navigator object exists
         */
        IsNavigatorAvailable: typeof IsNavigatorAvailable;
        /**
         * Check if the document object exists
         * @returns true if the document object exists
         */
        IsDocumentAvailable: typeof IsDocumentAvailable;
        /**
         * Extracts text content from a DOM element hierarchy
         * @param element defines the root element
         * @returns a string
         */
        GetDOMTextContent: typeof GetDOMTextContent;
    };


    /**
     * @internal
     */
    export function _WarnImport(name: string, warnOnce?: boolean): string | undefined;
    /**
     * Enables or disables console warnings when generated side-effect stubs are called.
     * Warnings are disabled by default because internal code may probe optional augmented APIs.
     * @param enabled - Whether missing side-effect stub calls should emit one-time warnings.
     */
    export function SetMissingSideEffectWarningsEnabled(enabled: boolean): void;
    /**
     * Runs a callback while missing side-effect stub warnings are suppressed.
     * @param callback - The callback to run with warnings suppressed.
     * @returns The callback result.
     */
    export function SuppressMissingSideEffectWarnings<T>(callback: () => T): T;
    /**
     * Interface for functions that are side-effect stubs.
     * Used to type-safely check if a method is a stub without using `any`.
     * @internal
     */
    export interface ISideEffectStub {
        /** Marker property indicating this is a side-effect stub */
        __isSideEffectStub: true;
    }
    /**
     * Returns a stub function that acts as a placeholder for augmented methods that
     * require a side-effect import. The stub is tagged with `__isSideEffectStub` so
     * that feature-detection code can check `_IsSideEffectImplemented()` before calling.
     *
     * The stub does NOT warn by default because internal engine code frequently calls
     * augmented methods as feature checks (e.g., `getBoundingBoxRenderer?.()` in the
     * render loop). Warnings would fire every frame for features the user never requested.
     *
     * If the user actually tries to use the returned value (which is undefined), they
     * will get a clear TypeError at the point of use.
     *
     * @param className - The class name (for diagnostic purposes)
     * @param methodName - The method name (for diagnostic purposes)
     * @param warn - If true, emit a one-time console warning when the stub is called.
     *              Use this only for methods that are never called internally as feature checks.
     * @internal
     */
    export function _MissingSideEffect(className: string, methodName: string, warn?: boolean): (...args: unknown[]) => void;
    /**
     * Checks whether a value is a side-effect stub (i.e., a placeholder function
     * generated by _MissingSideEffect). Use this instead of truthiness checks when
     * doing feature detection on methods that may be stubbed for tree-shaking.
     * @param fn The function/method to check
     * @returns true if the function is a real implementation (not a stub or undefined/null)
     * @internal
     */
    export function _IsSideEffectImplemented(fn: unknown): boolean;
    /**
     * Returns a property descriptor that acts as a placeholder for augmented properties
     * that require a side-effect import. The getter returns undefined (allowing pure code
     * to feature-detect by checking truthiness), and the setter replaces the stub with a
     * real data property on the instance.
     * @internal
     */
    export function _MissingSideEffectProperty(className: string, propName: string): PropertyDescriptor;


    /**
     * This class is a small wrapper around the MinMaxReducer class to compute the min/max values of a depth texture
     */
    export class DepthReducer extends MinMaxReducer {
        private _depthRenderer;
        private _depthRendererId;
        /**
         * Gets the depth renderer used for the computation.
         * Note that the result is null if you provide your own renderer when calling setDepthRenderer.
         */
        get depthRenderer(): Nullable<DepthRenderer>;
        /**
         * Creates a depth reducer
         * @param camera The camera used to render the depth texture
         */
        constructor(camera: Camera);
        /**
         * Sets the depth renderer to use to generate the depth map
         * @param depthRenderer The depth renderer to use. If not provided, a new one will be created automatically
         * @param type The texture type of the depth map (default: TEXTURETYPE_HALF_FLOAT)
         * @param forceFullscreenViewport Forces the post processes used for the reduction to be applied without taking into account viewport (defaults to true)
         */
        setDepthRenderer(depthRenderer?: Nullable<DepthRenderer>, type?: number, forceFullscreenViewport?: boolean): void;
        /**
         * @internal
         */
        setSourceTexture(sourceTexture: RenderTargetTexture, depthRedux: boolean, type?: number, forceFullscreenViewport?: boolean): void;
        /**
         * Activates the reduction computation.
         * When activated, the observers registered in onAfterReductionPerformed are
         * called after the computation is performed
         */
        activate(): void;
        /**
         * Deactivates the reduction computation.
         */
        deactivate(): void;
        /**
         * Disposes the depth reducer
         * @param disposeAll true to dispose all the resources. You should always call this function with true as the parameter (or without any parameter as it is the default one). This flag is meant to be used internally.
         */
        dispose(disposeAll?: boolean): void;
    }


    /**
     * Wrapper class for promise with external resolve and reject.
     */
    export class Deferred<T> {
        /**
         * The promise associated with this deferred object.
         */
        readonly promise: Promise<T>;
        private _resolve;
        private _reject;
        /**
         * The resolve method of the promise associated with this deferred object.
         */
        get resolve(): (value: T | PromiseLike<T>) => void;
        /**
         * The reject method of the promise associated with this deferred object.
         */
        get reject(): (reason?: any) => void;
        /**
         * Constructor for this deferred object.
         */
        constructor();
    }


    /**
     * Merges a series of objects into a single object, deeply.
     * @param objects The objects to merge (objects later in the list take precedence).
     * @returns The merged object.
     */
    export function deepMerge<T extends object>(...objects: T[]): T;


    /**
     * Class containing a set of static utilities functions for deep copy.
     */
    export class DeepCopier {
        /**
         * Tries to copy an object by duplicating every property
         * @param source defines the source object
         * @param destination defines the target object
         * @param doNotCopyList defines a list of properties to avoid
         * @param mustCopyList defines a list of properties to copy (even if they start with _)
         * @param shallowCopyValues defines wether properties referencing objects (none cloneable) must be shallow copied (false by default)
         * @remarks shallowCopyValues will not instantite the copied values which makes it only usable for "JSON objects"
         */
        static DeepCopy(source: any, destination: any, doNotCopyList?: string[], mustCopyList?: string[], shallowCopyValues?: boolean): void;
    }


    /** @internal */
    export interface ICopySourceOptions {
        cloneTexturesOnlyOnce?: boolean;
    }
    /**
     * Class used to help serialization objects
     */
    export class SerializationHelper {
        /**
         * Gets or sets a boolean to indicate if the UniqueId property should be serialized
         */
        static AllowLoadingUniqueId: boolean;
        /**
         * @internal
         */
        static _ImageProcessingConfigurationParser: (sourceProperty: any) => ImageProcessingConfiguration;
        /**
         * @internal
         */
        static _FresnelParametersParser: (sourceProperty: any) => FresnelParameters;
        /**
         * @internal
         */
        static _ColorCurvesParser: (sourceProperty: any) => ColorCurves;
        /**
         * @internal
         */
        static _TextureParser: (sourceProperty: any, scene: Scene, rootUrl: string) => Nullable<BaseTexture>;
        /**
         * Appends the serialized animations from the source animations
         * @param source Source containing the animations
         * @param destination Target to store the animations
         */
        static AppendSerializedAnimations(source: IAnimatable, destination: any): void;
        /**
         * Static function used to serialized a specific entity
         * @param entity defines the entity to serialize
         * @param serializationObject defines the optional target object where serialization data will be stored
         * @returns a JSON compatible object representing the serialization of the entity
         */
        static Serialize<T>(entity: T, serializationObject?: any): any;
        /**
         * Given a source json and a destination object in a scene, this function will parse the source and will try to apply its content to the destination object
         * @param source the source json data
         * @param destination the destination object
         * @param scene the scene where the object is
         * @param rootUrl root url to use to load assets
         */
        static ParseProperties(source: any, destination: any, scene: Nullable<Scene>, rootUrl: Nullable<string>): void;
        /**
         * Creates a new entity from a serialization data object
         * @param creationFunction defines a function used to instanciated the new entity
         * @param source defines the source serialization data
         * @param scene defines the hosting scene
         * @param rootUrl defines the root url for resources
         * @returns a new entity
         */
        static Parse<T>(creationFunction: () => T, source: any, scene: Nullable<Scene>, rootUrl?: Nullable<string>): T;
        /**
         * Clones an object
         * @param creationFunction defines the function used to instanciate the new object
         * @param source defines the source object
         * @param options defines the options to use
         * @returns the cloned object
         */
        static Clone<T>(creationFunction: () => T, source: T, options?: ICopySourceOptions): T;
        /**
         * Instanciates a new object based on a source one (some data will be shared between both object)
         * @param creationFunction defines the function used to instanciate the new object
         * @param source defines the source object
         * @returns the new object
         */
        static Instanciate<T>(creationFunction: () => T, source: T): T;
    }


    /** @internal */
    export function GetDirectStore(target: any): any;
    /**
     * @returns the list of properties flagged as serializable
     * @param target host object
     */
    export function GetMergedStore(target: any): any;


    export function expandToProperty(callback: string, targetKey?: Nullable<string>): (target: any, propertyKey: string) => void;
    export function serialize(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsTexture(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsColor3(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsFresnelParameters(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsVector2(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsVector3(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsMeshReference(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsColorCurves(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsColor4(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsImageProcessingConfiguration(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsQuaternion(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    export function serializeAsMatrix(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    /**
     * Decorator used to define property that can be serialized as reference to a camera
     * @param sourceName defines the name of the property to decorate
     * @returns Property Decorator
     */
    export function serializeAsCameraReference(sourceName?: string): (target: any, propertyKey: string | symbol) => void;
    /**
     * Decorator used to redirect a function to a native implementation if available.
     * @internal
     */
    export function nativeOverride<T extends (...params: any[]) => boolean>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...params: Parameters<T>) => any>, predicate?: T): void;
    export namespace nativeOverride {
        var filter: <T extends (...params: any) => boolean>(predicate: T) => (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<(...params: Parameters<T>) => unknown>) => void;
    }
    /**
     * Adds accessors for a material property.
     * @param setCallback - The name of the callback function to call when the property is set.
     * @param targetKey - The key to use for the target property (defaults to the original property key).
     * @returns A property decorator.
     */
    export function addAccessorsForMaterialProperty(setCallback: string, targetKey?: Nullable<string>): (target: any, propertyKey: string) => void;


    /** This file must only contain pure code and pure imports */
    /**
     * Direct draw surface info
     * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dx-graphics-dds-pguide
     */
    export interface DDSInfo {
        /**
         * Width of the texture
         */
        width: number;
        /**
         * Width of the texture
         */
        height: number;
        /**
         * Number of Mipmaps for the texture
         * @see https://en.wikipedia.org/wiki/Mipmap
         */
        mipmapCount: number;
        /**
         * If the textures format is a known fourCC format
         * @see https://www.fourcc.org/
         */
        isFourCC: boolean;
        /**
         * If the texture is an RGB format eg. DXGI_FORMAT_B8G8R8X8_UNORM format
         */
        isRGB: boolean;
        /**
         * If the texture is a lumincance format
         */
        isLuminance: boolean;
        /**
         * If this is a cube texture
         * @see https://docs.microsoft.com/en-us/windows/desktop/direct3ddds/dds-file-layout-for-cubic-environment-maps
         */
        isCube: boolean;
        /**
         * If the texture is a compressed format eg. FOURCC_DXT1
         */
        isCompressed: boolean;
        /**
         * The dxgiFormat of the texture
         * @see https://docs.microsoft.com/en-us/windows/desktop/api/dxgiformat/ne-dxgiformat-dxgi_format
         */
        dxgiFormat: number;
        /**
         * Texture type eg. Engine.TEXTURETYPE_UNSIGNED_BYTE, Engine.TEXTURETYPE_FLOAT
         */
        textureType: number;
        /**
         * Sphericle polynomial created for the dds texture
         */
        sphericalPolynomial?: SphericalPolynomial;
    }
    /**
     * Class used to provide DDS decompression tools
     */
    export class DDSTools {
        /**
         * Gets or sets a boolean indicating that LOD info is stored in alpha channel (false by default)
         */
        static StoreLODInAlphaChannel: boolean;
        /**
         * Gets DDS information from an array buffer
         * @param data defines the array buffer view to read data from
         * @returns the DDS information
         */
        static GetDDSInfo(data: ArrayBufferView): DDSInfo;
        private static _GetHalfFloatAsFloatRGBAArrayBuffer;
        private static _GetHalfFloatRGBAArrayBuffer;
        private static _GetFloatRGBAArrayBuffer;
        private static _GetFloatAsHalfFloatRGBAArrayBuffer;
        private static _GetFloatAsUIntRGBAArrayBuffer;
        private static _GetHalfFloatAsUIntRGBAArrayBuffer;
        private static _GetRGBAArrayBuffer;
        private static _ExtractLongWordOrder;
        private static _GetRGBArrayBuffer;
        private static _GetLuminanceArrayBuffer;
        /**
         * Uploads DDS Levels to a Babylon Texture
         * @internal
         */
        static UploadDDSLevels(engine: AbstractEngine, texture: InternalTexture, data: ArrayBufferView, info: DDSInfo, loadMipmaps: boolean, faces: number, lodIndex?: number, currentFace?: number, destTypeMustBeFilterable?: boolean): void;
    }




    /**
     * Class for storing data to local storage if available or in-memory storage otherwise
     */
    export class DataStorage {
        private static _Storage;
        private static _GetStorage;
        /**
         * Reads a string from the data storage
         * @param key The key to read
         * @param defaultValue The value if the key doesn't exist
         * @returns The string value
         */
        static ReadString(key: string, defaultValue: string): string;
        /**
         * Writes a string to the data storage
         * @param key The key to write
         * @param value The value to write
         */
        static WriteString(key: string, value: string): void;
        /**
         * Reads a boolean from the data storage
         * @param key The key to read
         * @param defaultValue The value if the key doesn't exist
         * @returns The boolean value
         */
        static ReadBoolean(key: string, defaultValue: boolean): boolean;
        /**
         * Writes a boolean to the data storage
         * @param key The key to write
         * @param value The value to write
         */
        static WriteBoolean(key: string, value: boolean): void;
        /**
         * Reads a number from the data storage
         * @param key The key to read
         * @param defaultValue The value if the key doesn't exist
         * @returns The number value
         */
        static ReadNumber(key: string, defaultValue: number): number;
        /**
         * Writes a number to the data storage
         * @param key The key to write
         * @param value The value to write
         */
        static WriteNumber(key: string, value: number): void;
        /**
         * Reads a JSON value from the data storage
         * @param key The key to read
         * @param defaultValue The value if the key doesn't exist
         * @returns The JSON value
         */
        static ReadJson<T>(key: string, defaultValue: T): T;
        /**
         * Writes a JSON value to the data storage
         * @param key The key to write
         * @param value The JSON value to write
         */
        static WriteJson<T>(key: string, value: T): void;
    }


    /**
     * Interface for a data buffer
     */
    export interface IDataBuffer {
        /**
         * Reads bytes from the data buffer.
         * @param byteOffset The byte offset to read
         * @param byteLength The byte length to read
         * @returns A promise that resolves when the bytes are read
         */
        readAsync(byteOffset: number, byteLength: number): Promise<ArrayBufferView>;
        /**
         * The byte length of the buffer.
         */
        readonly byteLength: number;
    }
    /**
     * Utility class for reading from a data buffer
     */
    export class DataReader {
        /**
         * The data buffer associated with this data reader.
         */
        readonly buffer: IDataBuffer;
        /**
         * The current byte offset from the beginning of the data buffer.
         */
        byteOffset: number;
        private _dataView;
        private _dataByteOffset;
        /**
         * Constructor
         * @param buffer The buffer to read
         */
        constructor(buffer: IDataBuffer);
        /**
         * Loads the given byte length.
         * @param byteLength The byte length to load
         * @returns A promise that resolves when the load is complete
         */
        loadAsync(byteLength: number): Promise<void>;
        /**
         * Read a unsigned 32-bit integer from the currently loaded data range.
         * @returns The 32-bit integer read
         */
        readUint32(): number;
        /**
         * Read a byte array from the currently loaded data range.
         * @param byteLength The byte length to read
         * @returns The byte array read
         */
        readUint8Array(byteLength: number): Uint8Array;
        /**
         * Read a string from the currently loaded data range.
         * @param byteLength The byte length to read
         * @returns The string read
         */
        readString(byteLength: number): string;
        /**
         * Skips the given byte length the currently loaded data range.
         * @param byteLength The byte length to skip
         */
        skipBytes(byteLength: number): void;
    }


    /**
     * Interface for any object that can request an animation frame
     */
    export interface ICustomAnimationFrameRequester {
        /**
         * This function will be called when the render loop is ready. If this is not populated, the engine's renderloop function will be called
         */
        renderFunction?: Function;
        /**
         * Called to request the next frame to render to
         * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame
         */
        requestAnimationFrame: Function;
        /**
         * You can pass this value to cancelAnimationFrame() to cancel the refresh callback request
         * @see https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame#Return_value
         */
        requestID?: number;
        /**
         * Called to cancel the next frame request
         */
        cancelAnimationFrame?: Function;
    }


    /**
     * A Coroutine<T> is the intersection of:
     * 1. An Iterator that yields void, returns a T, and is not passed values with calls to next.
     * 2. An IterableIterator of void (since it only yields void).
     */
    type CoroutineBase<TStep, TReturn> = Iterator<TStep, TReturn, void> & IterableIterator<TStep>;
    /** @internal */
    export type Coroutine<T> = CoroutineBase<void, T>;
    /** @internal */
    export type AsyncCoroutine<T> = CoroutineBase<void | Promise<void>, T>;
    /** @internal */
    export type CoroutineStep<T> = IteratorResult<void, T>;
    /** @internal */
    export type CoroutineScheduler<T> = (coroutine: AsyncCoroutine<T>, onStep: (stepResult: CoroutineStep<T>) => void, onError: (stepError: any) => void) => void;
    /**
     * @internal
     */
    export function inlineScheduler<T>(coroutine: AsyncCoroutine<T>, onStep: (stepResult: CoroutineStep<T>) => void, onError: (stepError: any) => void): void;
    /**
     * @internal
     */
    export function createYieldingScheduler<T>(yieldAfterMS?: number): (coroutine: AsyncCoroutine<T>, onStep: (stepResult: CoroutineStep<T>) => void, onError: (stepError: any) => void) => void;
    /**
     * @internal
     */
    export function runCoroutine<T>(coroutine: AsyncCoroutine<T>, scheduler: CoroutineScheduler<T>, onSuccess: (result: T) => void, onError: (error: any) => void, abortSignal?: AbortSignal): void;
    /**
     * @internal
     */
    export function runCoroutineSync<T>(coroutine: Coroutine<T>, abortSignal?: AbortSignal): T;
    /**
     * @internal
     */
    export function runCoroutineAsync<T>(coroutine: AsyncCoroutine<T>, scheduler: CoroutineScheduler<T>, abortSignal?: AbortSignal): Promise<T>;
    /**
     * Given a function that returns a Coroutine<T>, produce a function with the same parameters that returns a T.
     * The returned function runs the coroutine synchronously.
     * @param coroutineFactory A function that returns a Coroutine<T>.
     * @param abortSignal
     * @returns A function that runs the coroutine synchronously.
     * @internal
     */
    export function makeSyncFunction<TParams extends unknown[], TReturn>(coroutineFactory: (...params: TParams) => Coroutine<TReturn>, abortSignal?: AbortSignal): (...params: TParams) => TReturn;
    /**
     * Given a function that returns a Coroutine<T>, product a function with the same parameters that returns a Promise<T>.
     * The returned function runs the coroutine asynchronously, yield control of the execution context occasionally to enable a more responsive experience.
     * @param coroutineFactory A function that returns a Coroutine<T>.
     * @param scheduler
     * @param abortSignal
     * @returns A function that runs the coroutine asynchronously.
     * @internal
     */
    export function makeAsyncFunction<TParams extends unknown[], TReturn>(coroutineFactory: (...params: TParams) => AsyncCoroutine<TReturn>, scheduler: CoroutineScheduler<TReturn>, abortSignal?: AbortSignal): (...params: TParams) => Promise<TReturn>;


    /**
     * Transform some pixel data to a base64 string
     * @param pixels defines the pixel data to transform to base64
     * @param size defines the width and height of the (texture) data
     * @param invertY true if the data must be inverted for the Y coordinate during the conversion
     * @returns The base64 encoded string or null
     */
    export function GenerateBase64StringFromPixelData(pixels: ArrayBufferView, size: ISize, invertY?: boolean): Nullable<string>;
    /**
     * Reads the pixels stored in the webgl texture and returns them as a base64 string
     * @param texture defines the texture to read pixels from
     * @param faceIndex defines the face of the texture to read (in case of cube texture)
     * @param level defines the LOD level of the texture to read (in case of Mip Maps)
     * @returns The base64 encoded string or null
     */
    export function GenerateBase64StringFromTexture(texture: BaseTexture, faceIndex?: number, level?: number): Nullable<string>;
    /**
     * Reads the pixels stored in the webgl texture and returns them as a base64 string
     * @param texture defines the texture to read pixels from
     * @param faceIndex defines the face of the texture to read (in case of cube texture)
     * @param level defines the LOD level of the texture to read (in case of Mip Maps)
     * @returns The base64 encoded string or null wrapped in a promise
     */
    export function GenerateBase64StringFromTextureAsync(texture: BaseTexture, faceIndex?: number, level?: number): Promise<Nullable<string>>;
    /**
     * Class used to host copy specific utilities
     * (Back-compat)
     */
    export var CopyTools: {
        /**
         * Transform some pixel data to a base64 string
         * @param pixels defines the pixel data to transform to base64
         * @param size defines the width and height of the (texture) data
         * @param invertY true if the data must be inverted for the Y coordinate during the conversion
         * @returns The base64 encoded string or null
         */
        GenerateBase64StringFromPixelData: typeof GenerateBase64StringFromPixelData;
        /**
         * Reads the pixels stored in the webgl texture and returns them as a base64 string
         * @param texture defines the texture to read pixels from
         * @param faceIndex defines the face of the texture to read (in case of cube texture)
         * @param level defines the LOD level of the texture to read (in case of Mip Maps)
         * @returns The base64 encoded string or null
         */
        GenerateBase64StringFromTexture: typeof GenerateBase64StringFromTexture;
        /**
         * Reads the pixels stored in the webgl texture and returns them as a base64 string
         * @param texture defines the texture to read pixels from
         * @param faceIndex defines the face of the texture to read (in case of cube texture)
         * @param level defines the LOD level of the texture to read (in case of Mip Maps)
         * @returns The base64 encoded string or null wrapped in a promise
         */
        GenerateBase64StringFromTextureAsync: typeof GenerateBase64StringFromTextureAsync;
    };


    /**
     * Conversion modes available when copying a texture into another one
     */
    export enum ConversionMode {
        None = 0,
        ToLinearSpace = 1,
        ToGammaSpace = 2
    }
    /**
     * Class used for fast copy from one texture to another
     */
    export class CopyTextureToTexture {
        private _engine;
        private _isDepthTexture;
        private _renderer;
        private _effectWrapper;
        private _source;
        private _conversion;
        private _lodLevel;
        /** Shader language used */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Gets the effect wrapper used for the copy
         */
        get effectWrapper(): EffectWrapper;
        /**
         * Gets or sets the source texture
         */
        get source(): InternalTexture | ThinTexture;
        set source(texture: InternalTexture | ThinTexture);
        /**
         * Gets or sets the LOD level to copy from the source texture
         */
        get lodLevel(): number;
        set lodLevel(level: number);
        private _textureIsInternal;
        /**
         * Constructs a new instance of the class
         * @param engine The engine to use for the copy
         * @param isDepthTexture True means that we should write (using gl_FragDepth) into the depth texture attached to the destination (default: false)
         * @param sameSizeCopy True means that the copy will be done without any sampling (more efficient, but requires the source and destination to be of the same size) (default: false)
         */
        constructor(engine: AbstractEngine, isDepthTexture?: boolean, sameSizeCopy?: boolean);
        private _shadersLoaded;
        private _initShaderSourceAsync;
        /**
         * Indicates if the effect is ready to be used for the copy
         * @returns true if "copy" can be called without delay, else false
         */
        isReady(): boolean;
        /**
         * Copy one texture into another
         * @param source The source texture
         * @param destination The destination texture. If null, copy the source to the currently bound framebuffer
         * @param conversion The conversion mode that should be applied when copying
         * @param lod The LOD level to copy from the source texture
         * @returns
         */
        copy(source: InternalTexture | ThinTexture, destination?: Nullable<RenderTargetWrapper | IRenderTargetTexture>, conversion?: ConversionMode, lod?: number): boolean;
        /**
         * Releases all the resources used by the class
         */
        dispose(): void;
    }


    /**
     * Extracts the characters between two markers (for eg, between "(" and ")"). The function handles nested markers as well as markers inside strings (delimited by ", ' or `) and comments
     * @param markerOpen opening marker
     * @param markerClose closing marker
     * @param block code block to parse
     * @param startIndex starting index in block where the extraction must start. The character at block[startIndex] should be the markerOpen character!
     * @returns index of the last character for the extraction (or -1 if the string is invalid - no matching closing marker found). The string to extract (without the markers) is the string between startIndex + 1 and the returned value (exclusive)
     */
    export function ExtractBetweenMarkers(markerOpen: string, markerClose: string, block: string, startIndex: number): number;
    /**
     * Parses a string and skip whitespaces
     * @param s string to parse
     * @param index index where to start parsing
     * @returns the index after all whitespaces have been skipped
     */
    export function SkipWhitespaces(s: string, index: number): number;
    /**
     * Checks if a character is an identifier character (meaning, if it is 0-9, A-Z, a-z or _)
     * @param c character to check
     * @returns true if the character is an identifier character
     */
    export function IsIdentifierChar(c: string): boolean;
    /**
     * Removes the comments of a code block
     * @param block code block to parse
     * @returns block with the comments removed
     */
    export function RemoveComments(block: string): string;
    /**
     * Finds the first occurrence of a character in a string going backward
     * @param s the string to parse
     * @param index starting index in the string
     * @param c the character to find
     * @param c2 an optional second character to find
     * @returns the index of the character if found, else -1
     */
    export function FindBackward(s: string, index: number, c: string, c2?: string): number;
    /**
     * Escapes a string so that it is usable as a regular expression
     * @param s string to escape
     * @returns escaped string
     */
    export function EscapeRegExp(s: string): string;
    /**
     * Injects code at the beginning and/or end of a function.
     * The function is identified by "mainFuncDecl". The starting code is injected just after the first "\{" found after the mainFuncDecl.
     * The ending code is injected just before the last "\}" of the whole block of code (so, it is assumed that the function is the last of the block of code).
     * @param code code to inject into
     * @param mainFuncDecl Function declaration to find in the code (for eg: "void main")
     * @param startingCode The code to inject at the beginning of the function
     * @param endingCode The code to inject at the end of the function
     * @returns The code with the injected code
     */
    export function InjectStartingAndEndingCode(code: string, mainFuncDecl: string, startingCode?: string, endingCode?: string): string;


    /**
     * Diagnostic utility that checks all known side-effect stubs and reports which ones
     * have NOT been registered. Call this at application startup (after all your imports)
     * to discover ALL missing imports at once, instead of hitting them one at a time at runtime.
     *
     * This function is in a standalone module — it adds zero overhead to your bundle unless
     * you explicitly import it. Intended for development use only.
     *
     * @returns An array of module names that need to be imported. Empty if everything is registered.
     *
     * @example
     * ```typescript
     * import { CheckMissingImports } from "@babylonjs/core/Misc/checkMissingImports";
     *
     * const missing = CheckMissingImports();
     * // Console output: "[Babylon.js] The following side-effect modules have not been imported: ..."
     * ```
     */
    export function CheckMissingImports(): string[];


    /**
     * Gets a default environment BRDF for MS-BRDF Height Correlated BRDF
     * @param scene defines the hosting scene
     * @returns the environment BRDF texture
     */
    export const GetEnvironmentBRDFTexture: (scene: Scene) => BaseTexture;
    /**
     * Gets a default environment fuzz BRDF texture
     * @param scene defines the hosting scene
     * @returns the environment fuzz BRDF texture
     */
    export const GetEnvironmentFuzzBRDFTexture: (scene: Scene) => BaseTexture;
    /**
     * Gets the OpenPBR environment BRDF texture (3-channel F82 LUT)
     * @param scene defines the hosting scene
     * @returns the OpenPBR environment BRDF texture
     */
    export const GetOpenPBREnvironmentBRDFTexture: (scene: Scene) => BaseTexture;
    /**
     * Class used to host texture specific utilities
     */
    export var BRDFTextureTools: {
        /**
         * Gets a default environment BRDF for MS-BRDF Height Correlated BRDF
         * @param scene defines the hosting scene
         * @returns the environment BRDF texture
         */
        GetEnvironmentBRDFTexture: (scene: Scene) => BaseTexture;
        /**
         * Gets a default environment fuzz BRDF texture
         * @param scene defines the hosting scene
         * @returns the environment fuzz BRDF texture
         */
        GetEnvironmentFuzzBRDFTexture: (scene: Scene) => BaseTexture;
        /**
         * Gets the OpenPBR environment BRDF texture (3-channel F82 LUT)
         * @param scene defines the hosting scene
         * @returns the OpenPBR environment BRDF texture
         */
        GetOpenPBREnvironmentBRDFTexture: (scene: Scene) => BaseTexture;
    };


    /**
     * An fixed size array that effectively stores boolean values where each value is a single bit of backing data.
     * @remarks
     * All bits are initialized to false.
     */
    export class BitArray {
        readonly size: number;
        private readonly _byteArray;
        /**
         * Creates a new bit array with a fixed size.
         * @param size The number of bits to store.
         */
        constructor(size: number);
        /**
         * Gets the current value at the specified index.
         * @param bitIndex The index to get the value from.
         * @returns The value at the specified index.
         */
        get(bitIndex: number): boolean;
        /**
         * Sets the value at the specified index.
         * @param bitIndex The index to set the value at.
         * @param value The value to set.
         */
        set(bitIndex: number, value: boolean): void;
    }


    /**
     * The worker function that gets converted to a blob url to pass into a worker.
     * To be used if a developer wants to create their own worker instance and inject it instead of using the default worker.
     */
    export function workerFunction(): void;
    /**
     * Initialize a web worker with the basis transcoder
     * @param worker the worker to initialize
     * @param wasmBinary the wasm binary to load into the worker
     * @param moduleUrl the url to the basis transcoder module
     * @returns a promise that resolves when the worker is initialized
     */
    export function initializeWebWorker(worker: Worker, wasmBinary: ArrayBuffer, moduleUrl?: string): Promise<Worker>;


    /** This file must only contain pure code and pure imports */
    /**
     * Info about the .basis files
     */
    export class BasisFileInfo {
        /**
         * If the file has alpha
         */
        hasAlpha: boolean;
        /**
         * Info about each image of the basis file
         */
        images: Array<{
            levels: Array<{
                width: number;
                height: number;
                transcodedPixels: ArrayBufferView;
            }>;
        }>;
    }
    /**
     * Result of transcoding a basis file
     */
    class TranscodeResult {
        /**
         * Info about the .basis file
         */
        fileInfo: BasisFileInfo;
        /**
         * Format to use when loading the file
         */
        format: number;
    }
    /**
     * Configuration options for the Basis transcoder
     */
    export class BasisTranscodeConfiguration {
        /**
         * Supported compression formats used to determine the supported output format of the transcoder
         */
        supportedCompressionFormats?: {
            /**
             * etc1 compression format
             */
            etc1?: boolean;
            /**
             * s3tc compression format
             */
            s3tc?: boolean;
            /**
             * pvrtc compression format
             */
            pvrtc?: boolean;
            /**
             * etc2 compression format
             */
            etc2?: boolean;
            /**
             * astc compression format
             */
            astc?: boolean;
            /**
             * bc7 compression format
             */
            bc7?: boolean;
        };
        /**
         * If mipmap levels should be loaded for transcoded images (Default: true)
         */
        loadMipmapLevels?: boolean;
        /**
         * Index of a single image to load (Default: all images)
         */
        loadSingleImage?: number;
    }
    /**
     * Used to load .Basis files
     * See https://github.com/BinomialLLC/basis_universal/tree/master/webgl
     */
    export var BasisToolsOptions: {
        /**
         * URL to use when loading the basis transcoder
         */
        JSModuleURL: string;
        /**
         * URL to use when loading the wasm module for the transcoder
         */
        WasmModuleURL: string;
    };
    /**
     * Get the internal format to be passed to texImage2D corresponding to the .basis format value
     * @param basisFormat format chosen from GetSupportedTranscodeFormat
     * @param engine
     * @returns internal format corresponding to the Basis format
     */
    export const GetInternalFormatFromBasisFormat: (basisFormat: number, engine: AbstractEngine) => number;
    /**
     * Set the worker to use for transcoding
     * @param worker The worker that will be used for transcoding
     */
    export const SetBasisTranscoderWorker: (worker: Worker) => void;
    /**
     * Transcodes a loaded image file to compressed pixel data
     * @param data image data to transcode
     * @param config configuration options for the transcoding
     * @returns a promise resulting in the transcoded image
     */
    export const TranscodeAsync: (data: ArrayBuffer | ArrayBufferView, config: BasisTranscodeConfiguration) => Promise<TranscodeResult>;
    /**
     * Loads a texture from the transcode result
     * @param texture texture load to
     * @param transcodeResult the result of transcoding the basis file to load from
     */
    export const LoadTextureFromTranscodeResult: (texture: InternalTexture, transcodeResult: TranscodeResult) => void;
    /**
     * Used to load .Basis files
     * See https://github.com/BinomialLLC/basis_universal/tree/master/webgl
     */
    export var BasisTools: {
        /**
         * URL to use when loading the basis transcoder
         */
        JSModuleURL: string;
        /**
         * URL to use when loading the wasm module for the transcoder
         */
        WasmModuleURL: string;
        /**
         * Get the internal format to be passed to texImage2D corresponding to the .basis format value
         * @param basisFormat format chosen from GetSupportedTranscodeFormat
         * @returns internal format corresponding to the Basis format
         */
        GetInternalFormatFromBasisFormat: (basisFormat: number, engine: AbstractEngine) => number;
        /**
         * Transcodes a loaded image file to compressed pixel data
         * @param data image data to transcode
         * @param config configuration options for the transcoding
         * @returns a promise resulting in the transcoded image
         */
        TranscodeAsync: (data: ArrayBuffer | ArrayBufferView, config: BasisTranscodeConfiguration) => Promise<TranscodeResult>;
        /**
         * Loads a texture from the transcode result
         * @param texture texture load to
         * @param transcodeResult the result of transcoding the basis file to load from
         */
        LoadTextureFromTranscodeResult: (texture: InternalTexture, transcodeResult: TranscodeResult) => void;
    };
    /**
     * Register side effects for basis.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBasis(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import basis.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Provides a simple way of creating the rough equivalent of an async critical section.
     *
     * @example
     * ```typescript
     * const myLock = new AsyncLock();
     *
     * private async MyFuncAsync(): Promise<void> {
     *   await myLock.lockAsync(async () => {
     *     await operation1Async();
     *     await operation2Async();
     *   });
     * }
     * ```
     */
    export class AsyncLock {
        private _currentOperation;
        /**
         * Executes the provided function when the lock is acquired (e.g. when the previous operation finishes).
         * @param func The function to execute.
         * @param signal An optional signal that can be used to abort the operation.
         * @returns A promise that resolves when the func finishes executing.
         */
        lockAsync<T>(func: () => T | Promise<T>, signal?: AbortSignal): Promise<T>;
        /**
         * Executes the provided function when all the specified locks are acquired.
         * @param func The function to execute.
         * @param locks The locks to acquire.
         * @param signal An optional signal that can be used to abort the operation.
         * @returns A promise that resolves when the func finishes executing.
         */
        static LockAsync<T>(func: () => T | Promise<T>, locks: AsyncLock[], signal?: AbortSignal): Promise<T>;
    }


    /**
     * Defines the list of states available for a task inside a AssetsManager
     */
    export enum AssetTaskState {
        /**
         * Initialization
         */
        INIT = 0,
        /**
         * Running
         */
        RUNNING = 1,
        /**
         * Done
         */
        DONE = 2,
        /**
         * Error
         */
        ERROR = 3
    }
    /**
     * Define an abstract asset task used with a AssetsManager class to load assets into a scene
     */
    export abstract class AbstractAssetTask {
        /**
         * Task name
         */ name: string;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: any) => void;
        /**
         * Callback called when the task is not successful
         */
        onError: (task: any, message?: string, exception?: any) => void;
        /**
         * Creates a new AssetsManager
         * @param name defines the name of the task
         */
        constructor(
        /**
         * Task name
         */ name: string);
        private _isCompleted;
        private _taskState;
        private _errorObject;
        /**
         * Get if the task is completed
         */
        get isCompleted(): boolean;
        /**
         * Gets the current state of the task
         */
        get taskState(): AssetTaskState;
        /**
         * Gets the current error object (if task is in error)
         */
        get errorObject(): {
            message?: string;
            exception?: any;
        };
        /**
         * Internal only
         * @internal
         */
        _setErrorObject(message?: string, exception?: any): void;
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        run(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
        /**
         * Reset will set the task state back to INIT, so the next load call of the assets manager will execute this task again.
         * This can be used with failed tasks that have the reason for failure fixed.
         */
        reset(): void;
        private _onErrorCallback;
        private _onDoneCallback;
    }
    /**
     * Define the interface used by progress events raised during assets loading
     */
    export interface IAssetsProgressEvent {
        /**
         * Defines the number of remaining tasks to process
         */
        remainingCount: number;
        /**
         * Defines the total number of tasks
         */
        totalCount: number;
        /**
         * Defines the task that was just processed
         */
        task: AbstractAssetTask;
    }
    /**
     * Class used to share progress information about assets loading
     */
    export class AssetsProgressEvent implements IAssetsProgressEvent {
        /**
         * Defines the number of remaining tasks to process
         */
        remainingCount: number;
        /**
         * Defines the total number of tasks
         */
        totalCount: number;
        /**
         * Defines the task that was just processed
         */
        task: AbstractAssetTask;
        /**
         * Creates a AssetsProgressEvent
         * @param remainingCount defines the number of remaining tasks to process
         * @param totalCount defines the total number of tasks
         * @param task defines the task that was just processed
         */
        constructor(remainingCount: number, totalCount: number, task: AbstractAssetTask);
    }
    /**
     * Define a task used by AssetsManager to load assets into a container
     */
    export class ContainerAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the list of mesh's names you want to load
         */
        meshesNames: any;
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string;
        /**
         * Defines the filename or File of the scene to load from
         */
        sceneFilename: string | File;
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined;
        /**
         * Get the loaded asset container
         */
        loadedContainer: AssetContainer;
        /**
         * Gets the list of loaded transforms
         */
        loadedTransformNodes: Array<TransformNode>;
        /**
         * Gets the list of loaded meshes
         */
        loadedMeshes: Array<AbstractMesh>;
        /**
         * Gets the list of loaded particle systems
         */
        loadedParticleSystems: Array<IParticleSystem>;
        /**
         * Gets the list of loaded skeletons
         */
        loadedSkeletons: Array<Skeleton>;
        /**
         * Gets the list of loaded animation groups
         */
        loadedAnimationGroups: Array<AnimationGroup>;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: ContainerAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: ContainerAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new ContainerAssetTask
         * @param name defines the name of the task
         * @param meshesNames defines the list of mesh's names you want to load
         * @param rootUrl defines the root url to use as a base to load your meshes and associated resources
         * @param sceneFilename defines the filename or File of the scene to load from
         * @param extension defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the list of mesh's names you want to load
         */
        meshesNames: any, 
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string, 
        /**
         * Defines the filename or File of the scene to load from
         */
        sceneFilename: string | File, 
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load meshes
     */
    export class MeshAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the list of mesh's names you want to load
         */
        meshesNames: any;
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string;
        /**
         * Defines the filename or File of the scene to load from
         */
        sceneFilename: string | File;
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined;
        /**
         * defines the name of the file, if the data is binary
         */
        fileName?: string | undefined;
        /**
         * defines the options to use with the plugin
         */
        pluginOptions?: PluginOptions;
        /**
         * Gets the list of loaded transforms
         */
        loadedTransformNodes: Array<TransformNode>;
        /**
         * Gets the list of loaded meshes
         */
        loadedMeshes: Array<AbstractMesh>;
        /**
         * Gets the list of loaded particle systems
         */
        loadedParticleSystems: Array<IParticleSystem>;
        /**
         * Gets the list of loaded skeletons
         */
        loadedSkeletons: Array<Skeleton>;
        /**
         * Gets the list of loaded animation groups
         */
        loadedAnimationGroups: Array<AnimationGroup>;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: MeshAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: MeshAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new MeshAssetTask
         * @param name defines the name of the task
         * @param meshesNames defines the list of mesh's names you want to load
         * @param rootUrl defines the root url to use as a base to load your meshes and associated resources
         * @param sceneFilename defines the filename or File of the scene to load from
         * @param extension defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         * @param fileName defines the name of the file, if the data is binary
         * @param pluginOptions defines the options to use with the plugin
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the list of mesh's names you want to load
         */
        meshesNames: any, 
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string, 
        /**
         * Defines the filename or File of the scene to load from
         */
        sceneFilename: string | File, 
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined, 
        /**
         * defines the name of the file, if the data is binary
         */
        fileName?: string | undefined, 
        /**
         * defines the options to use with the plugin
         */
        pluginOptions?: PluginOptions);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load animations
     */
    export class AnimationAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string;
        /**
         * Defines the filename to load from
         */
        filename: string | File;
        /**
         * Defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         */
        targetConverter?: Nullable<(target: any) => any> | undefined;
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined;
        /**
         * Gets the list of loaded animation groups
         */
        loadedAnimationGroups: Array<AnimationGroup>;
        /**
         * Gets the list of loaded animatables
         */
        loadedAnimatables: Array<Animatable>;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: AnimationAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: AnimationAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new AnimationAssetTask
         * @param name defines the name of the task
         * @param rootUrl defines the root url to use as a base to load your meshes and associated resources
         * @param filename defines the filename or File of the scene to load from
         * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         * @param extension defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the root url to use as a base to load your meshes and associated resources
         */
        rootUrl: string, 
        /**
         * Defines the filename to load from
         */
        filename: string | File, 
        /**
         * Defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         */
        targetConverter?: Nullable<(target: any) => any> | undefined, 
        /**
         * Defines the extension to use to load the scene (if not defined, ".babylon" will be used)
         */
        extension?: string | undefined);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load text content
     */
    export class TextFileAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the file to load
         */
        url: string;
        /**
         * Gets the loaded text string
         */
        text: string;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: TextFileAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: TextFileAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new TextFileAssetTask object
         * @param name defines the name of the task
         * @param url defines the location of the file to load
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the file to load
         */
        url: string);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load binary data
     */
    export class BinaryFileAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the file to load
         */
        url: string;
        /**
         * Gets the loaded data (as an array buffer)
         */
        data: ArrayBuffer;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: BinaryFileAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: BinaryFileAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new BinaryFileAssetTask object
         * @param name defines the name of the new task
         * @param url defines the location of the file to load
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the file to load
         */
        url: string);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load images
     */
    export class ImageAssetTask extends AbstractAssetTask {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the image to load
         */
        url: string;
        /**
         * Gets the loaded images
         */
        image: HTMLImageElement;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: ImageAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: ImageAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new ImageAssetTask
         * @param name defines the name of the task
         * @param url defines the location of the image to load
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the image to load
         */
        url: string);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Defines the interface used by texture loading tasks
     */
    export interface ITextureAssetTask<Tex extends BaseTexture> {
        /**
         * Gets the loaded texture
         */
        texture: Tex;
    }
    /**
     * Define a task used by AssetsManager to load 2D textures
     */
    export class TextureAssetTask extends AbstractAssetTask implements ITextureAssetTask<Texture> {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the file to load
         */
        url: string;
        /**
         * Defines if mipmap should not be generated (default is false) or the creation options to use
         */
        noMipmapOrOptions?: (boolean | ITextureCreationOptions) | undefined;
        /**
         * [true] Defines if texture must be inverted on Y axis (default is true)
         */
        invertY: boolean;
        /**
         * [3] Defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)
         */
        samplingMode: number;
        /**
         * Gets the loaded texture
         */
        texture: Texture;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: TextureAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: TextureAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new TextureAssetTask object
         * @param name defines the name of the task
         * @param url defines the location of the file to load
         * @param noMipmapOrOptions defines if mipmap should not be generated (default is false) or the creation options to use
         * @param invertY defines if texture must be inverted on Y axis (default is true)
         * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the file to load
         */
        url: string, 
        /**
         * Defines if mipmap should not be generated (default is false) or the creation options to use
         */
        noMipmapOrOptions?: (boolean | ITextureCreationOptions) | undefined, 
        /**
         * [true] Defines if texture must be inverted on Y axis (default is true)
         */
        invertY?: boolean, 
        /**
         * [3] Defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)
         */
        samplingMode?: number);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load cube textures
     */
    export class CubeTextureAssetTask extends AbstractAssetTask implements ITextureAssetTask<CubeTexture> {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the files to load (You have to specify the folder where the files are + filename with no extension)
         */
        url: string;
        /**
         * Defines the suffixes add to the picture name in case six images are in use like _px.jpg or set of all options to create the cube texture
         */
        extensionsOrOptions: Nullable<string[] | ICubeTextureCreationOptions>;
        /**
         * Defines if mipmaps should not be generated (default is false)
         */
        noMipmap?: boolean | undefined;
        /**
         * Defines the explicit list of files (undefined by default)
         */
        files?: string[] | undefined;
        /**
         * Defines the prefiltered texture option (default is false)
         */
        prefiltered?: boolean | undefined;
        /**
         * Gets the loaded texture
         */
        texture: CubeTexture;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: CubeTextureAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: CubeTextureAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new CubeTextureAssetTask
         * @param name defines the name of the task
         * @param url defines the location of the files to load (You have to specify the folder where the files are + filename with no extension)
         * @param extensionsOrOptions defines the suffixes add to the picture name in case six images are in use like _px.jpg or set of all options to create the cube texture
         * @param noMipmap defines if mipmaps should not be generated (default is false)
         * @param files defines the explicit list of files (undefined by default)
         * @param prefiltered
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the files to load (You have to specify the folder where the files are + filename with no extension)
         */
        url: string, 
        /**
         * Defines the suffixes add to the picture name in case six images are in use like _px.jpg or set of all options to create the cube texture
         */
        extensionsOrOptions?: Nullable<string[] | ICubeTextureCreationOptions>, 
        /**
         * Defines if mipmaps should not be generated (default is false)
         */
        noMipmap?: boolean | undefined, 
        /**
         * Defines the explicit list of files (undefined by default)
         */
        files?: string[] | undefined, 
        /**
         * Defines the prefiltered texture option (default is false)
         */
        prefiltered?: boolean | undefined);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load HDR cube textures
     */
    export class HDRCubeTextureAssetTask extends AbstractAssetTask implements ITextureAssetTask<HDRCubeTexture> {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the file to load
         */
        url: string;
        /**
         * Defines the desired size (the more it increases the longer the generation will be)
         */
        size: number;
        /**
         * [false] Defines if mipmaps should not be generated (default is false)
         */
        noMipmap: boolean;
        /**
         * [true] Specifies whether you want to extract the polynomial harmonics during the generation process (default is true)
         */
        generateHarmonics: boolean;
        /**
         * [false] Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space) (default is false)
         */
        gammaSpace: boolean;
        /**
         * [false] Specifies if the texture should be prefiltered on load (default is false)
         */
        prefilterOnLoad: boolean;
        /**
         * [false] Specifies if the texture will be generated with super sampling (default is false)
         */
        supersample: boolean;
        /**
         * [false] Specifies if the irradiance should be prefiltered on load (default is false)
         */
        prefilterIrradianceOnLoad: boolean;
        /**
         * [false] Specifies if the texture should be prefiltered using CDF (default is false)
         */
        prefilterUsingCdf: boolean;
        /**
         * Gets the loaded texture
         */
        texture: HDRCubeTexture;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: HDRCubeTextureAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: HDRCubeTextureAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new HDRCubeTextureAssetTask object
         * @param name defines the name of the task
         * @param url defines the location of the file to load
         * @param size defines the desired size (the more it increases the longer the generation will be) If the size is omitted this implies you are using a preprocessed cubemap.
         * @param noMipmap defines if mipmaps should not be generated (default is false)
         * @param generateHarmonics specifies whether you want to extract the polynomial harmonics during the generation process (default is true)
         * @param gammaSpace specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space) (default is false)
         * @param prefilterOnLoad specifies if the texture should be prefiltered on load (default is false)
         * @param supersample specifies if the texture will be generated with super sampling (default is false)
         * @param prefilterIrradianceOnLoad specifies if the irradiance should be prefiltered on load (default is false)
         * @param prefilterUsingCdf specifies if the texture should be prefiltered using CDF (default is false)
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the file to load
         */
        url: string, 
        /**
         * Defines the desired size (the more it increases the longer the generation will be)
         */
        size: number, 
        /**
         * [false] Defines if mipmaps should not be generated (default is false)
         */
        noMipmap?: boolean, 
        /**
         * [true] Specifies whether you want to extract the polynomial harmonics during the generation process (default is true)
         */
        generateHarmonics?: boolean, 
        /**
         * [false] Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space) (default is false)
         */
        gammaSpace?: boolean, 
        /**
         * [false] Specifies if the texture should be prefiltered on load (default is false)
         */
        prefilterOnLoad?: boolean, 
        /**
         * [false] Specifies if the texture will be generated with super sampling (default is false)
         */
        supersample?: boolean, 
        /**
         * [false] Specifies if the irradiance should be prefiltered on load (default is false)
         */
        prefilterIrradianceOnLoad?: boolean, 
        /**
         * [false] Specifies if the texture should be prefiltered using CDF (default is false)
         */
        prefilterUsingCdf?: boolean);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * Define a task used by AssetsManager to load Equirectangular cube textures
     */
    export class EquiRectangularCubeTextureAssetTask extends AbstractAssetTask implements ITextureAssetTask<EquiRectangularCubeTexture> {
        /**
         * Defines the name of the task
         */
        name: string;
        /**
         * Defines the location of the file to load
         */
        url: string;
        /**
         * Defines the desired size (the more it increases the longer the generation will be)
         */
        size: number;
        /**
         * [false] Defines if mipmaps should not be generated (default is false)
         */
        noMipmap: boolean;
        /**
         * [true] Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space,
         * but the standard material would require them in Gamma space) (default is true)
         */
        gammaSpace: boolean;
        superSample: boolean;
        /**
         * Gets the loaded texture
         */
        texture: EquiRectangularCubeTexture;
        /**
         * Callback called when the task is successful
         */
        onSuccess: (task: EquiRectangularCubeTextureAssetTask) => void;
        /**
         * Callback called when the task is successful
         */
        onError: (task: EquiRectangularCubeTextureAssetTask, message?: string, exception?: any) => void;
        /**
         * Creates a new EquiRectangularCubeTextureAssetTask object
         * @param name defines the name of the task
         * @param url defines the location of the file to load
         * @param size defines the desired size (the more it increases the longer the generation will be)
         * If the size is omitted this implies you are using a preprocessed cubemap.
         * @param noMipmap defines if mipmaps should not be generated (default is false)
         * @param gammaSpace specifies if the texture will be used in gamma or linear space
         * @param superSample specifies if the texture will be generated with super sampling (default is false)
         * (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)
         * (default is true)
         */
        constructor(
        /**
         * Defines the name of the task
         */
        name: string, 
        /**
         * Defines the location of the file to load
         */
        url: string, 
        /**
         * Defines the desired size (the more it increases the longer the generation will be)
         */
        size: number, 
        /**
         * [false] Defines if mipmaps should not be generated (default is false)
         */
        noMipmap?: boolean, 
        /**
         * [true] Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space,
         * but the standard material would require them in Gamma space) (default is true)
         */
        gammaSpace?: boolean, superSample?: boolean);
        /**
         * Execute the current task
         * @param scene defines the scene where you want your assets to be loaded
         * @param onSuccess is a callback called when the task is successfully executed
         * @param onError is a callback called if an error occurs
         */
        runTask(scene: Scene, onSuccess: () => void, onError: (message?: string, exception?: any) => void): void;
    }
    /**
     * This class can be used to easily import assets into a scene
     * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/assetManager
     */
    export class AssetsManager {
        private _scene;
        private _isLoading;
        protected _tasks: AbstractAssetTask[];
        protected _waitingTasksCount: number;
        protected _totalTasksCount: number;
        /**
         * Callback called when all tasks are processed
         */
        onFinish: (tasks: AbstractAssetTask[]) => void;
        /**
         * Callback called when a task is successful
         */
        onTaskSuccess: (task: AbstractAssetTask) => void;
        /**
         * Callback called when a task had an error
         */
        onTaskError: (task: AbstractAssetTask) => void;
        /**
         * Callback called when a task is done (whatever the result is)
         */
        onProgress: (remainingCount: number, totalCount: number, task: AbstractAssetTask) => void;
        /**
         * Observable called when all tasks are processed
         */
        onTaskSuccessObservable: Observable<AbstractAssetTask>;
        /**
         * Observable called when a task had an error
         */
        onTaskErrorObservable: Observable<AbstractAssetTask>;
        /**
         * Observable called when all tasks were executed
         */
        onTasksDoneObservable: Observable<AbstractAssetTask[]>;
        /**
         * Observable called when a task is done (whatever the result is)
         */
        onProgressObservable: Observable<IAssetsProgressEvent>;
        /**
         * Gets or sets a boolean defining if the AssetsManager should use the default loading screen
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen
         */
        useDefaultLoadingScreen: boolean;
        /**
         * Gets or sets a boolean defining if the AssetsManager should automatically hide the loading screen
         * when all assets have been downloaded.
         * If set to false, you need to manually call in hideLoadingUI() once your scene is ready.
         */
        autoHideLoadingUI: boolean;
        /**
         * Creates a new AssetsManager
         * @param scene defines the scene to work on
         */
        constructor(scene?: Scene);
        /**
         * Add a ContainerAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param meshesNames defines the name of meshes to load
         * @param rootUrl defines the root url to use to locate files
         * @param sceneFilename defines the filename of the scene file or the File itself
         * @param extension defines the extension to use to load the file
         * @returns a new ContainerAssetTask object
         */
        addContainerTask(taskName: string, meshesNames: any, rootUrl: string, sceneFilename: string | File, extension?: string): ContainerAssetTask;
        /**
         * Add a MeshAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param meshesNames defines the name of meshes to load
         * @param rootUrl defines the root url to use to locate files
         * @param sceneFilename defines the filename of the scene file or the File itself
         * @param extension defines the extension to use to load the file
         * @param filename defines the name of the file, if the data is binary
         * @param pluginOptions defines the options to use with the plugin
         * @returns a new MeshAssetTask object
         */
        addMeshTask(taskName: string, meshesNames: any, rootUrl: string, sceneFilename: string | File, extension?: string, filename?: string, pluginOptions?: PluginOptions): MeshAssetTask;
        /**
         * Add a TextFileAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @returns a new TextFileAssetTask object
         */
        addTextFileTask(taskName: string, url: string): TextFileAssetTask;
        /**
         * Add a BinaryFileAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @returns a new BinaryFileAssetTask object
         */
        addBinaryFileTask(taskName: string, url: string): BinaryFileAssetTask;
        /**
         * Add a ImageAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @returns a new ImageAssetTask object
         */
        addImageTask(taskName: string, url: string): ImageAssetTask;
        /**
         * Add a TextureAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @param noMipmapOrOptions defines if mipmap should not be generated (default is false) or the creation options to use
         * @param invertY defines if you want to invert Y axis of the loaded texture (true by default)
         * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)
         * @returns a new TextureAssetTask object
         */
        addTextureTask(taskName: string, url: string, noMipmapOrOptions?: boolean | ITextureCreationOptions, invertY?: boolean, samplingMode?: number): TextureAssetTask;
        /**
         * Add a CubeTextureAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @param extensionsOrOptions defines the extension to use to load the cube map (can be null) or the options to use for the cube texture
         * @param noMipmap defines if the texture must not receive mipmaps (false by default)
         * @param files defines the list of files to load (can be null)
         * @param prefiltered defines the prefiltered texture option (default is false)
         * @returns a new CubeTextureAssetTask object
         */
        addCubeTextureTask(taskName: string, url: string, extensionsOrOptions?: string[] | ICubeTextureCreationOptions, noMipmap?: boolean, files?: string[], prefiltered?: boolean): CubeTextureAssetTask;
        /**
         *
         * Add a HDRCubeTextureAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @param size defines the size you want for the cubemap (can be null)
         * @param noMipmap defines if the texture must not receive mipmaps (false by default)
         * @param generateHarmonics defines if you want to automatically generate (true by default)
         * @param gammaSpace specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space) (default is false)
         * @param prefilterOnLoad specifies if the texture should be prefiltered on load (default is false)
         * @param supersample specifies if the texture will be generated with super sampling (default is false)
         * @param prefilterIrradianceOnLoad specifies if the irradiance should be prefiltered on load (default is false)
         * @param prefilterUsingCdf specifies if the texture should be prefiltered using CDF (default is false)
         * @returns a new HDRCubeTextureAssetTask object
         */
        addHDRCubeTextureTask(taskName: string, url: string, size: number, noMipmap?: boolean, generateHarmonics?: boolean, gammaSpace?: boolean, prefilterOnLoad?: boolean, supersample?: boolean, prefilterIrradianceOnLoad?: boolean, prefilterUsingCdf?: boolean): HDRCubeTextureAssetTask;
        /**
         *
         * Add a EquiRectangularCubeTextureAssetTask to the list of active tasks
         * @param taskName defines the name of the new task
         * @param url defines the url of the file to load
         * @param size defines the size you want for the cubemap (can be null)
         * @param noMipmap defines if the texture must not receive mipmaps (false by default)
         * @param gammaSpace Specifies if the texture will be used in gamma or linear space
         * @param superSample specifies if the texture will be generated with super sampling (default is false)
         * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)
         * @returns a new EquiRectangularCubeTextureAssetTask object
         */
        addEquiRectangularCubeTextureAssetTask(taskName: string, url: string, size: number, noMipmap?: boolean, gammaSpace?: boolean, superSample?: boolean): EquiRectangularCubeTextureAssetTask;
        /**
         * Remove a task from the assets manager.
         * @param task the task to remove
         */
        removeTask(task: AbstractAssetTask): void;
        private _decreaseWaitingTasksCount;
        private _runTask;
        private _formatTaskErrorMessage;
        /**
         * Reset the AssetsManager and remove all tasks
         * @returns the current instance of the AssetsManager
         */
        reset(): AssetsManager;
        /**
         * Start the loading process
         * @returns the current instance of the AssetsManager
         */
        load(): AssetsManager;
        /**
         * Start the loading process as an async operation
         * @returns a promise returning the list of failed tasks
         */
        loadAsync(): Promise<void>;
    }


    /**
     * Returns an array of the given size filled with elements built from the given constructor and the parameters.
     * @param size the number of element to construct and put in the array.
     * @param itemBuilder a callback responsible for creating new instance of item. Called once per array entry.
     * @returns a new array filled with new objects.
     */
    export function BuildArray<T>(size: number, itemBuilder: () => T): Array<T>;
    /**
     * Returns a tuple of the given size filled with elements built from the given constructor and the parameters.
     * @param size he number of element to construct and put in the tuple.
     * @param itemBuilder a callback responsible for creating new instance of item. Called once per tuple entry.
     * @returns a new tuple filled with new objects.
     */
    export function BuildTuple<T, N extends number>(size: N, itemBuilder: () => T): Tuple<T, N>;
    /**
     * Defines the callback type used when an observed array function is triggered.
     * @internal
     */
    export type _ObserveCallback = (functionName: string, previousLength: number) => void;
    /**
     * Observes an array and notifies the given observer when the array is modified.
     * @param array Defines the array to observe
     * @param callback Defines the function to call when the array is modified (in the limit of the observed array functions)
     * @returns A function to call to stop observing the array
     * @internal
     */
    export function _ObserveArray<T>(array: T[], callback: _ObserveCallback): () => void;


    /**
     * Class used for fast copy from one texture to another
     */
    export class AreaLightTextureTools {
        private _engine;
        private _renderer;
        private _effectWrapper;
        private _source;
        private _scalingRange;
        private _kernelLibrary;
        private readonly _blurSize;
        private readonly _alphaFactor;
        /** Shader language used */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language
         */
        get shaderLanguage(): ShaderLanguage;
        private _textureIsInternal;
        /**
         * Constructs a new instance of the class
         * @param engine The engine to use for the copy
         */
        constructor(engine: AbstractEngine);
        private _shadersLoaded;
        private _createEffect;
        /**
         * Indicates if the effect is ready to be used for the copy
         * @returns true if "copy" can be called without delay, else false
         */
        isReady(): boolean;
        /**
         * Pre-processes the texture to be used with RectAreaLight emissionTexture.
         * @param source The texture to pre-process
         * @returns A promise that resolves with the pre-processed texture
         */
        processAsync(source: BaseTexture): Promise<Nullable<BaseTexture>>;
        private _scaleImageDownAsync;
        private _generateGaussianKernel;
        private _mirrorIndex;
        private _applyGaussianBlurRange;
        private _transposeImage;
        private _applyProgressiveBlurAsync;
        /**
         * Releases all the resources used by the class
         */
        dispose(): void;
    }


    /**
     * Class used to evaluate queries containing `and` and `or` operators
     */
    export class AndOrNotEvaluator {
        /**
         * Evaluate a query
         * @param query defines the query to evaluate
         * @param evaluateCallback defines the callback used to filter result
         * @returns true if the query matches
         */
        static Eval(query: string, evaluateCallback: (val: any) => boolean): boolean;
        private static _HandleParenthesisContent;
        private static _SimplifyNegation;
    }


    /**
     * Interface for screenshot methods with describe argument called `size` as object with options
     * @link https://doc.babylonjs.com/api/classes/babylon.screenshottools
     */
    export interface IScreenshotSize {
        /**
         * number in pixels for canvas height. It is the height of the texture used to render the scene
         */
        height?: number;
        /**
         * multiplier allowing render at a higher or lower resolution
         * If value is defined then width and height will be multiplied by this value
         */
        precision?: number;
        /**
         * number in pixels for canvas width. It is the width of the texture used to render the scene
         */
        width?: number;
        /**
         * Width of the final screenshot image.
         * If only one of the two values is provided, the other will be calculated based on the camera's aspect ratio.
         * If both finalWidth and finalHeight are not provided, width and height will be used instead.
         * finalWidth and finalHeight are used only by CreateScreenshotUsingRenderTarget, not by CreateScreenshot!
         */
        finalWidth?: number;
        /**
         * Height of the final screenshot image.
         * If only one of the two values is provided, the other will be calculated based on the camera's aspect ratio.
         * If both finalWidth and finalHeight are not provided, width and height will be used instead
         * finalWidth and finalHeight are used only by CreateScreenshotUsingRenderTarget, not by CreateScreenshot!
         */
        finalHeight?: number;
    }


    /**
     * Interface used to define the mechanism to get data from the network
     */
    export interface IWebRequest {
        /**
         * Returns client's response url
         */
        responseURL: string;
        /**
         * Returns client's status
         */
        status: number;
        /**
         * Returns client's status as a text
         */
        statusText: string;
    }


    /**
     * Defines the shape of a collection of datasets that our graphing service uses for drawing purposes.
     */
    export interface IPerfDatasets {
        /**
         * The ids of our dataset.
         */
        ids: string[];
        /**
         * The data to be processed by the performance graph. Each slice will be of the form of [timestamp, numberOfPoints, value1, value2...]
         */
        data: DynamicFloat32Array;
        /**
         * A list of starting indices for each slice of data collected. Used for fast access of an arbitrary slice inside the data array.
         */
        startingIndices: DynamicFloat32Array;
    }
    /**
     * Defines the shape of a the metadata the graphing service uses for drawing purposes.
     */
    export interface IPerfMetadata {
        /**
         * The color of the line to be drawn.
         */
        color?: string;
        /**
         * Specifies if data should be hidden, falsey by default.
         */
        hidden?: boolean;
        /**
         * Specifies the category of the data
         */
        category?: string;
    }
    /**
     * Defines the shape of a custom user registered event.
     */
    export interface IPerfCustomEvent {
        /**
         * The name of the event.
         */
        name: string;
        /**
         * The value for the event, if set we will use it as the value, otherwise we will count the number of occurrences.
         */
        value?: number;
    }


    /**
     * Interface used to define entities containing multiple clip planes
     */
    export interface IClipPlanesHolder {
        /**
         * Gets or sets the active clipplane 1
         */
        clipPlane: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 2
         */
        clipPlane2: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 3
         */
        clipPlane3: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 4
         */
        clipPlane4: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 5
         */
        clipPlane5: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 6
         */
        clipPlane6: Nullable<Plane>;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Register the getPerfCollector method on Scene.
     * @internal
     */
    export function RegisterPerformanceViewerSceneExtension(): void;




    /**
     * Callback strategy and optional category for data collection
     */
    interface IPerformanceViewerStrategyParameter {
        /**
         * The strategy for collecting data. Available strategies are located on the PerfCollectionStrategy class
         */
        strategyCallback: PerfStrategyInitialization;
        /**
         * Category for displaying this strategy on the viewer. Can be undefined or an empty string, in which case the strategy will be displayed on top
         */
        category?: string;
        /**
         * Starts hidden
         */
        hidden?: boolean;
    }
    /**
     * The collector class handles the collection and storage of data into the appropriate array.
     * The collector also handles notifying any observers of any updates.
     */
    export class PerformanceViewerCollector {
        private _scene;
        private _datasetMeta;
        private _strategies;
        private _startingTimestamp;
        private _hasLoadedData;
        private _isStarted;
        private readonly _customEventObservable;
        private readonly _eventRestoreSet;
        /**
         * Datastructure containing the collected datasets. Warning: you should not modify the values in here, data will be of the form [timestamp, numberOfPoints, value1, value2..., timestamp, etc...]
         */
        readonly datasets: IPerfDatasets;
        /**
         * An observable you can attach to get deltas in the dataset. Subscribing to this will increase memory consumption slightly, and may hurt performance due to increased garbage collection needed.
         * Updates of slices will be of the form [timestamp, numberOfPoints, value1, value2...].
         */
        readonly datasetObservable: Observable<number[]>;
        /**
         * An observable you can attach to get the most updated map of metadatas.
         */
        readonly metadataObservable: Observable<Map<string, IPerfMetadata>>;
        /**
         * The offset for when actual data values start appearing inside a slice.
         */
        static get SliceDataOffset(): number;
        /**
         * The offset for the value of the number of points inside a slice.
         */
        static get NumberOfPointsOffset(): number;
        /**
         * Handles the creation of a performance viewer collector.
         * @param _scene the scene to collect on.
         * @param _enabledStrategyCallbacks the list of data to collect with callbacks for initialization purposes.
         */
        constructor(_scene: Scene, _enabledStrategyCallbacks?: IPerformanceViewerStrategyParameter[]);
        /**
         * Registers a custom string event which will be callable via sendEvent. This method returns an event object which will contain the id of the event.
         * The user can set a value optionally, which will be used in the sendEvent method. If the value is set, we will record this value at the end of each frame,
         * if not we will increment our counter and record the value of the counter at the end of each frame. The value recorded is 0 if no sendEvent method is called, within a frame.
         * @param name The name of the event to register
         * @param forceUpdate if the code should force add an event, and replace the last one.
         * @param category the category for that event
         * @returns The event registered, used in sendEvent
         */
        registerEvent(name: string, forceUpdate?: boolean, category?: string): IPerfCustomEvent | undefined;
        /**
         * Lets the perf collector handle an event, occurences or event value depending on if the event.value params is set.
         * @param event the event to handle an occurence for
         */
        sendEvent(event: IPerfCustomEvent): void;
        /**
         * This event restores all custom string events if necessary.
         */
        private _restoreStringEvents;
        /**
         * This method adds additional collection strategies for data collection purposes.
         * @param strategyCallbacks the list of data to collect with callbacks.
         */
        addCollectionStrategies(...strategyCallbacks: IPerformanceViewerStrategyParameter[]): void;
        /**
         * Gets a 6 character hexcode representing the colour from a passed in string.
         * @param id the string to get a hex code for.
         * @returns a hexcode hashed from the id.
         */
        private _getHexColorFromId;
        /**
         * Collects data for every dataset by using the appropriate strategy. This is called every frame.
         * This method will then notify all observers with the latest slice.
         */
        private _collectDataAtFrame;
        /**
         * Collects and then sends the latest slice to any observers by using the appropriate strategy when the user wants.
         * The slice will be of the form [timestamp, numberOfPoints, value1, value2...]
         * This method does not add onto the collected data accessible via the datasets variable.
         */
        getCurrentSlice(): void;
        /**
         * Updates a property for a dataset's metadata with the value provided.
         * @param id the id of the dataset which needs its metadata updated.
         * @param prop the property to update.
         * @param value the value to update the property with.
         */
        updateMetadata<T extends keyof IPerfMetadata>(id: string, prop: T, value: IPerfMetadata[T]): void;
        /**
         * Completely clear, data, ids, and strategies saved to this performance collector.
         * @param preserveStringEventsRestore if it should preserve the string events, by default will clear string events registered when called.
         */
        clear(preserveStringEventsRestore?: boolean): void;
        /**
         * Accessor which lets the caller know if the performance collector has data loaded from a file or not!
         * Call clear() to reset this value.
         * @returns true if the data is loaded from a file, false otherwise.
         */
        get hasLoadedData(): boolean;
        /**
         * Given a string containing file data, this function parses the file data into the datasets object.
         * It returns a boolean to indicate if this object was successfully loaded with the data.
         * @param data string content representing the file data.
         * @param keepDatasetMeta if it should use reuse the existing dataset metadata
         * @returns true if the data was successfully loaded, false otherwise.
         */
        loadFromFileData(data: string, keepDatasetMeta?: boolean): boolean;
        /**
         * Exports the datasets inside of the collector to a csv.
         */
        exportDataToCsv(): void;
        /**
         * Starts the realtime collection of data.
         * @param shouldPreserve optional boolean param, if set will preserve the dataset between calls of start.
         */
        start(shouldPreserve?: boolean): void;
        /**
         * Stops the collection of data.
         */
        stop(): void;
        /**
         * Returns if the perf collector has been started or not.
         */
        get isStarted(): boolean;
        /**
         * Disposes of the object
         */
        dispose(): void;
    }


    /**
     * Defines the general structure of what is necessary for a collection strategy.
     */
    export interface IPerfViewerCollectionStrategy {
        /**
         * The id of the strategy.
         */
        id: string;
        /**
         * Function which gets the data for the strategy.
         */
        getData: () => number;
        /**
         * Function which does any necessary cleanup. Called when performanceViewerCollector.dispose() is called.
         */
        dispose: () => void;
    }
    /**
     * Initializer callback for a strategy
     */
    export type PerfStrategyInitialization = (scene: Scene) => IPerfViewerCollectionStrategy;
    /**
     * Defines the predefined strategies used in the performance viewer.
     */
    export class PerfCollectionStrategy {
        /**
         * Gets the initializer for the strategy used for collection of fps metrics
         * @returns the initializer for the fps strategy
         */
        static FpsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of thermal utilization metrics.
         * Needs the experimental pressure API.
         * @returns the initializer for the thermal utilization strategy
         */
        static ThermalStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of power supply utilization metrics.
         * Needs the experimental pressure API.
         * @returns the initializer for the power supply utilization strategy
         */
        static PowerSupplyStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of pressure metrics.
         * Needs the experimental pressure API.
         * @returns the initializer for the pressure strategy
         */
        static PressureStrategy(): PerfStrategyInitialization;
        private static _PressureStrategy;
        /**
         * Gets the initializer for the strategy used for collection of total meshes metrics.
         * @returns the initializer for the total meshes strategy
         */
        static TotalMeshesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of active meshes metrics.
         * @returns the initializer for the active meshes strategy
         */
        static ActiveMeshesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of active indices metrics.
         * @returns the initializer for the active indices strategy
         */
        static ActiveIndicesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of active faces metrics.
         * @returns the initializer for the active faces strategy
         */
        static ActiveFacesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of active bones metrics.
         * @returns the initializer for the active bones strategy
         */
        static ActiveBonesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of active particles metrics.
         * @returns the initializer for the active particles strategy
         */
        static ActiveParticlesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of draw calls metrics.
         * @returns the initializer for the draw calls strategy
         */
        static DrawCallsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of total lights metrics.
         * @returns the initializer for the total lights strategy
         */
        static TotalLightsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of total vertices metrics.
         * @returns the initializer for the total vertices strategy
         */
        static TotalVerticesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of total materials metrics.
         * @returns the initializer for the total materials strategy
         */
        static TotalMaterialsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of total textures metrics.
         * @returns the initializer for the total textures strategy
         */
        static TotalTexturesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of absolute fps metrics.
         * @returns the initializer for the absolute fps strategy
         */
        static AbsoluteFpsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of meshes selection time metrics.
         * @returns the initializer for the meshes selection time strategy
         */
        static MeshesSelectionStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of render targets time metrics.
         * @returns the initializer for the render targets time strategy
         */
        static RenderTargetsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of particles time metrics.
         * @returns the initializer for the particles time strategy
         */
        static ParticlesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of sprites time metrics.
         * @returns the initializer for the sprites time strategy
         */
        static SpritesStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of animations time metrics.
         * @returns the initializer for the animations time strategy
         */
        static AnimationsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of physics time metrics.
         * @returns the initializer for the physics time strategy
         */
        static PhysicsStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of render time metrics.
         * @returns the initializer for the render time strategy
         */
        static RenderStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of total frame time metrics.
         * @returns the initializer for the total frame time strategy
         */
        static FrameTotalStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of inter-frame time metrics.
         * @returns the initializer for the inter-frame time strategy
         */
        static InterFrameStrategy(): PerfStrategyInitialization;
        /**
         * Gets the initializer for the strategy used for collection of gpu frame time metrics.
         * @returns the initializer for the gpu frame time strategy
         */
        static GpuFrameTimeStrategy(): PerfStrategyInitialization;
    }




    /**
     * A class acting as a dynamic float32array used in the performance viewer
     */
    export class DynamicFloat32Array {
        private _view;
        private _itemLength;
        /**
         * Creates a new DynamicFloat32Array with the desired item capacity.
         * @param itemCapacity The initial item capacity you would like to set for the array.
         */
        constructor(itemCapacity: number);
        /**
         * The number of items currently in the array.
         */
        get itemLength(): number;
        /**
         * Gets value at index, NaN if no such index exists.
         * @param index the index to get the value at.
         * @returns the value at the index provided.
         */
        at(index: number): number;
        /**
         * Gets a view of the original array from start to end (exclusive of end).
         * @param start starting index.
         * @param end ending index.
         * @returns a subarray of the original array.
         */
        subarray(start: number, end: number): Float32Array;
        /**
         * Pushes items to the end of the array.
         * @param item The item to push into the array.
         */
        push(item: number): void;
        /**
         * Grows the array by the growth factor when necessary.
         */
        private _growArray;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * CubeMap information grouping all the data for each faces as well as the cubemap size.
     */
    export interface CubeMapInfo {
        /**
         * The pixel array for the front face.
         * This is stored in format, left to right, up to down format.
         */
        front: Nullable<ArrayBufferView>;
        /**
         * The pixel array for the back face.
         * This is stored in format, left to right, up to down format.
         */
        back: Nullable<ArrayBufferView>;
        /**
         * The pixel array for the left face.
         * This is stored in format, left to right, up to down format.
         */
        left: Nullable<ArrayBufferView>;
        /**
         * The pixel array for the right face.
         * This is stored in format, left to right, up to down format.
         */
        right: Nullable<ArrayBufferView>;
        /**
         * The pixel array for the up face.
         * This is stored in format, left to right, up to down format.
         */
        up: Nullable<ArrayBufferView>;
        /**
         * The pixel array for the down face.
         * This is stored in format, left to right, up to down format.
         */
        down: Nullable<ArrayBufferView>;
        /**
         * The size of the cubemap stored.
         *
         * Each faces will be size * size pixels.
         */
        size: number;
        /**
         * The format of the texture.
         *
         * RGBA, RGB.
         */
        format: number;
        /**
         * The type of the texture data.
         *
         * UNSIGNED_INT, FLOAT.
         */
        type: number;
        /**
         * Specifies whether the texture is in gamma space.
         */
        gammaSpace: boolean;
    }
    /**
     * Helper class useful to convert panorama picture to their cubemap representation in 6 faces.
     */
    export class PanoramaToCubeMapTools {
        private static FACE_LEFT;
        private static FACE_RIGHT;
        private static FACE_FRONT;
        private static FACE_BACK;
        private static FACE_DOWN;
        private static FACE_UP;
        /**
         * Converts a panorama stored in RGB right to left up to down format into a cubemap (6 faces).
         *
         * @param float32Array The source data.
         * @param inputWidth The width of the input panorama.
         * @param inputHeight The height of the input panorama.
         * @param size The willing size of the generated cubemap (each faces will be size * size pixels)
         * @param supersample enable supersampling the cubemap
         * @param invertY defines if the Y axis must be inverted
         * @returns The cubemap data
         */
        static ConvertPanoramaToCubemap(float32Array: Float32Array, inputWidth: number, inputHeight: number, size: number, supersample?: boolean, invertY?: boolean): CubeMapInfo;
        private static CreateCubemapTexture;
        private static CalcProjectionSpherical;
    }




    /**
     * Header information of HDR texture files.
     */
    export interface HDRInfo {
        /**
         * The height of the texture in pixels.
         */
        height: number;
        /**
         * The width of the texture in pixels.
         */
        width: number;
        /**
         * The index of the beginning of the data in the binary file.
         */
        dataPosition: number;
    }
    /**
     * Reads header information from an RGBE texture stored in a native array.
     * More information on this format are available here:
     * https://en.wikipedia.org/wiki/RGBE_image_format
     *
     * @param uint8array The binary file stored in  native array.
     * @returns The header information.
     */
    export function RGBE_ReadHeader(uint8array: Uint8Array): HDRInfo;
    /**
     * Returns the cubemap information (each faces texture data) extracted from an RGBE texture.
     * This RGBE texture needs to store the information as a panorama.
     *
     * More information on this format are available here:
     * https://en.wikipedia.org/wiki/RGBE_image_format
     *
     * @param buffer The binary file stored in an array buffer.
     * @param size The expected size of the extracted cubemap.
     * @param supersample enable supersampling the cubemap (default: false)
     * @returns The Cube Map information.
     */
    export function GetCubeMapTextureData(buffer: ArrayBuffer, size: number, supersample?: boolean): CubeMapInfo;
    /**
     * Returns the pixels data extracted from an RGBE texture.
     * This pixels will be stored left to right up to down in the R G B order in one array.
     *
     * More information on this format are available here:
     * https://en.wikipedia.org/wiki/RGBE_image_format
     *
     * @param uint8array The binary file stored in an array buffer.
     * @param hdrInfo The header information of the file.
     * @returns The pixels data in RGB right to left up to down order.
     */
    export function RGBE_ReadPixels(uint8array: Uint8Array, hdrInfo: HDRInfo): Float32Array;
    /**
     * @deprecated Use functions separately
     */
    export var HDRTools: {
        RGBE_ReadHeader: typeof RGBE_ReadHeader;
        GetCubeMapTextureData: typeof GetCubeMapTextureData;
        RGBE_ReadPixels: typeof RGBE_ReadPixels;
    };


    /**
     * Helper class dealing with the extraction of spherical polynomial dataArray
     * from a cube map.
     */
    export class CubeMapToSphericalPolynomialTools {
        private static _FileFaces;
        /** @internal */
        static MAX_HDRI_VALUE: number;
        /** @internal */
        static PRESERVE_CLAMPED_COLORS: boolean;
        /**
         * Clamp a value to the nearest power of two (rounding down).
         * @param value The value to clamp
         * @returns The nearest power of two less than or equal to value
         */
        private static _NearestPow2Floor;
        /**
         * Converts a texture to the according Spherical Polynomial data.
         * This extracts the first 3 orders only as they are the only one used in the lighting.
         *
         * @param texture The texture to extract the information from.
         * @returns The Spherical Polynomial data.
         */
        static ConvertCubeMapTextureToSphericalPolynomial(texture: BaseTexture): Nullable<Promise<SphericalPolynomial>>;
        /**
         * Compute the area on the unit sphere of the rectangle defined by (x,y) and the origin
         * See https://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/
         * @param x
         * @param y
         * @returns the area
         */
        private static _AreaElement;
        /**
         * Box-filter downsample a single cubemap face.
         * @param data Source face data
         * @param srcSize Source face width/height
         * @param dstSize Target face width/height
         * @param stride Number of components per pixel
         * @returns Downsampled face data
         */
        private static _DownsampleFace;
        /**
         * Converts a cubemap to the according Spherical Polynomial data.
         * This extracts the first 3 orders only as they are the only one used in the lighting.
         *
         * @param cubeInfo The Cube map to extract the information from.
         * @param targetSize Optional target face size for downsampling before integration. 0 = no downsampling (default).
         * @returns The Spherical Polynomial data.
         */
        static ConvertCubeMapToSphericalPolynomial(cubeInfo: CubeMapInfo, targetSize?: number): SphericalPolynomial;
    }


    type TransformNodeParseType = typeof TransformNodeParse;
        export namespace TransformNode {
            let Parse: TransformNodeParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * A TransformNode is an object that is not rendered but can be used as a center of transformation. This can decrease memory usage and increase rendering speed compared to using an empty mesh as a parent and is less complicated than using a pivot matrix.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/transform_node
     */
    export class TransformNode extends Node {
        /**
         * Object will not rotate to face the camera
         */
        static BILLBOARDMODE_NONE: number;
        /**
         * Object will rotate to face the camera but only on the x axis
         */
        static BILLBOARDMODE_X: number;
        /**
         * Object will rotate to face the camera but only on the y axis
         */
        static BILLBOARDMODE_Y: number;
        /**
         * Object will rotate to face the camera but only on the z axis
         */
        static BILLBOARDMODE_Z: number;
        /**
         * Object will rotate to face the camera
         */
        static BILLBOARDMODE_ALL: number;
        /**
         * Object will rotate to face the camera's position instead of orientation
         */
        static BILLBOARDMODE_USE_POSITION: number;
        /**
         * Child transform with Billboard flags should or should not apply parent rotation (default if off)
         */
        static BillboardUseParentOrientation: boolean;
        private static _TmpRotation;
        private static _TmpScaling;
        private static _TmpTranslation;
        private static _TmpRHRestore;
        private _forward;
        private _up;
        private _right;
        private _position;
        private _rotation;
        private _rotationQuaternion;
        protected _scaling: Vector3;
        private _transformToBoneReferal;
        private _currentParentWhenAttachingToBone;
        private _isAbsoluteSynced;
        private _billboardMode;
        /**
         * Gets or sets the billboard mode. Default is 0.
         *
         * | Value | Type | Description |
         * | --- | --- | --- |
         * | 0 | BILLBOARDMODE_NONE |  |
         * | 1 | BILLBOARDMODE_X |  |
         * | 2 | BILLBOARDMODE_Y |  |
         * | 4 | BILLBOARDMODE_Z |  |
         * | 7 | BILLBOARDMODE_ALL |  |
         *
         */
        get billboardMode(): number;
        set billboardMode(value: number);
        /**
         * Multiplication factor on scale x/y/z when computing the world matrix. Eg. for a 1x1x1 cube setting this to 2 will make it a 2x2x2 cube
         */
        scalingDeterminant: number;
        private _infiniteDistance;
        /**
         * Gets or sets the distance of the object to max, often used by skybox
         */
        get infiniteDistance(): boolean;
        set infiniteDistance(value: boolean);
        /**
         * Gets or sets a boolean indicating that non uniform scaling (when at least one component is different from others) should be ignored.
         * By default the system will update normals to compensate
         */
        ignoreNonUniformScaling: boolean;
        /**
         * Gets or sets a boolean indicating that even if rotationQuaternion is defined, you can keep updating rotation property and Babylon.js will just mix both
         */
        reIntegrateRotationIntoRotationQuaternion: boolean;
        /** @internal */
        _poseMatrix: Nullable<Matrix>;
        /** @internal */
        _localMatrix: Matrix;
        private _usePivotMatrix;
        private _absolutePosition;
        private _absoluteScaling;
        private _absoluteRotationQuaternion;
        private _pivotMatrix;
        private _pivotMatrixInverse;
        /** @internal */
        _postMultiplyPivotMatrix: boolean;
        protected _isWorldMatrixFrozen: boolean;
        /**
         * @internal
         * Set by .babylon parsers to defer freezeWorldMatrix() until parent links are resolved.
         * Declared (not initialized) to avoid pushing every TransformNode/Mesh instance into V8 dictionary mode.
         */
        _waitingFreezeWorldMatrix?: Nullable<boolean>;
        /** @internal */
        _indexInSceneTransformNodesArray: number;
        /**
         * An event triggered after the world matrix is updated
         */
        onAfterWorldMatrixUpdateObservable: Observable<TransformNode>;
        /** @internal */
        constructor(name: string, scene?: Nullable<Scene>, isPure?: boolean);
        /**
         * Gets a string identifying the name of the class
         * @returns "TransformNode" string
         */
        getClassName(): string;
        /**
         * Gets or set the node position (default is (0.0, 0.0, 0.0))
         */
        get position(): Vector3;
        set position(newPosition: Vector3);
        /**
         * return true if a pivot has been set
         * @returns true if a pivot matrix is used
         */
        isUsingPivotMatrix(): boolean;
        /**
         * @returns true if pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect.
         */
        isUsingPostMultiplyPivotMatrix(): boolean;
        /**
         * Gets or sets the rotation property : a Vector3 defining the rotation value in radians around each local axis X, Y, Z  (default is (0.0, 0.0, 0.0)).
         * If rotation quaternion is set, this Vector3 will be ignored and copy from the quaternion
         */
        get rotation(): Vector3;
        set rotation(newRotation: Vector3);
        /**
         * Gets or sets the scaling property : a Vector3 defining the node scaling along each local axis X, Y, Z (default is (1.0, 1.0, 1.0)).
         */
        get scaling(): Vector3;
        set scaling(newScaling: Vector3);
        /**
         * Gets or sets the rotation Quaternion property : this a Quaternion object defining the node rotation by using a unit quaternion (undefined by default, but can be null).
         * If set, only the rotationQuaternion is then used to compute the node rotation (ie. node.rotation will be ignored)
         */
        get rotationQuaternion(): Nullable<Quaternion>;
        set rotationQuaternion(quaternion: Nullable<Quaternion>);
        /**
         * Allow user to specify custom mechanism for mark as dirty
         */
        customMarkAsDirty: () => void;
        private _markAsDirtyInternal;
        /**
         * The forward direction of that transform in world space.
         */
        get forward(): Vector3;
        /**
         * The up direction of that transform in world space.
         */
        get up(): Vector3;
        /**
         * The right direction of that transform in world space.
         */
        get right(): Vector3;
        /**
         * Copies the parameter passed Matrix into the mesh Pose matrix.
         * @param matrix the matrix to copy the pose from
         * @returns this TransformNode.
         */
        updatePoseMatrix(matrix: Matrix): TransformNode;
        /**
         * Returns the mesh Pose matrix.
         * @returns the pose matrix
         */
        getPoseMatrix(): Matrix;
        /** @internal */
        _isSynchronized(): boolean;
        /** @internal */
        _initCache(): void;
        /**
         * Returns the current mesh absolute position.
         * Returns a Vector3.
         */
        get absolutePosition(): Vector3;
        /**
         * Returns the current mesh absolute scaling.
         * Returns a Vector3.
         */
        get absoluteScaling(): Vector3;
        /**
         * Returns the current mesh absolute rotation.
         * Returns a Quaternion.
         */
        get absoluteRotationQuaternion(): Quaternion;
        /**
         * Sets a new matrix to apply before all other transformation
         * @param matrix defines the transform matrix
         * @returns the current TransformNode
         */
        setPreTransformMatrix(matrix: Matrix): TransformNode;
        /**
         * Sets a new pivot matrix to the current node
         * @param matrix defines the new pivot matrix to use
         * @param postMultiplyPivotMatrix defines if the pivot matrix must be cancelled in the world matrix. When this parameter is set to true (default), the inverse of the pivot matrix is also applied at the end to cancel the transformation effect
         * @returns the current TransformNode
         */
        setPivotMatrix(matrix: DeepImmutable<Matrix>, postMultiplyPivotMatrix?: boolean): TransformNode;
        /**
         * Returns the mesh pivot matrix.
         * Default : Identity.
         * @returns the matrix
         */
        getPivotMatrix(): Matrix;
        /**
         * Instantiate (when possible) or clone that node with its hierarchy
         * @param newParent defines the new parent to use for the instance (or clone)
         * @param options defines options to configure how copy is done
         * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created
         * @returns an instance (or a clone) of the current node with its hierarchy
         */
        instantiateHierarchy(newParent?: Nullable<TransformNode>, options?: {
            doNotInstantiate: boolean | ((node: TransformNode) => boolean);
        }, onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void): Nullable<TransformNode>;
        /**
         * Prevents the World matrix to be computed any longer.
         * Please note that the "moral" contract is that the world matrix is not going to be updated anymore. It is up to the developer to force updates.
         * You trade flexibility for performance. If you want to update it, you have to unfreeze it first.
         * @param newWorldMatrix defines an optional matrix to use as world matrix
         * @param decompose defines whether to decompose the given newWorldMatrix or directly assign
         * @returns the TransformNode.
         */
        freezeWorldMatrix(newWorldMatrix?: Nullable<Matrix>, decompose?: boolean): TransformNode;
        /**
         * Allows back the World matrix computation.
         * @returns the TransformNode.
         */
        unfreezeWorldMatrix(): this;
        /**
         * True if the World matrix has been frozen.
         */
        get isWorldMatrixFrozen(): boolean;
        /**
         * Returns the mesh absolute position in the World.
         * @returns a Vector3.
         */
        getAbsolutePosition(): Vector3;
        /**
         * Sets the mesh absolute position in the World from a Vector3 or an Array(3).
         * @param absolutePosition the absolute position to set
         * @returns the TransformNode.
         */
        setAbsolutePosition(absolutePosition: Vector3): TransformNode;
        /**
         * Sets the mesh position in its local space.
         * @param vector3 the position to set in localspace
         * @returns the TransformNode.
         */
        setPositionWithLocalVector(vector3: Vector3): TransformNode;
        /**
         * Returns the mesh position in the local space from the current World matrix values.
         * @returns a new Vector3.
         */
        getPositionExpressedInLocalSpace(): Vector3;
        /**
         * Translates the mesh along the passed Vector3 in its local space.
         * @param vector3 the distance to translate in localspace
         * @returns the TransformNode.
         */
        locallyTranslate(vector3: Vector3): TransformNode;
        private static _LookAtVectorCache;
        /**
         * Orients a mesh towards a target point. Mesh must be drawn facing user.
         * @param targetPoint the position (must be in same space as current mesh) to look at
         * @param yawCor optional yaw (y-axis) correction in radians
         * @param pitchCor optional pitch (x-axis) correction in radians
         * @param rollCor optional roll (z-axis) correction in radians
         * @param space the chosen space of the target
         * @returns the TransformNode.
         */
        lookAt(targetPoint: Vector3, yawCor?: number, pitchCor?: number, rollCor?: number, space?: Space): TransformNode;
        /**
         * Returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.
         * This Vector3 is expressed in the World space.
         * @param localAxis axis to rotate
         * @returns a new Vector3 that is the localAxis, expressed in the mesh local space, rotated like the mesh.
         */
        getDirection(localAxis: Vector3): Vector3;
        /**
         * Sets the Vector3 "result" as the rotated Vector3 "localAxis" in the same rotation than the mesh.
         * localAxis is expressed in the mesh local space.
         * result is computed in the World space from the mesh World matrix.
         * @param localAxis axis to rotate
         * @param result the resulting transformnode
         * @returns this TransformNode.
         */
        getDirectionToRef(localAxis: Vector3, result: Vector3): TransformNode;
        /**
         * Sets this transform node rotation to the given local axis.
         * @param localAxis the axis in local space
         * @param yawCor optional yaw (y-axis) correction in radians
         * @param pitchCor optional pitch (x-axis) correction in radians
         * @param rollCor optional roll (z-axis) correction in radians
         * @returns this TransformNode
         */
        setDirection(localAxis: Vector3, yawCor?: number, pitchCor?: number, rollCor?: number): TransformNode;
        /**
         * Sets a new pivot point to the current node
         * @param point defines the new pivot point to use
         * @param space defines if the point is in world or local space (local by default)
         * @returns the current TransformNode
         */
        setPivotPoint(point: Vector3, space?: Space): TransformNode;
        /**
         * Returns a new Vector3 set with the mesh pivot point coordinates in the local space.
         * @returns the pivot point
         */
        getPivotPoint(): Vector3;
        /**
         * Sets the passed Vector3 "result" with the coordinates of the mesh pivot point in the local space.
         * @param result the vector3 to store the result
         * @returns this TransformNode.
         */
        getPivotPointToRef(result: Vector3): TransformNode;
        /**
         * Returns a new Vector3 set with the mesh pivot point World coordinates.
         * @returns a new Vector3 set with the mesh pivot point World coordinates.
         */
        getAbsolutePivotPoint(): Vector3;
        /**
         * Sets the Vector3 "result" coordinates with the mesh pivot point World coordinates.
         * @param result vector3 to store the result
         * @returns this TransformNode.
         */
        getAbsolutePivotPointToRef(result: Vector3): TransformNode;
        /**
         * Flag the transform node as dirty (Forcing it to update everything)
         * @param property if set to "rotation" the objects rotationQuaternion will be set to null
         * @returns this  node
         */
        markAsDirty(property?: string): Node;
        /**
         * Defines the passed node as the parent of the current node.
         * The node will remain exactly where it is and its position / rotation will be updated accordingly.
         * If you don't want to preserve the current rotation / position, assign the parent through parent accessor.
         * Note that if the mesh has a pivot matrix / point defined it will be applied after the parent was updated.
         * In that case the node will not remain in the same space as it is, as the pivot will be applied.
         * To avoid this, you can set updatePivot to true and the pivot will be updated to identity
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/parent_pivot/parent
         * @param node the node ot set as the parent
         * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
         * @param updatePivot if true, update the pivot matrix to keep the node in the same space as before
         * @returns this TransformNode.
         */
        setParent(node: Nullable<Node>, preserveScalingSign?: boolean, updatePivot?: boolean): TransformNode;
        /**
         * Adds the passed mesh as a child to the current mesh.
         * The node will remain exactly where it is and its position / rotation will be updated accordingly.
         * This method is equivalent to calling setParent().
         * @param mesh defines the child mesh
         * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
         * @returns the current mesh
         */
        addChild(mesh: TransformNode, preserveScalingSign?: boolean): this;
        /**
         * Removes the passed mesh from the current mesh children list
         * @param mesh defines the child mesh
         * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
         * @returns the current mesh
         */
        removeChild(mesh: TransformNode, preserveScalingSign?: boolean): this;
        private _nonUniformScaling;
        /**
         * True if the scaling property of this object is non uniform eg. (1,2,1)
         */
        get nonUniformScaling(): boolean;
        /**
         * @internal
         */
        _updateNonUniformScalingState(value: boolean): boolean;
        /**
         * Attach the current TransformNode to another TransformNode associated with a bone
         * @param bone Bone affecting the TransformNode
         * @param affectedTransformNode TransformNode associated with the bone
         * @returns this object
         */
        attachToBone(bone: Bone, affectedTransformNode: TransformNode): TransformNode;
        /**
         * Detach the transform node if its associated with a bone
         * @param resetToPreviousParent Indicates if the parent that was in effect when attachToBone was called should be set back or if we should set parent to null instead (defaults to the latter)
         * @returns this object
         */
        detachFromBone(resetToPreviousParent?: boolean): TransformNode;
        private static _RotationAxisCache;
        /**
         * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in the given space.
         * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.
         * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.
         * The passed axis is also normalized.
         * @param axis the axis to rotate around
         * @param amount the amount to rotate in radians
         * @param space Space to rotate in (Default: local)
         * @returns the TransformNode.
         */
        rotate(axis: Vector3, amount: number, space?: Space): TransformNode;
        /**
         * Rotates the mesh around the axis vector for the passed angle (amount) expressed in radians, in world space.
         * Note that the property `rotationQuaternion` is then automatically updated and the property `rotation` is set to (0,0,0) and no longer used.
         * The passed axis is also normalized. .
         * Method is based on http://www.euclideanspace.com/maths/geometry/affine/aroundPoint/index.htm
         * @param point the point to rotate around
         * @param axis the axis to rotate around
         * @param amount the amount to rotate in radians
         * @returns the TransformNode
         */
        rotateAround(point: Vector3, axis: Vector3, amount: number): TransformNode;
        /**
         * Translates the mesh along the axis vector for the passed distance in the given space.
         * space (default LOCAL) can be either Space.LOCAL, either Space.WORLD.
         * @param axis the axis to translate in
         * @param distance the distance to translate
         * @param space Space to rotate in (Default: local)
         * @returns the TransformNode.
         */
        translate(axis: Vector3, distance: number, space?: Space): TransformNode;
        /**
         * Adds a rotation step to the mesh current rotation.
         * x, y, z are Euler angles expressed in radians.
         * This methods updates the current mesh rotation, either mesh.rotation, either mesh.rotationQuaternion if it's set.
         * This means this rotation is made in the mesh local space only.
         * It's useful to set a custom rotation order different from the BJS standard one YXZ.
         * Example : this rotates the mesh first around its local X axis, then around its local Z axis, finally around its local Y axis.
         * ```javascript
         * mesh.addRotation(x1, 0, 0).addRotation(0, 0, z2).addRotation(0, 0, y3);
         * ```
         * Note that `addRotation()` accumulates the passed rotation values to the current ones and computes the .rotation or .rotationQuaternion updated values.
         * Under the hood, only quaternions are used. So it's a little faster is you use .rotationQuaternion because it doesn't need to translate them back to Euler angles.
         * @param x Rotation to add
         * @param y Rotation to add
         * @param z Rotation to add
         * @returns the TransformNode.
         */
        addRotation(x: number, y: number, z: number): TransformNode;
        /**
         * @internal
         */
        protected _getEffectiveParent(): Nullable<Node>;
        /**
         * Returns whether the transform node world matrix computation needs the camera information to be computed.
         * This is the case when the node is a billboard or has an infinite distance for instance.
         * @returns true if the world matrix computation needs the camera information to be computed
         */
        isWorldMatrixCameraDependent(): boolean;
        /**
         * Computes the world matrix of the node
         * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch
         * @param camera defines the camera used if different from the scene active camera (This is used with modes like Billboard or infinite distance)
         * @returns the world matrix
         */
        computeWorldMatrix(force?: boolean, camera?: Nullable<Camera>): Matrix;
        /**
         * Resets this nodeTransform's local matrix to Matrix.Identity().
         * @param independentOfChildren indicates if all child nodeTransform's world-space transform should be preserved.
         */
        resetLocalMatrix(independentOfChildren?: boolean): void;
        protected _afterComputeWorldMatrix(): void;
        /**
         * If you'd like to be called back after the mesh position, rotation or scaling has been updated.
         * @param func callback function to add
         *
         * @returns the TransformNode.
         */
        registerAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode;
        /**
         * Removes a registered callback function.
         * @param func callback function to remove
         * @returns the TransformNode.
         */
        unregisterAfterWorldMatrixUpdate(func: (mesh: TransformNode) => void): TransformNode;
        /**
         * Gets the position of the current mesh in camera space
         * @param camera defines the camera to use
         * @returns a position
         */
        getPositionInCameraSpace(camera?: Nullable<Camera>): Vector3;
        /**
         * Returns the distance from the mesh to the active camera
         * @param camera defines the camera to use
         * @returns the distance
         */
        getDistanceToCamera(camera?: Nullable<Camera>): number;
        /**
         * Clone the current transform node
         * @param name Name of the new clone
         * @param newParent New parent for the clone
         * @param doNotCloneChildren Do not clone children hierarchy
         * @returns the new transform node
         */
        clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<TransformNode>;
        /**
         * Serializes the objects information.
         * @param currentSerializationObject defines the object to serialize in
         * @returns the serialized object
         */
        serialize(currentSerializationObject?: any): any;
        /**
         * Get all child-transformNodes of this node
         * @param directDescendantsOnly defines if true only direct descendants of 'this' will be considered, if false direct and also indirect (children of children, an so on in a recursive manner) descendants of 'this' will be considered
         * @param predicate defines an optional predicate that will be called on every evaluated child, the predicate must return true for a given child to be part of the result, otherwise it will be ignored
         * @returns an array of TransformNode
         */
        getChildTransformNodes(directDescendantsOnly?: boolean, predicate?: (node: Node) => boolean): TransformNode[];
        /**
         * Releases resources associated with this transform node.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)
         * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false
         * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false
         * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling
         * @returns the current mesh
         */
        normalizeToUnitCube(includeDescendants?: boolean, ignoreRotation?: boolean, predicate?: Nullable<(node: AbstractMesh) => boolean>): TransformNode;
        private _syncAbsoluteScalingAndRotation;
    }
    /**
     * Returns a new TransformNode object parsed from the source provided.
     * @param parsedTransformNode is the source.
     * @param scene the scene the object belongs to
     * @param rootUrl is a string, it's the root URL to prefix the `delayLoadingFile` property with
     * @returns a new TransformNode object parsed from the source provided.
     */
    export function TransformNodeParse(parsedTransformNode: any, scene: Scene, rootUrl: string): TransformNode;
    export function RegisterTransformNode(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import transformNode.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Options to be used when creating a trail mesh
     */
    export interface ITrailMeshOptions {
        /**
         * diameter of trailing mesh (default: 1)
         */
        diameter?: number;
        /**
         * length of trailing mesh (default: 60)
         */
        length?: number;
        /**
         * segments of trailing mesh (default: length)
         */
        segments?: number;
        /**
         * sections of trailing mesh (default: 4)
         */
        sections?: number;
        /**
         * tapers the trailing mesh (default: false)
         */
        doNotTaper?: boolean;
        /**
         * automatically start trailing mesh. (default: true)
         */
        autoStart?: boolean;
    }
    /**
     * Class used to create a trail following a mesh
     */
    export class TrailMesh extends Mesh {
        /**
         * The diameter of the trail, i.e. the width of the ribbon.
         */
        diameter: number;
        private _generator;
        private _autoStart;
        private _running;
        private _doNotTaper;
        private _length;
        private _segments;
        private _sectionPolygonPointsCount;
        private _sectionVectors;
        private _sectionNormalVectors;
        private _beforeRenderObserver;
        /**
         * Constructor
         * @param name The value used by scene.getMeshByName() to do a lookup.
         * @param generator The mesh or transform node to generate a trail.
         * @param scene The scene to add this mesh to.
         * @param diameter Diameter of trailing mesh. Default is 1.
         * @param length Length of trailing mesh. Default is 60.
         * @param autoStart Automatically start trailing mesh. Default true.
         */
        constructor(name: string, generator: TransformNode, scene?: Scene, diameter?: number, length?: number, autoStart?: boolean);
        /**
         * Constructor
         * @param name The value used by scene.getMeshByName() to do a lookup.
         * @param generator The mesh or transform node to generate a trail.
         * @param scene The scene to add this mesh to.
         * @param options defines the options used to create the mesh.
         */
        constructor(name: string, generator: TransformNode, scene?: Scene, options?: ITrailMeshOptions);
        /**
         * "TrailMesh"
         * @returns "TrailMesh"
         */
        getClassName(): string;
        private _createMesh;
        private _updateSectionVectors;
        /**
         * Start trailing mesh.
         */
        start(): void;
        /**
         * Stop trailing mesh.
         */
        stop(): void;
        /**
         * Update trailing mesh geometry.
         */
        update(): void;
        /**
         * Reset trailing mesh geometry.
         */
        reset(): void;
        /**
         * Returns a new TrailMesh object.
         * @param name is a string, the name given to the new mesh
         * @param newGenerator use new generator object for cloned trail mesh
         * @returns a new mesh
         */
        clone(name: string | undefined, newGenerator: TransformNode): TrailMesh;
        /**
         * Serializes this trail mesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized trail mesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the trail mesh in
         * @returns the created trail mesh
         */
        static Parse(parsedMesh: any, scene: Scene): TrailMesh;
    }
    /**
     * Register side effects for trailMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTrailMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import trailMesh.pure for tree-shakeable, side-effect-free usage.
     */


        /** @internal */
        interface Mesh {
            /**
             * Gets or sets a boolean defining if we want picking to pick thin instances as well
             */
            thinInstanceEnablePicking: boolean;
            /**
             * Indicates that a buffer created as static should be recreated if the buffer is updated (by calling thinInstanceSetMatrixAt or thinInstanceSetAttributeAt, for eg.)
             * If this flag is false (the default behavior), a buffer created as "static" won't show any update done to it, and will stay the same as it was created.
             * Note however that recreating a buffer each time there's a change will have some performance cost, that's why it is set to false by default.
             * You should set this flag to true only if your static buffers should change infrequently. If they change frequently, you should create your buffers as "dynamic" instead.
             */
            thinInstanceAllowAutomaticStaticBufferRecreation: boolean;
            /**
             * Creates a new thin instance
             * @param matrix the matrix or array of matrices (position, rotation, scale) of the thin instance(s) to create
             * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance
             * @returns the thin instance index number. If you pass an array of matrices, other instance indexes are index+1, index+2, etc
             */
            thinInstanceAdd(matrix: DeepImmutableObject<Matrix> | Array<DeepImmutableObject<Matrix>>, refresh?: boolean): number;
            /**
             * Adds the transformation (matrix) of the current mesh as a thin instance
             * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance
             * @returns the thin instance index number
             */
            thinInstanceAddSelf(refresh?: boolean): number;
            /**
             * Registers a custom attribute to be used with thin instances
             * @param kind name of the attribute
             * @param stride size in floats of the attribute
             */
            thinInstanceRegisterAttribute(kind: string, stride: number): void;
            /**
             * Sets the matrix of a thin instance
             * @param index index of the thin instance
             * @param matrix matrix to set
             * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance
             */
            thinInstanceSetMatrixAt(index: number, matrix: DeepImmutableObject<Matrix>, refresh?: boolean): void;
            /**
             * Sets the value of a custom attribute for a thin instance
             * @param kind name of the attribute
             * @param index index of the thin instance
             * @param value value to set
             * @param refresh true to refresh the underlying gpu buffer (default: true). If you do multiple calls to this method in a row, set refresh to true only for the last call to save performance
             */
            thinInstanceSetAttributeAt(kind: string, index: number, value: Array<number>, refresh?: boolean): void;
            /**
             * Gets / sets the number of thin instances to display. Note that you can't set a number higher than what the underlying buffer can handle.
             */
            thinInstanceCount: number;
            /**
             * Sets a buffer to be used with thin instances. This method is a faster way to setup multiple instances than calling thinInstanceAdd repeatedly
             * @param kind name of the attribute. Use "matrix" to setup the buffer of matrices
             * @param buffer buffer to set
             * @param stride size in floats of each value of the buffer
             * @param staticBuffer indicates that the buffer is static, so that you won't change it after it is set (better performances - true by default)
             */
            thinInstanceSetBuffer(kind: string, buffer: Nullable<Float32Array>, stride?: number, staticBuffer?: boolean): void;
            /**
             * Gets the list of world matrices
             * @returns an array containing all the world matrices from the thin instances
             */
            thinInstanceGetWorldMatrices(): Matrix[];
            /**
             * Synchronize the gpu buffers with a thin instance buffer. Call this method if you update later on the buffers passed to thinInstanceSetBuffer
             * @param kind name of the attribute to update. Use "matrix" to update the buffer of matrices
             */
            thinInstanceBufferUpdated(kind: string): void;
            /**
             * Applies a partial update to a buffer directly on the GPU
             * Note that the buffer located on the CPU is NOT updated! It's up to you to update it (or not) with the same data you pass to this method
             * @param kind name of the attribute to update. Use "matrix" to update the buffer of matrices
             * @param dataOrLength the data to set in the GPU buffer, or the length (in elements) of data to update starting from the offset.
             * If you pass a length (number), it is the number of elements to update. For example, if kind is "matrix" and you pass 2 as length, it will update 2 matrices (2*16 floats) in the GPU buffer starting from the offset; in this case {@link offset} should also be expressed as a number of elements.
             * If you pass a Float32Array, {@link offset} is interpreted in floats in the underlying GPU buffer, consistent with low-level buffer update methods such as updateDirectly.
             * @param offset the offset in the GPU buffer where to update the data:
             *  - when {@link dataOrLength} is a number, this is an element offset (for example, a matrix index);
             *  - when {@link dataOrLength} is a Float32Array, this is a float offset in the underlying buffer.
             */
            thinInstancePartialBufferUpdate(kind: string, dataOrLength: Float32Array | number, offset: number): void;
            /**
             * Refreshes the bounding info, taking into account all the thin instances defined
             * @param forceRefreshParentInfo true to force recomputing the mesh bounding info and use it to compute the aggregated bounding info
             * @param applySkeleton defines whether to apply the skeleton before computing the bounding info
             * @param applyMorph  defines whether to apply the morph target before computing the bounding info
             * @param applyBakedVertexAnimation defines whether to apply baked vertex animation before computing the bounding info
             */
            thinInstanceRefreshBoundingInfo(forceRefreshParentInfo?: boolean, applySkeleton?: boolean, applyMorph?: boolean, applyBakedVertexAnimation?: boolean): void;
            /** @internal */
            _thinInstanceInitializeUserStorage(): void;
            /** @internal */
            _thinInstanceUpdateBufferSize(kind: string, numInstances?: number): void;
            /** @internal */
            _thinInstanceCreateMatrixBuffer(kind: string, buffer: Nullable<Float32Array>, staticBuffer: boolean): Buffer;
            /** @internal */
            _thinInstanceRecreateBuffer(kind: string, staticBuffer?: boolean): void;
            /** @internal */
            _userThinInstanceBuffersStorage: {
                /** @internal */
                data: {
                    [key: string]: Float32Array;
                };
                /** @internal */
                sizes: {
                    [key: string]: number;
                };
                /** @internal */
                vertexBuffers: {
                    [key: string]: Nullable<VertexBuffer>;
                };
                /** @internal */
                strides: {
                    [key: string]: number;
                };
            };
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for thinInstanceMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterThinInstanceMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import thinInstanceMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a subdivision inside a mesh
     */
    export class SubMesh implements ICullable {
        /** the material index to use */
        materialIndex: number;
        /** vertex index start */
        verticesStart: number;
        /** vertices count */
        verticesCount: number;
        /** index start */
        indexStart: number;
        /** indices count */
        indexCount: number;
        private _engine;
        /** @internal */
        _drawWrappers: Array<DrawWrapper>;
        private _mainDrawWrapperOverride;
        /**
         * Gets material defines used by the effect associated to the sub mesh
         */
        get materialDefines(): Nullable<MaterialDefines>;
        /**
         * Sets material defines used by the effect associated to the sub mesh
         */
        set materialDefines(defines: Nullable<MaterialDefines>);
        /**
         * @internal
         */
        _getDrawWrapper(passId?: number, createIfNotExisting?: boolean): DrawWrapper | undefined;
        /**
         * @internal
         */
        _removeDrawWrapper(passId: number, disposeWrapper?: boolean, immediate?: boolean): void;
        /**
         * Gets associated (main) effect (possibly the effect override if defined)
         */
        get effect(): Nullable<Effect>;
        /** @internal */
        get _drawWrapper(): DrawWrapper;
        /** @internal */
        get _drawWrapperOverride(): Nullable<DrawWrapper>;
        /**
         * @internal
         */
        _setMainDrawWrapperOverride(wrapper: Nullable<DrawWrapper>): void;
        /**
         * Sets associated effect (effect used to render this submesh)
         * @param effect defines the effect to associate with
         * @param defines defines the set of defines used to compile this effect
         * @param materialContext material context associated to the effect
         * @param resetContext true to reset the draw context
         */
        setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, materialContext?: IMaterialContext, resetContext?: boolean): void;
        /**
         * Resets the draw wrappers cache
         * @param passId If provided, releases only the draw wrapper corresponding to this render pass id
         * @param immediate If true, the draw wrapper will dispose the effect immediately (false by default)
         */
        resetDrawCache(passId?: number, immediate?: boolean): void;
        /** @internal */
        _linesIndexCount: number;
        private _mesh;
        private _renderingMesh;
        private _boundingInfo;
        private _linesIndexBuffer;
        /** @internal */
        _lastColliderWorldVertices: Nullable<Vector3[]>;
        /** @internal */
        _trianglePlanes: Plane[];
        /** @internal */
        _lastColliderTransformMatrix: Nullable<Matrix>;
        /** @internal */
        _wasDispatched: boolean;
        /** @internal */
        _renderId: number;
        /** @internal */
        _alphaIndex: number;
        /** @internal */
        _distanceToCamera: number;
        /** @internal */
        _id: number;
        private _currentMaterial;
        /**
         * Add a new submesh to a mesh
         * @param materialIndex defines the material index to use
         * @param verticesStart defines vertex index start
         * @param verticesCount defines vertices count
         * @param indexStart defines index start
         * @param indexCount defines indices count
         * @param mesh defines the parent mesh
         * @param renderingMesh defines an optional rendering mesh
         * @param createBoundingBox defines if bounding box should be created for this submesh
         * @returns the new submesh
         */
        static AddToMesh(materialIndex: number, verticesStart: number, verticesCount: number, indexStart: number, indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox?: boolean): SubMesh;
        /**
         * Creates a new submesh
         * @param materialIndex defines the material index to use
         * @param verticesStart defines vertex index start
         * @param verticesCount defines vertices count
         * @param indexStart defines index start
         * @param indexCount defines indices count
         * @param mesh defines the parent mesh
         * @param renderingMesh defines an optional rendering mesh
         * @param createBoundingBox defines if bounding box should be created for this submesh
         * @param addToMesh defines a boolean indicating that the submesh must be added to the mesh.subMeshes array (true by default)
         */
        constructor(
        /** the material index to use */
        materialIndex: number, 
        /** vertex index start */
        verticesStart: number, 
        /** vertices count */
        verticesCount: number, 
        /** index start */
        indexStart: number, 
        /** indices count */
        indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox?: boolean, addToMesh?: boolean);
        /**
         * Returns true if this submesh covers the entire parent mesh
         * @ignorenaming
         */
        get IsGlobal(): boolean;
        /**
         * Returns the submesh BoundingInfo object
         * @returns current bounding info (or mesh's one if the submesh is global)
         */
        getBoundingInfo(): BoundingInfo;
        /**
         * Sets the submesh BoundingInfo
         * @param boundingInfo defines the new bounding info to use
         * @returns the SubMesh
         */
        setBoundingInfo(boundingInfo: BoundingInfo): SubMesh;
        /**
         * Returns the mesh of the current submesh
         * @returns the parent mesh
         */
        getMesh(): AbstractMesh;
        /**
         * Returns the rendering mesh of the submesh
         * @returns the rendering mesh (could be different from parent mesh)
         */
        getRenderingMesh(): Mesh;
        /**
         * Returns the replacement mesh of the submesh
         * @returns the replacement mesh (could be different from parent mesh)
         */
        getReplacementMesh(): Nullable<AbstractMesh>;
        /**
         * Returns the effective mesh of the submesh
         * @returns the effective mesh (could be different from parent mesh)
         */
        getEffectiveMesh(): AbstractMesh;
        /**
         * Returns the submesh material
         * @param getDefaultMaterial Defines whether or not to get the default material if nothing has been defined.
         * @returns null or the current material
         */
        getMaterial(getDefaultMaterial?: boolean): Nullable<Material>;
        private _isMultiMaterial;
        /**
         * Sets a new updated BoundingInfo object to the submesh
         * @param data defines an optional position array to use to determine the bounding info
         * @returns the SubMesh
         */
        refreshBoundingInfo(data?: Nullable<FloatArray>): SubMesh;
        /**
         * @internal
         */
        _checkCollision(collider: Collider): boolean;
        /**
         * Updates the submesh BoundingInfo
         * @param world defines the world matrix to use to update the bounding info
         * @returns the submesh
         */
        updateBoundingInfo(world: DeepImmutable<Matrix>): SubMesh;
        /**
         * True is the submesh bounding box intersects the frustum defined by the passed array of planes.
         * @param frustumPlanes defines the frustum planes
         * @returns true if the submesh is intersecting with the frustum
         */
        isInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * True is the submesh bounding box is completely inside the frustum defined by the passed array of planes
         * @param frustumPlanes defines the frustum planes
         * @returns true if the submesh is inside the frustum
         */
        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * Renders the submesh
         * @param enableAlphaMode defines if alpha needs to be used
         * @returns the submesh
         */
        render(enableAlphaMode: boolean): SubMesh;
        /**
         * @internal
         */
        _getLinesIndexBuffer(indices: IndicesArray, engine: AbstractEngine): DataBuffer;
        /**
         * Checks if the submesh intersects with a ray
         * @param ray defines the ray to test
         * @returns true is the passed ray intersects the submesh bounding box
         */
        canIntersects(ray: Ray): boolean;
        /**
         * Intersects current submesh with a ray
         * @param ray defines the ray to test
         * @param positions defines mesh's positions array
         * @param indices defines mesh's indices array
         * @param fastCheck defines if the first intersection will be used (and not the closest)
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @returns intersection info or null if no intersection
         */
        intersects(ray: Ray, positions: Vector3[], indices: IndicesArray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<IntersectionInfo>;
        /**
         * @internal
         */
        private _intersectLines;
        /**
         * @internal
         */
        private _intersectUnIndexedLines;
        /**
         * @internal
         */
        private _intersectTriangles;
        /**
         * @internal
         */
        private _intersectUnIndexedTriangles;
        /** @internal */
        _rebuild(): void;
        /**
         * Creates a new submesh from the passed mesh
         * @param newMesh defines the new hosting mesh
         * @param newRenderingMesh defines an optional rendering mesh
         * @returns the new submesh
         */
        clone(newMesh: AbstractMesh, newRenderingMesh?: Mesh): SubMesh;
        /**
         * Release associated resources
         * @param immediate If true, the effect will be disposed immediately (false by default)
         */
        dispose(immediate?: boolean): void;
        /**
         * Gets the class name
         * @returns the string "SubMesh".
         */
        getClassName(): string;
        /**
         * Creates a new submesh from indices data
         * @param materialIndex the index of the main mesh material
         * @param startIndex the index where to start the copy in the mesh indices array
         * @param indexCount the number of indices to copy then from the startIndex
         * @param mesh the main mesh to create the submesh from
         * @param renderingMesh the optional rendering mesh
         * @param createBoundingBox defines if bounding box should be created for this submesh
         * @returns a new submesh
         */
        static CreateFromIndices(materialIndex: number, startIndex: number, indexCount: number, mesh: AbstractMesh, renderingMesh?: Mesh, createBoundingBox?: boolean): SubMesh;
    }


        /** @internal */
        interface SubMesh {
            /** @internal */
            _projectOnTrianglesToRef(vector: Vector3, positions: Vector3[], indices: IndicesArray, step: number, checkStopper: boolean, ref: Vector3): number;
            /** @internal */
            _projectOnUnIndexedTrianglesToRef(vector: Vector3, positions: Vector3[], indices: IndicesArray, ref: Vector3): number;
            /**
             * Projects a point on this submesh and stores the result in "ref"
             *
             * @param vector point to project
             * @param positions defines mesh's positions array
             * @param indices defines mesh's indices array
             * @param ref vector that will store the result
             * @returns distance from the point and the submesh, or -1 if the mesh rendering mode doesn't support projections
             */
            projectToRef(vector: Vector3, positions: Vector3[], indices: IndicesArray, ref: Vector3): number;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for subMeshProject.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSubMeshProject(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import subMesh.project.pure for tree-shakeable, side-effect-free usage.
     */




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Polygon
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon
     */
    export class Polygon {
        /**
         * Creates a rectangle
         * @param xmin bottom X coord
         * @param ymin bottom Y coord
         * @param xmax top X coord
         * @param ymax top Y coord
         * @returns points that make the resulting rectangle
         */
        static Rectangle(xmin: number, ymin: number, xmax: number, ymax: number): Vector2[];
        /**
         * Creates a circle
         * @param radius radius of circle
         * @param cx scale in x
         * @param cy scale in y
         * @param numberOfSides number of sides that make up the circle
         * @returns points that make the resulting circle
         */
        static Circle(radius: number, cx?: number, cy?: number, numberOfSides?: number): Vector2[];
        /**
         * Creates a polygon from input string
         * @param input Input polygon data
         * @returns the parsed points
         */
        static Parse(input: string): Vector2[];
        /**
         * Starts building a polygon from x and y coordinates
         * @param x x coordinate
         * @param y y coordinate
         * @returns the started path2
         */
        static StartingAt(x: number, y: number): Path2;
    }
    /**
     * Builds a polygon
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/polyMeshBuilder
     */
    export class PolygonMeshBuilder {
        private _points;
        private _outlinepoints;
        private _holes;
        private _name;
        private _scene;
        private _epoints;
        private _eholes;
        private _addToepoint;
        /**
         * Babylon reference to the earcut plugin.
         */
        bjsEarcut: any;
        /**
         * Creates a PolygonMeshBuilder
         * @param name name of the builder
         * @param contours Path of the polygon
         * @param scene scene to add to when creating the mesh
         * @param earcutInjection can be used to inject your own earcut reference
         */
        constructor(name: string, contours: Path2 | Vector2[] | any, scene?: Scene, earcutInjection?: any);
        /**
         * Adds a hole within the polygon
         * @param hole Array of points defining the hole
         * @returns this
         */
        addHole(hole: Vector2[]): PolygonMeshBuilder;
        /**
         * Creates the polygon
         * @param updatable If the mesh should be updatable
         * @param depth The depth of the mesh created
         * @param smoothingThreshold Dot product threshold for smoothed normals
         * @returns the created mesh
         */
        build(updatable?: boolean, depth?: number, smoothingThreshold?: number): Mesh;
        /**
         * Creates the polygon
         * @param depth The depth of the mesh created
         * @param smoothingThreshold Dot product threshold for smoothed normals
         * @returns the created VertexData
         */
        buildVertexData(depth?: number, smoothingThreshold?: number): VertexData;
        /**
         * Adds a side to the polygon
         * @param positions points that make the polygon
         * @param normals normals of the polygon
         * @param uvs uvs of the polygon
         * @param indices indices of the polygon
         * @param bounds bounds of the polygon
         * @param points points of the polygon
         * @param depth depth of the polygon
         * @param flip flip of the polygon
         * @param smoothingThreshold
         */
        private _addSide;
    }


    /**
     * Computes the maximum extents of the given meshes considering animation, skeleton, and morph targets.
     * @param meshes The array of meshes to compute
     * @param animationGroup An optional animation group to animate (must be started to take effect)
     * @param animationStep An optional value indicating the number of seconds to step while looping through the given animation group
     * @returns An array of world space extents corresponding to the given meshes
     */
    export function computeMaxExtents(meshes: Array<AbstractMesh>, animationGroup?: Nullable<AnimationGroup>, animationStep?: number): Array<{
        minimum: Vector3;
        maximum: Vector3;
    }>;
    /**
     * @experimental
     * Removes unreferenced vertex data from the given meshes.
     * This is useful for cleaning up unused vertex data, such as UV sets, to reduce memory usage and stay under graphics device limits.
     * @remarks
     * This function currently only removes unreferenced UV sets (UV2, UV3, etc.) from the meshes.
     * @param meshes The array of meshes to clean up.
     */
    export function RemoveUnreferencedVerticesData(meshes: readonly Mesh[]): void;


        /** @internal */
        interface Scene {
            /** @internal */
            _meshUVSpaceRendererShader: Nullable<ShaderMaterial>;
            /** @internal */
            _meshUVSpaceRendererMaskShader: Nullable<ShaderMaterial>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Options for the MeshUVSpaceRenderer
     * @since 5.49.1
     */
    export interface IMeshUVSpaceRendererOptions {
        /**
         * Width of the texture. Default: 1024
         */
        width?: number;
        /**
         * Height of the texture. Default: 1024
         */
        height?: number;
        /**
         * Type of the texture. Default: Constants.TEXTURETYPE_UNSIGNED_BYTE
         */
        textureType?: number;
        /**
         * Generate mip maps. Default: true
         */
        generateMipMaps?: boolean;
        /**
         * Optimize UV allocation. Default: true
         * If you plan to use the texture as a decal map and rotate / offset the texture, you should set this to false
         */
        optimizeUVAllocation?: boolean;
        /**
         * If true, a post processing effect will be applied to the texture to fix seams. Default: false
         */
        uvEdgeBlending?: boolean;
    }
    /**
     * Class used to render in the mesh UV space
     * @since 5.49.1
     */
    export class MeshUVSpaceRenderer {
        private _mesh;
        private _scene;
        private _options;
        private _textureCreatedInternally;
        private _configureUserCreatedTexture;
        private _maskTexture;
        private _finalPostProcess;
        private _shadersLoaded;
        private _isDisposed;
        private static _GetShader;
        private static _GetMaskShader;
        private static _IsRenderTargetTexture;
        /**
         * Clear color of the texture
         */
        clearColor: Color4;
        /**
         * Target texture used for rendering
         * If you don't set the property, a RenderTargetTexture will be created internally given the options provided to the constructor.
         * If you provide a RenderTargetTexture, it will be used directly.
         */
        texture: Nullable<Texture>;
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Creates a new MeshUVSpaceRenderer
         * @param mesh The mesh used for the source UV space
         * @param scene The scene the mesh belongs to
         * @param options The options to use when creating the texture
         */
        constructor(mesh: AbstractMesh, scene: Scene, options?: IMeshUVSpaceRendererOptions);
        private _initShaderSourceAsync;
        /**
         * Checks if the texture is ready to be used
         * @returns true if the texture is ready to be used
         */
        isReady(): boolean;
        /**
         * Projects and renders a texture in the mesh UV space
         * @param texture The texture
         * @param position The position of the center of projection (world space coordinates)
         * @param normal The direction of the projection (world space coordinates)
         * @param size The size of the projection
         * @param angle The rotation angle around the direction of the projection (default: 0)
         * @param checkIsReady If true, it will check if the texture is ready before rendering (default: true). If the texture is not ready, a new attempt will be scheduled in 16ms
         */
        renderTexture(texture: BaseTexture, position: Vector3, normal: Vector3, size: Vector3, angle?: number, checkIsReady?: boolean): void;
        /**
         * Clears the texture map
         */
        clear(): void;
        /**
         * Disposes of the resources
         */
        dispose(): void;
        private _configureUserCreatedRTT;
        private _createDiffuseRTT;
        private _createMaskTexture;
        private _createPostProcess;
        private _createRenderTargetTexture;
        private _createProjectionMatrix;
    }


    export type * from "./meshUVSpaceRenderer.types";


        /** @internal */
        interface Scene {
            /** @internal (Backing field) */
            _simplificationQueue: SimplificationQueue;
            /**
             * Gets or sets the simplification queue attached to the scene
             * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
             */
            simplificationQueue: SimplificationQueue;
        }
        /** @internal */
        interface Mesh {
            /**
             * Simplify the mesh according to the given array of settings.
             * Function will return immediately and will simplify async
             * @param settings a collection of simplification settings
             * @param parallelProcessing should all levels calculate parallel or one after the other
             * @param simplificationType the type of simplification to run
             * @param successCallback optional success callback to be called after the simplification finished processing all settings
             * @returns the current mesh
             */
            simplify(settings: Array<ISimplificationSettings>, parallelProcessing?: boolean, simplificationType?: SimplificationType, successCallback?: (mesh?: Mesh, submeshIndex?: number) => void): Mesh;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the simplification queue scene component responsible to help scheduling the various simplification task
     * created in a scene
     */
    export class SimplicationQueueSceneComponent implements ISceneComponent {
        /**
         * The component name helpfull to identify the component in the list of scene components.
         */
        readonly name = "SimplificationQueue";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
        private _beforeCameraUpdate;
    }
    /**
     * Register side effects for meshSimplificationSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param simplificationQueueClass The SimplificationQueue class to use for lazy instantiation
     */
    export function RegisterMeshSimplificationSceneComponent(simplificationQueueClass: typeof SimplificationQueue): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import meshSimplificationSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * A simplifier interface for future simplification implementations
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export interface ISimplifier {
        /**
         * Simplification of a given mesh according to the given settings.
         * Since this requires computation, it is assumed that the function runs async.
         * @param settings The settings of the simplification, including quality and distance
         * @param successCallback A callback that will be called after the mesh was simplified.
         * @param errorCallback in case of an error, this callback will be called. optional.
         */
        simplify(settings: ISimplificationSettings, successCallback: (simplifiedMeshes: Mesh) => void, errorCallback?: () => void): void;
    }
    /**
     * Interface used to define a simplification task
     */
    export interface ISimplificationTask {
        /**
         * Array of settings
         */
        settings: Array<ISimplificationSettings>;
        /**
         * Simplification type
         */
        simplificationType: SimplificationType;
        /**
         * Mesh to simplify
         */
        mesh: Mesh;
        /**
         * Callback called on success
         */
        successCallback?: () => void;
        /**
         * Defines if parallel processing can be used
         */
        parallelProcessing: boolean;
    }
    /**
     * Queue used to order the simplification tasks
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export class SimplificationQueue {
        private _simplificationArray;
        /**
         * Gets a boolean indicating that the process is still running
         */
        running: boolean;
        /**
         * Creates a new queue
         */
        constructor();
        /**
         * Adds a new simplification task
         * @param task defines a task to add
         */
        addTask(task: ISimplificationTask): void;
        /**
         * Execute next task
         */
        executeNext(): void;
        /**
         * Execute a simplification task
         * @param task defines the task to run
         */
        runSimplification(task: ISimplificationTask): void;
        private _getSimplifier;
    }
    /**
     * An implementation of the Quadratic Error simplification algorithm.
     * Original paper : http://www1.cs.columbia.edu/~cs4162/html05s/garland97.pdf
     * Ported mostly from QSlim and http://voxels.blogspot.de/2014/05/quadric-mesh-simplification-with-source.html to babylon JS
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export class QuadraticErrorSimplification implements ISimplifier {
        private _mesh;
        private _triangles;
        private _vertices;
        private _references;
        private _reconstructedMesh;
        /** Gets or sets the number pf sync iterations */
        syncIterations: number;
        /** Gets or sets the aggressiveness of the simplifier */
        aggressiveness: number;
        /** Gets or sets the number of allowed iterations for decimation */
        decimationIterations: number;
        /** Gets or sets the espilon to use for bounding box computation */
        boundingBoxEpsilon: number;
        /**
         * Creates a new QuadraticErrorSimplification
         * @param _mesh defines the target mesh
         */
        constructor(_mesh: Mesh);
        /**
         * Simplification of a given mesh according to the given settings.
         * Since this requires computation, it is assumed that the function runs async.
         * @param settings The settings of the simplification, including quality and distance
         * @param successCallback A callback that will be called after the mesh was simplified.
         */
        simplify(settings: ISimplificationSettings, successCallback: (simplifiedMesh: Mesh) => void): void;
        private _runDecimation;
        private _initWithMesh;
        private _init;
        private _reconstructMesh;
        private _initDecimatedMesh;
        private _isFlipped;
        private _updateTriangles;
        private _identifyBorder;
        private _updateMesh;
        private _vertexError;
        private _calculateError;
    }


    /**
     * Expected simplification settings.
     * Quality should be between 0 and 1 (1 being 100%, 0 being 0%)
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export interface ISimplificationSettings {
        /**
         * Gets or sets the expected quality
         */
        quality: number;
        /**
         * Gets or sets the distance when this optimized version should be used
         */
        distance: number;
        /**
         * Gets an already optimized mesh
         */
        optimizeMesh?: boolean | undefined;
    }
    /**
     * Class used to specify simplification options
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export class SimplificationSettings implements ISimplificationSettings {
        /** expected quality */
        quality: number;
        /** distance when this optimized version should be used */
        distance: number;
        /** already optimized mesh  */
        optimizeMesh?: boolean | undefined;
        /**
         * Creates a SimplificationSettings
         * @param quality expected quality
         * @param distance distance when this optimized version should be used
         * @param optimizeMesh already optimized mesh
         */
        constructor(
        /** expected quality */
        quality: number, 
        /** distance when this optimized version should be used */
        distance: number, 
        /** already optimized mesh  */
        optimizeMesh?: boolean | undefined);
    }
    /**
     * The implemented types of simplification
     * At the moment only Quadratic Error Decimation is implemented
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/simplifyingMeshes
     */
    export enum SimplificationType {
        /** Quadratic error decimation */
        QUADRATIC = 0
    }


    /**
     * Class used to represent a specific level of detail of a mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
     */
    export class MeshLODLevel {
        /** Either distance from the center of the object to show this level or the screen coverage if `useLODScreenCoverage` is set to `true` on the mesh*/
        distanceOrScreenCoverage: number;
        /** Defines the mesh to use to render this level */
        mesh: Nullable<Mesh>;
        /**
         * Creates a new LOD level
         * @param distanceOrScreenCoverage defines either the distance or the screen coverage where this level should start being displayed
         * @param mesh defines the mesh to use to render this level
         */
        constructor(
        /** Either distance from the center of the object to show this level or the screen coverage if `useLODScreenCoverage` is set to `true` on the mesh*/
        distanceOrScreenCoverage: number, 
        /** Defines the mesh to use to render this level */
        mesh: Nullable<Mesh>);
    }


    /**
     * Class containing static functions to help procedurally build meshes
     */
    export var MeshBuilder: {
        CreateBox: typeof CreateBox;
        CreateTiledBox: typeof CreateTiledBox;
        CreateSphere: typeof CreateSphere;
        CreateDisc: typeof CreateDisc;
        CreateIcoSphere: typeof CreateIcoSphere;
        CreateRibbon: typeof CreateRibbon;
        CreateCylinder: typeof CreateCylinder;
        CreateTorus: typeof CreateTorus;
        CreateTorusKnot: typeof CreateTorusKnot;
        CreateLineSystem: typeof CreateLineSystem;
        CreateLines: typeof CreateLines;
        CreateDashedLines: typeof CreateDashedLines;
        ExtrudeShape: typeof ExtrudeShape;
        ExtrudeShapeCustom: typeof ExtrudeShapeCustom;
        CreateLathe: typeof CreateLathe;
        CreateTiledPlane: typeof CreateTiledPlane;
        CreatePlane: typeof CreatePlane;
        CreateGround: typeof CreateGround;
        CreateTiledGround: typeof CreateTiledGround;
        CreateGroundFromHeightMap: typeof CreateGroundFromHeightMap;
        CreatePolygon: typeof CreatePolygon;
        ExtrudePolygon: typeof ExtrudePolygon;
        CreateTube: typeof CreateTube;
        CreatePolyhedron: typeof CreatePolyhedron;
        CreateGeodesic: typeof CreateGeodesic;
        CreateGoldberg: typeof CreateGoldberg;
        CreateDecal: typeof CreateDecal;
        CreateCapsule: typeof CreateCapsule;
        CreateText: typeof CreateText;
    };


    /**
     * Inspired by https://github.com/stevinz/three-subdivide
     * Thanks a lot to https://github.com/stevinz
     */
    /**
     * Interface used to configure the subdivision process
     */
    export interface ISubdivideOptions {
        /** Apply only flat subdivision - false by default */
        flatOnly?: boolean;
        /** Split all triangles at edges shared by coplanar triangles - true by default*/
        split?: boolean;
        /**  Should UV values be averaged during subdivision - false by default */
        uvSmooth?: boolean;
        /** Should edges / breaks in geometry be ignored during subdivision? - false by default */
        preserveEdges?: boolean;
        /** How much to weigh favoring heavy corners vs favoring Loop's formula - 1 by default*/
        weight?: number;
    }
    /**
     * Subdivide a vertexData using Loop algorithm
     * @param vertexData The vertexData to subdivide
     * @param level The number of times to subdivide
     * @param options The options to use when subdividing
     * @returns The subdivided vertexData
     */
    export function Subdivide(vertexData: VertexData, level: number, options?: Partial<ISubdivideOptions>): VertexData;


    /**
     * Sort (in place) the index array so that faces with common indices are close
     * @param indices the array of indices to sort
     */
    export function OptimizeIndices(indices: IndicesArray): void;


    /**
     * Define an interface for all classes that will get and set the data on vertices
     */
    export interface IGetSetVerticesData {
        /**
         * Gets a boolean indicating if specific vertex data is present
         * @param kind defines the vertex data kind to use
         * @returns true is data kind is present
         */
        isVerticesDataPresent(kind: string): boolean;
        /**
         * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.
         * @param kind defines the data kind (Position, normal, etc...)
         * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes
         * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it
         * @returns a float array containing vertex data
         */
        getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray>;
        /**
         * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.
         * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.
         * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it
         * @returns the indices array or an empty array if the mesh has no geometry
         */
        getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable<IndicesArray>;
        /**
         * Set specific vertex data
         * @param kind defines the data kind (Position, normal, etc...)
         * @param data defines the vertex data to use
         * @param updatable defines if the vertex must be flagged as updatable (false as default)
         * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified
         */
        setVerticesData(kind: string, data: FloatArray, updatable: boolean, stride?: number): void;
        /**
         * Update a specific associated vertex buffer
         * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param data defines the data source
         * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for "position" kind
         * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)
         */
        updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): void;
        /**
         * Creates a new index buffer
         * @param indices defines the indices to store in the index buffer
         * @param totalVertices defines the total number of vertices (could be null)
         * @param updatable defines if the index buffer must be flagged as updatable (false by default)
         */
        setIndices(indices: IndicesArray, totalVertices: Nullable<number>, updatable?: boolean): void;
    }
    /** Class used to attach material info to sub section of a vertex data class */
    export class VertexDataMaterialInfo {
        /** Defines the material index to use */
        materialIndex: number;
        /** Defines vertex index start*/
        verticesStart: number;
        /** Defines vertices count */
        verticesCount: number;
        /** Defines index start */
        indexStart: number;
        /** Defines indices count */
        indexCount: number;
    }
    /**
     * Interface used to define a object like a vertex data structure
     */
    export interface IVertexDataLike {
        /**
         * An array of the x, y, z position of each vertex  [...., x, y, z, .....]
         */
        positions: Nullable<FloatArray>;
        /**
         * An array of the x, y, z normal vector of each vertex  [...., x, y, z, .....]
         */
        normals?: Nullable<FloatArray>;
        /**
         * An array of the x, y, z, w tangent vector of each vertex  [...., x, y, z, w, .....]
         */
        tangents?: Nullable<FloatArray>;
        /**
         * An array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs?: Nullable<FloatArray>;
        /**
         * A second array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs2?: Nullable<FloatArray>;
        /**
         * A third array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs3?: Nullable<FloatArray>;
        /**
         * A fourth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs4?: Nullable<FloatArray>;
        /**
         * A fifth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs5?: Nullable<FloatArray>;
        /**
         * A sixth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs6?: Nullable<FloatArray>;
        /**
         * An array of the r, g, b, a, color of each vertex  [...., r, g, b, a, .....]
         */
        colors?: Nullable<FloatArray>;
        /**
         * An array containing the list of indices to the array of matrices produced by bones, each vertex have up to 4 indices (8 if the matricesIndicesExtra is set).
         */
        matricesIndices?: Nullable<FloatArray>;
        /**
         * An array containing the list of weights defining the weight of each indexed matrix in the final computation
         */
        matricesWeights?: Nullable<FloatArray>;
        /**
         * An array extending the number of possible indices
         */
        matricesIndicesExtra?: Nullable<FloatArray>;
        /**
         * An array extending the number of possible weights when the number of indices is extended
         */
        matricesWeightsExtra?: Nullable<FloatArray>;
        /**
         * An array of i, j, k the three vertex indices required for each triangular facet  [...., i, j, k .....]
         */
        indices?: Nullable<IndicesArray>;
    }
    /**
     * This class contains the various kinds of data on every vertex of a mesh used in determining its shape and appearance
     */
    export class VertexData implements IVertexDataLike {
        /**
         * Mesh side orientation : usually the external or front surface
         */
        static readonly FRONTSIDE = 0;
        /**
         * Mesh side orientation : usually the internal or back surface
         */
        static readonly BACKSIDE = 1;
        /**
         * Mesh side orientation : both internal and external or front and back surfaces
         */
        static readonly DOUBLESIDE = 2;
        /**
         * Mesh side orientation : by default, `FRONTSIDE`
         */
        static readonly DEFAULTSIDE = 0;
        private static _UniqueIdGenerator;
        /**
         * An array of the x, y, z position of each vertex  [...., x, y, z, .....]
         */
        positions: Nullable<FloatArray>;
        /**
         * An array of the x, y, z normal vector of each vertex  [...., x, y, z, .....]
         */
        normals: Nullable<FloatArray>;
        /**
         * An array of the x, y, z, w tangent vector of each vertex  [...., x, y, z, w, .....]
         */
        tangents: Nullable<FloatArray>;
        /**
         * An array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs: Nullable<FloatArray>;
        /**
         * A second array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs2: Nullable<FloatArray>;
        /**
         * A third array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs3: Nullable<FloatArray>;
        /**
         * A fourth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs4: Nullable<FloatArray>;
        /**
         * A fifth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs5: Nullable<FloatArray>;
        /**
         * A sixth array of u,v which maps a texture image onto each vertex  [...., u, v, .....]
         */
        uvs6: Nullable<FloatArray>;
        /**
         * An array of the r, g, b, a, color of each vertex  [...., r, g, b, a, .....]
         */
        colors: Nullable<FloatArray>;
        /**
         * An array containing the list of indices to the array of matrices produced by bones, each vertex have up to 4 indices (8 if the matricesIndicesExtra is set).
         */
        matricesIndices: Nullable<FloatArray>;
        /**
         * An array containing the list of weights defining the weight of each indexed matrix in the final computation
         */
        matricesWeights: Nullable<FloatArray>;
        /**
         * An array extending the number of possible indices
         */
        matricesIndicesExtra: Nullable<FloatArray>;
        /**
         * An array extending the number of possible weights when the number of indices is extended
         */
        matricesWeightsExtra: Nullable<FloatArray>;
        /**
         * An array of i, j, k the three vertex indices required for each triangular facet  [...., i, j, k .....]
         */
        indices: Nullable<IndicesArray>;
        /**
         * An array defining material association for sub sections of the vertex data
         */
        materialInfos: Nullable<Array<VertexDataMaterialInfo>>;
        /**
         * Gets the unique ID of this vertex Data
         */
        uniqueId: number;
        /**
         * Metadata used to store contextual values
         */
        metadata: any;
        /**
         * Gets or sets a value indicating that the mesh must be flagged with hasVertexAlpha = true
         */
        hasVertexAlpha: boolean;
        /**
         * Creates a new VertexData
         */
        constructor();
        /**
         * Uses the passed data array to set the set the values for the specified kind of data
         * @param data a linear array of floating numbers
         * @param kind the type of data that is being set, eg positions, colors etc
         */
        set(data: FloatArray, kind: string): void;
        /**
         * Associates the vertexData to the passed Mesh.
         * Sets it as updatable or not (default `false`)
         * @param mesh the mesh the vertexData is applied to
         * @param updatable when used and having the value true allows new data to update the vertexData
         * @returns the VertexData
         */
        applyToMesh(mesh: Mesh, updatable?: boolean): VertexData;
        /**
         * Associates the vertexData to the passed Geometry.
         * Sets it as updatable or not (default `false`)
         * @param geometry the geometry the vertexData is applied to
         * @param updatable when used and having the value true allows new data to update the vertexData
         * @returns VertexData
         */
        applyToGeometry(geometry: Geometry, updatable?: boolean): VertexData;
        /**
         * Updates the associated mesh
         * @param mesh the mesh to be updated
         * @returns VertexData
         */
        updateMesh(mesh: Mesh): VertexData;
        /**
         * Updates the associated geometry
         * @param geometry the geometry to be updated
         * @returns VertexData.
         */
        updateGeometry(geometry: Geometry): VertexData;
        private readonly _applyTo;
        /**
         * @internal
         */
        _applyToCoroutine(meshOrGeometry: IGetSetVerticesData, updatable: boolean | undefined, isAsync: boolean): Coroutine<VertexData>;
        private _update;
        private static _TransformVector3Coordinates;
        private static _TransformVector3Normals;
        private static _TransformVector4Normals;
        private static _FlipFaces;
        /**
         * Transforms each position and each normal of the vertexData according to the passed Matrix
         * @param matrix the transforming matrix
         * @returns the VertexData
         */
        transform(matrix: Matrix): VertexData;
        /**
         * Generates an array of vertex data where each vertex data only has one material info
         * @returns An array of VertexData
         */
        splitBasedOnMaterialID(): VertexData[];
        /**
         * Merges the passed VertexData into the current one
         * @param others the VertexData to be merged into the current one
         * @param use32BitsIndices defines a boolean indicating if indices must be store in a 32 bits array
         * @param forceCloneIndices defines a boolean indicating if indices are forced to be cloned
         * @param mergeMaterialIds defines a boolean indicating if we need to merge the material infos
         * @param enableCompletion defines a boolean indicating if the vertex data should be completed to be compatible
         * @returns the modified VertexData
         */
        merge(others: VertexData | VertexData[], use32BitsIndices?: boolean, forceCloneIndices?: boolean, mergeMaterialIds?: boolean, enableCompletion?: boolean): VertexData;
        /**
         * @internal
         */
        _mergeCoroutine(transform: Matrix | undefined, vertexDatas: {
            vertexData: VertexData;
            transform?: Matrix;
        }[], use32BitsIndices: boolean | undefined, isAsync: boolean, forceCloneIndices: boolean, mergeMaterialIds?: boolean, enableCompletion?: boolean): Coroutine<VertexData>;
        private static _MergeElement;
        private _validate;
        /**
         * Clone the current vertex data
         * @returns a copy of the current data
         */
        clone(): VertexData;
        /**
         * Serializes the VertexData
         * @returns a serialized object
         */
        serialize(): any;
        /**
         * Extracts the vertexData from a mesh
         * @param mesh the mesh from which to extract the VertexData
         * @param copyWhenShared defines if the VertexData must be cloned when shared between multiple meshes, optional, default false
         * @param forceCopy indicating that the VertexData must be cloned, optional, default false
         * @returns the object VertexData associated to the passed mesh
         */
        static ExtractFromMesh(mesh: Mesh, copyWhenShared?: boolean, forceCopy?: boolean): VertexData;
        /**
         * Extracts the vertexData from the geometry
         * @param geometry the geometry from which to extract the VertexData
         * @param copyWhenShared defines if the VertexData must be cloned when the geometry is shared between multiple meshes, optional, default false
         * @param forceCopy indicating that the VertexData must be cloned, optional, default false
         * @returns the object VertexData associated to the passed mesh
         */
        static ExtractFromGeometry(geometry: Geometry, copyWhenShared?: boolean, forceCopy?: boolean): VertexData;
        private static _ExtractFrom;
        /**
         * Creates the VertexData for a Ribbon
         * @param options an object used to set the following optional parameters for the ribbon, required but can be empty
         * * pathArray array of paths, each of which an array of successive Vector3
         * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false
         * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false
         * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false
         * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional
         * * colors a linear array, of length 4 * number of vertices, of custom color values, optional
         * @returns the VertexData of the ribbon
         * @deprecated use CreateRibbonVertexData instead
         */
        static CreateRibbon(options: {
            pathArray: Vector3[][];
            closeArray?: boolean;
            closePath?: boolean;
            offset?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
            invertUV?: boolean;
            uvs?: Vector2[];
            colors?: Color4[];
        }): VertexData;
        /**
         * Creates the VertexData for a box
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * * size sets the width, height and depth of the box to the value of size, optional default 1
         * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size
         * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size
         * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size
         * * faceUV an array of 6 Vector4 elements used to set different images to each box side
         * * faceColors an array of 6 Color3 elements used to set different colors to each box side
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the box
         * @deprecated Please use CreateBoxVertexData from the BoxBuilder file instead
         */
        static CreateBox(options: {
            size?: number;
            width?: number;
            height?: number;
            depth?: number;
            faceUV?: Vector4[];
            faceColors?: Color4[];
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for a tiled box
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * - `pattern` sets the pattern
         * - `width` sets the width
         * - `height` sets the height
         * - `depth` sets the depth
         * - `tileSize` sets the tile size
         * - `tileWidth` sets the tile width
         * - `tileHeight` sets the tile height
         * - `alignHorizontal` sets the horizontal alignment
         * - `alignVertical` sets the vertical alignment
         * - `faceUV` an array of 6 Vector4 elements used to set different images to each box side
         * - `faceColors` an array of 6 Color3 elements used to set different colors to each box side
         * - `sideOrientation` optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * @returns the VertexData of the box
         * @deprecated Please use CreateTiledBoxVertexData instead
         */
        static CreateTiledBox(options: {
            pattern?: number;
            width?: number;
            height?: number;
            depth?: number;
            tileSize?: number;
            tileWidth?: number;
            tileHeight?: number;
            alignHorizontal?: number;
            alignVertical?: number;
            faceUV?: Vector4[];
            faceColors?: Color4[];
            sideOrientation?: number;
        }): VertexData;
        /**
         * Creates the VertexData for a tiled plane
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * * pattern a limited pattern arrangement depending on the number
         * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1
         * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size
         * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the tiled plane
         * @deprecated use CreateTiledPlaneVertexData instead
         */
        static CreateTiledPlane(options: {
            pattern?: number;
            tileSize?: number;
            tileWidth?: number;
            tileHeight?: number;
            size?: number;
            width?: number;
            height?: number;
            alignHorizontal?: number;
            alignVertical?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for an ellipsoid, defaults to a sphere
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * * segments sets the number of horizontal strips optional, default 32
         * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1
         * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter
         * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter
         * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter
         * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1
         * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the ellipsoid
         * @deprecated use CreateSphereVertexData instead
         */
        static CreateSphere(options: {
            segments?: number;
            diameter?: number;
            diameterX?: number;
            diameterY?: number;
            diameterZ?: number;
            arc?: number;
            slice?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for a cylinder, cone or prism
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * * height sets the height (y direction) of the cylinder, optional, default 2
         * * diameterTop sets the diameter of the top of the cone, overwrites diameter,  optional, default diameter
         * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter,  optional, default diameter
         * * diameter sets the diameter of the top and bottom of the cone, optional default 1
         * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
         * * `subdivisions` the number of rings along the cylinder height, optional, default 1
         * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1
         * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
         * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
         * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false
         * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the cylinder, cone or prism
         * @deprecated please use CreateCylinderVertexData instead
         */
        static CreateCylinder(options: {
            height?: number;
            diameterTop?: number;
            diameterBottom?: number;
            diameter?: number;
            tessellation?: number;
            subdivisions?: number;
            arc?: number;
            faceColors?: Color4[];
            faceUV?: Vector4[];
            hasRings?: boolean;
            enclose?: boolean;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for a torus
         * @param options an object used to set the following optional parameters for the box, required but can be empty
         * * diameter the diameter of the torus, optional default 1
         * * thickness the diameter of the tube forming the torus, optional default 0.5
         * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the torus
         * @deprecated use CreateTorusVertexData instead
         */
        static CreateTorus(options: {
            diameter?: number;
            thickness?: number;
            tessellation?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData of the LineSystem
         * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty
         *  - lines an array of lines, each line being an array of successive Vector3
         *  - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point
         * @returns the VertexData of the LineSystem
         * @deprecated use CreateLineSystemVertexData instead
         */
        static CreateLineSystem(options: {
            lines: Vector3[][];
            colors?: Nullable<Color4[][]>;
        }): VertexData;
        /**
         * Create the VertexData for a DashedLines
         * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty
         *  - points an array successive Vector3
         *  - dashSize the size of the dashes relative to the dash number, optional, default 3
         *  - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1
         *  - dashNb the intended total number of dashes, optional, default 200
         * @returns the VertexData for the DashedLines
         * @deprecated use CreateDashedLinesVertexData instead
         */
        static CreateDashedLines(options: {
            points: Vector3[];
            dashSize?: number;
            gapSize?: number;
            dashNb?: number;
        }): VertexData;
        /**
         * Creates the VertexData for a Ground
         * @param options an object used to set the following optional parameters for the Ground, required but can be empty
         *  - width the width (x direction) of the ground, optional, default 1
         *  - height the height (z direction) of the ground, optional, default 1
         *  - subdivisions the number of subdivisions per side, optional, default 1
         * @returns the VertexData of the Ground
         * @deprecated Please use CreateGroundVertexData instead
         */
        static CreateGround(options: {
            width?: number;
            height?: number;
            subdivisions?: number;
            subdivisionsX?: number;
            subdivisionsY?: number;
        }): VertexData;
        /**
         * Creates the VertexData for a TiledGround by subdividing the ground into tiles
         * @param options an object used to set the following optional parameters for the Ground, required but can be empty
         * * xmin the ground minimum X coordinate, optional, default -1
         * * zmin the ground minimum Z coordinate, optional, default -1
         * * xmax the ground maximum X coordinate, optional, default 1
         * * zmax the ground maximum Z coordinate, optional, default 1
         * * subdivisions a javascript object `\{w: positive integer, h: positive integer\}`, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default `\{w: 6, h: 6\}`
         * * precision a javascript object `\{w: positive integer, h: positive integer\}`, `w` and `h` are the numbers of subdivisions on the tile width and height, default `\{w: 2, h: 2\}`
         * @returns the VertexData of the TiledGround
         * @deprecated use CreateTiledGroundVertexData instead
         */
        static CreateTiledGround(options: {
            xmin: number;
            zmin: number;
            xmax: number;
            zmax: number;
            subdivisions?: {
                w: number;
                h: number;
            };
            precision?: {
                w: number;
                h: number;
            };
        }): VertexData;
        /**
         * Creates the VertexData of the Ground designed from a heightmap
         * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap
         * * width the width (x direction) of the ground
         * * height the height (z direction) of the ground
         * * subdivisions the number of subdivisions per side
         * * minHeight the minimum altitude on the ground, optional, default 0
         * * maxHeight the maximum altitude on the ground, optional default 1
         * * colorFilter the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)
         * * buffer the array holding the image color data
         * * bufferWidth the width of image
         * * bufferHeight the height of image
         * * alphaFilter Remove any data where the alpha channel is below this value, defaults 0 (all data visible)
         * @returns the VertexData of the Ground designed from a heightmap
         * @deprecated use CreateGroundFromHeightMapVertexData instead
         */
        static CreateGroundFromHeightMap(options: {
            width: number;
            height: number;
            subdivisions: number;
            minHeight: number;
            maxHeight: number;
            colorFilter: Color3;
            buffer: Uint8Array;
            bufferWidth: number;
            bufferHeight: number;
            alphaFilter: number;
        }): VertexData;
        /**
         * Creates the VertexData for a Plane
         * @param options an object used to set the following optional parameters for the plane, required but can be empty
         * * size sets the width and height of the plane to the value of size, optional default 1
         * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size
         * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the box
         * @deprecated use CreatePlaneVertexData instead
         */
        static CreatePlane(options: {
            size?: number;
            width?: number;
            height?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData of the Disc or regular Polygon
         * @param options an object used to set the following optional parameters for the disc, required but can be empty
         * * radius the radius of the disc, optional default 0.5
         * * tessellation the number of polygon sides, optional, default 64
         * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the box
         * @deprecated use CreateDiscVertexData instead
         */
        static CreateDisc(options: {
            radius?: number;
            tessellation?: number;
            arc?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()
         * All parameters are provided by CreatePolygon as needed
         * @param polygon a mesh built from polygonTriangulation.build()
         * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
         * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
         * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @param wrap a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side
         * @returns the VertexData of the Polygon
         * @deprecated use CreatePolygonVertexData instead
         */
        static CreatePolygon(polygon: Mesh, sideOrientation: number, fUV?: Vector4[], fColors?: Color4[], frontUVs?: Vector4, backUVs?: Vector4, wrap?: boolean): VertexData;
        /**
         * Creates the VertexData of the IcoSphere
         * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty
         * * radius the radius of the IcoSphere, optional default 1
         * * radiusX allows stretching in the x direction, optional, default radius
         * * radiusY allows stretching in the y direction, optional, default radius
         * * radiusZ allows stretching in the z direction, optional, default radius
         * * flat when true creates a flat shaded mesh, optional, default true
         * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the IcoSphere
         * @deprecated use CreateIcoSphereVertexData instead
         */
        static CreateIcoSphere(options: {
            radius?: number;
            radiusX?: number;
            radiusY?: number;
            radiusZ?: number;
            flat?: boolean;
            subdivisions?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for a Polyhedron
         * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty
         * * type provided types are:
         *  * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)
         *  * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)
         * * size the size of the IcoSphere, optional default 1
         * * sizeX allows stretching in the x direction, optional, default size
         * * sizeY allows stretching in the y direction, optional, default size
         * * sizeZ allows stretching in the z direction, optional, default size
         * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor
         * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
         * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
         * * flat when true creates a flat shaded mesh, optional, default true
         * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the Polyhedron
         * @deprecated use CreatePolyhedronVertexData instead
         */
        static CreatePolyhedron(options: {
            type?: number;
            size?: number;
            sizeX?: number;
            sizeY?: number;
            sizeZ?: number;
            custom?: any;
            faceUV?: Vector4[];
            faceColors?: Color4[];
            flat?: boolean;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Creates the VertexData for a Capsule, inspired from https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js
         * @param options an object used to set the following optional parameters for the capsule, required but can be empty
         * @returns the VertexData of the Capsule
         * @deprecated Please use CreateCapsuleVertexData from the capsuleBuilder file instead
         */
        static CreateCapsule(options?: ICreateCapsuleOptions): VertexData;
        /**
         * Creates the VertexData for a TorusKnot
         * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty
         * * radius the radius of the torus knot, optional, default 2
         * * tube the thickness of the tube, optional, default 0.5
         * * radialSegments the number of sides on each tube segments, optional, default 32
         * * tubularSegments the number of tubes to decompose the knot into, optional, default 32
         * * p the number of windings around the z axis, optional,  default 2
         * * q the number of windings around the x axis, optional,  default 3
         * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
         * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
         * @returns the VertexData of the Torus Knot
         * @deprecated use CreateTorusKnotVertexData instead
         */
        static CreateTorusKnot(options: {
            radius?: number;
            tube?: number;
            radialSegments?: number;
            tubularSegments?: number;
            p?: number;
            q?: number;
            sideOrientation?: number;
            frontUVs?: Vector4;
            backUVs?: Vector4;
        }): VertexData;
        /**
         * Compute normals for given positions and indices
         * @param positions an array of vertex positions, [...., x, y, z, ......]
         * @param indices an array of indices in groups of three for each triangular facet, [...., i, j, k, ......]
         * @param normals an array of vertex normals, [...., x, y, z, ......]
         * @param options an object used to set the following optional parameters for the TorusKnot, optional
         * * facetNormals : optional array of facet normals (vector3)
         * * facetPositions : optional array of facet positions (vector3)
         * * facetPartitioning : optional partitioning array. facetPositions is required for facetPartitioning computation
         * * ratio : optional partitioning ratio / bounding box, required for facetPartitioning computation
         * * bInfo : optional bounding info, required for facetPartitioning computation
         * * bbSize : optional bounding box size data, required for facetPartitioning computation
         * * subDiv : optional partitioning data about subdivisions on  each axis (int), required for facetPartitioning computation
         * * useRightHandedSystem: optional boolean to for right handed system computation
         * * depthSort : optional boolean to enable the facet depth sort computation
         * * distanceTo : optional Vector3 to compute the facet depth from this location
         * * depthSortedFacets : optional array of depthSortedFacets to store the facet distances from the reference location
         */
        static ComputeNormals(positions: any, indices: any, normals: any, options?: {
            facetNormals?: any;
            facetPositions?: any;
            facetPartitioning?: any;
            ratio?: number;
            bInfo?: any;
            bbSize?: Vector3;
            subDiv?: any;
            useRightHandedSystem?: boolean;
            depthSort?: boolean;
            distanceTo?: Vector3;
            depthSortedFacets?: any;
        }): void;
        /**
         * @internal
         */
        static _ComputeSides(sideOrientation: number, positions: FloatArray, indices: FloatArray | IndicesArray, normals: FloatArray, uvs: FloatArray, frontUVs?: Vector4, backUVs?: Vector4): void;
        /**
         * Creates a VertexData from serialized data
         * @param parsedVertexData the parsed data from an imported file
         * @returns a VertexData
         */
        static Parse(parsedVertexData: any): VertexData;
        /**
         * Applies VertexData created from the imported parameters to the geometry
         * @param parsedVertexData the parsed data from an imported file
         * @param geometry the geometry to apply the VertexData to
         */
        static ImportVertexData(parsedVertexData: any, geometry: Geometry): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     **/
    export class _CreationDataStorage {
        /** @internal */
        closePath?: boolean;
        /** @internal */
        closeArray?: boolean;
        /** @internal */
        idx: number[];
        /** @internal */
        dashSize: number;
        /** @internal */
        gapSize: number;
        /** @internal */
        path3D: Path3D;
        /** @internal */
        pathArray: Vector3[][];
        /** @internal */
        arc: number;
        /** @internal */
        radius: number;
        /** @internal */
        cap: number;
        /** @internal */
        tessellation: number;
    }
    /**
     * @internal
     **/
    interface IInstanceDataStorageRenderPassVisibleInstances {
        defaultRenderId: number;
        selfDefaultRenderId: number;
        intermediateDefaultRenderId: number;
        [renderId: number]: Nullable<Array<InstancedMesh>>;
    }
    /**
     * @internal
     **/
    class _InstanceDataStorageRenderPass {
        /** @internal */
        visibleInstances: Nullable<IInstanceDataStorageRenderPassVisibleInstances>;
        /** @internal */
        batchCache: _InstancesBatch;
        /** @internal */
        batchCacheReplacementModeInFrozenMode: _InstancesBatch;
        /** @internal */
        instancesBufferSize: number;
        /** @internal */
        instancesBuffer: Nullable<Buffer>;
        /** @internal */
        instancesPreviousBuffer: Nullable<Buffer>;
        /** @internal */
        instancesData: Float32Array;
        /** @internal */
        instancesPreviousData: Float32Array;
        /** @internal */
        previousBatch: Nullable<_InstancesBatch>;
        /** @internal */
        previousRenderId: number;
    }
    /**
     * @internal
     **/
    class _InstanceDataStorage {
        /** @internal */
        renderPasses: {
            [id: number]: _InstanceDataStorageRenderPass;
        };
        /** @internal */
        dataStorageRenderPass: _InstanceDataStorageRenderPass;
        /** @internal */
        useMonoDataStorageRenderPass: boolean;
        /** @internal */
        overridenInstanceCount: number;
        /** @internal */
        isFrozen: boolean;
        /** @internal */
        forceMatrixUpdates: boolean;
        /** @internal */
        hardwareInstancedRendering: boolean;
        /** @internal */
        manualUpdate: boolean;
        /** @internal */
        previousManualUpdate: boolean;
        /** @internal */
        masterMeshPreviousWorldMatrix: Nullable<Matrix>;
        /** @internal */
        engine: AbstractEngine;
    }
    /**
     * @internal
     **/
    export class _InstancesBatch {
        parent: _InstanceDataStorageRenderPass;
        /** @internal */
        mustReturn: boolean;
        /** @internal */
        visibleInstances: Nullable<InstancedMesh[]>[];
        /** @internal */
        renderSelf: boolean[];
        /** @internal */
        hardwareInstancedRendering: boolean[];
        /** @internal */
        constructor(parent: _InstanceDataStorageRenderPass);
    }
    /**
     * @internal
     **/
    class _ThinInstanceDataStorage {
        /** @internal */
        instancesCount: number;
        /** @internal */
        matrixBuffer: Nullable<Buffer>;
        /** @internal */
        previousMatrixBuffer: Nullable<Buffer>;
        /** @internal */
        matrixBufferSize: number;
        /** @internal */
        matrixData: Nullable<Float32Array>;
        /** @internal */
        previousMatrixData: Nullable<Float32Array>;
        /** @internal */
        boundingVectors: Array<Vector3>;
        /** @internal */
        worldMatrices: Nullable<Matrix[]>;
        /** @internal */
        masterMeshPreviousWorldMatrix: Nullable<Matrix>;
    }
    /**
     * Options used to clone a mesh
     */
    export interface MeshCloneOptions {
        /** The parent of the mesh, if it has one */
        parent?: Nullable<Node>;
        /** Skips cloning child meshes of source (default: false. When false, achieved by calling a clone(), also passing False. This will make creation of children, recursive. */
        doNotCloneChildren?: boolean;
        /** Includes cloning mesh physics impostor (default: true) */
        clonePhysicsImpostor?: boolean;
        /** Includes cloning thin instances (default: false) */
        cloneThinInstances?: boolean;
    }
    /**
     * Options used to create a mesh
     */
    export interface MeshCreationOptions extends MeshCloneOptions {
        /** An optional Mesh from which the new mesh will be cloned from (geometry will be shared) */
        source?: Nullable<Mesh>;
    }
    /**
     * Class used to represent renderable models
     */
    export class Mesh extends AbstractMesh implements IGetSetVerticesData {
        /**
         * Mesh side orientation : usually the external or front surface
         */
        static readonly FRONTSIDE = 0;
        /**
         * Mesh side orientation : usually the internal or back surface
         */
        static readonly BACKSIDE = 1;
        /**
         * Mesh side orientation : both internal and external or front and back surfaces
         */
        static readonly DOUBLESIDE = 2;
        /**
         * Mesh side orientation : by default, `FRONTSIDE`
         */
        static readonly DEFAULTSIDE = 0;
        /**
         * Mesh cap setting : no cap
         */
        static readonly NO_CAP = 0;
        /**
         * Mesh cap setting : one cap at the beginning of the mesh
         */
        static readonly CAP_START = 1;
        /**
         * Mesh cap setting : one cap at the end of the mesh
         */
        static readonly CAP_END = 2;
        /**
         * Mesh cap setting : two caps, one at the beginning  and one at the end of the mesh
         */
        static readonly CAP_ALL = 3;
        /**
         * Mesh pattern setting : no flip or rotate
         */
        static readonly NO_FLIP = 0;
        /**
         * Mesh pattern setting : flip (reflect in y axis) alternate tiles on each row or column
         */
        static readonly FLIP_TILE = 1;
        /**
         * Mesh pattern setting : rotate (180degs) alternate tiles on each row or column
         */
        static readonly ROTATE_TILE = 2;
        /**
         * Mesh pattern setting : flip (reflect in y axis) all tiles on alternate rows
         */
        static readonly FLIP_ROW = 3;
        /**
         * Mesh pattern setting : rotate (180degs) all tiles on alternate rows
         */
        static readonly ROTATE_ROW = 4;
        /**
         * Mesh pattern setting : flip and rotate alternate tiles on each row or column
         */
        static readonly FLIP_N_ROTATE_TILE = 5;
        /**
         * Mesh pattern setting : rotate pattern and rotate
         */
        static readonly FLIP_N_ROTATE_ROW = 6;
        /**
         * Mesh tile positioning : part tiles same on left/right or top/bottom
         */
        static readonly CENTER = 0;
        /**
         * Mesh tile positioning : part tiles on left
         */
        static readonly LEFT = 1;
        /**
         * Mesh tile positioning : part tiles on right
         */
        static readonly RIGHT = 2;
        /**
         * Mesh tile positioning : part tiles on top
         */
        static readonly TOP = 3;
        /**
         * Mesh tile positioning : part tiles on bottom
         */
        static readonly BOTTOM = 4;
        /**
         * Indicates that the instanced meshes should be sorted from back to front before rendering if their material is transparent
         */
        static INSTANCEDMESH_SORT_TRANSPARENT: boolean;
        /**
         * Gets the default side orientation.
         * @param orientation the orientation to value to attempt to get
         * @returns the default orientation
         * @internal
         */
        static _GetDefaultSideOrientation(orientation?: number): number;
        private _internalMeshDataInfo;
        /**
         * Determines if the LOD levels are intended to be calculated using screen coverage (surface area ratio) instead of distance.
         */
        get useLODScreenCoverage(): boolean;
        set useLODScreenCoverage(value: boolean);
        /**
         * Will notify when the mesh is completely ready, including materials.
         * Observers added to this observable will be removed once triggered
         */
        onMeshReadyObservable: Observable<Mesh>;
        /** {@inheritDoc} */
        get computeBonesUsingShaders(): boolean;
        /** {@inheritDoc} */
        set computeBonesUsingShaders(value: boolean);
        /**
         * An event triggered before rendering the mesh
         */
        get onBeforeRenderObservable(): Observable<Mesh>;
        /**
         * An event triggered before binding the mesh
         */
        get onBeforeBindObservable(): Observable<Mesh>;
        /**
         * An event triggered after rendering the mesh
         */
        get onAfterRenderObservable(): Observable<Mesh>;
        /**
         * An event triggeredbetween rendering pass when using separateCullingPass = true
         */
        get onBetweenPassObservable(): Observable<SubMesh>;
        /**
         * An event triggered before drawing the mesh
         */
        get onBeforeDrawObservable(): Observable<Mesh>;
        private _onBeforeDrawObserver;
        /**
         * Sets a callback to call before drawing the mesh. It is recommended to use onBeforeDrawObservable instead
         */
        set onBeforeDraw(callback: () => void);
        /** {@inheritDoc} */
        get hasInstances(): boolean;
        /** {@inheritDoc} */
        get hasThinInstances(): boolean;
        /**
         * Gets the delay loading state of the mesh (when delay loading is turned on)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/incrementalLoading
         */
        delayLoadState: number;
        /**
         * Gets the list of instances created from this mesh
         * it is not supposed to be modified manually.
         * Note also that the order of the InstancedMesh wihin the array is not significant and might change.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances
         */
        instances: InstancedMesh[];
        /**
         * Gets the file containing delay loading data for this mesh
         */
        delayLoadingFile: string;
        /** @internal */
        _binaryInfo: any;
        /**
         * User defined function used to change how LOD level selection is done
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
         */
        onLODLevelSelection: (distance: number, mesh: Mesh, selectedLevel: Nullable<Mesh>) => void;
        /** @internal */
        _creationDataStorage: Nullable<_CreationDataStorage>;
        /** @internal */
        _geometry: Nullable<Geometry>;
        /** @internal */
        _delayInfo: Array<string>;
        /** @internal */
        _delayLoadingFunction: (any: any, mesh: Mesh) => void;
        /**
         * Gets or sets the forced number of instances to display.
         * If 0 (default value), the number of instances is not forced and depends on the draw type
         * (regular / instance / thin instances mesh)
         */
        get forcedInstanceCount(): number;
        set forcedInstanceCount(count: number);
        /** @internal */
        _instanceDataStorage: _InstanceDataStorage;
        /** @internal */
        _thinInstanceDataStorage: _ThinInstanceDataStorage;
        /** @internal */
        _shouldGenerateFlatShading: boolean;
        /** @internal */
        _originalBuilderSideOrientation: number;
        /**
         * Use this property to change the original side orientation defined at construction time
         * Material.sideOrientation will override this value if set
         * User will still be able to change the material sideOrientation afterwards if they really need it
         */
        get sideOrientation(): number;
        set sideOrientation(value: number);
        /** @internal */
        get _effectiveSideOrientation(): number;
        /**
         * @deprecated Please use sideOrientation instead.
         * @see https://doc.babylonjs.com/breaking-changes#7110
         */
        get overrideMaterialSideOrientation(): number;
        set overrideMaterialSideOrientation(value: number);
        /**
         * Use this property to override the Material's fillMode value
         */
        get overrideRenderingFillMode(): Nullable<number>;
        set overrideRenderingFillMode(fillMode: Nullable<number>);
        /** {@inheritDoc} */
        get material(): Nullable<Material>;
        /** {@inheritDoc} */
        set material(value: Nullable<Material>);
        /**
         * Gets or sets a boolean indicating whether to render ignoring the active camera's max z setting. (false by default)
         * You should not mix meshes that have this property set to true with meshes that have it set to false if they all write
         * to the depth buffer, because the z-values are not comparable in the two cases and you will get rendering artifacts if you do.
         * You can set the property to true for meshes that do not write to the depth buffer, or set the same value (either false or true) otherwise.
         * Note this will reduce performance when set to true.
         */
        ignoreCameraMaxZ: boolean;
        /**
         * Gets the source mesh (the one used to clone this one from)
         */
        get source(): Nullable<Mesh>;
        /**
         * Gets the list of clones of this mesh
         * The scene must have been constructed with useClonedMeshMap=true for this to work!
         * Note that useClonedMeshMap=true is the default setting
         */
        get cloneMeshMap(): Nullable<{
            [id: string]: Mesh | undefined;
        }>;
        /**
         * Gets or sets a boolean indicating that this mesh does not use index buffer
         */
        get isUnIndexed(): boolean;
        set isUnIndexed(value: boolean);
        /** Gets the array buffer used to store the instanced buffer used for instances' world matrices */
        get worldMatrixInstancedBuffer(): Float32Array;
        /** Gets the array buffer used to store the instanced buffer used for instances' previous world matrices */
        get previousWorldMatrixInstancedBuffer(): Float32Array;
        /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */
        get manualUpdateOfWorldMatrixInstancedBuffer(): boolean;
        set manualUpdateOfWorldMatrixInstancedBuffer(value: boolean);
        /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices is manual */
        get manualUpdateOfPreviousWorldMatrixInstancedBuffer(): boolean;
        set manualUpdateOfPreviousWorldMatrixInstancedBuffer(value: boolean);
        /** Gets or sets a boolean indicating that the update of the instance buffer of the world matrices must be performed in all cases (and notably even in frozen mode) */
        get forceWorldMatrixInstancedBufferUpdate(): boolean;
        set forceWorldMatrixInstancedBufferUpdate(value: boolean);
        protected _copySource(source: Mesh, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean, cloneThinInstances?: boolean): void;
        /**
         * Constructor
         * @param name The value used by scene.getMeshByName() to do a lookup.
         * @param scene The scene to add this mesh to.
         * @param options Options used to create the mesh
         */
        constructor(name: string, scene?: Nullable<Scene>, options?: MeshCreationOptions);
        /**
         * Constructor
         * @param name The value used by scene.getMeshByName() to do a lookup.
         * @param scene The scene to add this mesh to.
         * @param parent The parent of this mesh, if it has one
         * @param source An optional Mesh from which geometry is shared, cloned.
         * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.
         *                  When false, achieved by calling a clone(), also passing False.
         *                  This will make creation of children, recursive.
         * @param clonePhysicsImpostor When cloning, include cloning mesh physics impostor, default True.
         */
        constructor(name: string, scene?: Nullable<Scene>, parent?: Nullable<Node>, source?: Nullable<Mesh>, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean);
        /**
         * Instantiate (when possible) or clone that node with its hierarchy
         * @param newParent defines the new parent to use for the instance (or clone)
         * @param options defines options to configure how copy is done
         * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created
         * @returns an instance (or a clone) of the current node with its hierarchy
         */
        instantiateHierarchy(newParent?: Nullable<TransformNode>, options?: {
            doNotInstantiate: boolean | ((node: TransformNode) => boolean);
        }, onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void): Nullable<TransformNode>;
        /**
         * Gets the class name
         * @returns the string "Mesh".
         */
        getClassName(): string;
        /** @internal */
        get _isMesh(): boolean;
        /**
         * Returns a description of this mesh
         * @param fullDetails define if full details about this mesh must be used
         * @returns a descriptive string representing this mesh
         */
        toString(fullDetails?: boolean): string;
        /** @internal */
        _unBindEffect(): void;
        /**
         * Gets a boolean indicating if this mesh has LOD
         */
        get hasLODLevels(): boolean;
        /**
         * Gets the list of MeshLODLevel associated with the current mesh
         * @returns an array of MeshLODLevel
         */
        getLODLevels(): MeshLODLevel[];
        private _sortLODLevels;
        /**
         * Add a mesh as LOD level triggered at the given distance.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
         * @param distanceOrScreenCoverage Either distance from the center of the object to show this level or the screen coverage if `useScreenCoverage` is set to `true`.
         * If screen coverage, value is a fraction of the screen's total surface, between 0 and 1.
         * Example Playground for distance https://playground.babylonjs.com/#QE7KM#197
         * Example Playground for screen coverage https://playground.babylonjs.com/#QE7KM#196
         * @param mesh The mesh to be added as LOD level (can be null)
         * @returns This mesh (for chaining)
         */
        addLODLevel(distanceOrScreenCoverage: number, mesh: Nullable<Mesh>): Mesh;
        /**
         * Returns the LOD level mesh at the passed distance or null if not found.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
         * @param distance The distance from the center of the object to show this level
         * @returns a Mesh or `null`
         */
        getLODLevelAtDistance(distance: number): Nullable<Mesh>;
        /**
         * Remove a mesh from the LOD array
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
         * @param mesh defines the mesh to be removed
         * @returns This mesh (for chaining)
         */
        removeLODLevel(mesh: Nullable<Mesh>): Mesh;
        /**
         * Returns the registered LOD mesh distant from the parameter `camera` position if any, else returns the current mesh.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/LOD
         * @param camera defines the camera to use to compute distance
         * @param boundingSphere defines a custom bounding sphere to use instead of the one from this mesh
         * @returns This mesh (for chaining)
         */
        getLOD(camera: Camera, boundingSphere?: BoundingSphere): Nullable<AbstractMesh>;
        /**
         * Gets the mesh internal Geometry object
         */
        get geometry(): Nullable<Geometry>;
        /**
         * Returns the total number of vertices within the mesh geometry or zero if the mesh has no geometry.
         * @returns the total number of vertices
         */
        getTotalVertices(): number;
        /**
         * Returns the content of an associated vertex buffer
         * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param copyWhenShared defines a boolean indicating that if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one
         * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns a FloatArray or null if the mesh has no geometry or no vertex buffer for this kind.
         */
        getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean, bypassInstanceData?: boolean): Nullable<FloatArray>;
        /**
         * Copies the requested vertex data kind into the given vertex data map. Float data is constructed if the map doesn't have the data.
         * @param kind defines the vertex data kind to use
         * @param vertexData defines the map that stores the resulting data
         */
        copyVerticesData(kind: string, vertexData: {
            [kind: string]: Float32Array;
        }): void;
        /**
         * Returns the mesh VertexBuffer object from the requested `kind`
         * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.NormalKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.
         */
        getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable<VertexBuffer>;
        /**
         * Tests if a specific vertex buffer is associated with this mesh
         * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.NormalKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns a boolean
         */
        isVerticesDataPresent(kind: string, bypassInstanceData?: boolean): boolean;
        /**
         * Returns a boolean defining if the vertex data for the requested `kind` is updatable.
         * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns a boolean
         */
        isVertexBufferUpdatable(kind: string, bypassInstanceData?: boolean): boolean;
        /**
         * Returns a string which contains the list of existing `kinds` of Vertex Data associated with this mesh.
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns an array of strings
         */
        getVerticesDataKinds(bypassInstanceData?: boolean): string[];
        /**
         * Returns a positive integer : the total number of indices in this mesh geometry.
         * @returns the number of indices or zero if the mesh has no geometry.
         */
        getTotalIndices(): number;
        /**
         * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.
         * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.
         * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it
         * @returns the indices array or an empty array if the mesh has no geometry
         */
        getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable<IndicesArray>;
        /** {@inheritDoc} */
        get isBlocked(): boolean;
        /**
         * Determine if the current mesh is ready to be rendered
         * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)
         * @param forceInstanceSupport will check if the mesh will be ready when used with instances (false by default)
         * @returns true if all associated assets are ready (material, textures, shaders)
         */
        isReady(completeCheck?: boolean, forceInstanceSupport?: boolean): boolean;
        /**
         * Gets a boolean indicating if the normals aren't to be recomputed on next mesh `positions` array update. This property is pertinent only for updatable parametric shapes.
         */
        get areNormalsFrozen(): boolean;
        /**
         * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It prevents the mesh normals from being recomputed on next `positions` array update.
         * @returns the current mesh
         */
        freezeNormals(): Mesh;
        /**
         * This function affects parametric shapes on vertex position update only : ribbons, tubes, etc. It has no effect at all on other shapes. It reactivates the mesh normals computation if it was previously frozen
         * @returns the current mesh
         */
        unfreezeNormals(): Mesh;
        /**
         * Sets a value overriding the instance count. Only applicable when custom instanced InterleavedVertexBuffer are used rather than InstancedMeshs
         */
        set overridenInstanceCount(count: number);
        /** @internal */
        _getInstanceDataStorage(): _InstanceDataStorageRenderPass;
        /** @internal */
        _preActivate(): Mesh;
        /**
         * @internal
         */
        _preActivateForIntermediateRendering(renderId: number): Mesh;
        /**
         * @internal
         */
        _registerInstanceForRenderId(instance: InstancedMesh, renderId: number): Mesh;
        protected _afterComputeWorldMatrix(): void;
        /** @internal */
        _postActivate(): void;
        /**
         * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.
         * This means the mesh underlying bounding box and sphere are recomputed.
         * @param applySkeletonOrOptions defines whether to apply the skeleton before computing the bounding info or a set of options
         * @param applyMorph defines whether to apply the morph target before computing the bounding info
         * @returns the current mesh
         */
        refreshBoundingInfo(applySkeletonOrOptions?: boolean | IMeshDataOptions, applyMorph?: boolean): Mesh;
        /**
         * @internal
         */
        _createGlobalSubMesh(force: boolean): Nullable<SubMesh>;
        /**
         * This function will subdivide the mesh into multiple submeshes
         * @param count defines the expected number of submeshes
         */
        subdivide(count: number): void;
        /**
         * Copy a FloatArray into a specific associated vertex buffer
         * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param data defines the data source
         * @param updatable defines if the updated vertex buffer must be flagged as updatable
         * @param stride defines the data stride size (can be null)
         * @returns the current mesh
         */
        setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh;
        /**
         * Delete a vertex buffer associated with this mesh
         * @param kind defines which buffer to delete (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         */
        removeVerticesData(kind: string): void;
        /**
         * Flags an associated vertex buffer as updatable
         * @param kind defines which buffer to use (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param updatable defines if the updated vertex buffer must be flagged as updatable
         */
        markVerticesDataAsUpdatable(kind: string, updatable?: boolean): void;
        /**
         * Sets the mesh global Vertex Buffer
         * @param buffer defines the buffer to use
         * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)
         * @param totalVertices defines the total number of vertices for position kind (could be null)
         * @returns the current mesh
         */
        setVerticesBuffer(buffer: VertexBuffer, disposeExistingBuffer?: boolean, totalVertices?: Nullable<number>): Mesh;
        /**
         * Update a specific associated vertex buffer
         * @param kind defines which buffer to write to (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param data defines the data source
         * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for "position" kind
         * @param makeItUnique defines if the geometry associated with the mesh must be cloned to make the change only for this mesh (and not all meshes associated with the same geometry)
         * @returns the current mesh
         */
        updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh;
        /**
         * This method updates the vertex positions of an updatable mesh according to the `positionFunction` returned values.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#other-shapes-updatemeshpositions
         * @param positionFunction is a simple JS function what is passed the mesh `positions` array. It doesn't need to return anything
         * @param computeNormals is a boolean (default true) to enable/disable the mesh normal recomputation after the vertex position update
         * @returns the current mesh
         */
        updateMeshPositions(positionFunction: (data: FloatArray) => void, computeNormals?: boolean): Mesh;
        /**
         * Creates a un-shared specific occurence of the geometry for the mesh.
         * @returns the current mesh
         */
        makeGeometryUnique(): Mesh;
        /**
         * Sets the index buffer of this mesh.
         * @param indexBuffer Defines the index buffer to use for this mesh
         * @param totalVertices Defines the total number of vertices used by the buffer
         * @param totalIndices Defines the total number of indices in the index buffer
         * @param is32Bits Defines if the indices are 32 bits. If null (default), the value is guessed from the number of vertices
         */
        setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number, is32Bits?: Nullable<boolean>): void;
        /**
         * Set the index buffer of this mesh
         * @param indices defines the source data
         * @param totalVertices defines the total number of vertices referenced by this index data (can be null)
         * @param updatable defines if the updated index buffer must be flagged as updatable (default is false)
         * @param dontForceSubMeshRecreation defines a boolean indicating that we don't want to force the recreation of sub-meshes if we don't have to (false by default)
         * @returns the current mesh
         */
        setIndices(indices: IndicesArray, totalVertices?: Nullable<number>, updatable?: boolean, dontForceSubMeshRecreation?: boolean): AbstractMesh;
        /**
         * Update the current index buffer
         * @param indices defines the source data
         * @param offset defines the offset in the index buffer where to store the new data (can be null)
         * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)
         * @returns the current mesh
         */
        updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly?: boolean): AbstractMesh;
        /**
         * Invert the geometry to move from a right handed system to a left handed one.
         * @returns the current mesh
         */
        toLeftHanded(): Mesh;
        /**
         * @internal
         */
        _bind(subMesh: SubMesh, effect: Effect, fillMode: number, allowInstancedRendering?: boolean): Mesh;
        /**
         * @internal
         */
        _bindDirect(effect: Effect, indexToBind: Nullable<DataBuffer>, allowInstancedRendering?: boolean): Mesh;
        /**
         * @internal
         */
        _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh;
        /**
         * Registers for this mesh a javascript function called just before the rendering process
         * @param func defines the function to call before rendering this mesh
         * @returns the current mesh
         */
        registerBeforeRender(func: (mesh: AbstractMesh) => void): Mesh;
        /**
         * Disposes a previously registered javascript function called before the rendering
         * @param func defines the function to remove
         * @returns the current mesh
         */
        unregisterBeforeRender(func: (mesh: AbstractMesh) => void): Mesh;
        /**
         * Registers for this mesh a javascript function called just after the rendering is complete
         * @param func defines the function to call after rendering this mesh
         * @returns the current mesh
         */
        registerAfterRender(func: (mesh: AbstractMesh) => void): Mesh;
        /**
         * Disposes a previously registered javascript function called after the rendering.
         * @param func defines the function to remove
         * @returns the current mesh
         */
        unregisterAfterRender(func: (mesh: AbstractMesh) => void): Mesh;
        /**
         * @internal
         */
        _getInstancesRenderList(subMeshId: number, isReplacementMode?: boolean): _InstancesBatch;
        /**
         * This method will also draw the instances if fillMode and effect are passed
         * @internal
         */
        _updateInstancedBuffers(subMesh: SubMesh, batch: _InstancesBatch, currentInstancesBufferSize: number, engine: AbstractEngine, fillMode?: number, effect?: Effect): void;
        /**
         * @internal
         */
        _renderWithInstances(subMesh: SubMesh, fillMode: number, batch: _InstancesBatch, effect: Effect, engine: AbstractEngine): Mesh;
        /**
         * @internal
         */
        _renderWithThinInstances(subMesh: SubMesh, fillMode: number, effect: Effect, engine: AbstractEngine): void;
        /**
         * @internal
         */
        _processInstancedBuffers(visibleInstances: Nullable<InstancedMesh[]>, renderSelf: boolean): void;
        /**
         * @internal
         */
        _processRendering(renderingMesh: AbstractMesh, subMesh: SubMesh, effect: Effect, fillMode: number, batch: _InstancesBatch, hardwareInstancedRendering: boolean, onBeforeDraw: (isInstance: boolean, world: Matrix, effectiveMaterial?: Material) => void, effectiveMaterial?: Material): Mesh;
        private _disposeInstanceDataStorageRenderPass;
        /**
         * @internal
         */
        _rebuild(dispose?: boolean): void;
        /** @internal */
        _releaseRenderPassId(id: number): void;
        /** @internal */
        _freeze(): void;
        /** @internal */
        _unFreeze(): void;
        /**
         * Triggers the draw call for the mesh (or a submesh), for a specific render pass id
         * @param renderPassId defines the render pass id to use to draw the mesh / submesh. If not provided, use the current renderPassId of the engine.
         * @param enableAlphaMode defines if alpha mode can be changed (default: false)
         * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering (default: undefined)
         * @param subMesh defines the subMesh to render. If not provided, draw all mesh submeshes (default: undefined)
         * @param checkFrustumCulling defines if frustum culling must be checked (default: true). If you know the mesh is in the frustum (or if you don't care!), you can pass false to optimize.
         * @returns the current mesh
         */
        renderWithRenderPassId(renderPassId?: number, enableAlphaMode?: boolean, effectiveMeshReplacement?: AbstractMesh, subMesh?: SubMesh, checkFrustumCulling?: boolean): this;
        /**
         * Render a complete mesh by going through all submeshes
         * @returns the current mesh
         * @see [simple test](https://playground.babylonjs.com/#5SPY1V#2)
         * @see [perf test](https://playground.babylonjs.com/#5SPY1V#5)
         */
        directRender(): Mesh;
        /**
         * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager
         * @param subMesh defines the subMesh to render
         * @param enableAlphaMode defines if alpha mode can be changed
         * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering
         * @returns the current mesh
         */
        render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh;
        private _onBeforeDraw;
        /**
         *   Renormalize the mesh and patch it up if there are no weights
         *   Similar to normalization by adding the weights compute the reciprocal and multiply all elements, this wil ensure that everything adds to 1.
         *   However in the case of zero weights then we set just a single influence to 1.
         *   We check in the function for extra's present and if so we use the normalizeSkinWeightsWithExtras rather than the FourWeights version.
         */
        cleanMatrixWeights(): void;
        private _normalizeSkinFourWeights;
        private _normalizeSkinWeightsAndExtra;
        /**
         * ValidateSkinning is used to determine that a mesh has valid skinning data along with skin metrics, if missing weights,
         * or not normalized it is returned as invalid mesh the string can be used for console logs, or on screen messages to let
         * the user know there was an issue with importing the mesh
         * @returns a validation object with skinned, valid and report string
         */
        validateSkinning(): {
            skinned: boolean;
            valid: boolean;
            report: string;
        };
        /** @internal */
        _checkDelayState(): Mesh;
        private _queueLoad;
        /**
         * Returns `true` if the mesh is within the frustum defined by the passed array of planes.
         * A mesh is in the frustum if its bounding box intersects the frustum
         * @param frustumPlanes defines the frustum to test
         * @returns true if the mesh is in the frustum planes
         */
        isInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * Sets the mesh material by the material or multiMaterial `id` property
         * @param id is a string identifying the material or the multiMaterial
         * @returns the current mesh
         */
        setMaterialById(id: string): Mesh;
        /**
         * Returns as a new array populated with the mesh material and/or skeleton, if any.
         * @returns an array of IAnimatable
         */
        getAnimatables(): IAnimatable[];
        /**
         * Modifies the mesh geometry according to the passed transformation matrix.
         * This method returns nothing, but it really modifies the mesh even if it's originally not set as updatable.
         * The mesh normals are modified using the same transformation.
         * Note that, under the hood, this method sets a new VertexBuffer each call.
         * @param transform defines the transform matrix to use
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms
         * @returns the current mesh
         */
        bakeTransformIntoVertices(transform: DeepImmutable<Matrix>): Mesh;
        /**
         * Modifies the mesh geometry according to its own current World Matrix.
         * The mesh World Matrix is then reset.
         * This method returns nothing but really modifies the mesh even if it's originally not set as updatable.
         * Note that, under the hood, this method sets a new VertexBuffer each call.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms
         * @param bakeIndependentlyOfChildren indicates whether to preserve all child nodes' World Matrix during baking
         * @param forceUnique indicates whether to force the mesh geometry to be unique
         * @returns the current mesh
         */
        bakeCurrentTransformIntoVertices(bakeIndependentlyOfChildren?: boolean, forceUnique?: boolean): Mesh;
        /** @internal */
        get _positions(): Nullable<Vector3[]>;
        /** @internal */
        _resetPointsArrayCache(): Mesh;
        /** @internal */
        _generatePointsArray(): boolean;
        /**
         * Returns a new Mesh object generated from the current mesh properties.
         * This method must not get confused with createInstance()
         * @param name is a string, the name given to the new mesh
         * @param newParent can be any Node object (default `null`) or an instance of MeshCloneOptions. If the latter, doNotCloneChildren and clonePhysicsImpostor are unused.
         * @param doNotCloneChildren allows/denies the recursive cloning of the original mesh children if any (default `false`)
         * @param clonePhysicsImpostor allows/denies the cloning in the same time of the original mesh `body` used by the physics engine, if any (default `true`)
         * @returns a new mesh
         */
        clone(name?: string, newParent?: Nullable<Node> | MeshCloneOptions, doNotCloneChildren?: boolean, clonePhysicsImpostor?: boolean): Mesh;
        /**
         * Releases resources associated with this mesh.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /** @internal */
        _disposeInstanceSpecificData(): void;
        /** @internal */
        _disposeThinInstanceSpecificData(): void;
        /**
         * Modifies the mesh geometry according to a displacement map.
         * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.
         * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.
         * @param url is a string, the URL from the image file is to be downloaded.
         * @param minHeight is the lower limit of the displacement.
         * @param maxHeight is the upper limit of the displacement.
         * @param onSuccess is an optional Javascript function to be called just after the mesh is modified. It is passed the modified mesh and must return nothing.
         * @param uvOffset is an optional vector2 used to offset UV.
         * @param uvScale is an optional vector2 used to scale UV.
         * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.
         * @param onError defines a callback called when an error occurs during the processing of the request.
         * @returns the Mesh.
         */
        applyDisplacementMap(url: string, minHeight: number, maxHeight: number, onSuccess?: (mesh: Mesh) => void, uvOffset?: Vector2, uvScale?: Vector2, forceUpdate?: boolean, onError?: (message?: string, exception?: any) => void): Mesh;
        /**
         * Modifies the mesh geometry according to a displacementMap buffer.
         * A displacement map is a colored image. Each pixel color value (actually a gradient computed from red, green, blue values) will give the displacement to apply to each mesh vertex.
         * The mesh must be set as updatable. Its internal geometry is directly modified, no new buffer are allocated.
         * @param buffer is a `Uint8Array` buffer containing series of `Uint8` lower than 255, the red, green, blue and alpha values of each successive pixel.
         * @param heightMapWidth is the width of the buffer image.
         * @param heightMapHeight is the height of the buffer image.
         * @param minHeight is the lower limit of the displacement.
         * @param maxHeight is the upper limit of the displacement.
         * @param uvOffset is an optional vector2 used to offset UV.
         * @param uvScale is an optional vector2 used to scale UV.
         * @param forceUpdate defines whether or not to force an update of the generated buffers. This is useful to apply on a deserialized model for instance.
         * @returns the Mesh.
         */
        applyDisplacementMapFromBuffer(buffer: Uint8Array, heightMapWidth: number, heightMapHeight: number, minHeight: number, maxHeight: number, uvOffset?: Vector2, uvScale?: Vector2, forceUpdate?: boolean): Mesh;
        private _getFlattenedNormals;
        private _convertToUnIndexedMesh;
        /**
         * Modify the mesh to get a flat shading rendering.
         * This means each mesh facet will then have its own normals. Usually new vertices are added in the mesh geometry to get this result.
         * Warning : the mesh is really modified even if not set originally as updatable and, under the hood, a new VertexBuffer is allocated.
         * @returns current mesh
         */
        convertToFlatShadedMesh(): Mesh;
        /**
         * This method removes all the mesh indices and add new vertices (duplication) in order to unfold facets into buffers.
         * In other words, more vertices, no more indices and a single bigger VBO.
         * The mesh is really modified even if not set originally as updatable. Under the hood, a new VertexBuffer is allocated.
         * @returns current mesh
         */
        convertToUnIndexedMesh(): Mesh;
        /**
         * Inverses facet orientations.
         * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.
         * @param flipNormals will also inverts the normals
         * @returns current mesh
         */
        flipFaces(flipNormals?: boolean): Mesh;
        /**
         * Increase the number of facets and hence vertices in a mesh
         * Vertex normals are interpolated from existing vertex normals
         * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.
         * @param numberPerEdge the number of new vertices to add to each edge of a facet, optional default 1
         */
        increaseVertices(numberPerEdge?: number): void;
        /**
         * Force adjacent facets to share vertices and remove any facets that have all vertices in a line
         * This will undo any application of covertToFlatShadedMesh
         * Warning : the mesh is really modified even if not set originally as updatable. A new VertexBuffer is created under the hood each call.
         */
        forceSharedVertices(): void;
        /**
         * @internal
         */
        static _instancedMeshFactory(name: string, mesh: Mesh): InstancedMesh;
        /**
         * @internal
         */
        static _PhysicsImpostorParser(scene: Scene, physicObject: IPhysicsEnabledObject, jsonObject: any): PhysicsImpostor;
        /**
         * Creates a new InstancedMesh object from the mesh model.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances
         * @param name defines the name of the new instance
         * @returns a new InstancedMesh
         */
        createInstance(name: string): InstancedMesh;
        /**
         * Synchronises all the mesh instance submeshes to the current mesh submeshes, if any.
         * After this call, all the mesh instances have the same submeshes than the current mesh.
         * @returns the current mesh
         */
        synchronizeInstances(): Mesh;
        /**
         * Optimization of the mesh's indices, in case a mesh has duplicated vertices.
         * The function will only reorder the indices and will not remove unused vertices to avoid problems with submeshes.
         * This should be used together with the simplification to avoid disappearing triangles.
         * @param successCallback an optional success callback to be called after the optimization finished.
         * @returns the current mesh
         */
        optimizeIndices(successCallback?: (mesh?: Mesh) => void): Mesh;
        /**
         * Serialize current mesh
         * @param serializationObject defines the object which will receive the serialization data
         * @returns the serialized object
         */
        serialize(serializationObject?: any): any;
        /** @internal */
        _syncGeometryWithMorphTargetManager(): void;
        /**
         * @internal
         */
        static _GroundMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * @internal
         */
        static _GoldbergMeshParser: (parsedMesh: any, scene: Scene) => GoldbergMesh;
        /**
         * @internal
         */
        static _LinesMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * @internal
         */
        static _GreasedLineMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * @internal
         */
        static _GreasedLineRibbonMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * @internal
         */
        static _TrailMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * Holder function for GaussianSplattingMesh Parser, should be GaussianSplattingMesh.Parse after imported
         * @internal
         */
        static _GaussianSplattingMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * Holder function for GaussianSplattingPartProxyMesh Parser, should be GaussianSplattingPartProxyMesh.Parse after imported
         * @internal
         */
        static _GaussianSplattingPartProxyMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * Holder function for GaussianSplattingCompoundMesh Parser, should be GaussianSplattingCompoundMesh.Parse after imported
         * @internal
         */
        static _GaussianSplattingCompoundMeshParser: (parsedMesh: any, scene: Scene) => Mesh;
        /**
         * Returns a new Mesh object parsed from the source provided.
         * @param parsedMesh is the source
         * @param scene defines the hosting scene
         * @param rootUrl is the root URL to prefix the `delayLoadingFile` property with
         * @returns a new Mesh
         */
        static Parse(parsedMesh: any, scene: Scene, rootUrl: string): Mesh;
        /**
         * Prepare internal position array for software CPU skinning
         * @returns original positions used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh
         */
        setPositionsForCPUSkinning(): Nullable<Float32Array>;
        /**
         * Prepare internal normal array for software CPU skinning
         * @returns original normals used for CPU skinning. Useful for integrating Morphing with skeletons in same mesh.
         */
        setNormalsForCPUSkinning(): Nullable<Float32Array>;
        /**
         * Updates the vertex buffer by applying transformation from the bones
         * @param skeleton defines the skeleton to apply to current mesh
         * @returns the current mesh
         */
        applySkeleton(skeleton: Skeleton): Mesh;
        /**
         * Returns an object containing a min and max Vector3 which are the minimum and maximum vectors of each mesh bounding box from the passed array, in the world coordinates
         * @param meshes defines the list of meshes to scan
         * @returns an object `{min:` Vector3`, max:` Vector3`}`
         */
        static MinMax(meshes: AbstractMesh[]): {
            min: Vector3;
            max: Vector3;
        };
        /**
         * Returns the center of the `{min:` Vector3`, max:` Vector3`}` or the center of MinMax vector3 computed from a mesh array
         * @param meshesOrMinMaxVector could be an array of meshes or a `{min:` Vector3`, max:` Vector3`}` object
         * @returns a vector3
         */
        static Center(meshesOrMinMaxVector: {
            min: Vector3;
            max: Vector3;
        } | AbstractMesh[]): Vector3;
        /**
         * Merge the array of meshes into a single mesh for performance reasons.
         * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.
         * @param disposeSource when true (default), dispose of the vertices from the source meshes.
         * @param allow32BitsIndices when the sum of the vertices \> 64k, this must be set to true.
         * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.
         * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.
         * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.
         * @returns a new mesh
         */
        static MergeMeshes(meshes: Array<Mesh>, disposeSource?: boolean, allow32BitsIndices?: boolean, meshSubclass?: Mesh, subdivideWithSubMeshes?: boolean, multiMultiMaterials?: boolean): Nullable<Mesh>;
        /**
         * Merge the array of meshes into a single mesh for performance reasons.
         * @param meshes array of meshes with the vertices to merge. Entries cannot be empty meshes.
         * @param disposeSource when true (default), dispose of the vertices from the source meshes.
         * @param allow32BitsIndices when the sum of the vertices \> 64k, this must be set to true.
         * @param meshSubclass (optional) can be set to a Mesh where the merged vertices will be inserted.
         * @param subdivideWithSubMeshes when true (false default), subdivide mesh into subMeshes.
         * @param multiMultiMaterials when true (false default), subdivide mesh into subMeshes with multiple materials, ignores subdivideWithSubMeshes.
         * @returns a new mesh
         */
        static MergeMeshesAsync(meshes: Array<Mesh>, disposeSource?: boolean, allow32BitsIndices?: boolean, meshSubclass?: Mesh, subdivideWithSubMeshes?: boolean, multiMultiMaterials?: boolean): Promise<any>;
        private static _MergeMeshesCoroutine;
        /**
         * @internal
         */
        addInstance(instance: InstancedMesh): void;
        /**
         * @internal
         */
        removeInstance(instance: InstancedMesh): void;
        /** @internal */
        _shouldConvertRHS(): boolean;
        /** @internal */
        _getRenderingFillMode(fillMode: number): number;
        /**
         * Sets the mesh material by the material or multiMaterial `id` property
         * @param id is a string identifying the material or the multiMaterial
         * @returns the current mesh
         * @deprecated Please use MeshBuilder instead Please use setMaterialById instead
         */
        setMaterialByID(id: string): Mesh;
        /**
         * Creates a ribbon mesh.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
         * @param _name defines the name of the mesh to create
         * @param _pathArray is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry.
         * @param _closeArray creates a seam between the first and the last paths of the path array (default is false)
         * @param _closePath creates a seam between the first and the last points of each path of the path array
         * @param _offset is taken in account only if the `pathArray` is containing a single path
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _instance defines an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#ribbon)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateRibbon(_name: string, _pathArray: Vector3[][], _closeArray: boolean, _closePath: boolean, _offset: number, _scene?: Scene, _updatable?: boolean, _sideOrientation?: number, _instance?: Mesh): Mesh;
        /**
         * Creates a plane polygonal mesh.  By default, this is a disc.
         * @param _name defines the name of the mesh to create
         * @param _radius sets the radius size (float) of the polygon (default 0.5)
         * @param _tessellation sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateDisc(_name: string, _radius: number, _tessellation: number, _scene: Nullable<Scene>, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a box mesh.
         * @param _name defines the name of the mesh to create
         * @param _size sets the size (float) of each box side (default 1)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateBox(_name: string, _size: number, _scene: Nullable<Scene>, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a sphere mesh.
         * @param _name defines the name of the mesh to create
         * @param _segments sets the sphere number of horizontal stripes (positive integer, default 32)
         * @param _diameter sets the diameter size (float) of the sphere (default 1)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateSphere(_name: string, _segments: number, _diameter: number, _scene?: Scene, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a hemisphere mesh.
         * @param _name defines the name of the mesh to create
         * @param _segments sets the sphere number of horizontal stripes (positive integer, default 32)
         * @param _diameter sets the diameter size (float) of the sphere (default 1)
         * @param _scene defines the hosting scene
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateHemisphere(_name: string, _segments: number, _diameter: number, _scene?: Scene): Mesh;
        /**
         * Creates a cylinder or a cone mesh.
         * @param _name defines the name of the mesh to create
         * @param _height sets the height size (float) of the cylinder/cone (float, default 2)
         * @param _diameterTop set the top cap diameter (floats, default 1)
         * @param _diameterBottom set the bottom cap diameter (floats, default 1). This value can't be zero
         * @param _tessellation sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance
         * @param _subdivisions sets the number of rings along the cylinder height (positive integer, default 1)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateCylinder(_name: string, _height: number, _diameterTop: number, _diameterBottom: number, _tessellation: number, _subdivisions: any, _scene?: Scene, _updatable?: any, _sideOrientation?: number): Mesh;
        /**
         * Creates a torus mesh.
         * @param _name defines the name of the mesh to create
         * @param _diameter sets the diameter size (float) of the torus (default 1)
         * @param _thickness sets the diameter size of the tube of the torus (float, default 0.5)
         * @param _tessellation sets the number of torus sides (positive integer, default 16)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateTorus(_name: string, _diameter: number, _thickness: number, _tessellation: number, _scene?: Scene, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a torus knot mesh.
         * @param _name defines the name of the mesh to create
         * @param _radius sets the global radius size (float) of the torus knot (default 2)
         * @param _tube sets the diameter size of the tube of the torus (float, default 0.5)
         * @param _radialSegments sets the number of sides on each tube segments (positive integer, default 32)
         * @param _tubularSegments sets the number of tubes to decompose the knot into (positive integer, default 32)
         * @param _p the number of windings on X axis (positive integers, default 2)
         * @param _q the number of windings on Y axis (positive integers, default 3)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateTorusKnot(_name: string, _radius: number, _tube: number, _radialSegments: number, _tubularSegments: number, _p: number, _q: number, _scene?: Scene, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a line mesh..
         * @param _name defines the name of the mesh to create
         * @param _points is an array successive Vector3
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines).
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateLines(_name: string, _points: Vector3[], _scene: Nullable<Scene>, _updatable: boolean, _instance?: Nullable<LinesMesh>): LinesMesh;
        /**
         * Creates a dashed line mesh.
         * @param _name defines the name of the mesh to create
         * @param _points is an array successive Vector3
         * @param _dashSize is the size of the dashes relatively the dash number (positive float, default 3)
         * @param _gapSize is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)
         * @param _dashNb is the intended total number of dashes (positive integer, default 200)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _instance is an instance of an existing LineMesh object to be updated with the passed `points` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#lines-and-dashedlines)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateDashedLines(_name: string, _points: Vector3[], _dashSize: number, _gapSize: number, _dashNb: number, _scene: Nullable<Scene>, _updatable?: boolean, _instance?: LinesMesh): LinesMesh;
        /**
         * Creates a polygon mesh.Please consider using the same method from the MeshBuilder class instead
         * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh.
         * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors.
         * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.
         * Remember you can only change the shape positions, not their number when updating a polygon.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#non-regular-polygon
         * @param _name defines the name of the mesh to create
         * @param _shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors
         * @param _scene defines the hosting scene
         * @param _holes is a required array of arrays of successive Vector3 used to defines holes in the polygon
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _earcutInjection can be used to inject your own earcut reference
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreatePolygon(_name: string, _shape: Vector3[], _scene: Scene, _holes?: Vector3[][], _updatable?: boolean, _sideOrientation?: number, _earcutInjection?: any): Mesh;
        /**
         * Creates an extruded polygon mesh, with depth in the Y direction..
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-non-regular-polygon
         * @param _name defines the name of the mesh to create
         * @param _shape is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors
         * @param _depth defines the height of extrusion
         * @param _scene defines the hosting scene
         * @param _holes is a required array of arrays of successive Vector3 used to defines holes in the polygon
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _earcutInjection can be used to inject your own earcut reference
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static ExtrudePolygon(_name: string, _shape: Vector3[], _depth: number, _scene: Scene, _holes?: Vector3[][], _updatable?: boolean, _sideOrientation?: number, _earcutInjection?: any): Mesh;
        /**
         * Creates an extruded shape mesh.
         * The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes
         * @param _name defines the name of the mesh to create
         * @param _shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis
         * @param _path is a required array of successive Vector3. This is the axis curve the shape is extruded along
         * @param _scale is the value to scale the shape
         * @param _rotation is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve
         * @param _cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#extruded-shape)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static ExtrudeShape(_name: string, _shape: Vector3[], _path: Vector3[], _scale: number, _rotation: number, _cap: number, _scene: Nullable<Scene>, _updatable?: boolean, _sideOrientation?: number, _instance?: Mesh): Mesh;
        /**
         * Creates an custom extruded shape mesh.
         * The custom extrusion is a parametric shape.
         * It has no predefined shape. Its final shape will depend on the input parameters.
         *
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes
         * @param _name defines the name of the mesh to create
         * @param _shape is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis
         * @param _path is a required array of successive Vector3. This is the axis curve the shape is extruded along
         * @param _scaleFunction is a custom Javascript function called on each path point
         * @param _rotationFunction is a custom Javascript function called on each path point
         * @param _ribbonCloseArray forces the extrusion underlying ribbon to close all the paths in its `pathArray`
         * @param _ribbonClosePath forces the extrusion underlying ribbon to close its `pathArray`
         * @param _cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _instance is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters (https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static ExtrudeShapeCustom(_name: string, _shape: Vector3[], _path: Vector3[], _scaleFunction: Nullable<{
            (i: number, distance: number): number;
        }>, _rotationFunction: Nullable<{
            (i: number, distance: number): number;
        }>, _ribbonCloseArray: boolean, _ribbonClosePath: boolean, _cap: number, _scene: Scene, _updatable?: boolean, _sideOrientation?: number, _instance?: Mesh): Mesh;
        /**
         * Creates lathe mesh.
         * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe.
         * @param _name defines the name of the mesh to create
         * @param _shape is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero
         * @param _radius is the radius value of the lathe
         * @param _tessellation is the side number of the lathe.
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateLathe(_name: string, _shape: Vector3[], _radius: number, _tessellation: number, _scene: Scene, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a plane mesh.
         * @param _name defines the name of the mesh to create
         * @param _size sets the size (float) of both sides of the plane at once (default 1)
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreatePlane(_name: string, _size: number, _scene: Scene, _updatable?: boolean, _sideOrientation?: number): Mesh;
        /**
         * Creates a ground mesh.
         * @param _name defines the name of the mesh to create
         * @param _width set the width of the ground
         * @param _height set the height of the ground
         * @param _subdivisions sets the number of subdivisions per side
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateGround(_name: string, _width: number, _height: number, _subdivisions: number, _scene?: Scene, _updatable?: boolean): Mesh;
        /**
         * Creates a tiled ground mesh.
         * @param _name defines the name of the mesh to create
         * @param _xmin set the ground minimum X coordinate
         * @param _zmin set the ground minimum Y coordinate
         * @param _xmax set the ground maximum X coordinate
         * @param _zmax set the ground maximum Z coordinate
         * @param _subdivisions is an object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile
         * @param _precision is an object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateTiledGround(_name: string, _xmin: number, _zmin: number, _xmax: number, _zmax: number, _subdivisions: {
            w: number;
            h: number;
        }, _precision: {
            w: number;
            h: number;
        }, _scene: Scene, _updatable?: boolean): Mesh;
        /**
         * Creates a ground mesh from a height map.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map
         * @param _name defines the name of the mesh to create
         * @param _url sets the URL of the height map image resource
         * @param _width set the ground width size
         * @param _height set the ground height size
         * @param _subdivisions sets the number of subdivision per side
         * @param _minHeight is the minimum altitude on the ground
         * @param _maxHeight is the maximum altitude on the ground
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _onReady  is a callback function that will be called  once the mesh is built (the height map download can last some time)
         * @param _alphaFilter will filter any data where the alpha channel is below this value, defaults 0 (all data visible)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateGroundFromHeightMap(_name: string, _url: string, _width: number, _height: number, _subdivisions: number, _minHeight: number, _maxHeight: number, _scene: Scene, _updatable?: boolean, _onReady?: (mesh: GroundMesh) => void, _alphaFilter?: number): GroundMesh;
        /**
         * Creates a tube mesh.
         * The tube is a parametric shape.
         * It has no predefined shape. Its final shape will depend on the input parameters.
         *
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
         * @param _name defines the name of the mesh to create
         * @param _path is a required array of successive Vector3. It is the curve used as the axis of the tube
         * @param _radius sets the tube radius size
         * @param _tessellation is the number of sides on the tubular surface
         * @param _radiusFunction is a custom function. If it is not null, it overrides the parameter `radius`. This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path
         * @param _cap sets the way the extruded shape is capped. Possible values : Mesh.NO_CAP (default), Mesh.CAP_START, Mesh.CAP_END, Mesh.CAP_ALL
         * @param _scene defines the hosting scene
         * @param _updatable defines if the mesh must be flagged as updatable
         * @param _sideOrientation defines the mesh side orientation (https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation)
         * @param _instance is an instance of an existing Tube object to be updated with the passed `pathArray` parameter (https://doc.babylonjs.com/how_to/How_to_dynamically_morph_a_mesh#tube)
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateTube(_name: string, _path: Vector3[], _radius: number, _tessellation: number, _radiusFunction: {
            (i: number, distance: number): number;
        }, _cap: number, _scene: Scene, _updatable?: boolean, _sideOrientation?: number, _instance?: Mesh): Mesh;
        /**
         * Creates a polyhedron mesh.
         *.
         * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embedded types. Please refer to the type sheet in the tutorial to choose the wanted type
         * * The parameter `size` (positive float, default 1) sets the polygon size
         * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)
         * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overwrittes the parameter `type`
         * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron
         * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)
         * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace
         * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored
         * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
         * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
         * @param _name defines the name of the mesh to create
         * @param _options defines the options used to create the mesh
         * @param _scene defines the hosting scene
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreatePolyhedron(_name: string, _options: {
            type?: number;
            size?: number;
            sizeX?: number;
            sizeY?: number;
            sizeZ?: number;
            custom?: any;
            faceUV?: Vector4[];
            faceColors?: Color4[];
            updatable?: boolean;
            sideOrientation?: number;
        }, _scene: Scene): Mesh;
        /**
         * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided
         * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)
         * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value than `radius`)
         * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size
         * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface
         * * You can also set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
         * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere
         * @param _name defines the name of the mesh
         * @param _options defines the options used to create the mesh
         * @param _scene defines the hosting scene
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateIcoSphere(_name: string, _options: {
            radius?: number;
            flat?: boolean;
            subdivisions?: number;
            sideOrientation?: number;
            updatable?: boolean;
        }, _scene: Scene): Mesh;
        /**
         * Creates a decal mesh.
         *.
         * A decal is a mesh usually applied as a model onto the surface of another mesh
         * @param _name  defines the name of the mesh
         * @param _sourceMesh defines the mesh receiving the decal
         * @param _position sets the position of the decal in world coordinates
         * @param _normal sets the normal of the mesh where the decal is applied onto in world coordinates
         * @param _size sets the decal scaling
         * @param _angle sets the angle to rotate the decal
         * @returns a new Mesh
         * @deprecated Please use MeshBuilder instead
         */
        static CreateDecal(_name: string, _sourceMesh: AbstractMesh, _position: Vector3, _normal: Vector3, _size: Vector3, _angle: number): Mesh;
        /** Creates a Capsule Mesh
         * @param _name defines the name of the mesh.
         * @param _options the constructors options used to shape the mesh.
         * @param _scene defines the scene the mesh is scoped to.
         * @returns the capsule mesh
         * @see https://doc.babylonjs.com/how_to/capsule_shape
         * @deprecated Please use MeshBuilder instead
         */
        static CreateCapsule(_name: string, _options: ICreateCapsuleOptions, _scene: Scene): Mesh;
        /**
         * Extends a mesh to a Goldberg mesh
         * Warning  the mesh to convert MUST be an import of a perviously exported Goldberg mesh
         * @param _mesh the mesh to convert
         * @returns the extended mesh
         * @deprecated Please use ExtendMeshToGoldberg instead
         */
        static ExtendToGoldberg(_mesh: Mesh): Mesh;
    }
    /**
     * Register side effects for mesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Line mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
     */
    export class LinesMesh extends Mesh {
        /**
         * If vertex color should be applied to the mesh
         */
        readonly useVertexColor?: boolean | undefined;
        /**
         * If vertex alpha should be applied to the mesh
         */
        readonly useVertexAlpha?: boolean | undefined;
        /**
         * Force all the LineMeshes to compile their default color material to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Color of the line (Default: White)
         */
        color: Color3;
        /**
         * Alpha of the line (Default: 1)
         */
        alpha: number;
        /**
         * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.
         * This margin is expressed in world space coordinates, so its value may vary.
         * Default value is 0.1
         */
        intersectionThreshold: number;
        private _isShaderMaterial;
        private _color4;
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        private _ownsMaterial;
        /**
         * Creates a new LinesMesh
         * @param name defines the name
         * @param scene defines the hosting scene
         * @param parent defines the parent mesh if any
         * @param source defines the optional source LinesMesh used to clone data from
         * @param doNotCloneChildren When cloning, skip cloning child meshes of source, default False.
         * When false, achieved by calling a clone(), also passing False.
         * This will make creation of children, recursive.
         * @param useVertexColor defines if this LinesMesh supports vertex color
         * @param useVertexAlpha defines if this LinesMesh supports vertex alpha
         * @param material material to use to draw the line. If not provided, will create a new one
         */
        constructor(name: string, scene?: Nullable<Scene>, parent?: Nullable<Node>, source?: Nullable<LinesMesh>, doNotCloneChildren?: boolean, 
        /**
         * If vertex color should be applied to the mesh
         */
        useVertexColor?: boolean | undefined, 
        /**
         * If vertex alpha should be applied to the mesh
         */
        useVertexAlpha?: boolean | undefined, material?: Material);
        /**
         * @returns the string "LineMesh"
         */
        getClassName(): string;
        /**
         * @internal
         */
        get material(): Nullable<Material>;
        /**
         * @internal
         */
        set material(value: Nullable<Material>);
        private _setInternalMaterial;
        /**
         * @internal
         */
        get checkCollisions(): boolean;
        set checkCollisions(value: boolean);
        /**
         * @internal
         */
        _bind(_subMesh: SubMesh, colorEffect: Effect): Mesh;
        /**
         * @internal
         */
        _draw(subMesh: SubMesh, fillMode: number, instancesCount?: number): Mesh;
        /**
         * Disposes of the line mesh (this disposes of the automatically created material if not instructed otherwise).
         * @param doNotRecurse If children should be disposed
         * @param disposeMaterialAndTextures This parameter is used to force disposing the material in case it is not the default one
         * @param doNotDisposeMaterial If the material should not be disposed (default: false, meaning the material might be disposed)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean, doNotDisposeMaterial?: boolean): void;
        /**
         * Returns a new LineMesh object cloned from the current one.
         * @param name defines the cloned mesh name
         * @param newParent defines the new mesh parent
         * @param doNotCloneChildren if set to true, none of the mesh children are cloned (false by default)
         * @returns the new mesh
         */
        clone(name: string, newParent?: Nullable<Node> | MeshCreationOptions, doNotCloneChildren?: boolean): LinesMesh;
        /**
         * Creates a new InstancedLinesMesh object from the mesh model.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances
         * @param name defines the name of the new instance
         * @returns a new InstancedLinesMesh
         */
        createInstance(name: string): InstancedLinesMesh;
        /**
         * Serializes this ground mesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized ground mesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the ground mesh in
         * @returns the created ground mesh
         */
        static Parse(parsedMesh: any, scene: Scene): LinesMesh;
    }
    /**
     * Creates an instance based on a source LinesMesh
     */
    export class InstancedLinesMesh extends InstancedMesh {
        /**
         * The intersection Threshold is the margin applied when intersection a segment of the LinesMesh with a Ray.
         * This margin is expressed in world space coordinates, so its value may vary.
         * Initialized with the intersectionThreshold value of the source LinesMesh
         */
        intersectionThreshold: number;
        constructor(name: string, source: LinesMesh);
        /**
         * @returns the string "InstancedLinesMesh".
         */
        getClassName(): string;
    }
    /**
     * Register side effects for linesMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLinesMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import linesMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Material plugin to add hardware accelerated lattice support
     * @see [webgl2](https://playground.babylonjs.com/#HBZD72#5)
     * @see [webgpu](https://playground.babylonjs.com/#HBZD72#6)
     */
    export class LatticePluginMaterial extends MaterialPluginBase {
        private _lattice;
        private _latticeDataTexture;
        private _latticeData;
        private _code;
        /**
         * Create a new LatticePluginMaterial
         * @param lattice defines the lattice this plugin is associated with
         * @param material defines the material this plugin is associated with
         */
        constructor(lattice: Lattice, material: Material);
        /**
         * Get the class name of the plugin
         * @returns the string "LatticePluginMaterial"
         */
        getClassName(): string;
        /**
         * Defines if the plugin supports the specified shader language
         * @param shaderLanguage defines the shader language to check
         * @returns true if supported, false otherwise
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        /**
         * Must be called when the lattice data was updated
         */
        refreshData(): void;
        /**
         * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)
         * @param shaderLanguage The shader language to use.
         * @returns the description of the uniforms
         */
        getUniforms(shaderLanguage?: ShaderLanguage): {
            ubo: {
                name: string;
                size: number;
                type: string;
                arraySize?: number;
            }[];
            vertex?: string;
            fragment?: string;
        };
        /**
         * Binds the material data.
         * @param uniformBuffer defines the Uniform buffer to fill in.
         */
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        /**
         * Gets the samplers used by the plugin.
         * @param samplers list that the sampler names should be added to.
         */
        getSamplers(samplers: string[]): void;
        private _prepareCode;
        /**
         * Returns a list of custom shader code fragments to customize the shader.
         * @param shaderType "vertex" or "fragment"
         * @param shaderLanguage The shader language to use.
         * @returns null if no code to be added, or a list of pointName =\> code.
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): {
            CUSTOM_VERTEX_DEFINITIONS: string;
            CUSTOM_VERTEX_UPDATE_POSITION: string;
        } | null;
        /**
         * Disposes the resources of the material.
         */
        dispose(): void;
    }


    /**
     * Interface used to define options for creating a lattice
     */
    export interface ILatticeOptions {
        /** resolution on x axis */
        resolutionX: number;
        /** resolution on y axis */
        resolutionY: number;
        /** resolution on z axis */
        resolutionZ: number;
        /** the lattice position in object space */
        position: Vector3;
        /** size of the lattice along each axis in object space */
        size: Vector3;
        /** Optional mesh to adapt the size to */
        autoAdaptToMesh?: Mesh;
    }
    /**
     * Class used to represent a lattice
     * @see [Moving lattice bounds](https://playground.babylonjs.com/#MDVD75#18)
     * @see [Twist](https://playground.babylonjs.com/#MDVD75#23)
     */
    export class Lattice {
        private _resolutionX;
        private _resolutionY;
        private _resolutionZ;
        private _position;
        private _size;
        private _cellSize;
        private _data;
        private _min;
        private _max;
        private _localPos;
        private _tmpVector;
        private _lerpVector0;
        private _lerpVector1;
        private _lerpVector2;
        private _lerpVector3;
        private _lerpVector4;
        private _lerpVector5;
        /**
         * @returns the string "Lattice"
         */
        getClassName(): string;
        /**
         * Gets the resolution on x axis
         */
        get resolutionX(): number;
        /**
         * Gets the resolution on y axis
         */
        get resolutionY(): number;
        /**
         * Gets the resolution on z axis
         */
        get resolutionZ(): number;
        /**
         * Gets the size of the lattice along each axis in object space
         * Updating the size requires you to call update afterwards
         */
        get size(): Vector3;
        /**
         * Gets the lattice position in object space
         */
        get position(): Vector3;
        /**
         * Gets the data of the lattice
         */
        get data(): Vector3[][][];
        /**
         * Gets the size of each cell in the lattice
         */
        get cellSize(): Vector3;
        /**
         * Gets the min bounds of the lattice
         */
        get min(): Vector3;
        /**
         * Gets the max bounds of the lattice
         */
        get max(): Vector3;
        /**
         * Creates a new Lattice
         * @param options options for creating
         */
        constructor(options?: Partial<ILatticeOptions>);
        private _allocateData;
        /**
         * Update of the lattice data
         */
        update(): void;
        /**
         * Apply the lattice to a mesh
         * @param mesh mesh to deform
         */
        deformMesh(mesh: Mesh): void;
        /**
         * Update the lattice internals (like min, max and cell size)
         */
        updateInternals(): void;
        /**
         * Apply the lattice to a set of points
         * @param positions vertex data to deform
         * @param target optional target array to store the result (operation will be done in place in not defined)
         */
        deform(positions: FloatArray, target?: FloatArray): void;
    }


        /** @internal */
        interface Mesh {
            /**
             * Register a custom buffer that will be instanced
             * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers
             * @param kind defines the buffer kind
             * @param stride defines the stride in floats
             */
            registerInstancedBuffer(kind: string, stride: number): void;
            /**
             * Invalidate VertexArrayObjects belonging to the mesh (but not to the Geometry of the mesh).
             */
            _invalidateInstanceVertexArrayObject(): void;
            /**
             * true to use the edge renderer for all instances of this mesh
             */
            edgesShareWithInstances: boolean;
            /** @internal */
            _userInstancedBuffersStorage: {
                /** @internal */
                data: {
                    [key: string]: Float32Array;
                };
                /** @internal */
                sizes: {
                    [key: string]: number;
                };
                /** @internal */
                vertexBuffers: {
                    [key: string]: Nullable<VertexBuffer>;
                };
                /** @internal */
                strides: {
                    [key: string]: number;
                };
                /** @internal */
                vertexArrayObjects?: {
                    [key: string]: WebGLVertexArrayObject;
                };
                /** @internal */
                renderPasses?: {
                    [renderPassId: number]: {
                        [kind: string]: Nullable<VertexBuffer>;
                    };
                };
            };
        }
        /** @internal */
        interface AbstractMesh {
            /**
             * Object used to store instanced buffers defined by user
             * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances#custom-buffers
             */
            instancedBuffers: {
                [key: string]: any;
            };
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Creates an instance based on a source mesh.
     */
    export class InstancedMesh extends AbstractMesh {
        private _sourceMesh;
        private _currentLOD;
        private _billboardWorldMatrix;
        /** @internal */
        _indexInSourceMeshInstanceArray: number;
        /** @internal */
        _distanceToCamera: number;
        /** @internal */
        _previousWorldMatrix: Nullable<Matrix>;
        /**
         * Creates a new InstancedMesh object from the mesh source.
         * @param name defines the name of the instance
         * @param source the mesh to create the instance from
         */
        constructor(name: string, source: Mesh);
        /**
         * @returns the string "InstancedMesh".
         */
        getClassName(): string;
        /** Gets the list of lights affecting that mesh */
        get lightSources(): Light[];
        /** @internal */
        _resyncLightSources(): void;
        /** @internal */
        _resyncLightSource(): void;
        /** @internal */
        _removeLightSource(): void;
        /**
         * If the source mesh receives shadows
         */
        get receiveShadows(): boolean;
        set receiveShadows(_value: boolean);
        /**
         * The material of the source mesh
         */
        get material(): Nullable<Material>;
        set material(_value: Nullable<Material>);
        /**
         * Visibility of the source mesh
         */
        get visibility(): number;
        set visibility(_value: number);
        /**
         * Skeleton of the source mesh
         */
        get skeleton(): Nullable<Skeleton>;
        set skeleton(_value: Nullable<Skeleton>);
        /**
         * Rendering ground id of the source mesh
         */
        get renderingGroupId(): number;
        set renderingGroupId(value: number);
        /**
         * @returns the total number of vertices (integer).
         */
        getTotalVertices(): number;
        /**
         * Returns a positive integer : the total number of indices in this mesh geometry.
         * @returns the number of indices or zero if the mesh has no geometry.
         */
        getTotalIndices(): number;
        /**
         * The source mesh of the instance
         */
        get sourceMesh(): Mesh;
        /**
         * Gets the mesh internal Geometry object
         */
        get geometry(): Nullable<Geometry>;
        /**
         * Creates a new InstancedMesh object from the mesh model.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances
         * @param name defines the name of the new instance
         * @returns a new InstancedMesh
         */
        createInstance(name: string): InstancedMesh;
        /**
         * Is this node ready to be used/rendered
         * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)
         * @returns is it ready
         */
        isReady(completeCheck?: boolean): boolean;
        /**
         * Returns an array of integers or a typed array (Int32Array, Uint32Array, Uint16Array) populated with the mesh indices.
         * @param kind kind of verticies to retrieve (eg. positions, normals, uvs, etc.)
         * @param copyWhenShared If true (default false) and and if the mesh geometry is shared among some other meshes, the returned array is a copy of the internal one.
         * @param forceCopy defines a boolean forcing the copy of the buffer no matter what the value of copyWhenShared is
         * @returns a float array or a Float32Array of the requested kind of data : positions, normals, uvs, etc.
         */
        getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray>;
        /** @internal */
        copyVerticesData(kind: string, vertexData: {
            [kind: string]: Float32Array;
        }): void;
        /** @internal */
        getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable<VertexBuffer>;
        /**
         * Sets the vertex data of the mesh geometry for the requested `kind`.
         * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.
         * The `data` are either a numeric array either a Float32Array.
         * The parameter `updatable` is passed as is to the underlying Geometry object constructor (if initially none) or updater.
         * The parameter `stride` is an optional positive integer, it is usually automatically deducted from the `kind` (3 for positions or normals, 2 for UV, etc).
         * Note that a new underlying VertexBuffer object is created each call.
         * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.
         *
         * Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         *
         * Returns the Mesh.
         * @param kind defines vertex data kind
         * @param data defines the data source
         * @param updatable defines if the data must be flagged as updatable (false as default)
         * @param stride defines the vertex stride (optional)
         * @returns the current mesh
         */
        setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh;
        /**
         * Updates the existing vertex data of the mesh geometry for the requested `kind`.
         * If the mesh has no geometry, it is simply returned as it is.
         * The `data` are either a numeric array either a Float32Array.
         * No new underlying VertexBuffer object is created.
         * If the `kind` is the `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.
         * If the parameter `makeItUnique` is true, a new global geometry is created from this positions and is set to the mesh.
         *
         * Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         *
         * Returns the Mesh.
         * @param kind defines vertex data kind
         * @param data defines the data source
         * @param updateExtends defines if extends info of the mesh must be updated (can be null). This is mostly useful for "position" kind
         * @param makeItUnique defines it the updated vertex buffer must be flagged as unique (false by default)
         * @returns the source mesh
         */
        updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): Mesh;
        /**
         * Sets the mesh indices.
         * Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array).
         * If the mesh has no geometry, a new Geometry object is created and set to the mesh.
         * This method creates a new index buffer each call.
         * Returns the Mesh.
         * @param indices the source data
         * @param totalVertices defines the total number of vertices referenced by indices (could be null)
         * @returns source mesh
         */
        setIndices(indices: IndicesArray, totalVertices?: Nullable<number>): Mesh;
        /**
         * Boolean : True if the mesh owns the requested kind of data.
         * @param kind defines which buffer to check (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @returns true if data kind is present
         */
        isVerticesDataPresent(kind: string): boolean;
        /**
         * @returns an array of indices (IndicesArray).
         */
        getIndices(): Nullable<IndicesArray>;
        /** @internal */
        get _positions(): Nullable<Vector3[]>;
        /** @internal */
        refreshBoundingInfo(applySkeletonOrOptions?: boolean | IMeshDataOptions, applyMorph?: boolean): InstancedMesh;
        /** @internal */
        _preActivate(): InstancedMesh;
        /**
         * @internal
         */
        _activate(renderId: number, intermediateRendering: boolean): boolean;
        /** @internal */
        _postActivate(): void;
        /** @internal */
        getWorldMatrix(): Matrix;
        /** @internal */
        get isAnInstance(): boolean;
        /**
         * Returns the current associated LOD AbstractMesh.
         * @param camera defines the camera to use to pick the LOD level
         * @returns a Mesh or `null` if no LOD is associated with the AbstractMesh
         */
        getLOD(camera: Camera): AbstractMesh;
        /**
         * @internal
         */
        _preActivateForIntermediateRendering(renderId: number): Mesh;
        /** @internal */
        _syncSubMeshes(): InstancedMesh;
        /** @internal */
        _generatePointsArray(): boolean;
        /** @internal */
        _updateBoundingInfo(): AbstractMesh;
        /**
         * Creates a new InstancedMesh from the current mesh.
         *
         * Returns the clone.
         * @param name the cloned mesh name
         * @param newParent the optional Node to parent the clone to.
         * @param doNotCloneChildren if `true` the model children aren't cloned.
         * @param newSourceMesh if set this mesh will be used as the source mesh instead of ths instance's one
         * @returns the clone
         */
        clone(name: string, newParent?: Nullable<Node>, doNotCloneChildren?: boolean, newSourceMesh?: Mesh): InstancedMesh;
        /**
         * Disposes the InstancedMesh.
         * Returns nothing.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * @internal
         */
        _serializeAsParent(serializationObject: any): void;
        /**
         * Instantiate (when possible) or clone that node with its hierarchy
         * @param newParent defines the new parent to use for the instance (or clone)
         * @param options defines options to configure how copy is done
         * @param onNewNodeCreated defines an option callback to call when a clone or an instance is created
         * @returns an instance (or a clone) of the current node with its hierarchy
         */
        instantiateHierarchy(newParent?: Nullable<TransformNode>, options?: {
            doNotInstantiate: boolean | ((node: TransformNode) => boolean);
            newSourcedMesh?: Mesh;
        }, onNewNodeCreated?: (source: TransformNode, clone: TransformNode) => void): Nullable<TransformNode>;
    }
    /**
     * Register side effects for instancedMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstancedMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instancedMesh.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Mesh representing the ground
     */
    export class GroundMesh extends Mesh {
        /** If octree should be generated */
        generateOctree: boolean;
        private _heightQuads;
        /** @internal */
        _subdivisionsX: number;
        /** @internal */
        _subdivisionsY: number;
        /** @internal */
        _width: number;
        /** @internal */
        _height: number;
        /** @internal */
        _minX: number;
        /** @internal */
        _maxX: number;
        /** @internal */
        _minZ: number;
        /** @internal */
        _maxZ: number;
        /** @internal */
        constructor(name: string, scene?: Scene);
        /**
         * "GroundMesh"
         * @returns "GroundMesh"
         */
        getClassName(): string;
        /**
         * The minimum of x and y subdivisions
         */
        get subdivisions(): number;
        /**
         * X subdivisions
         */
        get subdivisionsX(): number;
        /**
         * Y subdivisions
         */
        get subdivisionsY(): number;
        /**
         * This function will divide the mesh into submeshes and update an octree to help to select the right submeshes
         * for rendering, picking and collision computations. Please note that you must have a decent number of submeshes
         * to get performance improvements when using an octree.
         * @param chunksCount the number of submeshes the mesh will be divided into
         * @param octreeBlocksSize the maximum size of the octree blocks (Default: 32)
         */
        optimize(chunksCount: number, octreeBlocksSize?: number): void;
        /**
         * Returns a height (y) value in the World system :
         * the ground altitude at the coordinates (x, z) expressed in the World system.
         * @param x x coordinate
         * @param z z coordinate
         * @returns the ground y position if (x, z) are outside the ground surface.
         */
        getHeightAtCoordinates(x: number, z: number): number;
        /**
         * Returns a normalized vector (Vector3) orthogonal to the ground
         * at the ground coordinates (x, z) expressed in the World system.
         * @param x x coordinate
         * @param z z coordinate
         * @returns Vector3(0.0, 1.0, 0.0) if (x, z) are outside the ground surface.
         */
        getNormalAtCoordinates(x: number, z: number): Vector3;
        /**
         * Updates the Vector3 passed a reference with a normalized vector orthogonal to the ground
         * at the ground coordinates (x, z) expressed in the World system.
         * Doesn't update the reference Vector3 if (x, z) are outside the ground surface.
         * @param x x coordinate
         * @param z z coordinate
         * @param ref vector to store the result
         * @returns the GroundMesh.
         */
        getNormalAtCoordinatesToRef(x: number, z: number, ref: Vector3): GroundMesh;
        /**
         * Force the heights to be recomputed for getHeightAtCoordinates() or getNormalAtCoordinates()
         * if the ground has been updated.
         * This can be used in the render loop.
         * @returns the GroundMesh.
         */
        updateCoordinateHeights(): GroundMesh;
        private _getFacetAt;
        private _initHeightQuads;
        private _computeHeightQuads;
        /**
         * Serializes this ground mesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized ground mesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the ground mesh in
         * @returns the created ground mesh
         */
        static Parse(parsedMesh: any, scene: Scene): GroundMesh;
    }
    /**
     * Register side effects for groundMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGroundMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import groundMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the set of goldberg data used to create the polygon
     */
    export type GoldbergData = {
        /**
         * The list of Goldberg faces colors
         */
        faceColors: Color4[];
        /**
         * The list of Goldberg faces centers
         */
        faceCenters: Vector3[];
        /**
         * The list of Goldberg faces Z axis
         */
        faceZaxis: Vector3[];
        /**
         * The list of Goldberg faces Y axis
         */
        faceXaxis: Vector3[];
        /**
         * The list of Goldberg faces X axis
         */
        faceYaxis: Vector3[];
        /**
         * Defines the number of shared faces
         */
        nbSharedFaces: number;
        /**
         * Defines the number of unshared faces
         */
        nbUnsharedFaces: number;
        /**
         * Defines the total number of goldberg faces
         */
        nbFaces: number;
        /**
         * Defines the number of goldberg faces at the pole
         */
        nbFacesAtPole: number;
        /**
         * Defines the number of adjacent faces per goldberg faces
         */
        adjacentFaces: number[][];
    };
    /**
     * Mesh for a Goldberg Polyhedron which is made from 12 pentagonal and the rest hexagonal faces
     * @see https://en.wikipedia.org/wiki/Goldberg_polyhedron
     */
    export class GoldbergMesh extends Mesh {
        /**
         * Defines the specific Goldberg data used in this mesh construction.
         */
        goldbergData: GoldbergData;
        /**
         * Gets the related Goldberg face from pole infos
         * @param poleOrShared Defines the pole index or the shared face index if the fromPole parameter is passed in
         * @param fromPole Defines an optional pole index to find the related info from
         * @returns the goldberg face number
         */
        relatedGoldbergFace(poleOrShared: number, fromPole?: number): number;
        private _changeGoldbergFaceColors;
        /**
         * Set new goldberg face colors
         * @param colorRange the new color to apply to the mesh
         */
        setGoldbergFaceColors(colorRange: (number | Color4)[][]): void;
        /**
         * Updates new goldberg face colors
         * @param colorRange the new color to apply to the mesh
         */
        updateGoldbergFaceColors(colorRange: (number | Color4)[][]): void;
        private _changeGoldbergFaceUVs;
        /**
         * set new goldberg face UVs
         * @param uvRange the new UVs to apply to the mesh
         */
        setGoldbergFaceUVs(uvRange: (number | Vector2)[][]): void;
        /**
         * Updates new goldberg face UVs
         * @param uvRange the new UVs to apply to the mesh
         */
        updateGoldbergFaceUVs(uvRange: (number | Vector2)[][]): void;
        /**
         * Places a mesh on a particular face of the goldberg polygon
         * @param mesh Defines the mesh to position
         * @param face Defines the face to position onto
         * @param position Defines the position relative to the face we are positioning the mesh onto
         */
        placeOnGoldbergFaceAt(mesh: Mesh, face: number, position: Vector3): void;
        /**
         * Serialize current mesh
         * @param serializationObject defines the object which will receive the serialization data
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized goldberg mesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the goldberg mesh in
         * @returns the created goldberg mesh
         */
        static Parse(parsedMesh: any, scene: Scene): GoldbergMesh;
    }
    /**
     * Register side effects for goldbergMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGoldbergMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import goldbergMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to store geometry data (vertex buffers + index buffer)
     */
    export class Geometry implements IGetSetVerticesData {
        /**
         * Gets or sets the ID of the geometry
         */
        id: string;
        /**
         * Gets or sets the unique ID of the geometry
         */
        uniqueId: number;
        /**
         * Gets the delay loading state of the geometry (none by default which means not delayed)
         */
        delayLoadState: number;
        /**
         * Gets the file containing the data to load when running in delay load state
         */
        delayLoadingFile: Nullable<string>;
        /**
         * Callback called when the geometry is updated
         */
        onGeometryUpdated: (geometry: Geometry, kind?: string) => void;
        private _scene;
        private _engine;
        private _meshes;
        private _totalVertices;
        private _totalIndices?;
        /** @internal */
        _loadedUniqueId: string;
        /** @internal */
        _indices: IndicesArray;
        /** @internal */
        _vertexBuffers: {
            [key: string]: VertexBuffer;
        };
        private _isDisposed;
        private _extend;
        private _boundingBias;
        /** @internal */
        _delayInfo: Array<string>;
        private _indexBuffer;
        private _indexBufferIsUpdatable;
        /** @internal */
        _boundingInfo: Nullable<BoundingInfo>;
        /** @internal */
        _delayLoadingFunction: Nullable<(any: any, geometry: Geometry) => void>;
        /** @internal */
        _softwareSkinningFrameId: number;
        private _vertexArrayObjects;
        private _updatable;
        /** @internal */
        _positions: Nullable<Vector3[]>;
        private _positionsCache;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /**
         *  Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y
         */
        get boundingBias(): Vector2;
        /**
         *  Gets or sets the Bias Vector to apply on the bounding elements (box/sphere), the max extend is computed as v += v * bias.x + bias.y, the min is computed as v -= v * bias.x + bias.y
         */
        set boundingBias(value: Vector2);
        /**
         * Static function used to attach a new empty geometry to a mesh
         * @param mesh defines the mesh to attach the geometry to
         * @returns the new Geometry
         */
        static CreateGeometryForMesh(mesh: Mesh): Geometry;
        /** Get the list of meshes using this geometry */
        get meshes(): Mesh[];
        /**
         * If set to true (false by default), the bounding info applied to the meshes sharing this geometry will be the bounding info defined at the class level
         * and won't be computed based on the vertex positions (which is what we get when useBoundingInfoFromGeometry = false)
         */
        useBoundingInfoFromGeometry: boolean;
        /**
         * Creates a new geometry
         * @param id defines the unique ID
         * @param scene defines the hosting scene
         * @param vertexData defines the VertexData used to get geometry data
         * @param updatable defines if geometry must be updatable (false by default)
         * @param mesh defines the mesh that will be associated with the geometry
         * @param totalVertices defines the total number of vertices (optional)
         */
        constructor(id: string, scene?: Scene, vertexData?: VertexData, updatable?: boolean, mesh?: Nullable<Mesh>, totalVertices?: Nullable<number>);
        /**
         * Gets the current extend of the geometry
         */
        get extend(): {
            minimum: Vector3;
            maximum: Vector3;
        };
        /**
         * Gets the hosting scene
         * @returns the hosting Scene
         */
        getScene(): Scene;
        /**
         * Gets the hosting engine
         * @returns the hosting Engine
         */
        getEngine(): AbstractEngine;
        /**
         * Defines if the geometry is ready to use
         * @returns true if the geometry is ready to be used
         */
        isReady(): boolean;
        /**
         * Gets a value indicating that the geometry should not be serialized
         */
        get doNotSerialize(): boolean;
        /** @internal */
        _rebuild(): void;
        /**
         * Affects all geometry data in one call
         * @param vertexData defines the geometry data
         * @param updatable defines if the geometry must be flagged as updatable (false as default)
         */
        setAllVerticesData(vertexData: VertexData, updatable?: boolean): void;
        /**
         * Set specific vertex data
         * @param kind defines the data kind (Position, normal, etc...)
         * @param data defines the vertex data to use
         * @param updatable defines if the vertex must be flagged as updatable (false as default)
         * @param stride defines the stride to use (0 by default). This value is deduced from the kind value if not specified
         */
        setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): void;
        /**
         * Removes a specific vertex data
         * @param kind defines the data kind (Position, normal, etc...)
         */
        removeVerticesData(kind: string): void;
        /**
         * Affect a vertex buffer to the geometry. the vertexBuffer.getKind() function is used to determine where to store the data
         * @param buffer defines the vertex buffer to use
         * @param totalVertices defines the total number of vertices for position kind (could be null)
         * @param disposeExistingBuffer disposes the existing buffer, if any (default: true)
         */
        setVerticesBuffer(buffer: VertexBuffer, totalVertices?: Nullable<number>, disposeExistingBuffer?: boolean): void;
        /**
         * Update a specific vertex buffer
         * This function will directly update the underlying DataBuffer according to the passed numeric array or Float32Array
         * It will do nothing if the buffer is not updatable
         * @param kind defines the data kind (Position, normal, etc...)
         * @param data defines the data to use
         * @param offset defines the offset in the target buffer where to store the data
         * @param useBytes set to true if the offset is in bytes
         */
        updateVerticesDataDirectly(kind: string, data: DataArray, offset: number, useBytes?: boolean): void;
        /**
         * Update a specific vertex buffer
         * This function will create a new buffer if the current one is not updatable
         * @param kind defines the data kind (Position, normal, etc...)
         * @param data defines the data to use
         * @param updateExtends defines if the geometry extends must be recomputed (false by default)
         */
        updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean): void;
        private _updateBoundingInfo;
        /**
         * @internal
         */
        _bind(effect: Nullable<Effect>, indexToBind?: Nullable<DataBuffer>, overrideVertexBuffers?: {
            [kind: string]: Nullable<VertexBuffer>;
        }, overrideVertexArrayObjects?: {
            [key: string]: WebGLVertexArrayObject;
        }): void;
        /**
         * Gets total number of vertices
         * @returns the total number of vertices
         */
        getTotalVertices(): number;
        /**
         * Gets a specific vertex data attached to this geometry. Float data is constructed if the vertex buffer data cannot be returned directly.
         * @param kind defines the data kind (Position, normal, etc...)
         * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes
         * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it
         * @returns a float array containing vertex data
         */
        getVerticesData(kind: string, copyWhenShared?: boolean, forceCopy?: boolean): Nullable<FloatArray>;
        /**
         * Copies the requested vertex data kind into the given vertex data map. Float data is constructed if the map doesn't have the data.
         * @param kind defines the data kind (Position, normal, etc...)
         * @param vertexData defines the map that stores the resulting data
         */
        copyVerticesData(kind: string, vertexData: {
            [kind: string]: Float32Array;
        }): void;
        /**
         * Returns a boolean defining if the vertex data for the requested `kind` is updatable
         * @param kind defines the data kind (Position, normal, etc...)
         * @returns true if the vertex buffer with the specified kind is updatable
         */
        isVertexBufferUpdatable(kind: string): boolean;
        /**
         * Gets a specific vertex buffer
         * @param kind defines the data kind (Position, normal, etc...)
         * @returns a VertexBuffer
         */
        getVertexBuffer(kind: string): Nullable<VertexBuffer>;
        /**
         * Returns all vertex buffers
         * @returns an object holding all vertex buffers indexed by kind
         */
        getVertexBuffers(): Nullable<{
            [key: string]: VertexBuffer;
        }>;
        /**
         * Gets a boolean indicating if specific vertex buffer is present
         * @param kind defines the data kind (Position, normal, etc...)
         * @returns true if data is present
         */
        isVerticesDataPresent(kind: string): boolean;
        /**
         * Gets a list of all attached data kinds (Position, normal, etc...)
         * @returns a list of string containing all kinds
         */
        getVerticesDataKinds(): string[];
        /**
         * Update index buffer
         * @param indices defines the indices to store in the index buffer
         * @param offset defines the offset in the target buffer where to store the data
         * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)
         */
        updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly?: boolean): void;
        /**
         * Sets the index buffer for this geometry.
         * @param indexBuffer Defines the index buffer to use for this geometry
         * @param totalVertices Defines the total number of vertices used by the buffer
         * @param totalIndices Defines the total number of indices in the index buffer
         * @param is32Bits Defines if the indices are 32 bits. If null (default), the value is guessed from the number of vertices
         */
        setIndexBuffer(indexBuffer: DataBuffer, totalVertices: number, totalIndices: number, is32Bits?: Nullable<boolean>): void;
        /**
         * Creates a new index buffer
         * @param indices defines the indices to store in the index buffer
         * @param totalVertices defines the total number of vertices (could be null)
         * @param updatable defines if the index buffer must be flagged as updatable (false by default)
         * @param dontForceSubMeshRecreation defines a boolean indicating that we don't want to force the recreation of sub-meshes if we don't have to (false by default)
         */
        setIndices(indices: IndicesArray, totalVertices?: Nullable<number>, updatable?: boolean, dontForceSubMeshRecreation?: boolean): void;
        /**
         * Return the total number of indices
         * @returns the total number of indices
         */
        getTotalIndices(): number;
        /**
         * Gets the index buffer array
         * @param copyWhenShared defines if the returned array must be cloned upon returning it if the current geometry is shared between multiple meshes
         * @param forceCopy defines a boolean indicating that the returned array must be cloned upon returning it
         * @returns the index buffer array
         */
        getIndices(copyWhenShared?: boolean, forceCopy?: boolean): Nullable<IndicesArray>;
        /**
         * Gets the index buffer
         * @returns the index buffer
         */
        getIndexBuffer(): Nullable<DataBuffer>;
        /**
         * @internal
         */
        _releaseVertexArrayObject(effect?: Nullable<Effect>): void;
        /**
         * Release the associated resources for a specific mesh
         * @param mesh defines the source mesh
         * @param shouldDispose defines if the geometry must be disposed if there is no more mesh pointing to it
         */
        releaseForMesh(mesh: Mesh, shouldDispose?: boolean): void;
        /**
         * Apply current geometry to a given mesh
         * @param mesh defines the mesh to apply geometry to
         */
        applyToMesh(mesh: Mesh): void;
        private _updateExtend;
        private _applyToMesh;
        private _notifyUpdate;
        /**
         * Load the geometry if it was flagged as delay loaded
         * @param scene defines the hosting scene
         * @param onLoaded defines a callback called when the geometry is loaded
         */
        load(scene: Scene, onLoaded?: () => void): void;
        private _queueLoad;
        /**
         * Invert the geometry to move from a right handed system to a left handed one.
         */
        toLeftHanded(): void;
        /** @internal */
        _resetPointsArrayCache(): void;
        /** @internal */
        _generatePointsArray(): boolean;
        /**
         * Gets a value indicating if the geometry is disposed
         * @returns true if the geometry was disposed
         */
        isDisposed(): boolean;
        private _disposeVertexArrayObjects;
        /**
         * Free all associated resources
         */
        dispose(): void;
        /**
         * Clone the current geometry into a new geometry
         * @param id defines the unique ID of the new geometry
         * @returns a new geometry object
         */
        copy(id: string): Geometry;
        /**
         * Serialize the current geometry info (and not the vertices data) into a JSON object
         * @returns a JSON representation of the current geometry data (without the vertices data)
         */
        serialize(): any;
        private _toNumberArray;
        /**
         * Release any memory retained by the cached data on the Geometry.
         *
         * Call this function to reduce memory footprint of the mesh.
         * Vertex buffers will not store CPU data anymore (this will prevent picking, collisions or physics to work correctly)
         */
        clearCachedData(): void;
        /**
         * Serialize all vertices data into a JSON object
         * @returns a JSON representation of the current geometry data
         */
        serializeVerticeData(): any;
        /**
         * Extracts a clone of a mesh geometry
         * @param mesh defines the source mesh
         * @param id defines the unique ID of the new geometry object
         * @returns the new geometry object
         */
        static ExtractFromMesh(mesh: Mesh, id: string): Nullable<Geometry>;
        /**
         * You should now use Tools.RandomId(), this method is still here for legacy reasons.
         * Implementation from http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#answer-2117523
         * Be aware Math.random() could cause collisions, but:
         * "All but 6 of the 128 bits of the ID are randomly generated, which means that for any two ids, there's a 1 in 2^^122 (or 5.3x10^^36) chance they'll collide"
         * @returns a string containing a new GUID
         */
        static RandomId(): string;
        private static _GetGeometryByLoadedUniqueId;
        /**
         * @internal
         */
        static _ImportGeometry(parsedGeometry: any, mesh: Mesh): void;
        private static _CleanMatricesWeights;
        /**
         * Create a new geometry from persisted data (Using .babylon file format)
         * @param parsedVertexData defines the persisted data
         * @param scene defines the hosting scene
         * @param rootUrl defines the root url to use to load assets (like delayed data)
         * @returns the new geometry object
         */
        static Parse(parsedVertexData: any, scene: Scene, rootUrl: string): Nullable<Geometry>;
    }


    /**
     * Class representing data for one face OAB of an equilateral icosahedron
     * When O is the isovector (0, 0), A is isovector (m, n)
     * @internal
     */
    export class _PrimaryIsoTriangle {
        /** @internal */
        m: number;
        /** @internal */
        n: number;
        /** @internal */
        cartesian: Vector3[];
        /** @internal */
        vertices: _IsoVector[];
        /** @internal */
        max: number[];
        /** @internal */
        min: number[];
        /** @internal */
        vecToidx: {
            [key: string]: number;
        };
        /** @internal */
        vertByDist: {
            [key: string]: number[];
        };
        /** @internal */
        closestTo: number[][];
        /** @internal */
        innerFacets: string[][];
        /** @internal */
        isoVecsABOB: _IsoVector[][];
        /** @internal */
        isoVecsOBOA: _IsoVector[][];
        /** @internal */
        isoVecsBAOA: _IsoVector[][];
        /** @internal */
        vertexTypes: number[][];
        /** @internal */
        coau: number;
        /** @internal */
        cobu: number;
        /** @internal */
        coav: number;
        /** @internal */
        cobv: number;
        /** @internal */
        IDATA: PolyhedronData;
        /**
         * Creates the PrimaryIsoTriangle Triangle OAB
         * @param m an integer
         * @param n an integer
         */
        setIndices(): void;
        /** @internal */
        calcCoeffs(): void;
        /** @internal */
        createInnerFacets(): void;
        /** @internal */
        edgeVecsABOB(): void;
        /** @internal */
        mapABOBtoOBOA(): void;
        /** @internal */
        mapABOBtoBAOA(): void;
        /** @internal */
        MapToFace(faceNb: number, geodesicData: PolyhedronData): void;
        /**Creates a primary triangle
         * @internal
         */
        build(m: number, n: number): this;
    }
    /** Builds Polyhedron Data
     * @internal
     */
    export class PolyhedronData {
        /**
         * The name of the polyhedron
         */
        name: string;
        /**
         * The category of the polyhedron
         */
        category: string;
        /**
         * vertex data
         */
        vertex: number[][];
        /**
         * face data
         */
        face: number[][];
        /**
         * @internal
         */
        edgematch: (number | string)[][];
        /** @internal */
        constructor(
        /**
         * The name of the polyhedron
         */
        name: string, 
        /**
         * The category of the polyhedron
         */
        category: string, 
        /**
         * vertex data
         */
        vertex: number[][], 
        /**
         * face data
         */
        face: number[][]);
    }
    /**
     * This class Extends the PolyhedronData Class to provide measures for a Geodesic Polyhedron
     */
    export class GeodesicData extends PolyhedronData {
        /**
         * @internal
         */
        edgematch: (number | string)[][];
        /**
         * @internal
         */
        adjacentFaces: number[][];
        /**
         * @internal
         */
        sharedNodes: number;
        /**
         * @internal
         */
        poleNodes: number;
        /**
         * @internal
         */
        innerToData(face: number, primTri: _PrimaryIsoTriangle): void;
        /**
         * @internal
         */
        mapABOBtoDATA(faceNb: number, primTri: _PrimaryIsoTriangle): void;
        /**
         * @internal
         */
        mapOBOAtoDATA(faceNb: number, primTri: _PrimaryIsoTriangle): void;
        /**
         * @internal
         */
        mapBAOAtoDATA(faceNb: number, primTri: _PrimaryIsoTriangle): void;
        /**
         * @internal
         */
        orderData(primTri: _PrimaryIsoTriangle): void;
        /**
         * @internal
         */
        setOrder(m: number, faces: number[]): number[];
        /**
         * @internal
         */
        toGoldbergPolyhedronData(): PolyhedronData;
        /**Builds the data for a Geodesic Polyhedron from a primary triangle
         * @param primTri the primary triangle
         * @internal
         */
        static BuildGeodesicData(primTri: _PrimaryIsoTriangle): GeodesicData;
    }


    /**
     * Interface to customize the Manifold library import
     */
    export interface ICSG2Options {
        /**
         * Custom manifold URL
         */
        manifoldUrl?: string;
        /**
         * Custom manifold instance
         */
        manifoldInstance: any;
        /**
         * Custom manifold mesh instance
         */
        manifoldMeshInstance: any;
    }
    /**
     * Interface to customize the mesh rebuild options
     */
    export interface IMeshRebuildOptions {
        /**
         * Rebuild normals
         */
        rebuildNormals?: boolean;
        /**
         * True to center the mesh on 0,0,0
         */
        centerMesh?: boolean;
        /**
         * Defines a material to use for that mesh. When not defined the system will either reuse the one from the source or create a multimaterial if several materials were involved
         */
        materialToUse?: Material;
    }
    /**
     * Interface to customize the vertex data rebuild options
     */
    export interface IVertexDataRebuildOptions {
        /**
         * Rebuild normals
         */
        rebuildNormals?: boolean;
    }
    /**
     * Wrapper around the Manifold library
     * https://manifoldcad.org/
     * Use this class to perform fast boolean operations on meshes
     * @see [basic operations](https://playground.babylonjs.com/#IW43EB#15)
     * @see [skull vs box](https://playground.babylonjs.com/#JUKXQD#6218)
     * @see [skull vs vertex data](https://playground.babylonjs.com/#JUKXQD#6219)
     */
    export class CSG2 implements IDisposable {
        private _manifold;
        private _numProp;
        private _vertexStructure;
        /**
         * Return the size of a vertex (at least 3 for the position)
         */
        get numProp(): number;
        private constructor();
        private _process;
        /**
         * Run a difference operation between two CSG
         * @param csg defines the CSG to use to create the difference
         * @returns a new csg
         */
        subtract(csg: CSG2): CSG2;
        /**
         * Run an intersection operation between two CSG
         * @param csg defines the CSG to use to create the intersection
         * @returns a new csg
         */
        intersect(csg: CSG2): CSG2;
        /**
         * Run an union operation between two CSG
         * @param csg defines the CSG to use to create the union
         * @returns a new csg
         */
        add(csg: CSG2): CSG2;
        /**
         * Print debug information about the CSG
         */
        printDebug(): void;
        /**
         * Generate a vertex data from the CSG
         * @param options defines the options to use to rebuild the vertex data
         * @returns a new vertex data
         */
        toVertexData(options?: Partial<IVertexDataRebuildOptions>): VertexData;
        /**
         * Generate a mesh from the CSG
         * @param name defines the name of the mesh
         * @param scene defines the scene to use to create the mesh
         * @param options defines the options to use to rebuild the mesh
         * @returns a new Mesh
         */
        toMesh(name: string, scene?: Scene, options?: Partial<IMeshRebuildOptions>): Mesh;
        /**
         * Dispose the CSG resources
         */
        dispose(): void;
        private static _ProcessData;
        private static _Construct;
        /**
         * Create a new Constructive Solid Geometry from a vertexData
         * @param vertexData defines the vertexData to use to create the CSG
         * @returns a new CSG2 class
         */
        static FromVertexData(vertexData: VertexData): CSG2;
        /**
         * Create a new Constructive Solid Geometry from a mesh
         * @param mesh defines the mesh to use to create the CSG
         * @param ignoreWorldMatrix defines if the world matrix should be ignored
         * @returns a new CSG2 class
         */
        static FromMesh(mesh: Mesh, ignoreWorldMatrix?: boolean): CSG2;
    }
    /**
     * Checks if the Manifold library is ready
     * @returns true if the Manifold library is ready
     */
    export function IsCSG2Ready(): boolean;
    /**
     * Initialize the Manifold library
     * @param options defines the options to use to initialize the library
     */
    export function InitializeCSG2Async(options?: Partial<ICSG2Options>): Promise<void>;


    /**
     * Represents a vertex of a polygon. Use your own vertex class instead of this
     * one to provide additional features like texture coordinates and vertex
     * colors. Custom vertex classes need to provide a `pos` property and `clone()`,
     * `flip()`, and `interpolate()` methods that behave analogous to the ones
     * defined by `BABYLON.CSG.Vertex`. This class provides `normal` so convenience
     * functions like `BABYLON.CSG.sphere()` can return a smooth vertex normal, but `normal`
     * is not used anywhere else.
     * Same goes for uv, it allows to keep the original vertex uv coordinates of the 2 meshes
     */
    class Vertex {
        /**
         * The position of the vertex
         */
        pos: Vector3;
        /**
         * The normal of the vertex
         */
        normal: Vector3;
        /**
         * The texture coordinate of the vertex
         */
        uv?: Vector2 | undefined;
        /**
         * The texture coordinate of the vertex
         */
        vertColor?: Color4 | undefined;
        /**
         * Initializes the vertex
         * @param pos The position of the vertex
         * @param normal The normal of the vertex
         * @param uv The texture coordinate of the vertex
         * @param vertColor The RGBA color of the vertex
         */
        constructor(
        /**
         * The position of the vertex
         */
        pos: Vector3, 
        /**
         * The normal of the vertex
         */
        normal: Vector3, 
        /**
         * The texture coordinate of the vertex
         */
        uv?: Vector2 | undefined, 
        /**
         * The texture coordinate of the vertex
         */
        vertColor?: Color4 | undefined);
        /**
         * Make a clone, or deep copy, of the vertex
         * @returns A new Vertex
         */
        clone(): Vertex;
        /**
         * Invert all orientation-specific data (e.g. vertex normal). Called when the
         * orientation of a polygon is flipped.
         */
        flip(): void;
        /**
         * Create a new vertex between this vertex and `other` by linearly
         * interpolating all properties using a parameter of `t`. Subclasses should
         * override this to interpolate additional properties.
         * @param other the vertex to interpolate against
         * @param t The factor used to linearly interpolate between the vertices
         * @returns The new interpolated vertex
         */
        interpolate(other: Vertex, t: number): Vertex;
    }
    /**
     * Represents a plane in 3D space.
     */
    class CSGPlane {
        normal: Vector3;
        w: number;
        /**
         * Initializes the plane
         * @param normal The normal for the plane
         * @param w
         */
        constructor(normal: Vector3, w: number);
        /**
         * `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a
         * point is on the plane
         */
        static EPSILON: number;
        /**
         * Construct a plane from three points
         * @param a Point a
         * @param b Point b
         * @param c Point c
         * @returns A new plane
         */
        static FromPoints(a: Vector3, b: Vector3, c: Vector3): Nullable<CSGPlane>;
        /**
         * Clone, or make a deep copy of the plane
         * @returns a new Plane
         */
        clone(): CSGPlane;
        /**
         * Flip the face of the plane
         */
        flip(): void;
        /**
         * Split `polygon` by this plane if needed, then put the polygon or polygon
         * fragments in the appropriate lists. Coplanar polygons go into either
        `* coplanarFront` or `coplanarBack` depending on their orientation with
         * respect to this plane. Polygons in front or in back of this plane go into
         * either `front` or `back`
         * @param polygon The polygon to be split
         * @param coplanarFront Will contain polygons coplanar with the plane that are oriented to the front of the plane
         * @param coplanarBack Will contain polygons coplanar with the plane that are oriented to the back of the plane
         * @param front Will contain the polygons in front of the plane
         * @param back Will contain the polygons begind the plane
         */
        splitPolygon(polygon: CSGPolygon, coplanarFront: CSGPolygon[], coplanarBack: CSGPolygon[], front: CSGPolygon[], back: CSGPolygon[]): void;
    }
    /**
     * Represents a convex polygon. The vertices used to initialize a polygon must
     * be coplanar and form a convex loop.
     *
     * Each convex polygon has a `shared` property, which is shared between all
     * polygons that are clones of each other or were split from the same polygon.
     * This can be used to define per-polygon properties (such as surface color)
     */
    class CSGPolygon {
        /**
         * Vertices of the polygon
         */
        vertices: Vertex[];
        /**
         * Properties that are shared across all polygons
         */
        shared: any;
        /**
         * A plane formed from the vertices of the polygon
         */
        plane: CSGPlane;
        /**
         * Initializes the polygon
         * @param vertices The vertices of the polygon
         * @param shared The properties shared across all polygons
         */
        constructor(vertices: Vertex[], shared: any);
        /**
         * Clones, or makes a deep copy, or the polygon
         * @returns A new CSGPolygon
         */
        clone(): CSGPolygon;
        /**
         * Flips the faces of the polygon
         */
        flip(): void;
    }
    /**
     * Class for building Constructive Solid Geometry
     * @deprecated Please use CSG2 instead
     */
    export class CSG {
        private _polygons;
        /**
         * The world matrix
         */
        matrix: Matrix;
        /**
         * Stores the position
         */
        position: Vector3;
        /**
         * Stores the rotation
         */
        rotation: Vector3;
        /**
         * Stores the rotation quaternion
         */
        rotationQuaternion: Nullable<Quaternion>;
        /**
         * Stores the scaling vector
         */
        scaling: Vector3;
        /**
         * Convert a VertexData to CSG
         * @param data defines the VertexData to convert to CSG
         * @returns the new CSG
         */
        static FromVertexData(data: VertexData): CSG;
        /**
         * Convert the Mesh to CSG
         * @param mesh The Mesh to convert to CSG
         * @param absolute If true, the final (local) matrix transformation is set to the identity and not to that of `mesh`. It can help when dealing with right-handed meshes (default: false)
         * @returns A new CSG from the Mesh
         */
        static FromMesh(mesh: Mesh, absolute?: boolean): CSG;
        /**
         * Construct a CSG solid from a list of `CSG.Polygon` instances.
         * @param polygons Polygons used to construct a CSG solid
         * @returns A new CSG solid
         */
        private static _FromPolygons;
        /**
         * Clones, or makes a deep copy, of the CSG
         * @returns A new CSG
         */
        clone(): CSG;
        /**
         * Unions this CSG with another CSG
         * @param csg The CSG to union against this CSG
         * @returns The unioned CSG
         */
        union(csg: CSG): CSG;
        /**
         * Unions this CSG with another CSG in place
         * @param csg The CSG to union against this CSG
         */
        unionInPlace(csg: CSG): void;
        /**
         * Subtracts this CSG with another CSG
         * @param csg The CSG to subtract against this CSG
         * @returns A new CSG
         */
        subtract(csg: CSG): CSG;
        /**
         * Subtracts this CSG with another CSG in place
         * @param csg The CSG to subtract against this CSG
         */
        subtractInPlace(csg: CSG): void;
        /**
         * Intersect this CSG with another CSG
         * @param csg The CSG to intersect against this CSG
         * @returns A new CSG
         */
        intersect(csg: CSG): CSG;
        /**
         * Intersects this CSG with another CSG in place
         * @param csg The CSG to intersect against this CSG
         */
        intersectInPlace(csg: CSG): void;
        /**
         * Return a new CSG solid with solid and empty space switched. This solid is
         * not modified.
         * @returns A new CSG solid with solid and empty space switched
         */
        inverse(): CSG;
        /**
         * Inverses the CSG in place
         */
        inverseInPlace(): void;
        /**
         * This is used to keep meshes transformations so they can be restored
         * when we build back a Babylon Mesh
         * NB : All CSG operations are performed in world coordinates
         * @param csg The CSG to copy the transform attributes from
         * @returns This CSG
         */
        copyTransformAttributes(csg: CSG): CSG;
        /**
         * Build vertex data from CSG
         * Coordinates here are in world space
         * @param onBeforePolygonProcessing called before each polygon is being processed
         * @param onAfterPolygonProcessing called after each polygon has been processed
         * @returns the final vertex data
         */
        toVertexData(onBeforePolygonProcessing?: Nullable<(polygon: CSGPolygon) => void>, onAfterPolygonProcessing?: Nullable<() => void>): VertexData;
        /**
         * Build Raw mesh from CSG
         * Coordinates here are in world space
         * @param name The name of the mesh geometry
         * @param scene The Scene
         * @param keepSubMeshes Specifies if the submeshes should be kept
         * @returns A new Mesh
         */
        buildMeshGeometry(name: string, scene?: Scene, keepSubMeshes?: boolean): Mesh;
        /**
         * Build Mesh from CSG taking material and transforms into account
         * @param name The name of the Mesh
         * @param material The material of the Mesh
         * @param scene The Scene
         * @param keepSubMeshes Specifies if submeshes should be kept
         * @returns The new Mesh
         */
        toMesh(name: string, material?: Nullable<Material>, scene?: Scene, keepSubMeshes?: boolean): Mesh;
    }


    /**
     * This is here for backwards compatibility with 4.2
     * @internal
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Opaque cache when computing data about a mesh
     */
    export interface IMeshDataCache {
        /** @internal */
        _outputData?: Float32Array;
        /** @internal */
        _vertexData?: {
            [kind: string]: Float32Array;
        };
    }
    /**
     * Options when computing data about a mesh
     */
    export interface IMeshDataOptions {
        /** Apply skeleton when computing the bounding info. Defaults to false. */
        applySkeleton?: boolean;
        /** Apply morph when computing the bounding info. Defaults to false. */
        applyMorph?: boolean;
        /** Apply baked vertex animation when computing data. Defaults to false. */
        applyBakedVertexAnimation?: boolean;
        /** Baked vertex animation settings to use instead of the manager's animationParameters. */
        bakedVertexAnimationSettings?: DeepImmutable<Vector4>;
        /** Update the cached positions stored as a Vector3 array. Defaults to true. */
        updatePositionsArray?: boolean;
        /**
         * Cache to avoid redundant allocations and computations when computing the bounding info multiple times. Pass in
         * an initial empty object and continue with subsequent calls using the same object. Caching is disabled by default.
         */
        cache?: IMeshDataCache;
    }
    /** @internal */
    class _FacetDataStorage {
        facetPositions: Vector3[];
        facetNormals: Vector3[];
        facetPartitioning: number[][];
        facetNb: number;
        partitioningSubdivisions: number;
        partitioningBBoxRatio: number;
        facetDataEnabled: boolean;
        facetParameters: any;
        bbSize: Vector3;
        subDiv: {
            max: number;
            X: number;
            Y: number;
            Z: number;
        };
        /** @internal */
        facetDepthSort: boolean;
        facetDepthSortEnabled: boolean;
        depthSortedIndices: IndicesArray;
        depthSortedFacets: {
            ind: number;
            sqDistance: number;
        }[];
        facetDepthSortFunction: (f1: {
            ind: number;
            sqDistance: number;
        }, f2: {
            ind: number;
            sqDistance: number;
        }) => number;
        facetDepthSortFrom: Vector3;
        facetDepthSortOrigin: Vector3;
        invertedMatrix: Matrix;
    }
    /**
     * @internal
     **/
    class _InternalAbstractMeshDataInfo {
        _hasVertexAlpha: boolean;
        _useVertexColors: boolean;
        _numBoneInfluencers: number;
        _applyFog: boolean;
        _receiveShadows: boolean;
        _facetData: _FacetDataStorage;
        _visibility: number;
        _skeleton: Nullable<Skeleton>;
        _layerMask: number;
        _computeBonesUsingShaders: boolean;
        _isActive: boolean;
        _onlyForInstances: boolean;
        _isActiveIntermediate: boolean;
        _onlyForInstancesIntermediate: boolean;
        _actAsRegularMesh: boolean;
        _currentLOD: Map<Camera, [Nullable<AbstractMesh>, number]>;
        _collisionRetryCount: number;
        _morphTargetManager: Nullable<MorphTargetManager>;
        _renderingGroupId: number;
        _bakedVertexAnimationManager: Nullable<IBakedVertexAnimationManager>;
        _material: Nullable<Material>;
        _materialForRenderPass: Array<Material | undefined>;
        _positions: Nullable<Vector3[]>;
        _pointerOverDisableMeshTesting: boolean;
        _meshCollisionData: _MeshCollisionData;
        _enableDistantPicking: boolean;
        /** @internal
         * Bounding info that is unnafected by the addition of thin instances
         */
        _rawBoundingInfo: Nullable<BoundingInfo>;
        /** @internal
         * This value will indicate us that at some point, the mesh was specifically used with the opposite winding order
         * We use that as a clue to force the material to sideOrientation = null
         */
        _sideOrientationHint: boolean;
        /**
         * Used in frame graph mode only, to know which meshes to update when in frozen mode
         */
        _wasActiveLastFrame: boolean;
    }
    /**
     * Class used to store all common mesh properties
     */
    export abstract class AbstractMesh extends TransformNode implements IDisposable, ICullable, IGetSetVerticesData {
        /** No occlusion */
        static OCCLUSION_TYPE_NONE: number;
        /** Occlusion set to optimistic */
        static OCCLUSION_TYPE_OPTIMISTIC: number;
        /** Occlusion set to strict */
        static OCCLUSION_TYPE_STRICT: number;
        /** Use an accurate occlusion algorithm */
        static OCCLUSION_ALGORITHM_TYPE_ACCURATE: number;
        /** Use a conservative occlusion algorithm */
        static OCCLUSION_ALGORITHM_TYPE_CONSERVATIVE: number;
        /** Default culling strategy : this is an exclusion test and it's the more accurate.
         *  Test order :
         *  Is the bounding sphere outside the frustum ?
         *  If not, are the bounding box vertices outside the frustum ?
         *  It not, then the cullable object is in the frustum.
         */
        static readonly CULLINGSTRATEGY_STANDARD = 0;
        /** Culling strategy : Bounding Sphere Only.
         *  This is an exclusion test. It's faster than the standard strategy because the bounding box is not tested.
         *  It's also less accurate than the standard because some not visible objects can still be selected.
         *  Test : is the bounding sphere outside the frustum ?
         *  If not, then the cullable object is in the frustum.
         */
        static readonly CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY = 1;
        /** Culling strategy : Optimistic Inclusion.
         *  This in an inclusion test first, then the standard exclusion test.
         *  This can be faster when a cullable object is expected to be almost always in the camera frustum.
         *  This could also be a little slower than the standard test when the tested object center is not the frustum but one of its bounding box vertex is still inside.
         *  Anyway, it's as accurate as the standard strategy.
         *  Test :
         *  Is the cullable object bounding sphere center in the frustum ?
         *  If not, apply the default culling strategy.
         */
        static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION = 2;
        /** Culling strategy : Optimistic Inclusion then Bounding Sphere Only.
         *  This in an inclusion test first, then the bounding sphere only exclusion test.
         *  This can be the fastest test when a cullable object is expected to be almost always in the camera frustum.
         *  This could also be a little slower than the BoundingSphereOnly strategy when the tested object center is not in the frustum but its bounding sphere still intersects it.
         *  It's less accurate than the standard strategy and as accurate as the BoundingSphereOnly strategy.
         *  Test :
         *  Is the cullable object bounding sphere center in the frustum ?
         *  If not, apply the Bounding Sphere Only strategy. No Bounding Box is tested here.
         */
        static readonly CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY = 3;
        /**
         * No billboard
         */
        static get BILLBOARDMODE_NONE(): number;
        /** Billboard on X axis */
        static get BILLBOARDMODE_X(): number;
        /** Billboard on Y axis */
        static get BILLBOARDMODE_Y(): number;
        /** Billboard on Z axis */
        static get BILLBOARDMODE_Z(): number;
        /** Billboard on all axes */
        static get BILLBOARDMODE_ALL(): number;
        /** Billboard on using position instead of orientation */
        static get BILLBOARDMODE_USE_POSITION(): number;
        /**
         * Gets or sets the default value for isPickable for newly created meshes.
         * When set to false, all meshes created after the change will not be pickable by default.
         * Individual meshes can still override this by setting their own isPickable property.
         */
        static DefaultIsPickable: boolean;
        /** @internal */
        _internalAbstractMeshDataInfo: _InternalAbstractMeshDataInfo;
        /** @internal */
        _waitingMaterialId: Nullable<string>;
        /** @internal */
        _waitingMorphTargetManagerId: Nullable<number>;
        /** @internal */
        _waitingSkeletonId: Nullable<string>;
        /** @internal */
        _waitingSkeletonUniqueId: Nullable<number>;
        /**
         * The culling strategy to use to check whether the mesh must be rendered or not.
         * This value can be changed at any time and will be used on the next render mesh selection.
         * The possible values are :
         * - AbstractMesh.CULLINGSTRATEGY_STANDARD
         * - AbstractMesh.CULLINGSTRATEGY_BOUNDINGSPHERE_ONLY
         * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION
         * - AbstractMesh.CULLINGSTRATEGY_OPTIMISTIC_INCLUSION_THEN_BSPHERE_ONLY
         * Please read each static variable documentation to get details about the culling process.
         * */
        cullingStrategy: number;
        /**
         * Gets the number of facets in the mesh
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet
         */
        get facetNb(): number;
        /**
         * Gets or set the number (integer) of subdivisions per axis in the partitioning space
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning
         */
        get partitioningSubdivisions(): number;
        set partitioningSubdivisions(nb: number);
        /**
         * The ratio (float) to apply to the bounding box size to set to the partitioning space.
         * Ex : 1.01 (default) the partitioning space is 1% bigger than the bounding box
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#tweaking-the-partitioning
         */
        get partitioningBBoxRatio(): number;
        set partitioningBBoxRatio(ratio: number);
        /**
         * Gets or sets a boolean indicating that the facets must be depth sorted on next call to `updateFacetData()`.
         * Works only for updatable meshes.
         * Doesn't work with multi-materials
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort
         */
        get mustDepthSortFacets(): boolean;
        set mustDepthSortFacets(sort: boolean);
        /**
         * The location (Vector3) where the facet depth sort must be computed from.
         * By default, the active camera position.
         * Used only when facet depth sort is enabled
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#facet-depth-sort
         */
        get facetDepthSortFrom(): Vector3;
        set facetDepthSortFrom(location: Vector3);
        /** number of collision detection tries. Change this value if not all collisions are detected and handled properly */
        get collisionRetryCount(): number;
        set collisionRetryCount(retryCount: number);
        /**
         * gets a boolean indicating if facetData is enabled
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData#what-is-a-mesh-facet
         */
        get isFacetDataEnabled(): boolean;
        /**
         * Gets or sets the morph target manager
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/morphTargets
         */
        get morphTargetManager(): Nullable<MorphTargetManager>;
        set morphTargetManager(value: Nullable<MorphTargetManager>);
        /**
         * Gets or sets the baked vertex animation manager
         * @see https://doc.babylonjs.com/features/featuresDeepDive/animation/baked_texture_animations
         */
        get bakedVertexAnimationManager(): Nullable<IBakedVertexAnimationManager>;
        set bakedVertexAnimationManager(value: Nullable<IBakedVertexAnimationManager>);
        /** @internal */
        _syncGeometryWithMorphTargetManager(): void;
        /**
         * @internal
         */
        _updateNonUniformScalingState(value: boolean): boolean;
        /** @internal */
        get rawBoundingInfo(): Nullable<BoundingInfo>;
        set rawBoundingInfo(boundingInfo: Nullable<BoundingInfo>);
        /**
         * An event triggered when this mesh collides with another one
         */
        onCollideObservable: Observable<AbstractMesh>;
        /** Set a function to call when this mesh collides with another one */
        set onCollide(callback: (collidedMesh?: AbstractMesh) => void);
        /**
         * An event triggered when the collision's position changes
         */
        onCollisionPositionChangeObservable: Observable<Vector3>;
        /** Set a function to call when the collision's position changes */
        set onCollisionPositionChange(callback: () => void);
        /**
         * An event triggered when material is changed
         */
        onMaterialChangedObservable: Observable<AbstractMesh>;
        /**
         * Gets or sets the orientation for POV movement & rotation
         */
        definedFacingForward: boolean;
        /** @internal */
        _occlusionQuery: Nullable<WebGLQuery | number>;
        /** @internal */
        _renderingGroup: Nullable<RenderingGroup>;
        /**
         * Gets or sets mesh visibility between 0 and 1 (default is 1)
         */
        get visibility(): number;
        /**
         * Gets or sets mesh visibility between 0 and 1 (default is 1)
         */
        set visibility(value: number);
        /** Gets or sets the alpha index used to sort transparent meshes
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#alpha-index
         */
        alphaIndex: number;
        /**
         * Gets or sets a boolean indicating if the mesh can be picked (by scene.pick for instance or through actions).
         * Default value is determined by {@link AbstractMesh.DefaultIsPickable} (true unless changed).
         */
        isPickable: boolean;
        /**
         * Gets or sets a boolean indicating if the mesh can be near picked (touched by the XR controller or hands). Default is false
         */
        isNearPickable: boolean;
        /**
         * Gets or sets a boolean indicating if the mesh can be grabbed. Default is false.
         * Setting this to true, while using the XR near interaction feature, will trigger a pointer event when the mesh is grabbed.
         * Grabbing means that the controller is using the squeeze or main trigger button to grab the mesh.
         * This is different from nearPickable which only triggers the event when the mesh is touched by the controller
         */
        isNearGrabbable: boolean;
        /** Gets or sets a boolean indicating that bounding boxes of subMeshes must be rendered as well (false by default) */
        showSubMeshesBoundingBox: boolean;
        /** Gets or sets a boolean indicating if the mesh must be considered as a ray blocker for lens flares (false by default)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
         */
        isBlocker: boolean;
        /**
         * Gets or sets a boolean indicating that pointer move events must be supported on this mesh (false by default)
         */
        enablePointerMoveEvents: boolean;
        /**
         * Gets or sets the property which disables the test that is checking that the mesh under the pointer is the same than the previous time we tested for it (default: false).
         * Set this property to true if you want thin instances picking to be reported accurately when moving over the mesh.
         * Note that setting this property to true will incur some performance penalties when dealing with pointer events for this mesh so use it sparingly.
         */
        get pointerOverDisableMeshTesting(): boolean;
        set pointerOverDisableMeshTesting(disable: boolean);
        /**
         * Specifies the rendering group id for this mesh (0 by default)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/transparent_rendering#rendering-groups
         */
        get renderingGroupId(): number;
        set renderingGroupId(value: number);
        /** Gets or sets current material */
        get material(): Nullable<Material>;
        set material(value: Nullable<Material>);
        /** @internal */
        protected _setMaterial(value: Nullable<Material>): void;
        /**
         * Gets the material used to render the mesh in a specific render pass
         * @param renderPassId render pass id
         * @returns material used for the render pass. If no specific material is used for this render pass, undefined is returned (meaning mesh.material is used for this pass)
         */
        getMaterialForRenderPass(renderPassId: number): Material | undefined;
        /**
         * Sets the material to be used to render the mesh in a specific render pass
         * @param renderPassId render pass id
         * @param material material to use for this render pass. If undefined is passed, no specific material will be used for this render pass but the regular material will be used instead (mesh.material)
         */
        setMaterialForRenderPass(renderPassId: number, material?: Material): void;
        /**
         * Gets or sets a boolean indicating that this mesh can receive realtime shadows
         * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows
         */
        get receiveShadows(): boolean;
        set receiveShadows(value: boolean);
        /** Defines color to use when rendering outline */
        outlineColor: Color3;
        /** Define width to use when rendering outline */
        outlineWidth: number;
        /** Defines color to use when rendering overlay */
        overlayColor: Color3;
        /** Defines alpha to use when rendering overlay */
        overlayAlpha: number;
        /**
         * Gets or sets a boolean indicating that this mesh needs to use vertex alpha data to render.
         * This property is misnamed and should be `useVertexAlpha`. Note that the mesh will be rendered
         * with alpha blending when this flag is set even if vertex alpha data is missing from the geometry.
         */
        get hasVertexAlpha(): boolean;
        set hasVertexAlpha(value: boolean);
        /** Gets or sets a boolean indicating that this mesh needs to use vertex color data to render (if this kind of vertex data is available in the geometry) */
        get useVertexColors(): boolean;
        set useVertexColors(value: boolean);
        /**
         * Gets or sets a boolean indicating that bone animations must be computed by the GPU (true by default)
         */
        get computeBonesUsingShaders(): boolean;
        set computeBonesUsingShaders(value: boolean);
        /** Gets or sets the number of allowed bone influences per vertex (4 by default) */
        get numBoneInfluencers(): number;
        set numBoneInfluencers(value: number);
        /** Gets or sets a boolean indicating that this mesh will allow fog to be rendered on it (true by default) */
        get applyFog(): boolean;
        set applyFog(value: boolean);
        /** When enabled, decompose picking matrices for better precision with large values for mesh position and scling */
        get enableDistantPicking(): boolean;
        set enableDistantPicking(value: boolean);
        /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes selection (true by default) */
        useOctreeForRenderingSelection: boolean;
        /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes picking (true by default) */
        useOctreeForPicking: boolean;
        /** Gets or sets a boolean indicating that internal octree (if available) can be used to boost submeshes collision (true by default) */
        useOctreeForCollisions: boolean;
        /**
         * Gets or sets the current layer mask (default is 0x0FFFFFFF)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/layerMasksAndMultiCam
         */
        get layerMask(): number;
        set layerMask(value: number);
        /**
         * True if the mesh must be rendered in any case (this will shortcut the frustum clipping phase)
         */
        alwaysSelectAsActiveMesh: boolean;
        /**
         * Gets or sets a boolean indicating that the bounding info does not need to be kept in sync (for performance reason)
         */
        doNotSyncBoundingInfo: boolean;
        /**
         * Gets or sets the current action manager
         * @see https://doc.babylonjs.com/features/featuresDeepDive/events/actions
         */
        actionManager: Nullable<AbstractActionManager>;
        /**
         * Gets or sets the ellipsoid used to impersonate this mesh when using collision engine (default is (0.5, 1, 0.5))
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        ellipsoid: Vector3;
        /**
         * Gets or sets the ellipsoid offset used to impersonate this mesh when using collision engine (default is (0, 0, 0))
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        ellipsoidOffset: Vector3;
        /**
         * Gets or sets a collision mask used to mask collisions (default is -1).
         * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0
         */
        get collisionMask(): number;
        set collisionMask(mask: number);
        /**
         * Gets or sets a collision response flag (default is true).
         * when collisionResponse is false, events are still triggered but colliding entity has no response
         * This helps creating trigger volume when user wants collision feedback events but not position/velocity
         * to respond to the collision.
         */
        get collisionResponse(): boolean;
        set collisionResponse(response: boolean);
        /**
         * Gets or sets the current collision group mask (-1 by default).
         * A collision between A and B will happen if A.collisionGroup & b.collisionMask !== 0
         */
        get collisionGroup(): number;
        set collisionGroup(mask: number);
        /**
         * Gets or sets current surrounding meshes (null by default).
         *
         * By default collision detection is tested against every mesh in the scene.
         * It is possible to set surroundingMeshes to a defined list of meshes and then only these specified
         * meshes will be tested for the collision.
         *
         * Note: if set to an empty array no collision will happen when this mesh is moved.
         */
        get surroundingMeshes(): Nullable<AbstractMesh[]>;
        set surroundingMeshes(meshes: Nullable<AbstractMesh[]>);
        /**
         * Defines edge width used when edgesRenderer is enabled
         * @see https://www.babylonjs-playground.com/#10OJSG#13
         */
        edgesWidth: number;
        /**
         * Defines edge color used when edgesRenderer is enabled
         * @see https://www.babylonjs-playground.com/#10OJSG#13
         */
        edgesColor: Color4;
        /** @internal */
        _edgesRenderer: Nullable<IEdgesRenderer>;
        /** @internal */
        _masterMesh: Nullable<AbstractMesh>;
        protected _boundingInfo: Nullable<BoundingInfo>;
        protected _boundingInfoIsDirty: boolean;
        /** @internal */
        _renderId: number;
        /**
         * Gets or sets the list of subMeshes
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
         */
        subMeshes: SubMesh[];
        /** @internal */
        _intersectionsInProgress: AbstractMesh[];
        /** @internal */
        _unIndexed: boolean;
        /** @internal */
        _lightSources: Light[];
        /** Gets the list of lights affecting that mesh */
        get lightSources(): Light[];
        /** @internal */
        abstract get _positions(): Nullable<Vector3[]>;
        /** @internal */
        _waitingData: {
            lods: Nullable<any>;
            actions: Nullable<any>;
            freezeWorldMatrix: Nullable<boolean>;
        };
        /** @internal */
        _bonesTransformMatrices: Nullable<Float32Array>;
        /** @internal */
        _transformMatrixTexture: Nullable<RawTexture>;
        /**
         * Gets or sets a skeleton to apply skinning transformations
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/bonesSkeletons
         */
        set skeleton(value: Nullable<Skeleton>);
        get skeleton(): Nullable<Skeleton>;
        /**
         * An event triggered when the mesh is rebuilt.
         */
        onRebuildObservable: Observable<AbstractMesh>;
        /**
         * The current mesh uniform buffer.
         * @internal Internal use only.
         */
        _uniformBuffer: UniformBuffer;
        /**
         * Creates a new AbstractMesh
         * @param name defines the name of the mesh
         * @param scene defines the hosting scene
         */
        constructor(name: string, scene?: Nullable<Scene>);
        protected _buildUniformLayout(): void;
        /**
         * Transfer the mesh values to its UBO.
         * @param world The world matrix associated with the mesh
         */
        transferToEffect(world: Matrix): void;
        /**
         * Gets the mesh uniform buffer.
         * @returns the uniform buffer of the mesh.
         */
        getMeshUniformBuffer(): UniformBuffer;
        /**
         * Returns the string "AbstractMesh"
         * @returns "AbstractMesh"
         */
        getClassName(): string;
        /**
         * Gets a string representation of the current mesh
         * @param fullDetails defines a boolean indicating if full details must be included
         * @returns a string representation of the current mesh
         */
        toString(fullDetails?: boolean): string;
        /**
         * @internal
         */
        protected _getEffectiveParent(): Nullable<Node>;
        /**
         * @internal
         */
        _getActionManagerForTrigger(trigger?: number, initialCall?: boolean): Nullable<AbstractActionManager>;
        /**
         * @internal
         */
        _releaseRenderPassId(_id: number): void;
        /**
         * @internal
         */
        _rebuild(dispose?: boolean): void;
        /** @internal */
        _resyncLightSources(): void;
        /**
         * @internal
         */
        _resyncLightSource(light: Light): void;
        /** @internal */
        _unBindEffect(): void;
        /**
         * @internal
         */
        _removeLightSource(light: Light, dispose: boolean): void;
        private _markSubMeshesAsDirty;
        /**
         * @internal
         */
        _markSubMeshesAsLightDirty(dispose?: boolean): void;
        /** @internal */
        _markSubMeshesAsAttributesDirty(): void;
        /** @internal */
        _markSubMeshesAsMiscDirty(): void;
        /**
         * Flag the AbstractMesh as dirty (Forcing it to update everything)
         * @param property if set to "rotation" the objects rotationQuaternion will be set to null
         * @returns this AbstractMesh
         */
        markAsDirty(property?: string): AbstractMesh;
        /**
         * Resets the draw wrappers cache for all submeshes of this abstract mesh
         * @param passId If provided, releases only the draw wrapper corresponding to this render pass id
         * @param immediate If true, the effect will be released immediately, otherwise it will be released at the next frame
         */
        resetDrawCache(passId?: number, immediate?: boolean): void;
        /**
         * Returns true if the mesh is blocked. Implemented by child classes
         */
        get isBlocked(): boolean;
        /**
         * Returns the mesh itself by default. Implemented by child classes
         * @param camera defines the camera to use to pick the right LOD level
         * @returns the currentAbstractMesh
         */
        getLOD(camera: Camera): Nullable<AbstractMesh>;
        /**
         * The mesh's internal Geometry object. Implemented by child classes.
         */
        abstract get geometry(): Nullable<Geometry>;
        /**
         * Returns 0 by default. Implemented by child classes
         * @returns an integer
         */
        getTotalVertices(): number;
        /**
         * Returns a positive integer : the total number of indices in this mesh geometry.
         * @returns the number of indices or zero if the mesh has no geometry.
         */
        getTotalIndices(): number;
        /**
         * Returns null by default. Implemented by child classes
         * @returns null
         */
        getIndices(): Nullable<IndicesArray>;
        /**
         * Returns the array of the requested vertex data kind. Implemented by child classes
         * @param kind defines the vertex data kind to use
         * @returns null
         */
        getVerticesData(kind: string): Nullable<FloatArray>;
        /**
         * Copies the requested vertex data kind into the given vertex data map. Float data is constructed if the map doesn't have the data.
         * @param kind defines the vertex data kind to use
         * @param vertexData defines the map that stores the resulting data
         */
        abstract copyVerticesData(kind: string, vertexData: {
            [kind: string]: Float32Array;
        }): void;
        /**
         * Returns the mesh VertexBuffer object from the requested `kind`
         * @param kind defines which buffer to read from (positions, indices, normals, etc). Possible `kind` values :
         * - VertexBuffer.PositionKind
         * - VertexBuffer.NormalKind
         * - VertexBuffer.UVKind
         * - VertexBuffer.UV2Kind
         * - VertexBuffer.UV3Kind
         * - VertexBuffer.UV4Kind
         * - VertexBuffer.UV5Kind
         * - VertexBuffer.UV6Kind
         * - VertexBuffer.ColorKind
         * - VertexBuffer.MatricesIndicesKind
         * - VertexBuffer.MatricesIndicesExtraKind
         * - VertexBuffer.MatricesWeightsKind
         * - VertexBuffer.MatricesWeightsExtraKind
         * @param bypassInstanceData defines a boolean indicating that the function should not take into account the instance data (applies only if the mesh has instances). Default: false
         * @returns a FloatArray or null if the mesh has no vertex buffer for this kind.
         */
        abstract getVertexBuffer(kind: string, bypassInstanceData?: boolean): Nullable<VertexBuffer>;
        /**
         * Sets the vertex data of the mesh geometry for the requested `kind`.
         * If the mesh has no geometry, a new Geometry object is set to the mesh and then passed this vertex data.
         * Note that a new underlying VertexBuffer object is created each call.
         * If the `kind` is the `PositionKind`, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed.
         * @param kind defines vertex data kind:
         * * VertexBuffer.PositionKind
         * * VertexBuffer.UVKind
         * * VertexBuffer.UV2Kind
         * * VertexBuffer.UV3Kind
         * * VertexBuffer.UV4Kind
         * * VertexBuffer.UV5Kind
         * * VertexBuffer.UV6Kind
         * * VertexBuffer.ColorKind
         * * VertexBuffer.MatricesIndicesKind
         * * VertexBuffer.MatricesIndicesExtraKind
         * * VertexBuffer.MatricesWeightsKind
         * * VertexBuffer.MatricesWeightsExtraKind
         * @param data defines the data source
         * @param updatable defines if the data must be flagged as updatable (or static)
         * @param stride defines the vertex stride (size of an entire vertex). Can be null and in this case will be deduced from vertex data kind
         * @returns the current mesh
         */
        setVerticesData(kind: string, data: FloatArray, updatable?: boolean, stride?: number): AbstractMesh;
        /**
         * Updates the existing vertex data of the mesh geometry for the requested `kind`.
         * If the mesh has no geometry, it is simply returned as it is.
         * @param kind defines vertex data kind:
         * * VertexBuffer.PositionKind
         * * VertexBuffer.UVKind
         * * VertexBuffer.UV2Kind
         * * VertexBuffer.UV3Kind
         * * VertexBuffer.UV4Kind
         * * VertexBuffer.UV5Kind
         * * VertexBuffer.UV6Kind
         * * VertexBuffer.ColorKind
         * * VertexBuffer.MatricesIndicesKind
         * * VertexBuffer.MatricesIndicesExtraKind
         * * VertexBuffer.MatricesWeightsKind
         * * VertexBuffer.MatricesWeightsExtraKind
         * @param data defines the data source
         * @param updateExtends If `kind` is `PositionKind` and if `updateExtends` is true, the mesh BoundingInfo is renewed, so the bounding box and sphere, and the mesh World Matrix is recomputed
         * @param makeItUnique If true, a new global geometry is created from this data and is set to the mesh
         * @returns the current mesh
         */
        updateVerticesData(kind: string, data: FloatArray, updateExtends?: boolean, makeItUnique?: boolean): AbstractMesh;
        /**
         * Sets the mesh indices,
         * If the mesh has no geometry, a new Geometry object is created and set to the mesh.
         * @param indices Expects an array populated with integers or a typed array (Int32Array, Uint32Array, Uint16Array)
         * @param totalVertices Defines the total number of vertices
         * @returns the current mesh
         */
        setIndices(indices: IndicesArray, totalVertices: Nullable<number>): AbstractMesh;
        /**
         * Gets a boolean indicating if specific vertex data is present
         * @param kind defines the vertex data kind to use
         * @returns true is data kind is present
         */
        isVerticesDataPresent(kind: string): boolean;
        /**
         * Returns the mesh BoundingInfo object or creates a new one and returns if it was undefined.
         * Note that it returns a shallow bounding of the mesh (i.e. it does not include children).
         * However, if the mesh contains thin instances, it will be expanded to include them. If you want the "raw" bounding data instead, then use `getRawBoundingInfo()`.
         * To get the full bounding of all children, call `getHierarchyBoundingVectors` instead.
         * @returns a BoundingInfo
         */
        getBoundingInfo(): BoundingInfo;
        /**
         * Returns the bounding info unnafected by instance data.
         * @returns the bounding info of the mesh unaffected by instance data.
         */
        getRawBoundingInfo(): BoundingInfo;
        /**
         * Overwrite the current bounding info
         * @param boundingInfo defines the new bounding info
         * @returns the current mesh
         */
        setBoundingInfo(boundingInfo: BoundingInfo): AbstractMesh;
        /**
         * Returns true if there is already a bounding info
         */
        get hasBoundingInfo(): boolean;
        /**
         * Creates a new bounding info for the mesh
         * @param minimum min vector of the bounding box/sphere
         * @param maximum max vector of the bounding box/sphere
         * @param worldMatrix defines the new world matrix
         * @returns the new bounding info
         */
        buildBoundingInfo(minimum: DeepImmutable<Vector3>, maximum: DeepImmutable<Vector3>, worldMatrix?: DeepImmutable<Matrix>): BoundingInfo;
        /**
         * Uniformly scales the mesh to fit inside of a unit cube (1 X 1 X 1 units)
         * @param includeDescendants Use the hierarchy's bounding box instead of the mesh's bounding box. Default is false
         * @param ignoreRotation ignore rotation when computing the scale (ie. object will be axis aligned). Default is false
         * @param predicate predicate that is passed in to getHierarchyBoundingVectors when selecting which object should be included when scaling
         * @returns the current mesh
         */
        normalizeToUnitCube(includeDescendants?: boolean, ignoreRotation?: boolean, predicate?: Nullable<(node: AbstractMesh) => boolean>): AbstractMesh;
        /** Gets a boolean indicating if this mesh has skinning data and an attached skeleton */
        get useBones(): boolean;
        /** @internal */
        _preActivate(): void;
        /**
         * @internal
         */
        _preActivateForIntermediateRendering(renderId: number): void;
        /**
         * @internal
         */
        _activate(renderId: number, intermediateRendering: boolean): boolean;
        /** @internal */
        _postActivate(): void;
        /** @internal */
        _freeze(): void;
        /** @internal */
        _unFreeze(): void;
        /**
         * Gets the current world matrix
         * @returns a Matrix
         */
        getWorldMatrix(): Matrix;
        /** @internal */
        _getWorldMatrixDeterminant(): number;
        /**
         * Gets a boolean indicating if this mesh is an instance or a regular mesh
         */
        get isAnInstance(): boolean;
        /**
         * Gets a boolean indicating if this mesh has instances
         */
        get hasInstances(): boolean;
        /**
         * Gets a boolean indicating if this mesh has thin instances
         */
        get hasThinInstances(): boolean;
        /**
         * Perform relative position change from the point of view of behind the front of the mesh.
         * This is performed taking into account the meshes current rotation, so you do not have to care.
         * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.
         * @param amountRight defines the distance on the right axis
         * @param amountUp defines the distance on the up axis
         * @param amountForward defines the distance on the forward axis
         * @returns the current mesh
         */
        movePOV(amountRight: number, amountUp: number, amountForward: number): AbstractMesh;
        /**
         * Calculate relative position change from the point of view of behind the front of the mesh.
         * This is performed taking into account the meshes current rotation, so you do not have to care.
         * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.
         * @param amountRight defines the distance on the right axis
         * @param amountUp defines the distance on the up axis
         * @param amountForward defines the distance on the forward axis
         * @returns the new displacement vector
         */
        calcMovePOV(amountRight: number, amountUp: number, amountForward: number): Vector3;
        /**
         * Perform relative rotation change from the point of view of behind the front of the mesh.
         * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.
         * @param flipBack defines the flip
         * @param twirlClockwise defines the twirl
         * @param tiltRight defines the tilt
         * @returns the current mesh
         */
        rotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): AbstractMesh;
        /**
         * Calculate relative rotation change from the point of view of behind the front of the mesh.
         * Supports definition of mesh facing forward or backward {@link definedFacingForwardSearch | See definedFacingForwardSearch }.
         * @param flipBack defines the flip
         * @param twirlClockwise defines the twirl
         * @param tiltRight defines the tilt
         * @returns the new rotation vector
         */
        calcRotatePOV(flipBack: number, twirlClockwise: number, tiltRight: number): Vector3;
        /**
         * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.
         * This means the mesh underlying bounding box and sphere are recomputed.
         * @param options defines a set of options for computing the bounding info
         * @returns the current mesh
         */
        abstract refreshBoundingInfo(options: IMeshDataOptions): AbstractMesh;
        /**
         * This method recomputes and sets a new BoundingInfo to the mesh unless it is locked.
         * This means the mesh underlying bounding box and sphere are recomputed.
         * @param applySkeletonOrOptions defines whether to apply the skeleton before computing the bounding info or a set of options
         * @param applyMorph defines whether to apply the morph target before computing the bounding info
         * @returns the current mesh
         */
        abstract refreshBoundingInfo(applySkeletonOrOptions: boolean | IMeshDataOptions, applyMorph: boolean): AbstractMesh;
        /**
         * @internal
         */
        _refreshBoundingInfo(data: Nullable<FloatArray>, bias: Nullable<Vector2>): void;
        /**
         * @internal
         */
        _refreshBoundingInfoDirect(extend: {
            minimum: Vector3;
            maximum: Vector3;
        }): void;
        private static _ApplySkeleton;
        /** @internal */
        _getData(options: IMeshDataOptions, data: Nullable<FloatArray>, kind?: string): Nullable<FloatArray>;
        /**
         * Get the normals vertex data and optionally apply skeleton and morphing.
         * @param applySkeleton defines whether to apply the skeleton
         * @param applyMorph  defines whether to apply the morph target
         * @returns the normals data
         */
        getNormalsData(applySkeleton?: boolean, applyMorph?: boolean): Nullable<FloatArray>;
        /**
         * Get the position vertex data and optionally apply skeleton and morphing.
         * @param applySkeleton defines whether to apply the skeleton
         * @param applyMorph  defines whether to apply the morph target
         * @param data defines the position data to apply the skeleton and morph to
         * @returns the position data
         */
        getPositionData(applySkeleton?: boolean, applyMorph?: boolean, data?: Nullable<FloatArray>): Nullable<FloatArray>;
        /** @internal */
        _updateBoundingInfo(): AbstractMesh;
        /**
         * @internal
         */
        _updateSubMeshesBoundingInfo(matrix: DeepImmutable<Matrix>): AbstractMesh;
        /** @internal */
        protected _afterComputeWorldMatrix(): void;
        /**
         * Returns `true` if the mesh is within the frustum defined by the passed array of planes.
         * A mesh is in the frustum if its bounding box intersects the frustum
         * @param frustumPlanes defines the frustum to test
         * @returns true if the mesh is in the frustum planes
         */
        isInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * Returns `true` if the mesh is completely in the frustum defined be the passed array of planes.
         * A mesh is completely in the frustum if its bounding box it completely inside the frustum.
         * @param frustumPlanes defines the frustum to test
         * @returns true if the mesh is completely in the frustum planes
         */
        isCompletelyInFrustum(frustumPlanes: Plane[]): boolean;
        /**
         * True if the mesh intersects another mesh or a SolidParticle object
         * @param mesh defines a target mesh or SolidParticle to test
         * @param precise Unless the parameter `precise` is set to `true` the intersection is computed according to Axis Aligned Bounding Boxes (AABB), else according to OBB (Oriented BBoxes)
         * @param includeDescendants Can be set to true to test if the mesh defined in parameters intersects with the current mesh or any child meshes
         * @returns true if there is an intersection
         */
        intersectsMesh(mesh: AbstractMesh | SolidParticle, precise?: boolean, includeDescendants?: boolean): boolean;
        /**
         * Returns true if the passed point (Vector3) is inside the mesh bounding box
         * @param point defines the point to test
         * @returns true if there is an intersection
         */
        intersectsPoint(point: Vector3): boolean;
        /**
         * Gets or sets a boolean indicating that this mesh can be used in the collision engine
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        get checkCollisions(): boolean;
        set checkCollisions(collisionEnabled: boolean);
        /**
         * Gets Collider object used to compute collisions (not physics)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         */
        get collider(): Nullable<Collider>;
        /**
         * Move the mesh using collision engine
         * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/camera_collisions
         * @param displacement defines the requested displacement vector
         * @param slideOnCollide If true, the mesh will slide along a collider's surface.  If false, it will stop moving at the first collision. (true by default)
         * @returns the current mesh
         */
        moveWithCollisions(displacement: Vector3, slideOnCollide?: boolean): AbstractMesh;
        private _onCollisionPositionChange;
        /**
         * @internal
         */
        _collideForSubMesh(subMesh: SubMesh, transformMatrix: Matrix, collider: Collider): AbstractMesh;
        /**
         * @internal
         */
        _processCollisionsForSubMeshes(collider: Collider, transformMatrix: Matrix): AbstractMesh;
        /** @internal */
        _shouldConvertRHS(): boolean;
        /**
         * @internal
         */
        _checkCollision(collider: Collider): AbstractMesh;
        /** @internal */
        _generatePointsArray(): boolean;
        /**
         * Checks if the passed Ray intersects with the mesh. A mesh triangle can be picked both from its front and back sides,
         * irrespective of orientation.
         * @param ray defines the ray to use. It should be in the mesh's LOCAL coordinate space.
         * @param fastCheck defines if fast mode (but less precise) must be used (false by default)
         * @param trianglePredicate defines an optional predicate used to select faces when a mesh intersection is detected
         * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)
         * @param worldToUse defines the world matrix to use to get the world coordinate of the intersection point
         * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check
         * @returns the picking info
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/interactions/mesh_intersect
         */
        intersects(ray: Ray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate, onlyBoundingInfo?: boolean, worldToUse?: Matrix, skipBoundingInfo?: boolean): PickingInfo;
        /**
         * Clones the current mesh
         * @param name defines the mesh name
         * @param newParent defines the new mesh parent
         * @param doNotCloneChildren defines a boolean indicating that children must not be cloned (false by default)
         * @returns the new mesh
         */
        clone(name: string, newParent: Nullable<Node>, doNotCloneChildren?: boolean): Nullable<AbstractMesh>;
        /**
         * Disposes all the submeshes of the current mesh
         * @param immediate should dispose the effects immediately or not
         * @returns the current mesh
         */
        releaseSubMeshes(immediate?: boolean): AbstractMesh;
        /**
         * Releases resources associated with this abstract mesh.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /** @internal */
        private _initFacetData;
        /**
         * Updates the mesh facetData arrays and the internal partitioning when the mesh is morphed or updated.
         * This method can be called within the render loop.
         * You don't need to call this method by yourself in the render loop when you update/morph a mesh with the methods CreateXXX() as they automatically manage this computation
         * @returns the current mesh
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        updateFacetData(): AbstractMesh;
        /**
         * Returns the facetLocalNormals array.
         * The normals are expressed in the mesh local spac
         * @returns an array of Vector3
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetLocalNormals(): Vector3[];
        /**
         * Returns the facetLocalPositions array.
         * The facet positions are expressed in the mesh local space
         * @returns an array of Vector3
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetLocalPositions(): Vector3[];
        /**
         * Returns the facetLocalPartitioning array
         * @returns an array of array of numbers
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetLocalPartitioning(): number[][];
        /**
         * Returns the i-th facet position in the world system.
         * This method allocates a new Vector3 per call
         * @param i defines the facet index
         * @returns a new Vector3
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetPosition(i: number): Vector3;
        /**
         * Sets the reference Vector3 with the i-th facet position in the world system
         * @param i defines the facet index
         * @param ref defines the target vector
         * @returns the current mesh
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetPositionToRef(i: number, ref: Vector3): AbstractMesh;
        /**
         * Returns the i-th facet normal in the world system.
         * This method allocates a new Vector3 per call
         * @param i defines the facet index
         * @returns a new Vector3
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetNormal(i: number): Vector3;
        /**
         * Sets the reference Vector3 with the i-th facet normal in the world system
         * @param i defines the facet index
         * @param ref defines the target vector
         * @returns the current mesh
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetNormalToRef(i: number, ref: Vector3): this;
        /**
         * Returns the facets (in an array) in the same partitioning block than the one the passed coordinates are located (expressed in the mesh local system)
         * @param x defines x coordinate
         * @param y defines y coordinate
         * @param z defines z coordinate
         * @returns the array of facet indexes
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetsAtLocalCoordinates(x: number, y: number, z: number): Nullable<number[]>;
        /**
         * Returns the closest mesh facet index at (x,y,z) World coordinates, null if not found
         * @param x defines x coordinate
         * @param y defines y coordinate
         * @param z defines z coordinate
         * @param projected sets as the (x,y,z) world projection on the facet
         * @param checkFace if true (default false), only the facet "facing" to (x,y,z) or only the ones "turning their backs", according to the parameter "facing" are returned
         * @param facing if facing and checkFace are true, only the facet "facing" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet "turning their backs" to (x, y, z) are returned : negative dot (x, y, z) * facet position
         * @returns the face index if found (or null instead)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getClosestFacetAtCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace?: boolean, facing?: boolean): Nullable<number>;
        /**
         * Returns the closest mesh facet index at (x,y,z) local coordinates, null if not found
         * @param x defines x coordinate
         * @param y defines y coordinate
         * @param z defines z coordinate
         * @param projected sets as the (x,y,z) local projection on the facet
         * @param checkFace if true (default false), only the facet "facing" to (x,y,z) or only the ones "turning their backs", according to the parameter "facing" are returned
         * @param facing if facing and checkFace are true, only the facet "facing" to (x, y, z) are returned : positive dot (x, y, z) * facet position. If facing si false and checkFace is true, only the facet "turning their backs" to (x, y, z) are returned : negative dot (x, y, z) * facet position
         * @returns the face index if found (or null instead)
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getClosestFacetAtLocalCoordinates(x: number, y: number, z: number, projected?: Vector3, checkFace?: boolean, facing?: boolean): Nullable<number>;
        /**
         * Returns the object "parameter" set with all the expected parameters for facetData computation by ComputeNormals()
         * @returns the parameters
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        getFacetDataParameters(): any;
        /**
         * Disables the feature FacetData and frees the related memory
         * @returns the current mesh
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/facetData
         */
        disableFacetData(): AbstractMesh;
        /**
         * Updates the AbstractMesh indices array
         * @param indices defines the data source
         * @param offset defines the offset in the index buffer where to store the new data (can be null)
         * @param gpuMemoryOnly defines a boolean indicating that only the GPU memory must be updated leaving the CPU version of the indices unchanged (false by default)
         * @returns the current mesh
         */
        updateIndices(indices: IndicesArray, offset?: number, gpuMemoryOnly?: boolean): AbstractMesh;
        /**
         * Creates new normals data for the mesh
         * @param updatable defines if the normal vertex buffer must be flagged as updatable
         * @returns the current mesh
         */
        createNormals(updatable: boolean): AbstractMesh;
        /**
         * Optimize the indices order so that we keep the faces with similar indices together
         * @returns the current mesh
         */
        optimizeIndicesAsync(): Promise<AbstractMesh>;
        /**
         * Align the mesh with a normal
         * @param normal defines the normal to use
         * @param upDirection can be used to redefined the up vector to use (will use the (0, 1, 0) by default)
         * @returns the current mesh
         */
        alignWithNormal(normal: Vector3, upDirection?: Vector3): AbstractMesh;
        /** @internal */
        _checkOcclusionQuery(_checkOnly?: boolean): boolean;
        /**
         * Disables the mesh edge rendering mode
         * @returns the currentAbstractMesh
         */
        disableEdgesRendering(): AbstractMesh;
        /**
         * Enables the edge rendering mode on the mesh.
         * This mode makes the mesh edges visible
         * @param epsilon defines the maximal distance between two angles to detect a face
         * @param checkVerticesInsteadOfIndices indicates that we should check vertex list directly instead of faces
         * @param options options to the edge renderer
         * @returns the currentAbstractMesh
         * @see https://www.babylonjs-playground.com/#19O9TU#0
         */
        enableEdgesRendering(epsilon?: number, checkVerticesInsteadOfIndices?: boolean, options?: IEdgesRendererOptions): AbstractMesh;
        /**
         * This function returns all of the particle systems in the scene that use the mesh as an emitter.
         * @returns an array of particle systems in the scene that use the mesh as an emitter
         */
        getConnectedParticleSystems(): IParticleSystem[];
    }
    /**
     * Register side effects for abstractMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAbstractMesh(): void;


    /**
     * Data for mesh hotspot computation
     */
    export type HotSpotQuery = {
        /**
         * 3 point indices
         */
        pointIndex: [number, number, number];
        /**
         * 3 barycentric coordinates
         */
        barycentric: [number, number, number];
    };
    /**
     * Create a HotSpotQuery from a picking info
     * @remarks If there is no pickedMesh or the pickedMesh has no indices, the faceId is used as the base index
     * @param pickingInfo picking info to use
     * @returns the created HotSpotQuery
     */
    export function CreateHotSpotQueryForPickingInfo(pickingInfo: PickingInfo): HotSpotQuery;
    /**
     * Return a transformed local position from a mesh and vertex index
     * @param mesh mesh used to get vertex array from
     * @param index vertex index
     * @param res resulting local position
     * @returns false if it was not possible to compute the position for that vertex
     */
    export function GetTransformedPosition(mesh: AbstractMesh, index: number, res: Vector3): boolean;
    /**
     * Compute a world space hotspot position
     * TmpVectors.Vector3[0..4] are modified by this function. Do not use them as result output.
     * @param mesh mesh used to get hotspot from
     * @param hotSpotQuery point indices and barycentric
     * @param resPosition output world position
     * @param resNormal optional output world normal
     * @returns false if it was not possible to compute the hotspot position
     */
    export function GetHotSpotToRef(mesh: AbstractMesh, hotSpotQuery: HotSpotQuery, resPosition: Vector3, resNormal?: Vector3): boolean;


        /** @internal */
        interface AbstractMesh {
            /** @internal */
            _decalMap: Nullable<MeshUVSpaceRenderer>;
            /**
             * Gets or sets the decal map for this mesh
             */
            decalMap: Nullable<MeshUVSpaceRenderer>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for abstractMeshDecalMap.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAbstractMeshDecalMap(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import abstractMesh.decalMap.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import abstractMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** @internal */
    export class WebGPUDataBuffer extends DataBuffer {
        private _buffer;
        /** @internal */
        engineId: number;
        /** @internal */
        set buffer(buffer: Nullable<GPUBuffer>);
        /** @internal */
        constructor(resource?: GPUBuffer, capacity?: number);
        /** @internal */
        get underlyingResource(): any;
    }


    /** @internal */
    export class WebGLDataBuffer extends DataBuffer {
        private _buffer;
        /** @internal */
        constructor(resource: WebGLBuffer);
        /** @internal */
        get underlyingResource(): any;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Class used to store node based geometry build state
     */
    export class NodeGeometryBuildState {
        private _rotationMatrix;
        private _scalingMatrix;
        private _positionMatrix;
        private _scalingRotationMatrix;
        private _transformMatrix;
        private _tempVector3;
        /** Gets or sets the list of non connected mandatory inputs */
        notConnectedNonOptionalInputs: NodeGeometryConnectionPoint[];
        /** Gets or sets the list of non contextual inputs having no contextudal data */
        noContextualData: NodeGeometryContextualSources[];
        /** Gets or sets the build identifier */
        buildId: number;
        /** Gets or sets a boolean indicating that verbose mode is on */
        verbose: boolean;
        /** Gets or sets the vertex data */
        vertexData: Nullable<VertexData>;
        private _geometryContext;
        private _executionContext;
        private _instancingContext;
        private _geometryContextStack;
        private _executionContextStack;
        private _instancingContextStack;
        /** Gets or sets the geometry context */
        get geometryContext(): Nullable<VertexData>;
        /** Gets or sets the execution context */
        get executionContext(): Nullable<INodeGeometryExecutionContext>;
        /** Gets or sets the instancing context */
        get instancingContext(): Nullable<INodeGeometryInstancingContext>;
        /**
         * Push the new active geometry context
         * @param geometryContext defines the geometry context
         */
        pushGeometryContext(geometryContext: VertexData): void;
        /**
         * Push the new active execution context
         * @param executionContext defines the execution context
         */
        pushExecutionContext(executionContext: INodeGeometryExecutionContext): void;
        /**
         * Push the new active instancing context
         * @param instancingContext defines the instancing context
         */
        pushInstancingContext(instancingContext: INodeGeometryInstancingContext): void;
        /**
         * Remove current geometry context and restore the previous one
         */
        restoreGeometryContext(): void;
        /**
         * Remove current execution context and restore the previous one
         */
        restoreExecutionContext(): void;
        /**
         * Remove current isntancing context and restore the previous one
         */
        restoreInstancingContext(): void;
        /**
         * Gets the value associated with a contextual source
         * @param source Source of the contextual value
         * @param skipWarning Do not store the warning for reporting if true
         * @returns the value associated with the source
         */
        getContextualValue(source: NodeGeometryContextualSources, skipWarning?: boolean): any;
        /**
         * Adapt a value to a target type
         * @param source defines the value to adapt
         * @param targetType defines the target type
         * @returns the adapted value
         */
        adapt(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes): any;
        /**
         * Adapt an input value to a target type
         * @param source defines the value to adapt
         * @param targetType defines the target type
         * @param defaultValue defines the default value to use if not connected
         * @returns the adapted value
         */
        adaptInput(source: NodeGeometryConnectionPoint, targetType: NodeGeometryBlockConnectionPointTypes, defaultValue: any): any;
        /**
         * Emits console errors and exceptions if there is a failing check
         */
        emitErrors(): void;
        /** @internal  */
        _instantiate(clone: VertexData, currentPosition: Vector3, rotation: Vector3, scaling: Vector3, additionalVertexData: VertexData[]): void;
        /** @internal  */
        _instantiateWithMatrix(clone: VertexData, transform: Matrix, additionalVertexData: VertexData[]): void;
        /** @internal  */
        _instantiateWithPositionAndMatrix(clone: VertexData, currentPosition: Vector3, transform: Matrix, additionalVertexData: VertexData[]): void;
    }


    /**
     * Enum used to define the compatibility state between two connection points
     */
    export enum NodeGeometryConnectionPointCompatibilityStates {
        /** Points are compatibles */
        Compatible = 0,
        /** Points are incompatible because of their types */
        TypeIncompatible = 1,
        /** Points are incompatible because they are in the same hierarchy **/
        HierarchyIssue = 2
    }
    /**
     * Defines the direction of a connection point
     */
    export enum NodeGeometryConnectionPointDirection {
        /** Input */
        Input = 0,
        /** Output */
        Output = 1
    }
    /**
     * Defines a connection point for a block
     */
    export class NodeGeometryConnectionPoint {
        /** @internal */
        _ownerBlock: NodeGeometryBlock;
        /** @internal */
        _connectedPoint: Nullable<NodeGeometryConnectionPoint>;
        /** @internal */
        _storedValue: any;
        /** @internal */
        _storedFunction: Nullable<(state: NodeGeometryBuildState) => any>;
        /** @internal */
        _acceptedConnectionPointType: Nullable<NodeGeometryConnectionPoint>;
        private _endpoints;
        private _direction;
        private _type;
        /** @internal */
        _linkedConnectionSource: Nullable<NodeGeometryConnectionPoint>;
        /** @internal */
        _typeConnectionSource: Nullable<NodeGeometryConnectionPoint>;
        /** @internal */
        _defaultConnectionPointType: Nullable<NodeGeometryBlockConnectionPointTypes>;
        /** @internal */
        _isMainLinkSource: boolean;
        /** Gets the direction of the point */
        get direction(): NodeGeometryConnectionPointDirection;
        /**
         * Gets or sets the additional types supported by this connection point
         */
        acceptedConnectionPointTypes: NodeGeometryBlockConnectionPointTypes[];
        /**
         * Gets or sets the additional types excluded by this connection point
         */
        excludedConnectionPointTypes: NodeGeometryBlockConnectionPointTypes[];
        /**
         * Observable triggered when this point is connected
         */
        onConnectionObservable: Observable<NodeGeometryConnectionPoint>;
        /**
         * Observable triggered when this point is disconnected
         */
        onDisconnectionObservable: Observable<NodeGeometryConnectionPoint>;
        /**
         * Gets or sets a boolean indicating that this connection point is exposed on a frame
         */
        isExposedOnFrame: boolean;
        /**
         * Gets or sets number indicating the position that the port is exposed to on a frame
         */
        exposedPortPosition: number;
        /**
         * Gets the default value used for this point at creation time
         */
        defaultValue: Nullable<any>;
        /**
         * Gets or sets the default value used for this point if nothing is connected
         */
        value: Nullable<any>;
        /**
         * Gets or sets the min value accepted for this point if nothing is connected
         */
        valueMin: Nullable<any>;
        /**
         * Gets or sets the max value accepted for this point if nothing is connected
         */
        valueMax: Nullable<any>;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeGeometryBlockConnectionPointTypes;
        set type(value: NodeGeometryBlockConnectionPointTypes);
        /**
         * Gets or sets the connection point name
         */
        name: string;
        /**
         * Gets or sets the connection point display name
         */
        displayName: string;
        /**
         * Gets or sets a boolean indicating that this connection point can be omitted
         */
        isOptional: boolean;
        /**
         * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock
         */
        get isConnected(): boolean;
        /** Get the other side of the connection (if any) */
        get connectedPoint(): Nullable<NodeGeometryConnectionPoint>;
        /** Get the block that owns this connection point */
        get ownerBlock(): NodeGeometryBlock;
        /** Get the block connected on the other side of this connection (if any) */
        get sourceBlock(): Nullable<NodeGeometryBlock>;
        /** Get the block connected on the endpoints of this connection (if any) */
        get connectedBlocks(): Array<NodeGeometryBlock>;
        /** Gets the list of connected endpoints */
        get endpoints(): NodeGeometryConnectionPoint[];
        /** Gets a boolean indicating if that output point is connected to at least one input */
        get hasEndpoints(): boolean;
        /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */
        get innerType(): NodeGeometryBlockConnectionPointTypes;
        /** @internal */
        _callCount: number;
        /** @internal */
        _executionCount: number;
        /** @internal */
        _resetCounters(): void;
        /**
         * Gets the number of times this point was called
         */
        get callCount(): number;
        /**
         * Gets the number of times this point was executed
         */
        get executionCount(): number;
        /**
         * Gets the value represented by this connection point
         * @param state current evaluation state
         * @returns the connected value or the value if nothing is connected
         */
        getConnectedValue(state: NodeGeometryBuildState): any;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         */
        constructor(name: string, ownerBlock: NodeGeometryBlock, direction: NodeGeometryConnectionPointDirection);
        /**
         * Gets the current class name e.g. "NodeMaterialConnectionPoint"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a boolean
         */
        canConnectTo(connectionPoint: NodeGeometryConnectionPoint): boolean;
        /**
         * Gets a number indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a number defining the compatibility state
         */
        checkCompatibilityState(connectionPoint: NodeGeometryConnectionPoint): NodeGeometryConnectionPointCompatibilityStates;
        /**
         * Connect this point to another connection point
         * @param connectionPoint defines the other connection point
         * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)
         * @returns the current connection point
         */
        connectTo(connectionPoint: NodeGeometryConnectionPoint, ignoreConstraints?: boolean): NodeGeometryConnectionPoint;
        /**
         * Disconnect this point from one of his endpoint
         * @param endpoint defines the other connection point
         * @returns the current connection point
         */
        disconnectFrom(endpoint: NodeGeometryConnectionPoint): NodeGeometryConnectionPoint;
        /**
         * Fill the list of excluded connection point types with all types other than those passed in the parameter
         * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list
         */
        addExcludedConnectionPointFromAllowedTypes(mask: number): void;
        /**
         * Serializes this point in a JSON representation
         * @param isInput defines if the connection point is an input (default is true)
         * @returns the serialized point object
         */
        serialize(isInput?: boolean): any;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /**
     * Defines a block that can be used inside a node based geometry
     */
    export class NodeGeometryBlock {
        private _name;
        private _buildId;
        protected _isInput: boolean;
        protected _isTeleportOut: boolean;
        protected _isTeleportIn: boolean;
        protected _isDebug: boolean;
        protected _isUnique: boolean;
        private _buildExecutionTime;
        /**
         * Gets an observable raised when the block is built
         */
        onBuildObservable: Observable<NodeGeometryBlock>;
        /** @internal */
        _inputs: NodeGeometryConnectionPoint[];
        /** @internal */
        _outputs: NodeGeometryConnectionPoint[];
        /** @internal */
        _preparationId: number;
        /** @internal */
        _codeVariableName: string;
        /**
         * Gets the time spent to build this block (in ms)
         */
        get buildExecutionTime(): number;
        /**
         * Gets the list of input points
         */
        get inputs(): NodeGeometryConnectionPoint[];
        /** Gets the list of output points */
        get outputs(): NodeGeometryConnectionPoint[];
        /**
         * Gets or sets the unique id of the node
         */
        uniqueId: number;
        /**
         * Gets or set the name of the block
         */
        get name(): string;
        set name(value: string);
        /**
         * Gets a boolean indicating if this block is an input
         */
        get isInput(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport out
         */
        get isTeleportOut(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport in
         */
        get isTeleportIn(): boolean;
        /**
         * Gets a boolean indicating if this block is a debug block
         */
        get isDebug(): boolean;
        /**
         * Gets a boolean indicating that this block can only be used once per NodeGeometry
         */
        get isUnique(): boolean;
        /**
         * A free comment about the block
         */
        comments: string;
        /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */
        visibleOnFrame: boolean;
        /**
         * Gets the current class name e.g. "NodeGeometryBlock"
         * @returns the class name
         */
        getClassName(): string;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeGeometryBlock): boolean;
        /**
         * Checks if the current block is an ancestor of a given type
         * @param type defines the potential type to check
         * @returns true if block is a descendant
         */
        isAnAncestorOfType(type: string): boolean;
        /**
         * Get the first descendant using a predicate
         * @param predicate defines the predicate to check
         * @returns descendant or null if none found
         */
        getDescendantOfPredicate(predicate: (block: NodeGeometryBlock) => boolean): Nullable<NodeGeometryBlock>;
        /**
         * @internal
         */
        get _isReadyState(): Nullable<Promise<void>>;
        /**
         * Creates a new NodeGeometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Register a new input. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param isOptional defines a boolean indicating that this input can be omitted
         * @param value value to return if there is no connection
         * @param valueMin min value accepted for value
         * @param valueMax max value accepted for value
         * @returns the current block
         */
        registerInput(name: string, type: NodeGeometryBlockConnectionPointTypes, isOptional?: boolean, value?: any, valueMin?: any, valueMax?: any): this;
        /**
         * Register a new output. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerOutput(name: string, type: NodeGeometryBlockConnectionPointTypes, point?: NodeGeometryConnectionPoint): this;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _customBuildStep(state: NodeGeometryBuildState): void;
        /**
         * Build the current node and generate the vertex data
         * @param state defines the current generation state
         * @returns true if already built
         */
        build(state: NodeGeometryBuildState): boolean;
        protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling?: boolean): void;
        /**
         * Initialize the block and prepare the context for build
         */
        initialize(): void;
        /**
         * Lets the block try to connect some inputs automatically
         * @param _nodeGeometry defines the node geometry to use for auto connection
         */
        autoConfigure(_nodeGeometry: NodeGeometry): void;
        /**
         * Find an input by its name
         * @param name defines the name of the input to look for
         * @returns the input or null if not found
         */
        getInputByName(name: string): NodeGeometryConnectionPoint | null;
        /**
         * Find an output by its name
         * @param name defines the name of the output to look for
         * @returns the output or null if not found
         */
        getOutputByName(name: string): NodeGeometryConnectionPoint | null;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * @internal
         */
        _deserialize(serializationObject: any): void;
        private _deserializePortDisplayNamesAndExposedOnFrame;
        protected _dumpPropertiesCode(): string;
        /**
         * @internal
         */
        _dumpCodeForOutputConnections(alreadyDumped: NodeGeometryBlock[]): string;
        /**
         * @internal
         */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeGeometryBlock[]): string;
        /**
         * Clone the current block to a new identical block
         * @returns a copy of the current block
         */
        clone(): NodeGeometryBlock | null;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /**
     * Interface used to configure the node geometry editor
     */
    export interface INodeGeometryEditorOptions {
        /** Define the URL to load node editor script from */
        editorURL?: string;
        /** Additional configuration for the NGE */
        nodeGeometryEditorConfig?: {
            backgroundColor?: Color4;
            hostScene?: Scene;
            hostMesh?: Mesh;
        };
    }
    /**
     * Defines a node based geometry
     * @see demo at https://playground.babylonjs.com#PYY6XE#69
     */
    export class NodeGeometry {
        private static _BuildIdGenerator;
        private _buildId;
        private _buildWasSuccessful;
        private _vertexData;
        private _buildExecutionTime;
        /** Define the Url to load node editor script */
        static EditorURL: string;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        private BJSNODEGEOMETRYEDITOR;
        /** @returns the inspector from bundle or global */
        private _getGlobalNodeGeometryEditor;
        /**
         * Gets the time spent to build this block (in ms)
         */
        get buildExecutionTime(): number;
        /**
         * Gets or sets data used by visual editor
         * @see https://nge.babylonjs.com
         */
        editorData: any;
        /**
         * Gets an array of blocks that needs to be serialized even if they are not yet connected
         */
        attachedBlocks: NodeGeometryBlock[];
        /**
         * Observable raised when the geometry is built
         */
        onBuildObservable: Observable<NodeGeometry>;
        /** Gets or sets the GeometryOutputBlock used to gather the final geometry data */
        outputBlock: Nullable<GeometryOutputBlock>;
        /**
         * Snippet ID if the material was created from the snippet server
         */
        snippetId: string;
        /**
         * The name of the geometry
         */
        name: string;
        /**
         * A free comment about the geometry
         */
        comment: string;
        /**
         * Creates a new geometry
         * @param name defines the name of the geometry
         */
        constructor(name: string);
        /**
         * Gets the current class name of the geometry e.g. "NodeGeometry"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the vertex data. This needs to be done after build() was called.
         * This is used to access vertexData when creating a mesh is not required.
         */
        get vertexData(): Nullable<VertexData>;
        /**
         * Get a block by its name
         * @param name defines the name of the block to retrieve
         * @returns the required block or null if not found
         */
        getBlockByName(name: string): NodeGeometryBlock | null;
        /**
         * Get a block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required block or null if not found
         */
        getBlockByPredicate(predicate: (block: NodeGeometryBlock) => boolean): NodeGeometryBlock | null;
        /**
         * Gets the list of input blocks attached to this material
         * @returns an array of InputBlocks
         */
        getInputBlocks(): GeometryInputBlock[];
        /**
         * Launch the node geometry editor
         * @param config Define the configuration of the editor
         * @returns a promise fulfilled when the node editor is visible
         */
        edit(config?: INodeGeometryEditorOptions): Promise<void>;
        /**
         * Creates the node editor window.
         * @param additionalConfig Additional configuration for the NGE
         */
        private _createNodeEditor;
        /**
         * Build the final geometry. Please note that the geometry MAY not be ready until the onBuildObservable is raised.
         * @param verbose defines if the build should log activity
         * @param updateBuildId defines if the internal build Id should be updated (default is true)
         * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)
         */
        build(verbose?: boolean, updateBuildId?: boolean, autoConfigure?: boolean): void;
        /**
         * Creates a mesh from the geometry blocks
         * @param name defines the name of the mesh
         * @param scene The scene the mesh is scoped to
         * @returns The new mesh
         */
        createMesh(name: string, scene?: Nullable<Scene>): Nullable<Mesh>;
        /**
         * Creates a mesh from the geometry blocks
         * @param mesh the mesh to update
         * @returns True if successfully updated
         */
        updateMesh(mesh: Mesh): false | Mesh;
        private _initializeBlock;
        /**
         * Clear the current geometry
         */
        clear(): void;
        /**
         * Remove a block from the current geometry
         * @param block defines the block to remove
         */
        removeBlock(block: NodeGeometryBlock): void;
        /**
         * Clear the current graph and load a new one from a serialization object
         * @param source defines the JSON representation of the geometry
         * @param merge defines whether or not the source must be merged or replace the current content
         */
        parseSerializedObject(source: any, merge?: boolean): void;
        private _restoreConnections;
        /**
         * Generate a string containing the code declaration required to create an equivalent of this geometry
         * @returns a string
         */
        generateCode(): string;
        private _gatherBlocks;
        /**
         * Clear the current geometry and set it to a default state
         */
        setToDefault(): void;
        /**
         * Makes a duplicate of the current geometry.
         * @param name defines the name to use for the new geometry
         * @returns the new geometry
         */
        clone(name: string): NodeGeometry;
        /**
         * Serializes this geometry in a JSON representation
         * @param selectedBlocks defines the list of blocks to save (if null the whole geometry will be saved)
         * @returns the serialized geometry object
         */
        serialize(selectedBlocks?: NodeGeometryBlock[]): any;
        /**
         * Disposes the resources
         */
        dispose(): void;
        /**
         * Creates a new node geometry set to default basic configuration
         * @param name defines the name of the geometry
         * @returns a new NodeGeometry
         */
        static CreateDefault(name: string): NodeGeometry;
        /**
         * Creates a node geometry from parsed geometry data
         * @param source defines the JSON representation of the geometry
         * @returns a new node geometry
         */
        static Parse(source: any): NodeGeometry;
        /**
         * Creates a node geometry from a snippet saved by the node geometry editor
         * @param snippetId defines the snippet to load
         * @param nodeGeometry defines a node geometry to update (instead of creating a new one)
         * @param skipBuild defines whether to build the node geometry
         * @returns a promise that will resolve to the new node geometry
         */
        static ParseFromSnippetAsync(snippetId: string, nodeGeometry?: NodeGeometry, skipBuild?: boolean): Promise<NodeGeometry>;
    }




    /**
     * Interface used to define texture data
     */
    export interface INodeGeometryTextureData {
        /** @internal */
        data: Nullable<Float32Array>;
        /** @internal */
        width: number;
        /** @internal */
        height: number;
    }


    /**
     * Interface used to convey instancing context through execution nodes
     */
    export interface INodeGeometryInstancingContext {
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
    }


    /**
     * Interface used to convey context through execution nodes
     */
    export interface INodeGeometryExecutionContext {
        /**
         * Gets the current vertex index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the value associated with a contextual positions
         * @returns the value associated with the source
         */
        getOverridePositionsContextualValue?(): any;
        /**
         * Gets the value associated with a contextual normals
         * @returns the value associated with the source
         */
        getOverrideNormalsContextualValue?(): any;
        /**
         * Gets the value associated with a contextual UV1 set
         * @returns the value associated with the source
         */
        getOverrideUVs1ContextualValue?(): any;
    }


    /**
     * Defines the kind of contextual sources for node geometry
     */
    export enum NodeGeometryContextualSources {
        /** None */
        None = 0,
        /** Positions */
        Positions = 1,
        /** Normals */
        Normals = 2,
        /** Tangents */
        Tangents = 3,
        /** UV */
        UV = 4,
        /** UV2 */
        UV2 = 5,
        /** UV3 */
        UV3 = 6,
        /** UV4 */
        UV4 = 7,
        /** UV5 */
        UV5 = 8,
        /** UV6 */
        UV6 = 9,
        /** Colors */
        Colors = 10,
        /** VertexID */
        VertexID = 11,
        /** FaceID */
        FaceID = 12,
        /** GeometryID */
        GeometryID = 13,
        /** CollectionID */
        CollectionID = 14,
        /** LoopID */
        LoopID = 15,
        /** InstanceID */
        InstanceID = 16,
        /** LatticeID */
        LatticeID = 17,
        /** LatticeControl */
        LatticeControl = 18
    }


    /**
     * Defines the kind of connection point for node geometry
     */
    export enum NodeGeometryBlockConnectionPointTypes {
        /** Int */
        Int = 1,
        /** Float */
        Float = 2,
        /** Vector2 */
        Vector2 = 4,
        /** Vector3 */
        Vector3 = 8,
        /** Vector4 */
        Vector4 = 16,
        /** Matrix */
        Matrix = 32,
        /** Geometry */
        Geometry = 64,
        /** Texture */
        Texture = 128,
        /** Detect type based on connection */
        AutoDetect = 1024,
        /** Output type that will be defined by input type */
        BasedOnInput = 2048,
        /** Undefined */
        Undefined = 4096,
        /** Bitmask of all types */
        All = 4095
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to create a Vector2/3/4 out of individual or partial inputs
     */
    export class VectorConverterBlock extends NodeGeometryBlock {
        /**
         * Create a new VectorConverterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the xyzw component (input)
         */
        get xyzwIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the xyz component (input)
         */
        get xyzIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the xy component (input)
         */
        get xyIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the zw component (input)
         */
        get zwIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the x component (input)
         */
        get xIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the y component (input)
         */
        get yIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the z component (input)
         */
        get zIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the w component (input)
         */
        get wIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the xyzw component (output)
         */
        get xyzwOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the xyz component (output)
         */
        get xyzOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the xy component (output)
         */
        get xyOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the zw component (output)
         */
        get zwOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the x component (output)
         */
        get xOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the y component (output)
         */
        get yOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the z component (output)
         */
        get zOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the w component (output)
         */
        get wOut(): NodeGeometryConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for vectorConverterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVectorConverterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import vectorConverterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to subdivide for a geometry using Catmull-Clark algorithm
     */
    export class SubdivideBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         */
        flatOnly: boolean;
        /**
         * Gets or sets a float defining the loop weight. i.e how much to weigh favoring heavy corners vs favoring Loop's formula
         */
        loopWeight: number;
        /**
         * Creates a new ComputeNormalsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the level component
         */
        get level(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for subdivideBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSubdivideBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import subdivideBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Locks supported by the random block
     */
    export enum RandomBlockLocks {
        /** None */
        None = 0,
        /** LoopID */
        LoopID = 1,
        /** InstanceID */
        InstanceID = 2,
        /** Once */
        Once = 3
    }
    /**
     * Block used to get a random number
     */
    export class RandomBlock extends NodeGeometryBlock {
        private _currentLockId;
        /**
         * Gets or sets a value indicating if that block will lock its value for a specific duration
         */
        lockMode: RandomBlockLocks;
        /**
         * Create a new RandomBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the min input component
         */
        get min(): NodeGeometryConnectionPoint;
        /**
         * Gets the max input component
         */
        get max(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for randomBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRandomBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import randomBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to normalize vectors
     */
    export class NormalizeVectorBlock extends NodeGeometryBlock {
        /**
         * Creates a new NormalizeVectorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for normalizeVectorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNormalizeVectorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import normalizeVectorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a noise value
     */
    export class NoiseBlock extends NodeGeometryBlock {
        /**
         * Create a new NoiseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the offset input component
         */
        get offset(): NodeGeometryConnectionPoint;
        /**
         * Gets the scale input component
         */
        get scale(): NodeGeometryConnectionPoint;
        /**
         * Gets the octaves input component
         */
        get octaves(): NodeGeometryConnectionPoint;
        /**
         * Gets the roughtness input component
         */
        get roughness(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        private _negateIf;
        private _noiseGrad;
        private _fade;
        private _hashBitRotate;
        private _hash;
        private _mix;
        private _perlinNoise;
        private _perlinSigned;
        private _perlin;
        /**
         * Gets a perlin noise value
         * @param octaves number of octaves
         * @param roughness roughness
         * @param _position position vector
         * @param offset offset vector
         * @param scale scale value
         * @returns a value between 0 and 1
         * @see Based on https://github.com/blender/blender/blob/main/source/blender/blenlib/intern/noise.cc#L533
         */
        noise(octaves: number, roughness: number, _position: Vector3, offset: Vector3, scale: number): number;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for noiseBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNoiseBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import noiseBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to merge several geometries
     */
    export class MergeGeometryBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new MergeGeometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry0 input component
         */
        get geometry0(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry1 input component
         */
        get geometry1(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry2 input component
         */
        get geometry2(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry3 input component
         */
        get geometry3(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry4 input component
         */
        get geometry4(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for mergeGeometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMergeGeometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mergeGeometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compose two matrices
     */
    export class MatrixComposeBlock extends NodeGeometryBlock {
        /**
         * Create a new MatrixComposeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the matrix0 input component
         */
        get matrix0(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix1 input component
         */
        get matrix1(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for matrixComposeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMatrixComposeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import matrixComposeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Math block
     */
    export enum MathBlockOperations {
        /** Add */
        Add = 0,
        /** Subtract */
        Subtract = 1,
        /** Multiply */
        Multiply = 2,
        /** Divide */
        Divide = 3,
        /** Max */
        Max = 4,
        /** Min */
        Min = 5
    }
    /**
     * Block used to apply math functions
     */
    export class MathBlock extends NodeGeometryBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: MathBlockOperations;
        private readonly _connectionObservers;
        /**
         * Create a new MathBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        private _updateInputOutputTypes;
        /**
         * Release resources
         */
        dispose(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for mathBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMathBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mathBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Type of mappings supported by the mapping block
     */
    export enum MappingTypes {
        /** Spherical */
        Spherical = 0,
        /** Cylindrical */
        Cylindrical = 1,
        /** Cubic */
        Cubic = 2
    }
    /**
     * Block used to generate UV coordinates
     */
    export class MappingBlock extends NodeGeometryBlock {
        /**
         * Gets or sets the mapping type used by the block
         */
        mapping: MappingTypes;
        /**
         * Create a new MappingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the position input component
         */
        get position(): NodeGeometryConnectionPoint;
        /**
         * Gets the normal input component
         */
        get normal(): NodeGeometryConnectionPoint;
        /**
         * Gets the center input component
         */
        get center(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get uv(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for mappingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMappingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mappingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to move a value from a range to another
     */
    export class MapRangeBlock extends NodeGeometryBlock {
        /**
         * Create a new MapRangeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the fromMin input component
         */
        get fromMin(): NodeGeometryConnectionPoint;
        /**
         * Gets the fromMax input component
         */
        get fromMax(): NodeGeometryConnectionPoint;
        /**
         * Gets the toMin input component
         */
        get toMin(): NodeGeometryConnectionPoint;
        /**
         * Gets the toMax input component
         */
        get toMax(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for mapRangeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMapRangeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mapRangeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to convert from int to float
     */
    export class IntFloatConverterBlock extends NodeGeometryBlock {
        /**
         * Create a new IntFloatConverterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the float input component
         */
        get floatIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the int input component
         */
        get intIn(): NodeGeometryConnectionPoint;
        /**
         * Gets the float output component
         */
        get floatOut(): NodeGeometryConnectionPoint;
        /**
         * Gets the int output component
         */
        get intOut(): NodeGeometryConnectionPoint;
        protected _inputRename(name: string): string;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for intFloatConverterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterIntFloatConverterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import intFloatConverterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Trigonometry block
     */
    export enum GeometryTrigonometryBlockOperations {
        /** Cos */
        Cos = 0,
        /** Sin */
        Sin = 1,
        /** Abs */
        Abs = 2,
        /** Exp */
        Exp = 3,
        /** Round */
        Round = 4,
        /** Floor */
        Floor = 5,
        /** Ceiling */
        Ceiling = 6,
        /** Square root */
        Sqrt = 7,
        /** Log */
        Log = 8,
        /** Tangent */
        Tan = 9,
        /** Arc tangent */
        ArcTan = 10,
        /** Arc cosinus */
        ArcCos = 11,
        /** Arc sinus */
        ArcSin = 12,
        /** Sign */
        Sign = 13,
        /** Negate */
        Negate = 14,
        /** OneMinus */
        OneMinus = 15,
        /** Reciprocal */
        Reciprocal = 16,
        /** ToDegrees */
        ToDegrees = 17,
        /** ToRadians */
        ToRadians = 18,
        /** Fract */
        Fract = 19,
        /** Exp2 */
        Exp2 = 20
    }
    /**
     * Block used to apply trigonometry operation to floats
     */
    export class GeometryTrigonometryBlock extends NodeGeometryBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: GeometryTrigonometryBlockOperations;
        /**
         * Creates a new GeometryTrigonometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): this | undefined;
        /** @internal */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for geometryTrigonometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryTrigonometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryTrigonometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply a transform to a vector / geometry
     */
    export class GeometryTransformBlock extends NodeGeometryBlock {
        private _rotationMatrix;
        private _scalingMatrix;
        private _translationMatrix;
        private _scalingRotationMatrix;
        private _pivotMatrix;
        private _backPivotMatrix;
        private _transformMatrix;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new GeometryTransformBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix input component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /**
         * Gets the translation input component
         */
        get translation(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        /**
         * Gets the pivot input component
         */
        get pivot(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryTransformBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryTransformBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryTransformBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to step a value
     */
    export class GeometryStepBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryStepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the edge operand input component
         */
        get edge(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryStepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryStepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to smooth step a value
     */
    export class GeometrySmoothStepBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometrySmoothStepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the first edge operand input component
         */
        get edge0(): NodeGeometryConnectionPoint;
        /**
         * Gets the second edge operand input component
         */
        get edge1(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometrySmoothStepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometrySmoothStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometrySmoothStepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to rotate a 2d vector by a given angle
     */
    export class GeometryRotate2dBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryRotate2dBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input vector
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the input angle
         */
        get angle(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryRotate2dBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryRotate2dBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryRotate2dBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to replace a color by another one
     */
    export class GeometryReplaceColorBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryReplaceColorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the reference input component
         */
        get reference(): NodeGeometryConnectionPoint;
        /**
         * Gets the distance input component
         */
        get distance(): NodeGeometryConnectionPoint;
        /**
         * Gets the replacement input component
         */
        get replacement(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryReplaceColorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryReplaceColorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryReplaceColorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the value of the first parameter raised to the power of the second
     */
    export class GeometryPowBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryPowBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the power operand input component
         */
        get power(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryPowBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryPowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryPowBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to posterize a value
     * @see https://en.wikipedia.org/wiki/Posterization
     */
    export class GeometryPosterizeBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryPosterizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the steps input component
         */
        get steps(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryPosterizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryPosterizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryPosterizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to generate the final geometry
     */
    export class GeometryOutputBlock extends NodeGeometryBlock {
        private _vertexData;
        /**
         * Gets the current vertex data if the graph was successfully built
         */
        get currentVertexData(): Nullable<VertexData>;
        /**
         * Create a new GeometryOutputBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for geometryOutputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryOutputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to extract unique positions from a geometry
     */
    export class GeometryOptimizeBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Define the epsilon used to compare similar positions
         */
        epsilon: number;
        /**
         * Optimize faces (by removing duplicates)
         */
        optimizeFaces: boolean;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Creates a new GeometryOptimizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the selector component
         */
        get selector(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryOptimizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryOptimizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryOptimizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to normalize lerp between 2 values
     */
    export class GeometryNLerpBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryNLerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryNLerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryNLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryNLerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute value of one parameter modulo another
     */
    export class GeometryModBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryModBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryModBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryModBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryModBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to lerp between 2 values
     */
    export class GeometryLerpBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryLerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryLerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryLerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the length of a vector
     */
    export class GeometryLengthBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryLengthBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryLengthBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryLengthBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryLengthBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to trigger an observable when traversed
     * It can also be used to execute a function when traversed
     */
    export class GeometryInterceptorBlock extends NodeGeometryBlock {
        /**
         * Observable triggered when the block is traversed
         */
        onInterceptionObservable: Observable<any>;
        /**
         * Custom function to execute when traversed
         */
        customFunction?: (value: any, state: NodeGeometryBuildState) => any;
        /**
         * Creates a new GeometryInterceptorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the time spent to build this block (in ms)
         */
        get buildExecutionTime(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for geometryInterceptorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryInterceptorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryInterceptorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to expose an input value
     */
    export class GeometryInputBlock extends NodeGeometryBlock {
        private _storedValue;
        private _valueCallback;
        private _type;
        private _contextualSource;
        /** Gets or set a value used to limit the range of float values */
        min: number;
        /** Gets or set a value used to limit the range of float values */
        max: number;
        /** Gets or sets the group to use to display this block in the Inspector */
        groupInInspector: string;
        /**
         * Gets or sets a boolean indicating that this input is displayed in the Inspector
         */
        displayInInspector: boolean;
        /** Gets an observable raised when the value is changed */
        onValueChangedObservable: Observable<GeometryInputBlock>;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeGeometryBlockConnectionPointTypes;
        /**
         * Gets a boolean indicating that the current connection point is a contextual value
         */
        get isContextual(): boolean;
        /**
         * Gets or sets the current contextual value
         */
        get contextualValue(): NodeGeometryContextualSources;
        set contextualValue(value: NodeGeometryContextualSources);
        /**
         * Creates a new InputBlock
         * @param name defines the block name
         * @param type defines the type of the input (can be set to NodeGeometryBlockConnectionPointTypes.AutoDetect)
         */
        constructor(name: string, type?: NodeGeometryBlockConnectionPointTypes);
        /**
         * Gets or sets the value of that point.
         * Please note that this value will be ignored if valueCallback is defined
         */
        get value(): any;
        set value(value: any);
        /**
         * Gets or sets a callback used to get the value of that point.
         * Please note that setting this value will force the connection point to ignore the value property
         */
        get valueCallback(): () => any;
        set valueCallback(value: () => any);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        /**
         * Set the input block to its default value (based on its type)
         */
        setDefaultValue(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        /** @internal */
        dispose(): void;
        protected _dumpPropertiesCode(): string;
        /** @internal */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryInputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryInputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryInputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get information about a geometry
     */
    export class GeometryInfoBlock extends NodeGeometryBlock {
        private _currentVertexData;
        /**
         * Create a new GeometryInfoBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        /**
         * Gets the id output component
         */
        get id(): NodeGeometryConnectionPoint;
        /**
         * Gets the collectionId output component
         */
        get collectionId(): NodeGeometryConnectionPoint;
        /**
         * Gets the verticesCount output component
         */
        get verticesCount(): NodeGeometryConnectionPoint;
        /**
         * Gets the facesCount output component
         */
        get facesCount(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for geometryInfoBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryInfoBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryInfoBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as a pass through
     */
    export class GeometryElbowBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryElbowBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the time spent to build this block (in ms)
         */
        get buildExecutionTime(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for geometryElbowBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryElbowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryElbowBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Types of easing function supported by the Ease block
     */
    export enum GeometryEaseBlockTypes {
        /** EaseInSine */
        EaseInSine = 0,
        /** EaseOutSine */
        EaseOutSine = 1,
        /** EaseInOutSine */
        EaseInOutSine = 2,
        /** EaseInQuad */
        EaseInQuad = 3,
        /** EaseOutQuad */
        EaseOutQuad = 4,
        /** EaseInOutQuad */
        EaseInOutQuad = 5,
        /** EaseInCubic */
        EaseInCubic = 6,
        /** EaseOutCubic */
        EaseOutCubic = 7,
        /** EaseInOutCubic */
        EaseInOutCubic = 8,
        /** EaseInQuart */
        EaseInQuart = 9,
        /** EaseOutQuart */
        EaseOutQuart = 10,
        /** EaseInOutQuart */
        EaseInOutQuart = 11,
        /** EaseInQuint */
        EaseInQuint = 12,
        /** EaseOutQuint */
        EaseOutQuint = 13,
        /** EaseInOutQuint */
        EaseInOutQuint = 14,
        /** EaseInExpo */
        EaseInExpo = 15,
        /** EaseOutExpo */
        EaseOutExpo = 16,
        /** EaseInOutExpo */
        EaseInOutExpo = 17,
        /** EaseInCirc */
        EaseInCirc = 18,
        /** EaseOutCirc */
        EaseOutCirc = 19,
        /** EaseInOutCirc */
        EaseInOutCirc = 20,
        /** EaseInBack */
        EaseInBack = 21,
        /** EaseOutBack */
        EaseOutBack = 22,
        /** EaseInOutBack */
        EaseInOutBack = 23,
        /** EaseInElastic */
        EaseInElastic = 24,
        /** EaseOutElastic */
        EaseOutElastic = 25,
        /** EaseInOutElastic */
        EaseInOutElastic = 26
    }
    /**
     * Block used to apply an easing function to floats
     */
    export class GeometryEaseBlock extends NodeGeometryBlock {
        private _easingFunction;
        private _type;
        /**
         * Gets or sets the type of the easing functions applied by the block
         */
        get type(): GeometryEaseBlockTypes;
        set type(value: GeometryEaseBlockTypes);
        /**
         * Creates a new GeometryEaseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): this | undefined;
        /** @internal */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for geometryEaseBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryEaseBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryEaseBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply a dot product between 2 vectors
     */
    export class GeometryDotBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryDotBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryDotBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryDotBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryDotBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the distance between 2 values
     */
    export class GeometryDistanceBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryDistanceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryDistanceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryDistanceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryDistanceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to desaturate a color
     */
    export class GeometryDesaturateBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryDesaturateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color operand input component
         */
        get color(): NodeGeometryConnectionPoint;
        /**
         * Gets the level operand input component
         */
        get level(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryDesaturateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryDesaturateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryDesaturateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Types of curves supported by the Curve block
     */
    export enum GeometryCurveBlockTypes {
        /** EaseInSine */
        EaseInSine = 0,
        /** EaseOutSine */
        EaseOutSine = 1,
        /** EaseInOutSine */
        EaseInOutSine = 2,
        /** EaseInQuad */
        EaseInQuad = 3,
        /** EaseOutQuad */
        EaseOutQuad = 4,
        /** EaseInOutQuad */
        EaseInOutQuad = 5,
        /** EaseInCubic */
        EaseInCubic = 6,
        /** EaseOutCubic */
        EaseOutCubic = 7,
        /** EaseInOutCubic */
        EaseInOutCubic = 8,
        /** EaseInQuart */
        EaseInQuart = 9,
        /** EaseOutQuart */
        EaseOutQuart = 10,
        /** EaseInOutQuart */
        EaseInOutQuart = 11,
        /** EaseInQuint */
        EaseInQuint = 12,
        /** EaseOutQuint */
        EaseOutQuint = 13,
        /** EaseInOutQuint */
        EaseInOutQuint = 14,
        /** EaseInExpo */
        EaseInExpo = 15,
        /** EaseOutExpo */
        EaseOutExpo = 16,
        /** EaseInOutExpo */
        EaseInOutExpo = 17,
        /** EaseInCirc */
        EaseInCirc = 18,
        /** EaseOutCirc */
        EaseOutCirc = 19,
        /** EaseInOutCirc */
        EaseInOutCirc = 20,
        /** EaseInBack */
        EaseInBack = 21,
        /** EaseOutBack */
        EaseOutBack = 22,
        /** EaseInOutBack */
        EaseInOutBack = 23,
        /** EaseInElastic */
        EaseInElastic = 24,
        /** EaseOutElastic */
        EaseOutElastic = 25,
        /** EaseInOutElastic */
        EaseInOutElastic = 26
    }
    /**
     * Block used to apply curve operation
     */
    export class GeometryCurveBlock extends NodeGeometryBlock {
        /**
         * Gets or sets the type of the curve applied by the block
         */
        type: GeometryCurveBlockTypes;
        /**
         * Creates a new CurveBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
        /** @internal */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for geometryCurveBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryCurveBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryCurveBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply a cross product between 2 vectors
     */
    export class GeometryCrossBlock extends NodeGeometryBlock {
        /**
         * Creates a new GeometryCrossBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
    }
    /**
     * Register side effects for geometryCrossBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryCrossBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryCrossBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to randomly pick a geometry from a collection
     */
    export class GeometryCollectionBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new GeometryCollectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry0 input component
         */
        get geometry0(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry1 input component
         */
        get geometry1(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry2 input component
         */
        get geometry2(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry3 input component
         */
        get geometry3(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry4 input component
         */
        get geometry4(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry5 input component
         */
        get geometry5(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry6 input component
         */
        get geometry6(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry7 input component
         */
        get geometry7(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry8 input component
         */
        get geometry8(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry9 input component
         */
        get geometry9(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        private _storeGeometry;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryCollectionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryCollectionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryCollectionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clamp a float
     */
    export class GeometryClampBlock extends NodeGeometryBlock {
        /** Gets or sets the minimum range */
        get minimum(): number;
        set minimum(value: number);
        /** Gets or sets the maximum range */
        get maximum(): number;
        set maximum(value: number);
        /**
         * Creates a new GeometryClampBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeGeometryConnectionPoint;
        /**
         * Gets the min input component
         */
        get min(): NodeGeometryConnectionPoint;
        /**
         * Gets the max input component
         */
        get max(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): this | undefined;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryClampBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryClampBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryClampBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute arc tangent of 2 values
     */
    export class GeometryArcTan2Block extends NodeGeometryBlock {
        /**
         * Creates a new GeometryArcTan2Block
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the x operand input component
         */
        get x(): NodeGeometryConnectionPoint;
        /**
         * Gets the y operand input component
         */
        get y(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for geometryArcTan2Block.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryArcTan2Block(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryArcTan2Block.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Cap mode for the extrusion
     */
    export enum ExtrudeGeometryCap {
        /** No caps — only the extruded side walls are generated */
        NoCap = 0,
        /** Cap the bottom face (the original input geometry face) */
        CapStart = 1,
        /** Cap the top face (the offset/extruded geometry face) */
        CapEnd = 2,
        /** Cap both the bottom and top faces (default). Creates a solid */
        CapAll = 3
    }
    /**
     * Block used to extrude a geometry along its face normals
     */
    export class ExtrudeGeometryBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Gets or sets the cap mode for the extrusion
         */
        cap: ExtrudeGeometryCap;
        /**
         * Create a new ExtrudeGeometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the depth input component
         */
        get depth(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for extrudeGeometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterExtrudeGeometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import extrudeGeometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to debug values going through it
     */
    export class DebugBlock extends NodeGeometryBlock {
        /**
         * Gets the log entries
         */
        log: string[][];
        /**
         * Create a new DebugBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the time spent to build this block (in ms)
         */
        get buildExecutionTime(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for meshesNodeBlocksDebugBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshesNodeBlocksDebugBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import debugBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Conditions supported by the condition block
     */
    export enum ConditionBlockTests {
        /** Equal */
        Equal = 0,
        /** NotEqual */
        NotEqual = 1,
        /** LessThan */
        LessThan = 2,
        /** GreaterThan */
        GreaterThan = 3,
        /** LessOrEqual */
        LessOrEqual = 4,
        /** GreaterOrEqual */
        GreaterOrEqual = 5,
        /** Logical Exclusive OR */
        Xor = 6,
        /** Logical Or */
        Or = 7,
        /** Logical And */
        And = 8
    }
    /**
     * Block used to evaluate a condition and return a true or false value
     */
    export class ConditionBlock extends NodeGeometryBlock {
        /**
         * Gets or sets the test used by the block
         */
        test: ConditionBlockTests;
        /**
         * Gets or sets the epsilon value used for comparison
         */
        epsilon: number;
        /**
         * Create a new ConditionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left input component
         */
        get left(): NodeGeometryConnectionPoint;
        /**
         * Gets the right input component
         */
        get right(): NodeGeometryConnectionPoint;
        /**
         * Gets the ifTrue input component
         */
        get ifTrue(): NodeGeometryConnectionPoint;
        /**
         * Gets the ifFalse input component
         */
        get ifFalse(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(nodeGeometry: NodeGeometry): void;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for conditionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterConditionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import conditionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to recompute normals for a geometry
     */
    export class ComputeNormalsBlock extends NodeGeometryBlock {
        /**
         * Creates a new ComputeNormalsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for computeNormalsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterComputeNormalsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import computeNormalsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clean a geometry
     */
    export class CleanGeometryBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Creates a new CleanGeometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for cleanGeometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCleanGeometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cleanGeometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the bounding info of a geometry
     */
    export class BoundingBlock extends NodeGeometryBlock {
        /**
         * Create a new BoundingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the min output component
         */
        get min(): NodeGeometryConnectionPoint;
        /**
         * Gets the max output component
         */
        get max(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for boundingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBoundingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import boundingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the boolean block
     */
    export enum BooleanGeometryOperations {
        /** Intersect */
        Intersect = 0,
        /** Subtract */
        Subtract = 1,
        /** Union */
        Union = 2
    }
    /**
     * Block used to apply a boolean operation between 2 geometries
     */
    export class BooleanGeometryBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Gets or sets the operation applied by the block
         */
        operation: BooleanGeometryOperations;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        useOldCSGEngine: boolean;
        private _csg2LoadingPromise;
        /**
         * @internal
         */
        get _isReadyState(): Nullable<Promise<void>>;
        /**
         * Create a new BooleanGeometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry0 input component
         */
        get geometry0(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry1 input component
         */
        get geometry1(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for booleanGeometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBooleanGeometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import booleanGeometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to bevel sharp edges in a geometry.
     */
    export class BevelBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context.
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change.
         */
        evaluateContext: boolean;
        /**
         * Creates a new BevelBlock.
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component.
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the bevel amount input component.
         */
        get amount(): NodeGeometryConnectionPoint;
        /**
         * Gets the bevel segment count input component.
         */
        get segments(): NodeGeometryConnectionPoint;
        /**
         * Gets the angle threshold input component in degrees.
         */
        get angle(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component.
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation.
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for bevelBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBevelBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import bevelBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Registers all instance-related node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometryInstancesBlocks(): void;
    /**
     * Registers all matrix-related node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometryMatricesBlocks(): void;
    /**
     * Registers all set/modify node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometrySetBlocks(): void;
    /**
     * Registers all source/primitive node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometrySourcesBlocks(): void;
    /**
     * Registers all teleport node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometryTeleportBlocks(): void;
    /**
     * Registers all texture node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometryTexturesBlocks(): void;
    /**
     * Registers all root-level (math/utility/geometry) node geometry blocks for deserialization.
     */
    export function RegisterNodeGeometryMathBlocks(): void;
    /**
     * Registers all node geometry blocks for deserialization.
     * Call this function when you need to deserialize node geometry from JSON/snippets.
     *
     * This is the tree-shakeable replacement for:
     * ```ts
     * import "@babylonjs/core/Meshes/Node/Blocks/index";
     * ```
     */
    export function RegisterAllNodeGeometryBlocks(): void;




    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to fetch a color from texture data
     */
    export class GeometryTextureFetchBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating if coordinates should be clamped between 0 and 1
         */
        clampCoordinates: boolean;
        /**
         * Gets or sets a boolean indicating if coordinates should be clamped between 0 and 1
         */
        interpolation: boolean;
        /**
         * Creates a new GeometryTextureFetchBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the texture component
         */
        get texture(): NodeGeometryConnectionPoint;
        /**
         * Gets the coordinates component
         */
        get coordinates(): NodeGeometryConnectionPoint;
        /**
         * Gets the rgba component
         */
        get rgba(): NodeGeometryConnectionPoint;
        /**
         * Gets the rgb component
         */
        get rgb(): NodeGeometryConnectionPoint;
        /**
         * Gets the r component
         */
        get r(): NodeGeometryConnectionPoint;
        /**
         * Gets the g component
         */
        get g(): NodeGeometryConnectionPoint;
        /**
         * Gets the b component
         */
        get b(): NodeGeometryConnectionPoint;
        /**
         * Gets the a component
         */
        get a(): NodeGeometryConnectionPoint;
        private _repeatClamp;
        private _lerp;
        private _getPixel;
        protected _buildBlock(): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryTextureFetchBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryTextureFetchBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryTextureFetchBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to load texture data
     */
    export class GeometryTextureBlock extends NodeGeometryBlock {
        private _data;
        private _width;
        private _height;
        /**
         * Gets or sets a boolean indicating that this block should serialize its cached data
         */
        serializedCachedData: boolean;
        /**
         * Gets the texture data
         */
        get textureData(): Nullable<Float32Array>;
        /**
         * Gets the texture width
         */
        get textureWidth(): number;
        /**
         * Gets the texture height
         */
        get textureHeight(): number;
        /**
         * Creates a new GeometryTextureBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the texture component
         */
        get texture(): NodeGeometryConnectionPoint;
        private _prepareImgToLoadAsync;
        /**
         * Remove stored data
         */
        cleanData(): void;
        /**
         * Load the texture data from a Float32Array
         * @param data defines the data to load
         * @param width defines the width of the texture
         * @param height defines the height of the texture
         */
        loadTextureFromData(data: Float32Array, width: number, height: number): void;
        /**
         * Load the texture data
         * @param imageFile defines the file to load data from
         * @returns a promise fulfilled when image data is loaded
         */
        loadTextureFromFileAsync(imageFile: File): Promise<void>;
        /**
         * Load the texture data
         * @param url defines the url to load data from
         * @returns a promise fulfilled when image data is loaded
         */
        loadTextureFromUrlAsync(url: string): Promise<void>;
        /**
         * Load the texture data
         * @param texture defines the source texture
         * @returns a promise fulfilled when image data is loaded
         */
        extractFromTextureAsync(texture: Texture): Promise<void>;
        protected _buildBlock(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for geometryTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGeometryTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import geometryTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to receive a value from a teleport entry point
     */
    export class TeleportOutBlock extends NodeGeometryBlock {
        /** @internal */
        _entryPoint: Nullable<TeleportInBlock>;
        /** @internal */
        _tempEntryPointUniqueId: Nullable<number>;
        /**
         * Create a new TeleportOutBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the entry point
         */
        get entryPoint(): Nullable<TeleportInBlock>;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeGeometryConnectionPoint;
        /** Detach from entry point */
        detach(): void;
        protected _buildBlock(): void;
        protected _customBuildStep(state: NodeGeometryBuildState): void;
        /** @internal */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeGeometryBlock[]): string;
        /** @internal */
        _dumpCodeForOutputConnections(alreadyDumped: NodeGeometryBlock[]): string;
        /**
         * Clone the current block to a new identical block
         * @returns a copy of the current block
         */
        clone(): NodeGeometryBlock | null;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for meshesNodeBlocksTeleportTeleportOutBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshesNodeBlocksTeleportTeleportOutBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import teleportOutBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to teleport a value to an endpoint
     */
    export class TeleportInBlock extends NodeGeometryBlock {
        private _endpoints;
        /** Gets the list of attached endpoints */
        get endpoints(): TeleportOutBlock[];
        /**
         * Create a new TeleportInBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeGeometryConnectionPoint;
        /** @internal */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeGeometryBlock[]): string;
        /**
         * Checks if the current block is an ancestor of a given type
         * @param type defines the potential type to check
         * @returns true if block is a descendant
         */
        isAnAncestorOfType(type: string): boolean;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeGeometryBlock): boolean;
        /**
         * Get the first descendant using a predicate
         * @param predicate defines the predicate to check
         * @returns descendant or null if none found
         */
        getDescendantOfPredicate(predicate: (block: NodeGeometryBlock) => boolean): Nullable<NodeGeometryBlock>;
        /**
         * Add an enpoint to this block
         * @param endpoint define the endpoint to attach to
         */
        attachToEndpoint(endpoint: TeleportOutBlock): void;
        /**
         * Remove enpoint from this block
         * @param endpoint define the endpoint to remove
         */
        detachFromEndpoint(endpoint: TeleportOutBlock): void;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for meshesNodeBlocksTeleportTeleportInBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshesNodeBlocksTeleportTeleportInBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import teleportInBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate torus geometry data
     */
    export class TorusBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new TorusBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the diameter input component
         */
        get diameter(): NodeGeometryConnectionPoint;
        /**
         * Gets the thickness input component
         */
        get thickness(): NodeGeometryConnectionPoint;
        /**
         * Gets the tessellation input component
         */
        get tessellation(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for torusBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTorusBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import torusBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate sphere geometry data
     */
    export class SphereBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SphereBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the segments input component
         */
        get segments(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameter input component
         */
        get diameter(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameterX input component
         */
        get diameterX(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameterY input component
         */
        get diameterY(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameterZ input component
         */
        get diameterZ(): NodeGeometryConnectionPoint;
        /**
         * Gets the arc input component
         */
        get arc(): NodeGeometryConnectionPoint;
        /**
         * Gets the slice input component
         */
        get slice(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for sphereBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSphereBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sphereBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate a geometry data from a list of points
     */
    export class PointListBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a list of points used to generate the geometry
         */
        points: Vector3[];
        /**
         * Create a new PointListBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        protected _buildBlock(_state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for pointListBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPointListBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pointListBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate plane geometry data
     */
    export class PlaneBlock extends NodeGeometryBlock {
        private _rotationMatrix;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new PlaneBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the size input component
         */
        get size(): NodeGeometryConnectionPoint;
        /**
         * Gets the width input component
         */
        get width(): NodeGeometryConnectionPoint;
        /**
         * Gets the height input component
         */
        get height(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsX input component
         */
        get subdivisionsX(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsY input component
         */
        get subdivisionsY(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for planeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPlaneBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import planeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate a null geometry data
     */
    export class NullBlock extends NodeGeometryBlock {
        /**
         * Create a new NullBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the vector output component
         */
        get vector(): NodeGeometryConnectionPoint;
        protected _buildBlock(): void;
    }
    /**
     * Register side effects for nullBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNullBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import nullBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate a user defined mesh geometry data
     */
    export class MeshBlock extends NodeGeometryBlock {
        private _mesh;
        private _cachedVertexData;
        /**
         * Gets or sets a boolean indicating that winding order needs to be reserved
         */
        reverseWindingOrder: boolean;
        /**
         * Gets or sets a boolean indicating that this block should serialize its cached data
         */
        serializedCachedData: boolean;
        /**
         * Gets or sets the mesh to use to get vertex data
         */
        get mesh(): Nullable<Mesh>;
        set mesh(value: Nullable<Mesh>);
        /**
         * Create a new MeshBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating if the block is using cached data
         */
        get isUsingCachedData(): boolean;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Remove stored data
         */
        cleanData(): void;
        protected _buildBlock(): void;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for meshBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import meshBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate icosphere geometry data
     */
    export class IcoSphereBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new IcoSphereBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the radius input component
         */
        get radius(): NodeGeometryConnectionPoint;
        /**
         * Gets the radiusX input component
         */
        get radiusX(): NodeGeometryConnectionPoint;
        /**
         * Gets the radiusY input component
         */
        get radiusY(): NodeGeometryConnectionPoint;
        /**
         * Gets the radiusZ input component
         */
        get radiusZ(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for icoSphereBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterIcoSphereBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import icoSphereBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate grid geometry data
     */
    export class GridBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new GridBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the width input component
         */
        get width(): NodeGeometryConnectionPoint;
        /**
         * Gets the height input component
         */
        get height(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsX input component
         */
        get subdivisionsX(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsY input component
         */
        get subdivisionsY(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for gridBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGridBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gridBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate disc geometry data
     */
    export class DiscBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new DiscBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the radius input component
         */
        get radius(): NodeGeometryConnectionPoint;
        /**
         * Gets the tessellation input component
         */
        get tessellation(): NodeGeometryConnectionPoint;
        /**
         * Gets the arc input component
         */
        get arc(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for discBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDiscBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import discBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate cylinder geometry data
     */
    export class CylinderBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SphereBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the height input component
         */
        get height(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameter input component
         */
        get diameter(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameterTop input component
         */
        get diameterTop(): NodeGeometryConnectionPoint;
        /**
         * Gets the diameterBottom input component
         */
        get diameterBottom(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the tessellation input component
         */
        get tessellation(): NodeGeometryConnectionPoint;
        /**
         * Gets the arc input component
         */
        get arc(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for cylinderBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCylinderBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cylinderBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate capsule geometry data
     */
    export class CapsuleBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new CapsuleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the height input component
         */
        get height(): NodeGeometryConnectionPoint;
        /**
         * Gets the radius input component
         */
        get radius(): NodeGeometryConnectionPoint;
        /**
         * Gets the tessellation input component
         */
        get tessellation(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for capsuleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCapsuleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import capsuleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to generate box geometry data
     */
    export class BoxBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new BoxBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the size input component
         */
        get size(): NodeGeometryConnectionPoint;
        /**
         * Gets the width input component
         */
        get width(): NodeGeometryConnectionPoint;
        /**
         * Gets the height input component
         */
        get height(): NodeGeometryConnectionPoint;
        /**
         * Gets the depth input component
         */
        get depth(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisions input component
         */
        get subdivisions(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsX input component
         */
        get subdivisionsX(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsY input component
         */
        get subdivisionsY(): NodeGeometryConnectionPoint;
        /**
         * Gets the subdivisionsZ input component
         */
        get subdivisionsZ(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for boxBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBoxBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import boxBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to set texture coordinates for a geometry
     */
    export class SetUVsBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Gets or sets a value indicating which UV to set
         */
        textureCoordinateIndex: number;
        /**
         * Create a new SetUVsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the uvs input component
         */
        get uvs(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setUVsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetUVsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setUVsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to set tangents for a geometry
     */
    export class SetTangentsBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetTangentsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the tangents input component
         */
        get tangents(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setTangentsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetTangentsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setTangentsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to set positions for a geometry
     */
    export class SetPositionsBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetPositionsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the positions input component
         */
        get positions(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        private _remapVector3Data;
        private _remapVector4Data;
        private _remapVector2Data;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setPositionsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetPositionsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setPositionsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to set normals for a geometry
     */
    export class SetNormalsBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetNormalsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the normals input component
         */
        get normals(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setNormalsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetNormalsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setNormalsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to affect a material ID to a geometry
     */
    export class SetMaterialIDBlock extends NodeGeometryBlock {
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetMaterialIDBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the id input component
         */
        get id(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setMaterialIDBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetMaterialIDBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setMaterialIDBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to set colors for a geometry
     */
    export class SetColorsBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetColorsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the colors input component
         */
        get colors(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for setColorsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSetColorsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import setColorsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply Lattice on geometry
     */
    export class LatticeBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndexX;
        private _currentIndexY;
        private _currentIndexZ;
        private _lattice;
        private _indexVector3;
        private _currentControl;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Resolution on x axis
         */
        resolutionX: number;
        /**
         * Resolution on y axis
         */
        resolutionY: number;
        /**
         * Resolution on z axis
         */
        resolutionZ: number;
        /**
         * Create a new LatticeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the controls input component
         */
        get controls(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        /**
         * Gets the value associated with a contextual positions
         * In this case it will be the current position in the lattice
         * @returns the current position in the lattice
         */
        getOverridePositionsContextualValue(): Vector3;
        /**
         * Gets the value associated with a contextual normals
         * In this case it will be the current control point being processed
         * @returns the current control point being processed
         */
        getOverrideNormalsContextualValue(): Vector3;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for latticeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLatticeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import latticeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Conditions supported by the condition block
     */
    export enum Aggregations {
        /** Max */
        Max = 0,
        /** Min */
        Min = 1,
        /** Sum */
        Sum = 2
    }
    /**
     * Block used to extract a valuefrom a geometry
     */
    export class AggregatorBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext {
        private _vertexData;
        private _currentIndex;
        /**
         * Gets or sets the test used by the block
         */
        aggregation: Aggregations;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new SetPositionsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the source input component
         */
        get source(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for aggregatorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAggregatorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import aggregatorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a translation matrix
     */
    export class TranslationBlock extends NodeGeometryBlock {
        /**
         * Create a new TranslationBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the translation input component
         */
        get translation(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for translationBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTranslationBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import translationBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a scaling matrix
     */
    export class ScalingBlock extends NodeGeometryBlock {
        /**
         * Create a new ScalingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the scale input component
         */
        get scale(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /** @internal */
        autoConfigure(): void;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for scalingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScalingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import scalingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a rotation matrix on Z Axis
     */
    export class RotationZBlock extends NodeGeometryBlock {
        /**
         * Create a new RotationZBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the angle input component
         */
        get angle(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for rotationZBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRotationZBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import rotationZBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a rotation matrix on Y Axis
     */
    export class RotationYBlock extends NodeGeometryBlock {
        /**
         * Create a new RotationYBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the angle input component
         */
        get angle(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for rotationYBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRotationYBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import rotationYBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a rotation matrix on X Axis
     */
    export class RotationXBlock extends NodeGeometryBlock {
        /**
         * Create a new RotationXBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the angle input component
         */
        get angle(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for rotationXBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRotationXBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import rotationXBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a align matrix
     */
    export class AlignBlock extends NodeGeometryBlock {
        /**
         * Create a new AlignBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the source input component
         */
        get source(): NodeGeometryConnectionPoint;
        /**
         * Gets the target input component
         */
        get target(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix output component
         */
        get matrix(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for alignBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAlignBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import alignBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clone geometry in a radial shape
     */
    export class InstantiateRadialBlock extends InstantiateBaseBlock {
        /**
         * Create a new InstantiateRadialBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the direction input component
         */
        get radius(): NodeGeometryConnectionPoint;
        /**
         * Gets the direction input component
         */
        get angleStart(): NodeGeometryConnectionPoint;
        /**
         * Gets the direction input component
         */
        get angleEnd(): NodeGeometryConnectionPoint;
        /**
         * Gets the transform input component
         */
        get transform(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for instantiateRadialBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateRadialBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateRadialBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to instance geometry inside a geometry
     */
    export class InstantiateOnVolumeBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext, INodeGeometryInstancingContext {
        private _vertexData;
        private _currentLoopIndex;
        private _currentPosition;
        private _vertex0;
        private _vertex1;
        private _vertex2;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Gets or sets a boolean indicating that a grid pattern should be used
         */
        gridMode: boolean;
        /**
         * Create a new InstantiateOnVolumeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the value associated with a contextual positions
         * @returns the value associated with the source
         */
        getOverridePositionsContextualValue(): Vector3;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the instance input component
         */
        get instance(): NodeGeometryConnectionPoint;
        /**
         * Gets the count input component
         */
        get count(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix input component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /**
         * Gets the offset input component
         */
        get offset(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        /**
         * Gets the grid size input component
         */
        get gridSize(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        private _getValueOnGrid;
        private _getIndexinGrid;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for instantiateOnVolumeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateOnVolumeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateOnVolumeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to instance geometry on every vertex of a geometry
     */
    export class InstantiateOnVerticesBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext, INodeGeometryInstancingContext {
        private _vertexData;
        private _currentIndex;
        private _currentLoopIndex;
        private _indexTranslation;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Gets or sets a boolean indicating if the block should remove duplicated positions
         */
        removeDuplicatedPositions: boolean;
        /**
         * Create a new InstantiateOnVerticesBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the instance input component
         */
        get instance(): NodeGeometryConnectionPoint;
        /**
         * Gets the density input component
         */
        get density(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix input component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /**
         * Gets the offset input component
         */
        get offset(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for instantiateOnVerticesBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateOnVerticesBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateOnVerticesBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to instance geometry on every face of a geometry
     */
    export class InstantiateOnFacesBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext, INodeGeometryInstancingContext {
        private _vertexData;
        private _currentFaceIndex;
        private _currentLoopIndex;
        private _currentPosition;
        private _currentUV;
        private _vertex0;
        private _vertex1;
        private _vertex2;
        private _tempVector0;
        private _tempVector1;
        private _uv0;
        private _uv1;
        private _uv2;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new InstantiateOnFacesBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the value associated with a contextual positions
         * @returns the value associated with the source
         */
        getOverridePositionsContextualValue(): Vector3;
        /**
         * Gets the value associated with a contextual normals
         * @returns the value associated with the source
         */
        getOverrideNormalsContextualValue(): Vector3;
        /**
         * Gets the value associated with a contextual UV1 se
         * @returns the value associated with the source
         */
        getOverrideUVs1ContextualValue(): Vector2;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the geometry input component
         */
        get geometry(): NodeGeometryConnectionPoint;
        /**
         * Gets the instance input component
         */
        get instance(): NodeGeometryConnectionPoint;
        /**
         * Gets the count input component
         */
        get count(): NodeGeometryConnectionPoint;
        /**
         * Gets the matrix input component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /**
         * Gets the offset input component
         */
        get offset(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for instantiateOnFacesBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateOnFacesBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateOnFacesBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clone geometry along a line
     */
    export class InstantiateLinearBlock extends InstantiateBaseBlock {
        /**
         * Create a new Instantiate Linear Block
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the direction input component
         */
        get direction(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for instantiateLinearBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateLinearBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateLinearBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to instantiate a geometry inside a loop
     */
    export class InstantiateBlock extends InstantiateBaseBlock {
        protected _vertexData: VertexData;
        protected _currentIndex: number;
        /**
         * Create a new InstantiateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the matrix input component
         */
        get matrix(): NodeGeometryConnectionPoint;
        /**
         * Gets the position input component
         */
        get position(): NodeGeometryConnectionPoint;
        /**
         * Gets the rotation input component
         */
        get rotation(): NodeGeometryConnectionPoint;
        /**
         * Gets the scaling input component
         */
        get scaling(): NodeGeometryConnectionPoint;
        protected _buildBlock(state: NodeGeometryBuildState): void;
    }
    /**
     * Register side effects for instantiateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstantiateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instantiateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Block used as a base for InstantiateXXX blocks
     */
    export abstract class InstantiateBaseBlock extends NodeGeometryBlock implements INodeGeometryExecutionContext, INodeGeometryInstancingContext {
        protected _vertexData: VertexData;
        protected _currentIndex: number;
        /**
         * Gets or sets a boolean indicating that this block can evaluate context
         * Build performance is improved when this value is set to false as the system will cache values instead of reevaluating everything per context change
         */
        evaluateContext: boolean;
        /**
         * Create a new InstantiateBaseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current instance index in the current flow
         * @returns the current index
         */
        getInstanceIndex(): number;
        /**
         * Gets the current index in the current flow
         * @returns the current index
         */
        getExecutionIndex(): number;
        /**
         * Gets the current loop index in the current flow
         * @returns the current loop index
         */
        getExecutionLoopIndex(): number;
        /**
         * Gets the current face index in the current flow
         * @returns the current face index
         */
        getExecutionFaceIndex(): number;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the instance input component
         */
        get instance(): NodeGeometryConnectionPoint;
        /**
         * Gets the count input component
         */
        get count(): NodeGeometryConnectionPoint;
        /**
         * Gets the geometry output component
         */
        get output(): NodeGeometryConnectionPoint;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /** @internal */
        _deserialize(serializationObject: any): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * GreasedLineRibbonMesh
     * Use the GreasedLineBuilder.CreateGreasedLine function to create an instance of this class.
     */
    export class GreasedLineRibbonMesh extends GreasedLineBaseMesh {
        readonly name: string;
        /**
         * Default line width
         */
        static DEFAULT_WIDTH: number;
        private static _RightHandedForwardReadOnlyQuaternion;
        private static _LeftHandedForwardReadOnlyQuaternion;
        private static _LeftReadOnlyQuaternion;
        /**
         * Direction which the line segment will be thickened if drawn on the XY plane
         */
        static DIRECTION_XY: DeepImmutableObject<Vector3>;
        /**
         * Direction which the line segment will be thickened if drawn on the XZ plane
         */
        static DIRECTION_XZ: DeepImmutableObject<Vector3>;
        /**
         * Direction which the line segment will be thickened if drawn on the YZ plane
         */
        static DIRECTION_YZ: DeepImmutableObject<Vector3>;
        private _paths;
        private _pathsOptions;
        private _vSegmentLengths;
        private _uSegmentLengths;
        private _vTotalLengths;
        private _uTotalLengths;
        private _counters;
        private _slopes;
        private _ribbonWidths;
        /**
         * GreasedLineRibbonMesh
         * @param name name of the mesh
         * @param scene the scene
         * @param _options mesh options
         * @param _pathOptions used internaly when parsing a serialized GreasedLineRibbonMesh
         */
        constructor(name: string, scene: Scene, _options: GreasedLineMeshOptions, _pathOptions?: {
            options: GreasedLineMeshOptions;
            pathCount: number;
        }[]);
        /**
         * Adds new points to the line. It doesn't rerenders the line if in lazy mode.
         * @param points points table
         * @param options mesh options
         * @param hasPathOptions defaults to false
         */
        addPoints(points: number[][], options: GreasedLineMeshOptions, hasPathOptions?: boolean): void;
        /**
         * "GreasedLineRibbonMesh"
         * @returns "GreasedLineRibbonMesh"
         */
        getClassName(): string;
        /**
         * Return true if the line was created from two edge paths or one points path.
         * In this case the line is always flat.
         */
        get isFlatLine(): boolean;
        /**
         * Returns the slopes of the line at each point relative to the center of the line
         */
        get slopes(): number[];
        /**
         * Set the slopes of the line at each point relative to the center of the line
         */
        set slopes(slopes: number[]);
        protected _updateColorPointers(): void;
        protected _updateWidths(): void;
        protected _setPoints(points: number[][], _options: GreasedLineMeshOptions): void;
        private static _GetDirectionPlanesFromDirectionsOption;
        private static _CreateRibbonVertexData;
        private _preprocess;
        private static _ConvertToRibbonPath;
        private static _GetDirectionFromPoints;
        /**
         * Clones the GreasedLineRibbonMesh.
         * @param name new line name
         * @param newParent new parent node
         * @returns cloned line
         */
        clone(name?: string, newParent?: Nullable<Node>): GreasedLineRibbonMesh;
        /**
         * Serializes this GreasedLineRibbonMesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized GreasedLineRibbonMesh
         * @param parsedMesh the serialized GreasedLineRibbonMesh
         * @param scene the scene to create the GreasedLineRibbonMesh in
         * @returns the created GreasedLineRibbonMesh
         */
        static Parse(parsedMesh: any, scene: Scene): Mesh;
        protected _initGreasedLine(): void;
        private _calculateSegmentLengths;
        private static _CalculateSlopes;
        protected _createVertexBuffers(): VertexData;
    }
    /**
     * Register side effects for greasedLineRibbonMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGreasedLineRibbonMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import greasedLineRibbonMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * GreasedLineMesh
     * Use the GreasedLineBuilder.CreateGreasedLine function to create an instance of this class.
     */
    export class GreasedLineMesh extends GreasedLineBaseMesh {
        readonly name: string;
        private _previousAndSide;
        private _nextAndCounters;
        private static _V_START;
        private static _V_END;
        private static _V_OFFSET_START;
        private static _V_OFFSET_END;
        /**
         * Treshold used to pick the mesh
         */
        intersectionThreshold: number;
        /**
         * GreasedLineMesh
         * @param name name of the mesh
         * @param scene the scene
         * @param _options mesh options
         */
        constructor(name: string, scene: Scene, _options: GreasedLineMeshOptions);
        /**
         * "GreasedLineMesh"
         * @returns "GreasedLineMesh"
         */
        getClassName(): string;
        protected _updateColorPointers(): void;
        protected _updateWidths(): void;
        protected _setPoints(points: number[][]): void;
        /**
         * Clones the GreasedLineMesh.
         * @param name new line name
         * @param newParent new parent node
         * @returns cloned line
         */
        clone(name?: string, newParent?: Nullable<Node>): GreasedLineMesh;
        /**
         * Serializes this GreasedLineMesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        /**
         * Parses a serialized GreasedLineMesh
         * @param parsedMesh the serialized GreasedLineMesh
         * @param scene the scene to create the GreasedLineMesh in
         * @returns the created GreasedLineMesh
         */
        static Parse(parsedMesh: any, scene: Scene): Mesh;
        protected _initGreasedLine(): void;
        /**
         * Checks whether a ray is intersecting this GreasedLineMesh
         * @param ray ray to check the intersection of this mesh with
         * @param fastCheck not supported
         * @param trianglePredicate not supported
         * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)
         * @param worldToUse not supported
         * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check
         * @returns the picking info
         */
        intersects(ray: Ray, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate, onlyBoundingInfo?: boolean, worldToUse?: Matrix, skipBoundingInfo?: boolean): PickingInfo;
        /**
         * Gets all intersections of a ray and the line
         * @param ray Ray to check the intersection of this mesh with
         * @param _fastCheck not supported
         * @param _trianglePredicate not supported
         * @param onlyBoundingInfo defines a boolean indicating if picking should only happen using bounding info (false by default)
         * @param _worldToUse not supported
         * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check
         * @param firstOnly If true, the first and only intersection is immediatelly returned if found
         * @returns intersection(s)
         */
        findAllIntersections(ray: Ray, _fastCheck?: boolean, _trianglePredicate?: TrianglePickingPredicate, onlyBoundingInfo?: boolean, _worldToUse?: Matrix, skipBoundingInfo?: boolean, firstOnly?: boolean): {
            distance: number;
            point: Vector3;
        }[] | undefined;
        private get _boundingSphere();
        private static _CompareV3;
        protected _createVertexBuffers(): VertexData;
    }
    /**
     * Register side effects for greasedLineMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGreasedLineMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import greasedLineMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * In POINTS_MODE_POINTS every array of points will become the center (backbone) of the ribbon. The ribbon will be expanded by `width / 2` to `+direction` and `-direction` as well.
     * In POINTS_MODE_PATHS every array of points specifies an edge. These will be used to build one ribbon.
     */
    export enum GreasedLineRibbonPointsMode {
        POINTS_MODE_POINTS = 0,
        POINTS_MODE_PATHS = 1
    }
    /**
     * FACES_MODE_SINGLE_SIDED single sided with back face culling. Default value.
     * FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING single sided without back face culling. Sets backFaceCulling = false on the material so it affects all line ribbons added to the line ribbon instance.
     * FACES_MODE_DOUBLE_SIDED extra back faces are created. This doubles the amount of faces of the mesh.
     */
    export enum GreasedLineRibbonFacesMode {
        FACES_MODE_SINGLE_SIDED = 0,
        FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING = 1,
        FACES_MODE_DOUBLE_SIDED = 2
    }
    /**
     * Only with POINTS_MODE_PATHS.
     * AUTO_DIRECTIONS_FROM_FIRST_SEGMENT sets the direction (slope) of the ribbon from the direction of the first line segment. Recommended.
     * AUTO_DIRECTIONS_FROM_ALL_SEGMENTS in this mode the direction (slope) will be calculated for each line segment according to the direction vector between each point of the line segments. Slow method.
     * AUTO_DIRECTIONS_ENHANCED in this mode the direction (slope) will be calculated for each line segment according to the direction vector between each point of the line segments using a more sophisitcaed algorithm. Slowest method.
     * AUTO_DIRECTIONS_FACE_TO in this mode the direction (slope) will be calculated for each line segment according to the direction vector between each point of the line segments and a direction (face-to) vector specified in direction. The resulting line will face to the direction of this face-to vector.
     * AUTO_DIRECTIONS_NONE you have to set the direction (slope) manually. Recommended.
     */
    export enum GreasedLineRibbonAutoDirectionMode {
        AUTO_DIRECTIONS_FROM_FIRST_SEGMENT = 0,
        AUTO_DIRECTIONS_FROM_ALL_SEGMENTS = 1,
        AUTO_DIRECTIONS_ENHANCED = 2,
        AUTO_DIRECTIONS_FACE_TO = 3,
        AUTO_DIRECTIONS_NONE = 99
    }
    export type GreasedLineRibbonOptions = {
        /**
         * Defines how the points are processed.
         * In GreasedLineRibbonPointsMode.POINTS_MODE_POINTS every array of points will become the center of the ribbon. The ribbon will be expanded by width/2 to +direction and -direction as well.
         * In GreasedLineRibbonPointsMode.POINTS_MODE_PATHS every array of points is one path. These will be used to buuid one ribbon.
         */
        pointsMode?: GreasedLineRibbonPointsMode;
        /**
         * Normalized directions of the slopes of the non camera facing lines.
         */
        directions?: Vector3[] | Vector3;
        /**
         * Defines the calculation mode of the directions which the line will be thickened to.
         */
        directionsAutoMode?: GreasedLineRibbonAutoDirectionMode;
        /**
         * Width of the ribbon.
         */
        width?: number;
        /**
         * Controls how the faces are created.
         * GreasedLineRibbonFacesMode.FACES_MODE_SINGLE_SIDED = single sided with back face culling. Default value.
         * GreasedLineRibbonFacesMode.FACES_MODE_SINGLE_SIDED_NO_BACKFACE_CULLING = single sided without back face culling
         * GreasedLineRibbonFacesMode.FACES_MODE_DOUBLE_SIDED = extra back faces are created. This doubles the amount of faces of the mesh.
         */
        facesMode?: GreasedLineRibbonFacesMode;
        /**
         * If true, the path will be closed.
         */
        closePath?: boolean;
        /**
         * If true, normals will be computed when creating the vertex buffers.
         * This results to smooth shading of the mesh.
         */
        smoothShading?: boolean;
    };
    export type GreasedLinePoints = Vector3[] | Vector3[][] | Float32Array | Float32Array[] | number[][] | number[];
    /**
     * Options for converting the points to the internal number[][] format used by GreasedLine
     */
    export interface GreasedLinePointsOptions {
        /**
         * If defined and a Float32Array is used for the points parameter,
         * it will create multiple disconnected lines.
         * This parameter defines how many entries from the array to use for one line.
         * One entry = 3 float values.
         */
        floatArrayStride?: number;
    }
    /**
     * Options for creating a GreasedLineMesh
     */
    export interface GreasedLineMeshOptions {
        /**
         * Points of the line.
         */
        points: GreasedLinePoints;
        /**
         * Each line segment (from point to point) can have it's width multiplier. Final width = widths[segmentIdx] * width.
         * Defaults to empty array.
         */
        widths?: number[];
        /**
         * If instance is specified, lines are added to the specified instance.
         * Defaults to undefined.
         */
        instance?: GreasedLineBaseMesh;
        /**
         * You can manually set the color pointers so you can control which segment/part
         * will use which color from the colors material option
         */
        colorPointers?: number[];
        /**
         * UVs for the mesh
         */
        uvs?: FloatArray;
        /**
         * If true, offsets and widths are updatable.
         * Defaults to false.
         */
        updatable?: boolean;
        /**
         * Use when @see instance is specified.
         * If true, the line will be rendered only after calling instance.updateLazy(). If false, line will be rerendered after every call to @see CreateGreasedLine
         * Defaults to false.
         */
        lazy?: boolean;
        /**
         * The options for the ribbon which will be used as a line.
         * If this option is set the line switches automatically to a non camera facing mode.
         */
        ribbonOptions?: GreasedLineRibbonOptions;
        /**
         * Options for converting the points.
         */
        pointsOptions?: GreasedLinePointsOptions;
    }
    /**
     * GreasedLineBaseMesh
     */
    export abstract class GreasedLineBaseMesh extends Mesh {
        readonly name: string;
        protected _options: GreasedLineMeshOptions;
        protected _vertexPositions: FloatArray;
        protected _indices: IndicesArray;
        protected _uvs: FloatArray;
        protected _points: number[][];
        protected _offsets: number[];
        protected _colorPointers: number[];
        protected _widths: number[];
        protected _offsetsBuffer?: Buffer;
        protected _widthsBuffer?: Buffer;
        protected _colorPointersBuffer?: Buffer;
        protected _lazy: boolean;
        protected _updatable: boolean;
        protected _engine: AbstractEngine;
        constructor(name: string, scene: Scene, _options: GreasedLineMeshOptions);
        /**
         * "GreasedLineMesh"
         * @returns "GreasedLineMesh"
         */
        getClassName(): string;
        protected abstract _setPoints(points: number[][], options?: GreasedLineMeshOptions): void;
        protected abstract _updateColorPointers(): void;
        protected abstract _updateWidths(): void;
        protected _updateWidthsWithValue(defaulValue: number): void;
        /**
         * Updated a lazy line. Rerenders the line and updates boundinfo as well.
         */
        updateLazy(): void;
        /**
         * Adds new points to the line. It doesn't rerenders the line if in lazy mode.
         * @param points points table
         * @param options optional options
         */
        addPoints(points: number[][], options?: GreasedLineMeshOptions): void;
        /**
         * Dispose the line and it's resources
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * @returns true if the mesh was created in lazy mode
         */
        isLazy(): boolean;
        /**
         * Returns the UVs
         */
        get uvs(): FloatArray;
        /**
         * Sets the UVs
         * @param uvs the UVs
         */
        set uvs(uvs: FloatArray);
        /**
         * Returns the points offsets
         * Return the points offsets
         */
        get offsets(): number[];
        /**
         * Sets point offests
         * @param offsets offset table [x,y,z, x,y,z, ....]
         */
        set offsets(offsets: number[]);
        /**
         * Gets widths at each line point like [widthLower, widthUpper, widthLower, widthUpper, ...]
         */
        get widths(): number[];
        /**
         * Sets widths at each line point
         * @param widths width table [widthLower, widthUpper, widthLower, widthUpper ...]
         */
        set widths(widths: number[]);
        /**
         * Gets the color pointer. Each vertex need a color pointer. These color pointers points to the colors in the color table @see colors
         */
        get colorPointers(): number[];
        /**
         * Sets the color pointer
         * @param colorPointers array of color pointer in the colors array. One pointer for every vertex is needed.
         */
        set colorPointers(colorPointers: number[]);
        /**
         * Gets the pluginMaterial associated with line
         */
        get greasedLineMaterial(): IGreasedLineMaterial | undefined;
        /**
         * Return copy the points.
         */
        get points(): number[][];
        /**
         * Sets line points and rerenders the line.
         * @param points points table
         * @param options optional options
         */
        setPoints(points: GreasedLinePoints, options?: GreasedLineMeshOptions): void;
        protected _initGreasedLine(): void;
        protected _createLineOptions(): GreasedLineMeshOptions;
        /**
         * Serializes this GreasedLineMesh
         * @param serializationObject object to write serialization to
         */
        serialize(serializationObject: any): void;
        protected _createVertexBuffers(computeNormals?: boolean): VertexData;
        protected _createOffsetsBuffer(offsets: number[]): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Class used as a proxy mesh for a part of a compound Gaussian Splatting mesh
     */
    export class GaussianSplattingPartProxyMesh extends Mesh {
        /**
         * Local-space bounds for this part, stored directly on the proxy so it does not
         * need to retain a reference to the original source mesh.
         */
        private _minimum;
        private _maximum;
        /**
         * The index of the part in the compound mesh (internal storage)
         */
        private _partIndex;
        /**
         * Number of splats owned by this part.
         * @internal
         */
        _vertexCount: number;
        /**
         * Offset of this part in the compound splat ordering.
         * @internal
         */
        _splatsDataOffset: number;
        /**
         * Texel offset of this part inside the compound SH textures.
         * This matches the splat offset because SH data is stored one texel per splat.
         * @internal
         */
        _shDataOffset: number;
        /**
         * Gets the index of the part in the compound mesh
         */
        get partIndex(): number;
        /**
         * The compound mesh that owns this part proxy
         */
        readonly compoundSplatMesh: GaussianSplattingMesh;
        /**
         * Backward-compatible alias for the owning compound mesh.
         * @deprecated Use `compoundSplatMesh` instead.
         */
        get proxiedMesh(): GaussianSplattingMesh;
        /**
         * Creates a new Gaussian Splatting part proxy mesh
         * @param name The name of the proxy mesh
         * @param scene The scene the proxy mesh belongs to
         * @param compoundSplatMesh The compound mesh that owns this part proxy
         * @param partIndex The index of the part in the compound mesh
         * @param boundingInfo Local-space bounds of the part inside the compound mesh
         * @param vertexCount Number of splats owned by the part
         * @param splatsDataOffset Offset of the part in the compound splat ordering
         * @param shDataOffset Offset of the part in the compound SH textures
         */
        constructor(name: string, scene: Nullable<Scene>, compoundSplatMesh: GaussianSplattingMesh, partIndex: number, boundingInfo: BoundingInfo, vertexCount: number, splatsDataOffset: number, shDataOffset?: number);
        /**
         * Updates the bounding info of this proxy mesh from its stored part metadata.
         */
        updateBoundingInfoFromPartData(): void;
        /**
         * Backward-compatible alias retained while callers move away from source-mesh based semantics.
         */
        updateBoundingInfoFromProxiedMesh(): void;
        private _applyBoundingInfo;
        /**
         * Returns the class name
         * @returns "GaussianSplattingPartProxyMesh"
         */
        getClassName(): string;
        /**
         * Updates the part index for this proxy mesh.
         * This should only be called internally when parts are removed from the compound mesh.
         * @param newPartIndex the new part index
         * @internal
         */
        updatePartIndex(newPartIndex: number): void;
        /**
         * Updates the per-part metadata for this proxy mesh.
         * This is used internally when compound parts are rebuilt and re-indexed.
         * @param vertexCount the number of splats owned by the part
         * @param splatsDataOffset the new splat offset in the compound
         * @param shDataOffset the new SH texel offset in the compound
         * @internal
         */
        updatePartMetadata(vertexCount: number, splatsDataOffset: number, shDataOffset?: number): void;
        /**
         * Gets whether the part is visible
         */
        get isVisible(): boolean;
        /**
         * Sets whether the part is visible
         */
        set isVisible(value: boolean);
        /**
         * Gets the visibility of the part (0.0 to 1.0)
         */
        get visibility(): number;
        /**
         * Sets the visibility of the part (0.0 to 1.0)
         */
        set visibility(value: number);
        /**
         * Checks if a ray intersects with this proxy mesh using only bounding info
         * @param ray defines the ray to test
         * @returns the picking info with this mesh set as pickedMesh if hit
         */
        intersects(ray: Ray): PickingInfo;
        /**
         * Serialize current GaussianSplattingPartProxyMesh
         * @param serializationObject defines the object which will receive the serialization data
         * @returns the serialized object
         */
        serialize(serializationObject?: any): any;
        /**
         * Parses a serialized GaussianSplattingPartProxyMesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the GaussianSplattingPartProxyMesh in
         * @returns the created GaussianSplattingPartProxyMesh
         */
        static Parse(parsedMesh: any, scene: Scene): GaussianSplattingPartProxyMesh;
    }
    /**
     * Register side effects for gaussianSplattingPartProxyMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingPartProxyMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingPartProxyMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /** Internal mirror of ISogTexturePack (defined in loaders) — avoids a circular import. */
    interface ISogPackInternal {
        version: 1 | 2;
        splatCount: number;
        shDegree: number;
        meansTextureL: BaseTexture;
        meansTextureU: BaseTexture;
        scalesTexture: BaseTexture;
        quatsTexture: BaseTexture;
        sh0Texture: BaseTexture;
        shCentroidsTexture?: BaseTexture;
        shLabelsTexture?: BaseTexture;
        codebookTexture?: BaseTexture;
        meansMin: [number, number, number];
        meansMax: [number, number, number];
        scalesMin?: [number, number, number];
        scalesMax?: [number, number, number];
        sh0Min?: [number, number, number, number];
        sh0Max?: [number, number, number, number];
        shnMin?: number;
        shnMax?: number;
        shCoeffCount: number;
        positions: Float32Array;
    }
    interface IUpdateOptions {
        flipY?: boolean;
        /** @internal When set, skips reprocessing splats [0, previousVertexCount) and copies from cached arrays instead. */
        previousVertexCount?: number;
    }
    interface ITextureDataUpdateCapableEngine {
        updateTextureData(texture: InternalTexture, imageData: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number, faceIndex?: number, lod?: number, generateMipMaps?: boolean): void;
        updateRawTexture(texture: Nullable<InternalTexture>, data: Nullable<ArrayBufferView>, format: number, invertY: boolean, compression?: Nullable<string>, type?: number, useSRGBBuffer?: boolean): void;
        _gl?: unknown;
        isWebGPU?: boolean;
    }
    /**
     * Representation of the types
     */
    const enum PLYType {
        FLOAT = 0,
        INT = 1,
        UINT = 2,
        DOUBLE = 3,
        UCHAR = 4,
        UNDEFINED = 5
    }
    /**
     * Usage types of the PLY values
     */
    const enum PLYValue {
        MIN_X = 0,
        MIN_Y = 1,
        MIN_Z = 2,
        MAX_X = 3,
        MAX_Y = 4,
        MAX_Z = 5,
        MIN_SCALE_X = 6,
        MIN_SCALE_Y = 7,
        MIN_SCALE_Z = 8,
        MAX_SCALE_X = 9,
        MAX_SCALE_Y = 10,
        MAX_SCALE_Z = 11,
        PACKED_POSITION = 12,
        PACKED_ROTATION = 13,
        PACKED_SCALE = 14,
        PACKED_COLOR = 15,
        X = 16,
        Y = 17,
        Z = 18,
        SCALE_0 = 19,
        SCALE_1 = 20,
        SCALE_2 = 21,
        DIFFUSE_RED = 22,
        DIFFUSE_GREEN = 23,
        DIFFUSE_BLUE = 24,
        OPACITY = 25,
        F_DC_0 = 26,
        F_DC_1 = 27,
        F_DC_2 = 28,
        F_DC_3 = 29,
        ROT_0 = 30,
        ROT_1 = 31,
        ROT_2 = 32,
        ROT_3 = 33,
        MIN_COLOR_R = 34,
        MIN_COLOR_G = 35,
        MIN_COLOR_B = 36,
        MAX_COLOR_R = 37,
        MAX_COLOR_G = 38,
        MAX_COLOR_B = 39,
        SH_0 = 40,
        SH_1 = 41,
        SH_2 = 42,
        SH_3 = 43,
        SH_4 = 44,
        SH_5 = 45,
        SH_6 = 46,
        SH_7 = 47,
        SH_8 = 48,
        SH_9 = 49,
        SH_10 = 50,
        SH_11 = 51,
        SH_12 = 52,
        SH_13 = 53,
        SH_14 = 54,
        SH_15 = 55,
        SH_16 = 56,
        SH_17 = 57,
        SH_18 = 58,
        SH_19 = 59,
        SH_20 = 60,
        SH_21 = 61,
        SH_22 = 62,
        SH_23 = 63,
        SH_24 = 64,
        SH_25 = 65,
        SH_26 = 66,
        SH_27 = 67,
        SH_28 = 68,
        SH_29 = 69,
        SH_30 = 70,
        SH_31 = 71,
        SH_32 = 72,
        SH_33 = 73,
        SH_34 = 74,
        SH_35 = 75,
        SH_36 = 76,
        SH_37 = 77,
        SH_38 = 78,
        SH_39 = 79,
        SH_40 = 80,
        SH_41 = 81,
        SH_42 = 82,
        SH_43 = 83,
        SH_44 = 84,
        SH_45 = 85,
        SH_46 = 86,
        SH_47 = 87,
        SH_48 = 88,
        SH_49 = 89,
        SH_50 = 90,
        SH_51 = 91,
        SH_52 = 92,
        SH_53 = 93,
        SH_54 = 94,
        SH_55 = 95,
        SH_56 = 96,
        SH_57 = 97,
        SH_58 = 98,
        SH_59 = 99,
        SH_60 = 100,
        SH_61 = 101,
        SH_62 = 102,
        SH_63 = 103,
        SH_64 = 104,
        SH_65 = 105,
        SH_66 = 106,
        SH_67 = 107,
        SH_68 = 108,
        SH_69 = 109,
        SH_70 = 110,
        SH_71 = 111,
        UNDEFINED = 112
    }
    /**
     * Property field found in PLY header
     */
    export type PlyProperty = {
        /**
         * Value usage
         */
        value: PLYValue;
        /**
         * Value type
         */
        type: PLYType;
        /**
         * offset in byte from te beginning of the splat
         */
        offset: number;
    };
    /**
     * meta info on Splat file
     */
    export interface PLYHeader {
        /**
         * number of splats
         */
        vertexCount: number;
        /**
         * number of spatial chunks for compressed ply
         */
        chunkCount: number;
        /**
         * length in bytes of the vertex info
         */
        rowVertexLength: number;
        /**
         * length in bytes of the chunk
         */
        rowChunkLength: number;
        /**
         * array listing properties per vertex
         */
        vertexProperties: PlyProperty[];
        /**
         * array listing properties per chunk
         */
        chunkProperties: PlyProperty[];
        /**
         * data view for parsing chunks and vertices
         */
        dataView: DataView;
        /**
         * buffer for the data view
         */
        buffer: ArrayBuffer;
        /**
         * degree of SH coefficients
         */
        shDegree: number;
        /**
         * number of coefficient per splat
         */
        shCoefficientCount: number;
        /**
         * buffer for SH coefficients
         */
        shBuffer: ArrayBuffer | null;
    }
    /**
     * Base class for Gaussian Splatting meshes. Contains all single-cloud rendering logic.
     * @internal Use GaussianSplattingMesh instead; this class is an internal implementation detail.
     */
    export class GaussianSplattingMeshBase extends Mesh {
        /** @internal */
        _vertexCount: number;
        protected _worker: Nullable<Worker>;
        private _modelViewProjectionMatrix;
        private _depthMix;
        protected _canPostToWorker: boolean;
        private _readyToDisplay;
        private _sortRequestId;
        private _hasRenderedOnce;
        protected _covariancesATexture: Nullable<BaseTexture>;
        protected _covariancesBTexture: Nullable<BaseTexture>;
        protected _centersTexture: Nullable<BaseTexture>;
        protected _colorsTexture: Nullable<BaseTexture>;
        protected _rotationsATexture: Nullable<BaseTexture>;
        protected _rotationsBTexture: Nullable<BaseTexture>;
        protected _rotationScaleTexture: Nullable<BaseTexture>;
        private _rotationDataA;
        private _rotationDataB;
        private _rotationScaleData;
        protected _needsRotationScaleTextures: boolean;
        protected _splatPositions: Nullable<Float32Array>;
        private _splatIndex;
        protected _shTextures: Nullable<BaseTexture[]>;
        /** @internal */
        _splatsData: Nullable<ArrayBuffer>;
        /** @internal */
        _shData: Nullable<Uint8Array[]>;
        private _textureSize;
        protected readonly _keepInRam: boolean;
        protected _alwaysRetainSplatsData: boolean;
        protected _flipY: boolean;
        private _delayedTextureUpdate;
        protected _useRGBACovariants: boolean;
        protected _useSog: boolean;
        protected _sogParams: Nullable<ISogPackInternal>;
        private _material;
        private _tmpCovariances;
        private _splatSizeMin;
        private _splatSizeMax;
        private _sortIsDirty;
        protected _cachedBoundingMin: Nullable<Vector3>;
        protected _cachedBoundingMax: Nullable<Vector3>;
        private static _RowOutputLength;
        private static _SH_C0;
        private static _SplatBatchSize;
        private static _PlyConversionBatchSize;
        /** @internal */
        _shDegree: number;
        private _maxShDegree;
        private static readonly _BatchSize;
        private _cameraViewInfos;
        protected static readonly _DefaultViewUpdateThreshold = 0.0001;
        /** Fired after parts are added or the mesh is rebuilt following a removal. Payload is the new part count. */
        readonly onPartCountChangedObservable: Observable<number>;
        /** Fired after part-removal validation passes but before the mesh is rebuilt.
         *  Payload is the original (pre-removal) part index. */
        readonly onPartRemovedObservable: Observable<number>;
        /**
         * Returns a byte-accurate view for retained splat data, preserving any non-zero byte offset.
         * @param data The retained splat source bytes.
         * @returns A Uint8Array covering the exact source byte range.
         * @internal
         */
        protected static _GetSplatDataBytes(data: ArrayBuffer | ArrayBufferView): Uint8Array;
        /**
         * Returns a Float32 reinterpretation for retained splat data, copying only when alignment requires it.
         * @param data The retained splat source bytes.
         * @returns A Float32Array over the exact source byte range.
         * @internal
         */
        protected static _GetSplatDataFloats(data: ArrayBuffer | ArrayBufferView): Float32Array;
        /**
         * Cosine value of the angle threshold to update view dependent splat sorting. Default is 0.0001.
         */
        viewUpdateThreshold: number;
        protected _disableDepthSort: boolean;
        /**
         * If true, disables depth sorting of the splats (default: false)
         */
        get disableDepthSort(): boolean;
        set disableDepthSort(value: boolean);
        /**
         * View direction factor used to compute the SH view direction in the shader.
         * @deprecated Not used anymore for SH rendering
         */
        get viewDirectionFactor(): DeepImmutableObject<Vector3>;
        /**
         * SH degree. 0 = no sh (default). 1 = 3 parameters. 2 = 8 parameters. 3 = 15 parameters.
         * Value is clamped between 0 and the maximum degree available from loaded data.
         */
        get shDegree(): number;
        set shDegree(value: number);
        /**
         * Maximum SH degree available from the loaded data.
         */
        get maxShDegree(): number;
        /**
         * Number of splats in the mesh
         */
        get splatCount(): number | undefined;
        /**
         * returns the splats data array buffer that contains in order : postions (3 floats), size (3 floats), color (4 bytes), orientation quaternion (4 bytes)
         * Only available if the mesh was created with keepInRam: true
         */
        get splatsData(): Nullable<ArrayBuffer>;
        /**
         * returns the SH data arrays
         * Only available if the mesh was created with keepInRam: true
         */
        get shData(): Nullable<Uint8Array<ArrayBufferLike>[]>;
        /**
         * Returns the min/max size range of splats in this mesh, where size is pow(|det(Σ)|, 1/6)
         * of the 3D covariance matrix — equivalent to the geometric mean of the principal radii.
         * Computed automatically during updateData(). Returns null before any data has been loaded.
         */
        get splatSizeRange(): Nullable<{
            min: number;
            max: number;
        }>;
        /**
         * Set the number of batch (a batch is 16384 splats) after which a display update is performed
         * A value of 0 (default) means display update will not happens before splat is ready.
         */
        static ProgressiveUpdateAmount: number;
        /**
         * Gets the covariancesA texture
         */
        get covariancesATexture(): Nullable<BaseTexture>;
        /**
         * Gets the covariancesB texture
         */
        get covariancesBTexture(): Nullable<BaseTexture>;
        /**
         * Gets the centers texture
         */
        get centersTexture(): Nullable<BaseTexture>;
        /**
         * Gets the colors texture
         */
        get colorsTexture(): Nullable<BaseTexture>;
        /**
         * Gets the rotation matrix A texture (rotation elements m[0],m[1],m[2],m[4])
         */
        get rotationsATexture(): Nullable<BaseTexture>;
        /**
         * Gets the rotation matrix B texture (rotation elements m[5],m[6],m[8],m[9])
         */
        get rotationsBTexture(): Nullable<BaseTexture>;
        /**
         * Gets the rotation scale texture (rotation element m[10] followed by scale diagonal sx,sy,sz)
         */
        get rotationScaleTexture(): Nullable<BaseTexture>;
        /**
         * Enables or disables generation of rotation and scale matrix textures, required for voxel-based IBL shadows.
         */
        get needsRotationScaleTextures(): boolean;
        set needsRotationScaleTextures(value: boolean);
        /**
         * Gets the SH textures
         */
        get shTextures(): Nullable<BaseTexture[]>;
        /**
         * True when this mesh holds raw SOG webp textures (dequantized in-shader) rather than the
         * pre-decoded covariance/center/color textures produced by the standard splat loader.
         */
        get useSog(): boolean;
        /**
         * SOG dequantization parameters paired with the raw textures.
         * Set by the splat loader when `useSogTextures: true`. Null otherwise.
         */
        get sogParams(): Nullable<ISogPackInternal>;
        /**
         * Install a set of raw SOG webp textures and bind the mesh to the in-shader dequantization path.
         * @param pack SOG texture pack produced by ParseSogMetaAsTextures.
         * @internal
         */
        setSogTextureData(pack: ISogPackInternal): void;
        /**
         * Gets the kernel size
         * Documentation and mathematical explanations here:
         * https://github.com/graphdeco-inria/gaussian-splatting/issues/294#issuecomment-1772688093
         * https://github.com/autonomousvision/mip-splatting/issues/18#issuecomment-1929388931
         */
        get kernelSize(): number;
        /**
         * Get the compensation state
         */
        get compensation(): boolean;
        private _loadingPromise;
        /**
         * set rendering material
         */
        set material(value: Material);
        /**
         * get rendering material
         */
        get material(): Nullable<Material>;
        private static _MakeSplatGeometryForMesh;
        /**
         * Creates a new gaussian splatting mesh
         * @param name defines the name of the mesh
         * @param url defines the url to load from (optional)
         * @param scene defines the hosting scene (optional)
         * @param keepInRam keep datas in ram for editing purpose
         */
        constructor(name: string, url?: Nullable<string>, scene?: Nullable<Scene>, keepInRam?: boolean);
        /**
         * Get the loading promise when loading the mesh from a URL in the constructor
         * @returns constructor loading promise or null if no URL was provided
         */
        getLoadingPromise(): Promise<void> | null;
        /**
         * Returns the class name
         * @returns "GaussianSplattingMeshBase"
         */
        getClassName(): string;
        /**
         * Returns the total number of vertices (splats) within the mesh
         * @returns the total number of vertices
         */
        getTotalVertices(): number;
        /**
         * Is this node ready to be used/rendered
         * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)
         * @returns true when ready
         */
        isReady(completeCheck?: boolean): boolean;
        _getCameraDirection(camera: Camera): Vector3;
        private _isSortStateDirty;
        /** @internal */
        _postToWorker(forced?: boolean): void;
        /**
         * Triggers the draw call for the mesh. Usually, you don't need to call this method by your own because the mesh rendering is handled by the scene rendering manager
         * @param subMesh defines the subMesh to render
         * @param enableAlphaMode defines if alpha mode can be changed
         * @param effectiveMeshReplacement defines an optional mesh used to provide info for the rendering
         * @returns the current mesh
         */
        render(subMesh: SubMesh, enableAlphaMode: boolean, effectiveMeshReplacement?: AbstractMesh): Mesh;
        private static _TypeNameToEnum;
        private static _ValueNameToEnum;
        /**
         * Parse a PLY file header and returns metas infos on splats and chunks
         * @param data the loaded buffer
         * @returns a PLYHeader
         */
        static ParseHeader(data: ArrayBuffer): PLYHeader | null;
        private static _GetCompressedChunks;
        private static _GetSplat;
        /**
         * Converts a .ply data with SH coefficients splat
         * if data array buffer is not ply, returns the original buffer
         * @param data the .ply data to load
         * @param useCoroutine use coroutine and yield
         * @returns the loaded splat buffer and optional array of sh coefficients
         */
        static ConvertPLYWithSHToSplat(data: ArrayBuffer, useCoroutine?: boolean): Generator<undefined, {
            buffer: ArrayBuffer;
            sh?: undefined;
            shDegree?: undefined;
        } | {
            buffer: ArrayBuffer;
            sh: any[] | null;
            shDegree: number;
        }, unknown>;
        /**
         * Converts a .ply data array buffer to splat
         * if data array buffer is not ply, returns the original buffer
         * @param data the .ply data to load
         * @param useCoroutine use coroutine and yield
         * @returns the loaded splat buffer without SH coefficient, whether ply contains or not SH.
         */
        static ConvertPLYToSplat(data: ArrayBuffer, useCoroutine?: boolean): Generator<undefined, ArrayBuffer, unknown>;
        /**
         * Converts a .ply data array buffer to splat
         * if data array buffer is not ply, returns the original buffer
         * @param data the .ply data to load
         * @returns the loaded splat buffer
         */
        static ConvertPLYToSplatAsync(data: ArrayBuffer): Promise<ArrayBuffer>;
        /**
         * Converts a .ply with SH data array buffer to splat
         * if data array buffer is not ply, returns the original buffer
         * @param data the .ply data to load
         * @returns the loaded splat buffer with SH
         */
        static ConvertPLYWithSHToSplatAsync(data: ArrayBuffer): Promise<unknown>;
        /**
         * Loads a .splat Gaussian Splatting array buffer asynchronously
         * @param data arraybuffer containing splat file
         * @returns a promise that resolves when the operation is complete
         */
        loadDataAsync(data: ArrayBuffer): Promise<void>;
        /**
         * Loads a Gaussian or Splatting file asynchronously
         * @param url path to the splat file to load
         * @param scene optional scene it belongs to
         * @returns a promise that resolves when the operation is complete
         * @deprecated Please use SceneLoader.ImportMeshAsync instead
         */
        loadFileAsync(url: string, scene?: Scene): Promise<void>;
        /**
         * Releases resources associated with this mesh.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         */
        dispose(doNotRecurse?: boolean): void;
        protected _copyTextures(source: GaussianSplattingMeshBase): void;
        /**
         * Returns a new Mesh object generated from the current mesh properties.
         * @param name is a string, the name given to the new mesh
         * @returns a new Gaussian Splatting Mesh
         */
        clone(name?: string): GaussianSplattingMeshBase;
        private static _CreateWorker;
        protected _makeEmptySplat(index: number, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array): void;
        /**
         * Processes a single splat from the source buffer (at srcIndex) and writes the result into
         * the destination texture arrays at dstIndex. This decoupling allows addPart to feed multiple
         * independent source buffers into a single set of destination arrays without merging them first.
         * @param dstIndex - destination splat index (into _splatPositions, covA, covB, colorArray)
         * @param fBuffer - float32 view of the source .splat buffer
         * @param uBuffer - uint8 view of the source .splat buffer
         * @param covA - destination covariancesA array
         * @param covB - destination covariancesB array
         * @param colorArray - destination color array
         * @param minimum - accumulated bounding minimum (updated in-place)
         * @param maximum - accumulated bounding maximum (updated in-place)
         * @param flipY - whether to negate the Y position
         * @param srcIndex - source splat index (defaults to dstIndex when omitted)
         */
        protected _makeSplat(dstIndex: number, fBuffer: Float32Array, uBuffer: Uint8Array, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, minimum: Vector3, maximum: Vector3, flipY: boolean, srcIndex?: number): void;
        protected _onUpdateTextures(_textureSize: Vector2): void;
        /**
         * Called when part index data is received during a data load. Override to store and manage
         * part index state (e.g. allocating the padded Uint8Array).
         * No-op in the base class.
         * @param _partIndices - the raw part indices passed in by the caller
         * @param _textureLength - the padded texture length (width × height) to allocate into
         */
        protected _onIndexDataReceived(_partIndices: Uint8Array, _textureLength: number): void;
        /**
         * Called at the start of an incremental texture update, before any splats are processed.
         * Override to perform incremental-specific setup, such as ensuring the part-index GPU texture
         * exists before the sub-texture upload begins.
         * No-op in the base class.
         * @param _textureSize - current texture dimensions
         */
        protected _onIncrementalUpdateStart(_textureSize: Vector2): void;
        /**
         * Whether this mesh is in compound mode (has at least one part added via addPart).
         * Returns `false` in the base class; overridden to return `true` in the compound subclass.
         * Consumed by the material and depth renderer to toggle compound-specific shader paths.
         * @internal
         */
        get isCompound(): boolean;
        protected _setDelayedTextureUpdate(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[]): void;
        protected _updateTextures(covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh?: Uint8Array[]): void;
        /**
         * Checks whether the GPU textures can be incrementally updated for a new addPart operation,
         * avoiding a full texture re-upload for existing splats.
         * Requires that the GPU textures already exist and the texture height won't change.
         * @param previousVertexCount - The number of splats previously committed to GPU
         * @param vertexCount - The new total number of splats
         * @returns true when only the new splat region needs to be uploaded
         */
        protected _canReuseCachedData(previousVertexCount: number, vertexCount: number): boolean;
        /**
         * Posts updated positions to the sort worker and marks the sort as dirty.
         * Called after processing new splats so the worker can re-sort with the complete position set.
         * Subclasses (e.g. compound) may override to additionally post part-index data.
         */
        protected _notifyWorkerNewData(): void;
        private _updateData;
        /**
         * Update asynchronously the buffer
         * @param data array buffer containing center, color, orientation and scale of splats
         * @param sh optional array of uint8 array for SH data
         * @param partIndices optional array of uint8 for rig node indices
         * @param shDegree optional SH degree of the data
         * @returns a promise
         */
        updateDataAsync(data: ArrayBuffer, sh?: Uint8Array[], partIndices?: Uint8Array, shDegree?: number): Promise<void>;
        /**
         * @experimental
         * Update data from GS (position, orientation, color, scaling)
         * @param data array that contain all the datas
         * @param sh optional array of uint8 array for SH data
         * @param options optional informations on how to treat data (needs to be 3rd for backward compatibility)
         * @param partIndices optional array of uint8 for rig node indices
         * @param shDegree optional SH degree of the data
         */
        updateData(data: ArrayBuffer, sh?: Uint8Array[], options?: IUpdateOptions, partIndices?: Uint8Array, shDegree?: number): void;
        /**
         * Refreshes the bounding info, taking into account all the thin instances defined
         * @returns the current Gaussian Splatting
         */
        refreshBoundingInfo(): Mesh;
        protected _updateSplatIndexBuffer(vertexCount: number): void;
        protected _updateTextureFromData: (texture: BaseTexture, data: ArrayBufferView, width: number, lineStart: number, lineCount: number) => void;
        protected _updateTextureFromDataRect: (texture: BaseTexture, data: ArrayBufferView, xOffset: number, yOffset: number, width: number, height: number) => void;
        protected _getTextureDataUpdateEngine(): ITextureDataUpdateCapableEngine;
        protected _updateShTextureData(texture: BaseTexture, shData: Uint8Array, textureWidth: number, lineStart: number, lineCount: number): void;
        protected _updateSubTextures(centers: Float32Array, covA: Uint16Array, covB: Uint16Array, colors: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[]): void;
        protected _instantiateWorker(): void;
        protected _getTextureSize(length: number): Vector2;
        /**
         * Called after the sort worker has been created and the initial positions message has been sent.
         * Override in subclasses to post any additional setup messages the worker needs (e.g. group
         * indices, per-part matrices, etc.).
         * @param _worker the newly created worker
         */
        protected _onWorkerCreated(_worker: Worker): void;
        /**
         * Called by the material to bind any extra shader uniforms that are specific to this mesh type.
         * The base implementation is a no-op; override in subclasses to bind additional data.
         * @param _effect the shader effect that is being bound
         * @internal
         */
        bindExtraEffectUniforms(_effect: Effect): void;
        /**
         * Processes all splats from a source GaussianSplattingMesh directly into the destination
         * texture arrays starting at dstOffset. This is the core of the texture-direct compound API:
         * no merged CPU buffer is ever created; each source mesh is written straight into its region.
         *
         * @param source - The source mesh whose splats are appended
         * @param dstOffset - The destination splat index at which writing starts
         * @param covA - Destination covA array (full texture size)
         * @param covB - Destination covB array (full texture size)
         * @param colorArray - Destination color array (full texture size)
         * @param sh - Destination SH arrays (full texture size), or undefined
         * @param minimum - Accumulated bounding min (updated in-place)
         * @param maximum - Accumulated bounding max (updated in-place)
         * @internal Use GaussianSplattingMesh.addPart instead
         */
        protected _appendSourceToArrays(source: GaussianSplattingMeshBase, dstOffset: number, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, sh: Uint8Array[] | undefined, minimum: Vector3, maximum: Vector3): void;
        /**
         * Modifies the splats according to the passed transformation matrix.
         * @param transform defines the transform matrix to use
         * @returns the current mesh
         */
        bakeTransformIntoVertices(transform: DeepImmutable<Matrix>): Mesh;
    }
    /**
     * Allocates SH texture buffers pre-filled with 128 (the neutral encoding of ~0.0 in the
     * shader's decompose() function). Padding bytes beyond the actual coefficients in the last
     * texture are read as higher-order SH bands when the mesh is added to a compound with a
     * higher degree; zero would decode to -1.0 instead, producing wrong colors.
     * @param textureCount number of SH textures to allocate
     * @param bytesEach byte size of each texture buffer
     * @returns array of initialized Uint8Array buffers
     */
    export function AllocateShBuffers(textureCount: number, bytesEach: number): Uint8Array[];




    /** This file must only contain pure code and pure imports */
    interface IGaussianSplattingPartSource {
        name: string;
        _vertexCount: number;
        _splatsData: Nullable<ArrayBuffer | ArrayBufferView>;
        _shData: Nullable<Uint8Array[]>;
        _shDegree: number;
        isCompound: boolean;
        getWorldMatrix(): Matrix;
        getBoundingInfo(): BoundingInfo;
        dispose(): void;
    }
    /**
     * Class used to render a Gaussian Splatting mesh. Supports both single-cloud and compound
     * (multi-part) rendering. In compound mode, multiple Gaussian Splatting source meshes are
     * merged into one draw call while retaining per-part world-matrix control via
     * addPart/addParts and removePart.
     */
    export class GaussianSplattingMesh extends GaussianSplattingMeshBase {
        /**
         * Proxy meshes indexed by part index. Maintained in sync with _partMatrices.
         */
        private _partProxies;
        /** Part 0 local-space AABB when owned directly (not proxied). Set on first addPart, cleared on dispose/reset. */
        private _part0LocalMin;
        private _part0LocalMax;
        /**
         * World matrices for each part, indexed by part index.
         */
        protected _partMatrices: Matrix[];
        /** When true, suppresses the sort trigger inside setWorldMatrixForPart during batch rebuilds. */
        private _rebuilding;
        /**
         * Visibility values for each part (0.0 to 1.0), indexed by part index.
         */
        protected _partVisibility: number[];
        private _partIndicesTexture;
        private _partIndices;
        /** Gets the part indices texture used for compound rendering */
        get partIndicesTexture(): Nullable<BaseTexture>;
        /**
         * Creates a new GaussianSplattingMesh
         * @param name the name of the mesh
         * @param url optional URL to load a Gaussian Splatting file from
         * @param scene the hosting scene
         * @param keepInRam whether to keep the raw splat data in RAM after uploading to GPU
         * @param needsRotationScaleTextures generate rotation and scale matrix textures required for voxel-based IBL shadows
         */
        constructor(name: string, url?: Nullable<string>, scene?: Nullable<Scene>, keepInRam?: boolean, needsRotationScaleTextures?: boolean);
        /**
         * Returns the class name
         * @returns "GaussianSplattingMesh"
         */
        getClassName(): string;
        /**
         * Is this node ready to be used/rendered.
         * Force-syncs every part proxy's world matrix into `_partMatrices` BEFORE delegating to
         * the base readiness check. This guarantees that any pending proxy transform changes
         * (for example a user-set `proxy.position`) are reflected in the next sort post, so the
         * base `isReady` will only return true once `sortAppliedId === sortRequestId` for that
         * up-to-date state. Without this, the proxy's `onAfterWorldMatrixUpdateObservable` would
         * fire during the first render and queue a fresh sort AFTER readiness was reported,
         * leaving the rendered frame with stale splat order on `renderCount=1` runs.
         * @param completeCheck defines if a complete check (including materials and lights) has to be done (false by default)
         * @returns true when ready
         */
        isReady(completeCheck?: boolean): boolean;
        /**
         * Recomputes compound local-space bounds from part 0's stored AABB (if unproxied) plus all
         * proxy world AABBs inverse-transformed to compound-local space. All 8 corners of each proxy
         * AABB are transformed so the result is correct under non-identity compound rotation/scale.
         */
        private _updateBoundingInfoFromProxies;
        /**
         * Override for compound meshes: recomputes bounds from proxy world extents instead of
         * local bounds × world matrix, which is wrong for proxied parts with independent transforms.
         * @returns this mesh
         */
        _updateBoundingInfo(): AbstractMesh;
        /**
         * Replaces the base hierarchy bounds computation for compound meshes: computes world bounds
         * from scratch by iterating part 0's local AABB and all proxy meshes, rather than delegating
         * to the base _children traversal which never reaches proxies (they are not parented to the
         * compound). Visibility per-part is respected; invisible parts are excluded.
         * @param includeDescendants when true, includes descendants (default: true)
         * @param predicate optional filter predicate
         * @returns world-space min/max of the hierarchy bounding box
         */
        getHierarchyBoundingVectors(includeDescendants?: boolean, predicate?: Nullable<(abstractMesh: AbstractMesh) => boolean>): {
            min: Vector3;
            max: Vector3;
        };
        /**
         * Disposes proxy meshes and clears part data in addition to the base class GPU resources.
         * @param doNotRecurse Set to true to not recurse into each children
         */
        dispose(doNotRecurse?: boolean): void;
        /**
         * Posts the initial per-part data to the sort worker after it has been created.
         * Sends the current part matrices and group index array so the worker can correctly
         * weight depth values per part.
         * @param worker the newly created sort worker
         */
        protected _onWorkerCreated(worker: Worker): void;
        /**
         * Stores the raw part index array, padded to texture length, so the worker and GPU texture
         * creation step have access to it.
         * @param partIndices - the raw part indices array received during a data load
         * @param textureLength - the padded texture length to allocate into
         */
        protected _onIndexDataReceived(partIndices: Uint8Array, textureLength: number): void;
        /**
         * Returns `true` when at least one part has been added to this compound mesh.
         * Returns `false` before any parts are added, so the mesh renders in normal
         * (non-compound) mode until the first addPart/addParts call. This matches the
         * old base-class behavior of `this._partMatrices.length > 0` and avoids
         * binding unset partWorld uniforms (which would cause division-by-zero in the
         * Gaussian projection Jacobian and produce huge distorted splats).
         * @internal
         */
        get isCompound(): boolean;
        /**
         * During a removePart rebuild, keep the existing sort worker alive rather than
         * tearing it down and spinning up a new one. This avoids startup latency and the
         * transient state window where a stale sort could fire against an incomplete
         * partMatrices array.
         * Outside of a rebuild the base-class behaviour is used unchanged.
         */
        protected _instantiateWorker(): void;
        /**
         * Ensures the part-index GPU texture exists at the start of an incremental update.
         * Called before the sub-texture upload so the correct texture is available for the first batch.
         * @param textureSize - current texture dimensions
         */
        protected _onIncrementalUpdateStart(textureSize: Vector2): void;
        /**
         * Posts positions (via super) and then additionally posts the current part-index array
         * to the sort worker so it can associate each splat with its part.
         */
        protected _notifyWorkerNewData(): void;
        /**
         * Binds all compound-specific shader uniforms: the group index texture, per-part world
         * matrices, and per-part visibility values.
         * @param effect the shader effect that is being bound
         * @internal
         */
        bindExtraEffectUniforms(effect: Effect): void;
        /**
         * Gets the number of parts in the compound.
         */
        get partCount(): number;
        /**
         * Gets the part visibility array.
         */
        get partVisibility(): number[];
        /**
         * Sets the world matrix for a specific part of the compound.
         * This will trigger a re-sort of the mesh.
         * The `_partMatrices` array is automatically extended when `partIndex >= partCount`.
         * @param partIndex index of the part
         * @param worldMatrix the world matrix to set
         */
        setWorldMatrixForPart(partIndex: number, worldMatrix: Matrix): void;
        /**
         * Gets the world matrix for a specific part of the compound.
         * @param partIndex index of the part, that must be between 0 and partCount - 1
         * @returns the world matrix for the part, or the current world matrix of the mesh if the part is not found
         */
        getWorldMatrixForPart(partIndex: number): Matrix;
        /**
         * Gets the visibility for a specific part of the compound.
         * @param partIndex index of the part, that must be between 0 and partCount - 1
         * @returns the visibility value (0.0 to 1.0) for the part
         */
        getPartVisibility(partIndex: number): number;
        /**
         * Sets the visibility for a specific part of the compound.
         * @param partIndex index of the part, that must be between 0 and partCount - 1
         * @param value the visibility value (0.0 to 1.0) to set
         */
        setPartVisibility(partIndex: number, value: number): void;
        protected _copyTextures(source: GaussianSplattingMeshBase): void;
        protected _onUpdateTextures(textureSize: Vector2): void;
        protected _updateSubTextures(splatPositions: Float32Array, covA: Uint16Array, covB: Uint16Array, colorArray: Uint8Array, lineStart: number, lineCount: number, sh?: Uint8Array[], partIndices?: Uint8Array): void;
        /**
         * Creates the part indices GPU texture the first time an incremental addPart introduces
         * compound data. Has no effect if the texture already exists or no partIndices are provided.
         * @param textureSize - Current texture dimensions
         * @param partIndices - Part index data; if undefined the method is a no-op
         */
        protected _ensurePartIndicesTexture(textureSize: Vector2, partIndices: Uint8Array | undefined): void;
        private _appendPartSourceToArrays;
        private _createRetainedPartSource;
        private _retainMergedPartData;
        /**
         * Core implementation for adding one or more source parts as new
         * parts. Writes directly into texture-sized CPU arrays, updates the retained merged source
         * buffers, and uploads in one pass.
         *
         * @param others - Source meshes to append (must each be non-compound and fully loaded)
         * @param disposeOthers - Dispose source meshes after appending
         * @returns Proxy meshes and their assigned part indices
         */
        protected _addPartsInternal(others: IGaussianSplattingPartSource[], disposeOthers: boolean): {
            proxyMeshes: GaussianSplattingPartProxyMesh[];
            assignedPartIndices: number[];
        };
        /**
         * Add another mesh to this mesh, as a new part. This makes the current mesh a compound, if not already.
         * The source mesh's splat data is read directly and copied into the compound's retained source buffers.
         * @param other - The other mesh to add. Must be fully loaded before calling this method.
         * @param disposeOther - Whether to dispose the other mesh after adding it to the current mesh.
         * @returns a placeholder mesh that can be used to manipulate the part transform
         * @deprecated Use {@link GaussianSplattingCompoundMesh.addPart} instead.
         */
        addPart(other: GaussianSplattingMesh, disposeOther?: boolean): GaussianSplattingPartProxyMesh;
        /**
         * Remove a part from this compound mesh.
         * The remaining parts are rebuilt directly from the compound mesh's retained source buffers.
         * The current mesh is reset to a plain (single-part) state and then each remaining source is
         * re-added via addParts.
         * @param index - The index of the part to remove
         * @deprecated Use {@link GaussianSplattingCompoundMesh.removePart} instead.
         */
        removePart(index: number): void;
        /**
         * Serialize current GaussianSplattingMesh
         * @param serializationObject defines the object which will receive the serialization data
         * @param encoding the encoding of binary data, defaults to base64 for json serialize,
         * kept for future internal use like cloning where base64 encoding wastes cycles and memory
         * @returns the serialized object
         */
        serialize(serializationObject?: any, encoding?: string): any;
        /**
         * Internal helper to parses a serialized GaussianSplattingMesh or GaussianSplattingCompoundMesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the GaussianSplattingMesh or GaussianSplattingCompoundMesh in
         * @param ctor the constructor of the mesh to create
         * @returns the created GaussianSplattingMesh
         * @internal
         */
        static _ParseInternal<T extends GaussianSplattingMesh>(parsedMesh: any, scene: Scene, ctor: new (name: string, url: Nullable<string>, scene: Nullable<Scene>, keepInRam: boolean) => T): T;
        /**
         * Parses a serialized GaussianSplattingMesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the GaussianSplattingMesh in
         * @returns the created GaussianSplattingMesh
         */
        static Parse(parsedMesh: any, scene: Scene): GaussianSplattingMesh;
    }
    /**
     * Register side effects for gaussianSplattingMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Manages debug rendering options across a set of Gaussian splat meshes.
     * Create one instance, add meshes via addMesh(), then set options to apply
     * them to every registered mesh simultaneously.
     *
     * All options default to their "off" states so there is no rendering cost
     * until a feature is explicitly enabled.
     *
     * @example
     * ```ts
     * // Global options — applied to every registered mesh
     * const gsDebugger = new GaussianSplattingDebugger();
     * gsDebugger.addMesh(mesh1);
     * gsDebugger.addMesh(compoundMesh); // compound mesh with multiple parts
     * gsDebugger.clippingBox = { min: new Vector3(-2, -2, -2), max: new Vector3(2, 2, 2) };
     * gsDebugger.shOrder1 = false;
     *
     * // Per-part override — saturate opacity on part 0 of the compound mesh only,
     * // leaving all other parts (and mesh1) unaffected
     * gsDebugger.setPartOptions(compoundMesh, 0, { opacitySaturate: true });
     * // Later, restore part 0 to the global setting
     * gsDebugger.clearPartOptions(compoundMesh, 0);
     * ```
     */
    export class GaussianSplattingDebugger {
        private _plugins;
        private _meshes;
        private _disposeObservers;
        private _partCountObservers;
        private _partRemovedObservers;
        private _clippingBox;
        private _opacityCulling;
        private _sizeCulling;
        private _opacityScale;
        private _opacitySaturate;
        private _shDc;
        private _shOrder1;
        private _shOrder2;
        private _shOrder3;
        private _shOrder4;
        /**
         * Adds a mesh to the debugger, attaching a debug plugin to its material.
         * The mesh must already have a GaussianSplattingMaterial assigned (i.e., data
         * must have been loaded at least once). Current option values are applied immediately.
         * The mesh is automatically unregistered if it is disposed.
         * @param mesh The mesh to register.
         */
        addMesh(mesh: GaussianSplattingMeshBase): void;
        /**
         * Removes a mesh and disposes its debug plugin.
         * @param mesh The mesh to unregister.
         */
        removeMesh(mesh: GaussianSplattingMeshBase): void;
        /** Disposes all debug plugins and clears the mesh list. */
        dispose(): void;
        /**
         * Returns the min/max size range of splats in a mesh.
         * Convenience wrapper for GaussianSplattingMeshBase.splatSizeRange.
         * @param mesh The mesh to query.
         * @returns the splat size range, or null if not yet computed.
         */
        static GetSplatSizeRange(mesh: GaussianSplattingMeshBase): Nullable<{
            min: number;
            max: number;
        }>;
        private _applyAllTo;
        /**
         * World-space axis-aligned clipping box. Splats outside are not rendered.
         * Set to null to disable.
         */
        get clippingBox(): Nullable<{
            min: Vector3;
            max: Vector3;
        }>;
        set clippingBox(value: Nullable<{
            min: Vector3;
            max: Vector3;
        }>);
        /**
         * Opacity culling range [0..1]. Splats outside this range are not rendered.
         * Set to null to disable.
         */
        get opacityCulling(): Nullable<{
            min: number;
            max: number;
        }>;
        set opacityCulling(value: Nullable<{
            min: number;
            max: number;
        }>);
        /**
         * Size culling range. Size is pow(|det(Σ)|, 1/6) of the 3D covariance matrix,
         * equal to the geometric mean of the principal radii. Splats outside this range are not rendered.
         * Use GaussianSplattingDebugger.GetSplatSizeRange(mesh) to find an asset's range.
         * Set to null to disable.
         */
        get sizeCulling(): Nullable<{
            min: number;
            max: number;
        }>;
        set sizeCulling(value: Nullable<{
            min: number;
            max: number;
        }>);
        /** Scalar multiplier applied to every splat's opacity. 1.0 = no change. */
        get opacityScale(): number;
        set opacityScale(value: number);
        /**
         * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,
         * showing each splat as a solid disk.
         */
        get opacitySaturate(): boolean;
        set opacitySaturate(value: boolean);
        /** Include the DC (base) color from colorsTexture. Default: true. */
        get shDc(): boolean;
        set shDc(value: boolean);
        /** Include SH band 1 contribution. Default: true. */
        get shOrder1(): boolean;
        set shOrder1(value: boolean);
        /** Include SH band 2 contribution. Default: true. */
        get shOrder2(): boolean;
        set shOrder2(value: boolean);
        /** Include SH band 3 contribution. Default: true. */
        get shOrder3(): boolean;
        set shOrder3(value: boolean);
        /** Include SH band 4 contribution. Default: true. */
        get shOrder4(): boolean;
        set shOrder4(value: boolean);
        /**
         * Sets per-part debug overrides for a specific part of a compound mesh.
         * The mesh must already be registered via addMesh(). Logs an error if the mesh
         * is not compound (partCount is 0).
         * @param mesh The compound mesh.
         * @param partIndex The zero-based part index.
         * @param options Partial set of debug options to override for this part.
         */
        setPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void;
        /**
         * Clears all per-part debug overrides for a specific part, falling back to global settings.
         * @param mesh The compound mesh.
         * @param partIndex The zero-based part index.
         */
        clearPartOptions(mesh: GaussianSplattingMeshBase, partIndex: number): void;
    }


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingDebugger.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Class used to compose multiple Gaussian Splatting meshes into a single draw call,
     * with per-part world-matrix and visibility control via addPart/addParts/removePart.
     *
     * This is the recommended class for multi-part Gaussian Splatting use cases.
     *
     * Next major version: the compound mesh API (addPart/addParts/removePart) will
     * move exclusively to this class and will be removed from GaussianSplattingMesh.
     */
    export class GaussianSplattingCompoundMesh extends GaussianSplattingMesh {
        /**
         * Creates a new GaussianSplattingCompoundMesh
         * @param name the name of the mesh
         * @param url optional URL to load a Gaussian Splatting file from
         * @param scene the hosting scene
         * @param keepInRam whether to keep the raw splat data in RAM after uploading to GPU
         * @param needsRotationScaleTextures generate rotation and scale matrix textures required for voxel-based IBL shadows
         */
        constructor(name: string, url?: Nullable<string>, scene?: Nullable<Scene>, keepInRam?: boolean, needsRotationScaleTextures?: boolean);
        /**
         * Add another mesh to this compound mesh as a new part.
         * The source mesh's splat data is read directly and copied into the compound's retained source buffers.
         * @param other - The other mesh to add. Must be fully loaded before calling this method.
         * @param disposeOther - Whether to dispose the other mesh after adding it.
         * @returns a placeholder mesh that can be used to manipulate the part transform
         */
        addPart(other: GaussianSplattingMesh, disposeOther?: boolean): GaussianSplattingPartProxyMesh;
        /**
         * Add multiple meshes to this compound mesh as new parts in a single operation.
         * Splat data is written into texture arrays while the compound refreshes its retained merged source buffers.
         * @param others - The meshes to add. Each must be fully loaded and must not be a compound.
         * @param disposeOthers - Whether to dispose the other meshes after adding them.
         * @returns an array of placeholder meshes that can be used to manipulate the part transforms
         */
        addParts(others: GaussianSplattingMesh[], disposeOthers?: boolean): GaussianSplattingPartProxyMesh[];
        /**
         * Remove a part from this compound mesh.
         * The remaining parts are rebuilt directly from the compound mesh's retained source buffers.
         * @param index - The index of the part to remove
         */
        removePart(index: number): void;
        /**
         * Serialize current GaussianSplattingMesh
         * @param serializationObject defines the object which will receive the serialization data
         * @param encoding the encoding of binary data, defaults to base64 for json serialize,
         * kept for future internal use like cloning where base64 encoding wastes cycles and memory
         * @returns the serialized object
         */
        serialize(serializationObject?: any, encoding?: string): any;
        /**
         * Parses a serialized GaussianSplattingCompoundMesh
         * @param parsedMesh the serialized mesh
         * @param scene the scene to create the GaussianSplattingCompoundMesh in
         * @returns the created GaussianSplattingCompoundMesh
         */
        static Parse(parsedMesh: any, scene: Scene): GaussianSplattingCompoundMesh;
    }
    /**
     * Register side effects for gaussianSplattingCompoundMesh.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingCompoundMesh(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingCompoundMesh.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Configuration for meshoptimizer compression
     */
    export interface IMeshoptCompressionConfiguration {
        /**
         * Configuration for the decoder.
         */
        decoder: {
            /**
             * The url to the meshopt decoder library.
             */
            url: string;
        };
    }
    /**
     * Meshopt compression (https://github.com/zeux/meshoptimizer)
     *
     * This class wraps the meshopt library from https://github.com/zeux/meshoptimizer/tree/master/js.
     *
     * **Encoder**
     *
     * The encoder is not currently implemented.
     *
     * **Decoder**
     *
     * By default, the configuration points to a copy of the meshopt files on the Babylon.js preview CDN (e.g. https://preview.babylonjs.com/meshopt_decoder.js).
     *
     * To update the configuration, use the following code:
     * ```javascript
     *     MeshoptCompression.Configuration = {
     *         decoder: {
     *             url: "<url to the meshopt decoder library>"
     *         }
     *     };
     * ```
     */
    export class MeshoptCompression implements IDisposable {
        private _decoderModulePromise?;
        /**
         * The configuration. Defaults to the following:
         * ```javascript
         * decoder: {
         *   url: "https://cdn.babylonjs.com/meshopt_decoder.js"
         * }
         * ```
         */
        static Configuration: IMeshoptCompressionConfiguration;
        private static _Default;
        /**
         * Default instance for the meshoptimizer object.
         */
        static get Default(): MeshoptCompression;
        /**
         * Constructor
         */
        constructor();
        /**
         * Stop all async operations and release resources.
         */
        dispose(): void;
        /**
         * Decode meshopt data.
         * @see https://github.com/zeux/meshoptimizer/tree/master/js#decoder
         * @param source The input data.
         * @param count The number of elements.
         * @param stride The stride in bytes.
         * @param mode The compression mode.
         * @param filter The compression filter.
         * @returns a Promise<Uint8Array> that resolves to the decoded data
         */
        decodeGltfBufferAsync(source: Uint8Array, count: number, stride: number, mode: "ATTRIBUTES" | "TRIANGLES" | "INDICES", filter?: string): Promise<Uint8Array>;
    }




    /**
     * The available Draco attribute names.
     */
    export type DracoAttributeName = "POSITION" | "NORMAL" | "COLOR" | "TEX_COORD" | "GENERIC";
    /**
     * Draco encoding method (from EncoderMethod enum in `draco_encoder.ts`).
     */
    export type DracoEncoderMethod = "MESH_SEQUENTIAL_ENCODING" | "MESH_EDGEBREAKER_ENCODING";
    /**
     * Options for a particular encoding.
     */
    export interface IDracoEncoderOptions {
        /**
         * Tune how fast decoding should be (0 = fastest but least compressed, 10 = slowest but most compressed).
         */
        decodeSpeed?: number;
        /**
         * Tune how fast encoding should be (0 = fastest but least compressed, 10 = slowest but most compressed).
         */
        encodeSpeed?: number;
        /**
         * The method to use for encoding the data (EDGEBREAKER or SEQUENTIAL). Defaults to EDGEBREAKER, if possible.
         */
        method?: DracoEncoderMethod;
        /**
         * The number of bits to use for each DRACO attribute kind.
         */
        quantizationBits?: Record<DracoAttributeName, number>;
        /**
         * The list of BABYLON attribute kinds to skip exporting, if present. Defaults to none.
         */
        excludedAttributes?: string[];
    }
    /**
     * Encoder parameter carrying Babylon attribute data.
     * @internal
     */
    export interface IDracoAttributeData {
        /**
         * The kind of the attribute.
         */
        kind: string;
        /**
         * The Draco name for the kind of the attribute.
         */
        dracoName: DracoAttributeName;
        /**
         * The size of the attribute.
         */
        size: number;
        /**
         * The buffer view of the attribute.
         */
        data: VertexDataTypedArray;
    }
    /**
     * Encoded Draco mesh data.
     * @internal
     */
    export interface IDracoEncodedMeshData {
        /**
         * The encoded data.
         */
        data: Int8Array;
        /**
         * A map of Babylon vertex attributes to their Draco unique ids in the encoded data.
         */
        attributeIds: Record<string, number>;
    }
    interface IEncodeSuccessMessage {
        id: "encodeMeshSuccess";
        encodedMeshData: IDracoEncodedMeshData;
    }
    interface IEncodeErrorMessage {
        id: "encodeMeshError";
        errorMessage: string;
    }
    /**
     * @internal
     */
    export type EncoderMessage = IEncodeSuccessMessage | IEncodeErrorMessage;


    /**
     * @experimental This class is subject to change.
     *
     * Draco Encoder (https://google.github.io/draco/)
     *
     * This class wraps the Draco encoder module.
     *
     * By default, the configuration points to a copy of the Draco encoder files from the Babylon.js cdn https://cdn.babylonjs.com/draco_encoder_wasm_wrapper.js.
     *
     * To update the configuration, use the following code:
     * ```javascript
     *     DracoEncoder.DefaultConfiguration = {
     *          wasmUrl: "<url to the WebAssembly library>",
     *          wasmBinaryUrl: "<url to the WebAssembly binary>",
     *          fallbackUrl: "<url to the fallback JavaScript library>",
     *     };
     * ```
     *
     * Draco has two versions, one for WebAssembly and one for JavaScript. The encoder configuration can be set to only support WebAssembly or only support the JavaScript version.
     * Decoding will automatically fallback to the JavaScript version if WebAssembly version is not configured or if WebAssembly is not supported by the browser.
     * Use `DracoEncoder.DefaultAvailable` to determine if the encoder configuration is available for the current context.
     *
     * To encode Draco compressed data, get the default DracoEncoder object and call encodeMeshAsync:
     * ```javascript
     *     var dracoData = await DracoEncoder.Default.encodeMeshAsync(mesh);
     * ```
     *
     * Currently, DracoEncoder only encodes to meshes. Encoding to point clouds is not yet supported.
     *
     * Only position, normal, color, and UV attributes are supported natively by the encoder. All other attributes are treated as generic. This means that,
     * when decoding these generic attributes later, additional information about their original Babylon types will be needed to interpret the data correctly.
     * You can use the return value of `encodeMeshAsync` to source this information, specifically the `attributes` field. E.g.,
     * ```javascript
     *    var dracoData = await DracoEncoder.Default.encodeMeshAsync(mesh);
     *    var meshData = await DracoDecoder.Default.decodeMeshToMeshDataAsync(dracoData.data, dracoData.attributes);
     * ```
     *
     * By default, DracoEncoder will encode all available attributes of the mesh. To exclude specific attributes, use the following code:
     * ```javascript
     *    var options = { excludedAttributes: [VertexBuffer.MatricesIndicesKind, VertexBuffer.MatricesWeightsKind] };
     *    var dracoData = await DracoDecoder.Default.encodeMeshAsync(mesh, options);
     * ```
     */
    export class DracoEncoder extends DracoCodec {
        /**
         * Default configuration for the DracoEncoder. Defaults to the following:
         * - numWorkers: 50% of the available logical processors, capped to 4. If no logical processors are available, defaults to 1.
         * - wasmUrl: `"https://cdn.babylonjs.com/draco_encoder_wasm_wrapper.js"`
         * - wasmBinaryUrl: `"https://cdn.babylonjs.com/draco_encoder.wasm"`
         * - fallbackUrl: `"https://cdn.babylonjs.com/draco_encoder.js"`
         */
        static DefaultConfiguration: IDracoCodecConfiguration;
        /**
         * Returns true if the encoder's `DefaultConfiguration` is available.
         */
        static get DefaultAvailable(): boolean;
        protected static _Default: Nullable<DracoEncoder>;
        /**
         * Default instance for the DracoEncoder.
         */
        static get Default(): DracoEncoder;
        /**
         * Reset the default DracoEncoder object to null and disposing the removed default instance.
         * Note that if the workerPool is a member of the static DefaultConfiguration object it is recommended not to run dispose,
         * unless the static worker pool is no longer needed.
         * @param skipDispose set to true to not dispose the removed default instance
         */
        static ResetDefault(skipDispose?: boolean): void;
        protected _isModuleAvailable(): boolean;
        protected _createModuleAsync(wasmBinary?: ArrayBuffer, jsModule?: unknown /** DracoEncoderModule */): Promise<{
            module: unknown; /** EncoderModule */
        }>;
        protected _getWorkerContent(): string;
        /**
         * Creates a new Draco encoder.
         * @param configuration Optional override of the configuration for the DracoEncoder. If not provided, defaults to {@link DracoEncoder.DefaultConfiguration}.
         */
        constructor(configuration?: IDracoCodecConfiguration);
        /**
         * @internal
         */
        _encodeAsync(attributes: Array<IDracoAttributeData>, indices: Nullable<Uint16Array | Uint32Array>, options?: IDracoEncoderOptions): Promise<IDracoEncodedMeshData>;
        /**
         * Encodes a mesh or geometry into a Draco-encoded mesh data.
         * @param input the mesh or geometry to encode
         * @param options options for the encoding
         * @returns a promise that resolves to the newly-encoded data
         */
        encodeMeshAsync(input: Mesh | Geometry, options?: IDracoEncoderOptions): Promise<IDracoEncodedMeshData>;
    }


    /**
     * Decoded Draco mesh data.
     */
    export interface MeshData {
        /**
         * The indices of the mesh. Point clouds will not have indices.
         */
        indices?: Uint16Array | Uint32Array;
        /**
         * The attributes of the mesh.
         */
        attributes: Array<IAttributeData>;
        /**
         * The total number of vertices in the mesh.
         */
        totalVertices: number;
    }
    /**
     * @internal
     */
    export interface IAttributeData {
        /** @internal */
        kind: string;
        /** @internal */
        data: ArrayBufferView;
        /** @internal */
        size: number;
        /** @internal */
        byteOffset: number;
        /** @internal */
        byteStride: number;
        /** @internal */
        normalized: boolean;
    }
    /**
     * @internal
     */
    export interface IDecodeMeshDoneMessage {
        /** @internal */
        id: "decodeMeshDone";
        /** @internal */
        totalVertices: number;
    }
    /**
     * @internal
     */
    export interface IIndicesMessage {
        /** @internal */
        id: "indices";
        /** @internal */
        data: Uint16Array | Uint32Array;
    }
    /**
     * @internal
     */
    export interface IAttributeMessage extends IAttributeData {
        /** @internal */
        id: "attribute";
    }
    /**
     * @internal
     */
    export type DecoderMessage = IDecodeMeshDoneMessage | IIndicesMessage | IAttributeMessage;


    /**
     * @experimental This class is an experimental version of `DracoCompression` and is subject to change.
     *
     * Draco Decoder (https://google.github.io/draco/)
     *
     * This class wraps the Draco decoder module.
     *
     * By default, the configuration points to a copy of the Draco decoder files for glTF from the Babylon.js cdn https://cdn.babylonjs.com/draco_wasm_wrapper_gltf.js.
     *
     * To update the configuration, use the following code:
     * ```javascript
     *     DracoDecoder.DefaultConfiguration = {
     *          wasmUrl: "<url to the WebAssembly library>",
     *          wasmBinaryUrl: "<url to the WebAssembly binary>",
     *          fallbackUrl: "<url to the fallback JavaScript library>",
     *     };
     * ```
     *
     * Draco has two versions, one for WebAssembly and one for JavaScript. The decoder configuration can be set to only support WebAssembly or only support the JavaScript version.
     * Decoding will automatically fallback to the JavaScript version if WebAssembly version is not configured or if WebAssembly is not supported by the browser.
     * Use `DracoDecoder.DefaultAvailable` to determine if the decoder configuration is available for the current context.
     *
     * To decode Draco compressed data, get the default DracoDecoder object and call decodeMeshToGeometryAsync:
     * ```javascript
     *     var geometry = await DracoDecoder.Default.decodeMeshToGeometryAsync(data);
     * ```
     */
    export class DracoDecoder extends DracoCodec {
        /**
         * Default configuration for the DracoDecoder. Defaults to the following:
         * - numWorkers: 50% of the available logical processors, capped to 4. If no logical processors are available, defaults to 1.
         * - wasmUrl: `"https://cdn.babylonjs.com/draco_wasm_wrapper_gltf.js"`
         * - wasmBinaryUrl: `"https://cdn.babylonjs.com/draco_decoder_gltf.wasm"`
         * - fallbackUrl: `"https://cdn.babylonjs.com/draco_decoder_gltf.js"`
         */
        static DefaultConfiguration: IDracoCodecConfiguration;
        /**
         * Returns true if the decoder's `DefaultConfiguration` is available.
         */
        static get DefaultAvailable(): boolean;
        protected static _Default: Nullable<DracoDecoder>;
        /**
         * Default instance for the DracoDecoder.
         */
        static get Default(): DracoDecoder;
        /**
         * Reset the default DracoDecoder object to null and disposing the removed default instance.
         * Note that if the workerPool is a member of the static DefaultConfiguration object it is recommended not to run dispose,
         * unless the static worker pool is no longer needed.
         * @param skipDispose set to true to not dispose the removed default instance
         */
        static ResetDefault(skipDispose?: boolean): void;
        protected _isModuleAvailable(): boolean;
        protected _createModuleAsync(wasmBinary?: ArrayBuffer, jsModule?: unknown /** DracoDecoderModule */): Promise<{
            module: unknown; /** DecoderModule */
        }>;
        protected _getWorkerContent(): string;
        /**
         * Creates a new Draco decoder.
         * @param configuration Optional override of the configuration for the DracoDecoder. If not provided, defaults to {@link DracoDecoder.DefaultConfiguration}.
         */
        constructor(configuration?: IDracoCodecConfiguration);
        /**
         * Decode Draco compressed mesh data to mesh data.
         * @param data The ArrayBuffer or ArrayBufferView of the compressed Draco data
         * @param attributes A map of attributes from vertex buffer kinds to Draco unique ids
         * @param gltfNormalizedOverride A map of attributes from vertex buffer kinds to normalized flags to override the Draco normalization
         * @returns A promise that resolves with the decoded mesh data
         */
        decodeMeshToMeshDataAsync(data: ArrayBuffer | ArrayBufferView, attributes?: {
            [kind: string]: number;
        }, gltfNormalizedOverride?: {
            [kind: string]: boolean;
        }): Promise<MeshData>;
        /**
         * Decode Draco compressed mesh data to Babylon geometry.
         * @param name The name to use when creating the geometry
         * @param scene The scene to use when creating the geometry
         * @param data The ArrayBuffer or ArrayBufferView of the Draco compressed data
         * @param attributes A map of attributes from vertex buffer kinds to Draco unique ids
         * @returns A promise that resolves with the decoded geometry
         */
        decodeMeshToGeometryAsync(name: string, scene: Scene, data: ArrayBuffer | ArrayBufferView, attributes?: {
            [kind: string]: number;
        }): Promise<Geometry>;
        /** @internal */
        _decodeMeshToGeometryForGltfAsync(name: string, scene: Scene, data: ArrayBuffer | ArrayBufferView, attributes: {
            [kind: string]: number;
        }, gltfNormalizedOverride: {
            [kind: string]: boolean;
        }, boundingInfo: Nullable<BoundingInfo>): Promise<Geometry>;
    }


    /**
     * @internal
     */
    export function EncodeMesh(module: unknown /** EncoderModule */, attributes: Array<IDracoAttributeData>, indices: Nullable<Uint16Array | Uint32Array>, options: IDracoEncoderOptions): IDracoEncodedMeshData;
    /**
     * The worker function that gets converted to a blob url to pass into a worker.
     * To be used if a developer wants to create their own worker instance and inject it instead of using the default worker.
     */
    export function EncoderWorkerFunction(): void;
    /**
     * @internal
     */
    export function DecodeMesh(module: unknown /** DecoderModule */, data: Int8Array, attributeIDs: Record<string, number> | undefined, onIndicesData: (indices: Uint16Array | Uint32Array) => void, onAttributeData: (kind: string, data: ArrayBufferView, size: number, offset: number, stride: number, normalized: boolean) => void): number;
    /**
     * The worker function that gets converted to a blob url to pass into a worker.
     * To be used if a developer wants to create their own worker instance and inject it instead of using the default worker.
     */
    export function DecoderWorkerFunction(): void;
    /**
     * Initializes a worker that was created for the draco agent pool
     * @param worker  The worker to initialize
     * @param wasmBinary The wasm binary to load into the worker
     * @param moduleUrl The url to the draco decoder module (optional)
     * @returns A promise that resolves when the worker is initialized
     */
    export function initializeWebWorker(worker: Worker, wasmBinary?: ArrayBuffer, moduleUrl?: string): Promise<Worker>;


    /**
     * Configuration for Draco compression
     */
    export interface IDracoCompressionConfiguration {
        /**
         * Configuration for the decoder.
         */
        decoder: IDracoCodecConfiguration;
    }
    /**
     * Options for Draco compression
     */
    export interface IDracoCompressionOptions extends Pick<IDracoCodecConfiguration, "numWorkers" | "wasmBinary" | "workerPool"> {
    }
    /**
     * Draco compression (https://google.github.io/draco/)
     *
     * This class wraps the Draco module.
     *
     * **Encoder**
     *
     * The encoder is not currently implemented.
     *
     * **Decoder**
     *
     * By default, the configuration points to a copy of the Draco decoder files for glTF from the babylon.js cdn https://cdn.babylonjs.com/draco_wasm_wrapper_gltf.js.
     * The configuration is shared with the DracoDecoder class.
     *
     * To update the configuration, use the following code:
     * ```javascript
     *     DracoCompression.Configuration = {
     *         decoder: {
     *             wasmUrl: "<url to the WebAssembly library>",
     *             wasmBinaryUrl: "<url to the WebAssembly binary>",
     *             fallbackUrl: "<url to the fallback JavaScript library>",
     *         }
     *     };
     * ```
     *
     * Draco has two versions, one for WebAssembly and one for JavaScript. The decoder configuration can be set to only support WebAssembly or only support the JavaScript version.
     * Decoding will automatically fallback to the JavaScript version if WebAssembly version is not configured or if WebAssembly is not supported by the browser.
     * Use `DracoCompression.DecoderAvailable` to determine if the decoder configuration is available for the current context.
     *
     * To decode Draco compressed data, get the default DracoCompression object and call decodeMeshToGeometryAsync:
     * ```javascript
     *     var geometry = await DracoCompression.Default.decodeMeshToGeometryAsync(data);
     * ```
     *
     * @see https://playground.babylonjs.com/#DMZIBD#0
     */
    export class DracoCompression {
        private _decoder;
        /**
         * The configuration. Defaults to the following urls:
         * - wasmUrl: "https://cdn.babylonjs.com/draco_wasm_wrapper_gltf.js"
         * - wasmBinaryUrl: "https://cdn.babylonjs.com/draco_decoder_gltf.wasm"
         * - fallbackUrl: "https://cdn.babylonjs.com/draco_decoder_gltf.js"
         */
        static get Configuration(): IDracoCompressionConfiguration;
        static set Configuration(value: IDracoCompressionConfiguration);
        /**
         * Returns true if the decoder configuration is available.
         */
        static get DecoderAvailable(): boolean;
        /**
         * Default number of workers to create when creating the draco compression object.
         */
        static DefaultNumWorkers: number;
        protected static _Default: Nullable<DracoCompression>;
        /**
         * Default instance for the DracoCompression.
         */
        static get Default(): DracoCompression;
        /**
         * Reset the default draco compression object to null and disposing the removed default instance.
         * Note that if the workerPool is a member of the static Configuration object it is recommended not to run dispose,
         * unless the static worker pool is no longer needed.
         * @param skipDispose set to true to not dispose the removed default instance
         */
        static ResetDefault(skipDispose?: boolean): void;
        /**
         * Creates a new DracoCompression object.
         * @param numWorkersOrOptions Overrides for the Configuration. Either:
         * - The number of workers for async operations or a config object. Specify `0` to disable web workers and run synchronously in the current context.
         * - An options object
         */
        constructor(numWorkersOrOptions?: number | IDracoCompressionOptions);
        /**
         * Stop all async operations and release resources.
         */
        dispose(): void;
        /**
         * Returns a promise that resolves when ready. Call this manually to ensure draco compression is ready before use.
         * @returns a promise that resolves when ready
         */
        whenReadyAsync(): Promise<void>;
        /**
         * Decode Draco compressed mesh data to mesh data.
         * @param data The ArrayBuffer or ArrayBufferView for the Draco compression data
         * @param attributes A map of attributes from vertex buffer kinds to Draco unique ids
         * @param gltfNormalizedOverride A map of attributes from vertex buffer kinds to normalized flags to override the Draco normalization
         * @returns A promise that resolves with the decoded mesh data
         */
        decodeMeshToMeshDataAsync(data: ArrayBuffer | ArrayBufferView, attributes?: {
            [kind: string]: number;
        }, gltfNormalizedOverride?: {
            [kind: string]: boolean;
        }): Promise<MeshData>;
        /**
         * Decode Draco compressed mesh data to Babylon geometry.
         * @param name The name to use when creating the geometry
         * @param scene The scene to use when creating the geometry
         * @param data The ArrayBuffer or ArrayBufferView for the Draco compression data
         * @param attributes A map of attributes from vertex buffer kinds to Draco unique ids
         * @returns A promise that resolves with the decoded geometry
         */
        decodeMeshToGeometryAsync(name: string, scene: Scene, data: ArrayBuffer | ArrayBufferView, attributes?: {
            [kind: string]: number;
        }): Promise<Geometry>;
        /** @internal */
        _decodeMeshToGeometryForGltfAsync(name: string, scene: Scene, data: ArrayBuffer | ArrayBufferView, attributes: {
            [kind: string]: number;
        }, gltfNormalizedOverride: {
            [kind: string]: boolean;
        }, boundingInfo: Nullable<BoundingInfo>): Promise<Geometry>;
        /**
         * Decode Draco compressed mesh data to Babylon vertex data.
         * @param data The ArrayBuffer or ArrayBufferView for the Draco compression data
         * @param attributes A map of attributes from vertex buffer kinds to Draco unique ids
         * @returns A promise that resolves with the decoded vertex data
         * @deprecated Use {@link decodeMeshToGeometryAsync} for better performance in some cases
         */
        decodeMeshAsync(data: ArrayBuffer | ArrayBufferView, attributes?: {
            [kind: string]: number;
        }): Promise<VertexData>;
    }


    /**
     * Configuration for using a Draco codec.
     */
    export interface IDracoCodecConfiguration {
        /**
         * The url to the WebAssembly module.
         */
        wasmUrl?: string;
        /**
         * The url to the WebAssembly binary.
         */
        wasmBinaryUrl?: string;
        /**
         * The url to the fallback JavaScript module.
         */
        fallbackUrl?: string;
        /**
         * The number of workers for async operations. Specify `0` to disable web workers and run synchronously in the current context.
         */
        numWorkers?: number;
        /**
         * Optional worker pool to use for async encoding/decoding.
         * If provided, the worker pool will be used as is: no Draco scripts will be loaded, and numWorkers will be ignored.
         */
        workerPool?: WorkerPool;
        /**
         * Optional ArrayBuffer of the WebAssembly binary.
         * If provided it will be used instead of loading the binary from wasmBinaryUrl.
         */
        wasmBinary?: ArrayBuffer;
        /**
         * The codec module if already available.
         */
        jsModule?: unknown;
    }
    /**
     * @internal
     */
    export function _GetDefaultNumWorkers(): number;
    /**
     * @internal
     */
    export function _IsConfigurationAvailable(config: IDracoCodecConfiguration): boolean;
    /**
     * Base class for a Draco codec.
     * @internal
     */
    export abstract class DracoCodec implements IDisposable {
        protected _workerPoolPromise?: Promise<WorkerPool>;
        protected _modulePromise?: Promise<{
            module: unknown; /** DecoderModule | EncoderModule */
        }>;
        /**
         * Checks if the default codec JS module is in scope.
         */
        protected abstract _isModuleAvailable(): boolean;
        /**
         * Creates the JS Module for the corresponding wasm.
         */
        protected abstract _createModuleAsync(wasmBinary?: ArrayBuffer, jsModule?: unknown /** DracoDecoderModule | DracoEncoderModule */): Promise<{
            module: unknown; /** DecoderModule | EncoderModule */
        }>;
        /**
         * Returns the worker content.
         */
        protected abstract _getWorkerContent(): string;
        /**
         * Constructor
         * @param configuration The configuration for the DracoCodec instance.
         */
        constructor(configuration: IDracoCodecConfiguration);
        /**
         * Returns a promise that resolves when ready. Call this manually to ensure the draco codec is ready before use.
         * @returns a promise that resolves when ready
         */
        whenReadyAsync(): Promise<void>;
        /**
         * Stop all async operations and release resources.
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Creates a tube mesh.
     * The tube is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters
     * * The parameter `path` is a required array of successive Vector3. It is the curve used as the axis of the tube
     * * The parameter `radius` (positive float, default 1) sets the tube radius size
     * * The parameter `tessellation` (positive float, default 64) is the number of sides on the tubular surface
     * * The parameter `radiusFunction` (javascript function, default null) is a vanilla javascript function. If it is not null, it overrides the parameter `radius`
     * * This function is called on each point of the tube path and is passed the index `i` of the i-th point and the distance of this point from the first point of the path. It must return a radius value (positive float)
     * * The parameter `arc` (positive float, maximum 1, default 1) is the ratio to apply to the tube circumference : 2 x PI x arc
     * * The parameter `cap` sets the way the extruded shape is capped. Possible values : BABYLON.Mesh.NO_CAP (default), BABYLON.Mesh.CAP_START, BABYLON.Mesh.CAP_END, BABYLON.Mesh.CAP_ALL
     * * The optional parameter `instance` is an instance of an existing Tube object to be updated with the passed `pathArray` parameter. The `path`Array HAS to have the SAME number of points as the previous one: https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#tube
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The optional parameter `invertUV` (boolean, default false) swaps in the geometry the U and V coordinates to apply a texture
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created. The NUMBER of points CAN'T CHANGE, only their positions.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the tube mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#tube
     */
    export function CreateTube(name: string, options: {
        path: Vector3[];
        radius?: number;
        tessellation?: number;
        radiusFunction?: {
            (i: number, distance: number): number;
        };
        cap?: number;
        arc?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        instance?: Mesh;
        invertUV?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateTube directly
     */
    export var TubeBuilder: {
        CreateTube: typeof CreateTube;
    };
    /**
     * Register side effects for tubeBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTubeBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import tubeBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a TorusKnot
     * @param options an object used to set the following optional parameters for the TorusKnot, required but can be empty
     * * radius the radius of the torus knot, optional, default 2
     * * tube the thickness of the tube, optional, default 0.5
     * * radialSegments the number of sides on each tube segments, optional, default 32
     * * tubularSegments the number of tubes to decompose the knot into, optional, default 32
     * * p the number of windings around the z axis, optional,  default 2
     * * q the number of windings around the x axis, optional,  default 3
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the Torus Knot
     */
    export function CreateTorusKnotVertexData(options: {
        radius?: number;
        tube?: number;
        radialSegments?: number;
        tubularSegments?: number;
        p?: number;
        q?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a torus knot mesh
     * * The parameter `radius` sets the global radius size (float) of the torus knot (default 2)
     * * The parameter `radialSegments` sets the number of sides on each tube segments (positive integer, default 32)
     * * The parameter `tubularSegments` sets the number of tubes to decompose the knot into (positive integer, default 32)
     * * The parameters `p` and `q` are the number of windings on each axis (positive integers, default 2 and 3)
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the torus knot mesh
     * @see  https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#torus-knot
     */
    export function CreateTorusKnot(name: string, options?: {
        radius?: number;
        tube?: number;
        radialSegments?: number;
        tubularSegments?: number;
        p?: number;
        q?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Scene): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateTorusKnot instead
     */
    export var TorusKnotBuilder: {
        CreateTorusKnot: typeof CreateTorusKnot;
    };
    /**
     * Register side effects for torusKnotBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTorusKnotBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import torusKnotBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a torus
     * @param options an object used to set the following optional parameters for the box, required but can be empty
     * * diameter the diameter of the torus, optional default 1
     * * thickness the diameter of the tube forming the torus, optional default 0.5
     * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the torus
     */
    export function CreateTorusVertexData(options: {
        diameter?: number;
        thickness?: number;
        tessellation?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a torus mesh
     * * The parameter `diameter` sets the diameter size (float) of the torus (default 1)
     * * The parameter `thickness` sets the diameter size of the tube of the torus (float, default 0.5)
     * * The parameter `tessellation` sets the number of torus sides (positive integer, default 16)
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the torus mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#torus
     */
    export function CreateTorus(name: string, options?: {
        diameter?: number;
        thickness?: number;
        tessellation?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Scene): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateTorus instead
     */
    export var TorusBuilder: {
        CreateTorus: typeof CreateTorus;
    };
    /**
     * Register side effects for torusBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTorusBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import torusBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Creates the VertexData for a tiled plane
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane
     * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty
     * * pattern a limited pattern arrangement depending on the number
     * * size of the box
     * * width of the box, overwrites size
     * * height of the box, overwrites size
     * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1
     * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size
     * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * alignHorizontal places whole tiles aligned to the center, left or right of a row
     * * alignVertical places whole tiles aligned to the center, left or right of a column
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the tiled plane
     */
    export function CreateTiledPlaneVertexData(options: {
        pattern?: number;
        tileSize?: number;
        tileWidth?: number;
        tileHeight?: number;
        size?: number;
        width?: number;
        height?: number;
        alignHorizontal?: number;
        alignVertical?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a tiled plane mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_plane
     * @param name defines the name of the mesh
     * @param options an object used to set the following optional parameters for the tiled plane, required but can be empty
     * * pattern a limited pattern arrangement depending on the number
     * * size of the box
     * * width of the box, overwrites size
     * * height of the box, overwrites size
     * * tileSize sets the width, height and depth of the tile to the value of size, optional default 1
     * * tileWidth sets the width (x direction) of the tile, overwrites the width set by size, optional, default size
     * * tileHeight sets the height (y direction) of the tile, overwrites the height set by size, optional, default size
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * alignHorizontal places whole tiles aligned to the center, left or right of a row
     * * alignVertical places whole tiles aligned to the center, left or right of a column
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @param scene defines the hosting scene
     * @returns the box mesh
     */
    export function CreateTiledPlane(name: string, options: {
        pattern?: number;
        tileSize?: number;
        tileWidth?: number;
        tileHeight?: number;
        size?: number;
        width?: number;
        height?: number;
        alignHorizontal?: number;
        alignVertical?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateTiledPlane instead
     */
    export var TiledPlaneBuilder: {
        CreateTiledPlane: typeof CreateTiledPlane;
    };


    /**
     * Creates the VertexData for a tiled box
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_box
     * @param options an object used to set the following optional parameters for the tiled box, required but can be empty
     * * pattern sets the rotation or reflection pattern for the tiles,
     * * size of the box
     * * width of the box, overwrites size
     * * height of the box, overwrites size
     * * depth of the box, overwrites size
     * * tileSize sets the size of a tile
     * * tileWidth sets the tile width and overwrites tileSize
     * * tileHeight sets the tile width and overwrites tileSize
     * * faceUV an array of 6 Vector4 elements used to set different images to each box side
     * * faceColors an array of 6 Color4 elements used to set different colors to each box side
     * * alignHorizontal places whole tiles aligned to the center, left or right of a row
     * * alignVertical places whole tiles aligned to the center, left or right of a column
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * @returns the VertexData of the TiledBox
     */
    export function CreateTiledBoxVertexData(options: {
        pattern?: number;
        size?: number;
        width?: number;
        height?: number;
        depth?: number;
        tileSize?: number;
        tileWidth?: number;
        tileHeight?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        alignHorizontal?: number;
        alignVertical?: number;
        sideOrientation?: number;
    }): VertexData;
    /**
     * Creates a tiled box mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/tiled_box
     * @param name defines the name of the mesh
     * @param options an object used to set the following optional parameters for the tiled box, required but can be empty
     * * pattern sets the rotation or reflection pattern for the tiles,
     * * size of the box
     * * width of the box, overwrites size
     * * height of the box, overwrites size
     * * depth of the box, overwrites size
     * * tileSize sets the size of a tile
     * * tileWidth sets the tile width and overwrites tileSize
     * * tileHeight sets the tile width and overwrites tileSize
     * * faceUV an array of 6 Vector4 elements used to set different images to each box side
     * * faceColors an array of 6 Color3 elements used to set different colors to each box side
     * * alignHorizontal places whole tiles aligned to the center, left or right of a row
     * * alignVertical places whole tiles aligned to the center, left or right of a column
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * @param scene defines the hosting scene
     * @returns the box mesh
     */
    export function CreateTiledBox(name: string, options: {
        pattern?: number;
        width?: number;
        height?: number;
        depth?: number;
        tileSize?: number;
        tileWidth?: number;
        tileHeight?: number;
        alignHorizontal?: number;
        alignVertical?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        sideOrientation?: number;
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateTiledBox instead
     */
    export var TiledBoxBuilder: {
        CreateTiledBox: typeof CreateTiledBox;
    };


    /**
     * Parser inspired by https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/FontLoader.js
     */
    /**
     * Represents glyph data generated by http://gero3.github.io/facetype.js/
     */
    export interface IGlyphData {
        /** Commands used to draw (line, move, curve, etc..) */
        o: string;
        /** Width */
        ha: number;
    }
    /**
     * Represents font data generated by http://gero3.github.io/facetype.js/
     */
    export interface IFontData {
        /**
         * Font resolution
         */
        resolution: number;
        /** Underline tickness */
        underlineThickness: number;
        /** Bounding box */
        boundingBox: {
            yMax: number;
            yMin: number;
        };
        /** List of supported glyphs */
        glyphs: {
            [key: string]: IGlyphData;
        };
    }
    class ShapePath {
        private _paths;
        private _tempPaths;
        private _holes;
        private _currentPath;
        private _resolution;
        /** Create the ShapePath used to support glyphs
         * @param resolution defines the resolution used to determine the number of points per curve (default is 4)
         */
        constructor(resolution: number);
        /** Move the virtual cursor to a coordinate
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         */
        moveTo(x: number, y: number): void;
        /** Draw a line from the virtual cursor to a given coordinate
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         */
        lineTo(x: number, y: number): void;
        /** Create a quadratic curve from the virtual cursor to a given coordinate
         * @param cpx defines the x coordinate of the control point
         * @param cpy defines the y coordinate of the control point
         * @param x defines the x coordinate of the end point
         * @param y defines the y coordinate of the end point
         */
        quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
        /**
         * Create a bezier curve from the virtual cursor to a given coordinate
         * @param cpx1 defines the x coordinate of the first control point
         * @param cpy1 defines the y coordinate of the first control point
         * @param cpx2 defines the x coordinate of the second control point
         * @param cpy2 defines the y coordinate of the second control point
         * @param x defines the x coordinate of the end point
         * @param y defines the y coordinate of the end point
         */
        bezierCurveTo(cpx1: number, cpy1: number, cpx2: number, cpy2: number, x: number, y: number): void;
        /** Extract holes based on CW / CCW */
        extractHoles(): void;
        /** Gets the list of paths */
        get paths(): Path2[];
        /** Gets the list of holes */
        get holes(): Path2[];
    }
    /**
     * Creates shape paths from a text and font
     * @param text the text
     * @param size size of the font
     * @param resolution resolution of the font
     * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)
     * @returns array of ShapePath objects
     */
    export function CreateTextShapePaths(text: string, size: number, resolution: number, fontData: IFontData): ShapePath[];
    /**
     * Create a text mesh
     * @param name defines the name of the mesh
     * @param text defines the text to use to build the mesh
     * @param fontData defines the font data (can be generated with http://gero3.github.io/facetype.js/)
     * @param options defines options used to create the mesh
     * @param scene defines the hosting scene
     * @param earcutInjection can be used to inject your own earcut reference
     * @returns a new Mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/text
     */
    export function CreateText(name: string, text: string, fontData: IFontData, options?: {
        size?: number;
        resolution?: number;
        depth?: number;
        sideOrientation?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        perLetterFaceUV?: (letterIndex: number) => Vector4[];
        perLetterFaceColors?: (letterIndex: number) => Color4[];
    }, scene?: Nullable<Scene>, earcutInjection?: any): Nullable<Mesh>;


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for an ellipsoid, defaults to a sphere
     * @param options an object used to set the following optional parameters for the box, required but can be empty
     * * segments sets the number of horizontal strips optional, default 32
     * * diameter sets the axes dimensions, diameterX, diameterY and diameterZ to the value of diameter, optional default 1
     * * diameterX sets the diameterX (x direction) of the ellipsoid, overwrites the diameterX set by diameter, optional, default diameter
     * * diameterY sets the diameterY (y direction) of the ellipsoid, overwrites the diameterY set by diameter, optional, default diameter
     * * diameterZ sets the diameterZ (z direction) of the ellipsoid, overwrites the diameterZ set by diameter, optional, default diameter
     * * arc a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the circumference (latitude) given by the arc value, optional, default 1
     * * slice a number from 0 to 1, to create an unclosed ellipsoid based on the fraction of the height (latitude) given by the arc value, optional, default 1
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the ellipsoid
     */
    export function CreateSphereVertexData(options: {
        segments?: number;
        diameter?: number;
        diameterX?: number;
        diameterY?: number;
        diameterZ?: number;
        arc?: number;
        slice?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        dedupTopBottomIndices?: boolean;
    }): VertexData;
    /**
     * Creates a sphere mesh
     * * The parameter `diameter` sets the diameter size (float) of the sphere (default 1)
     * * You can set some different sphere dimensions, for instance to build an ellipsoid, by using the parameters `diameterX`, `diameterY` and `diameterZ` (all by default have the same value of `diameter`)
     * * The parameter `segments` sets the sphere number of horizontal stripes (positive integer, default 32)
     * * You can create an unclosed sphere with the parameter `arc` (positive float, default 1), valued between 0 and 1, what is the ratio of the circumference (latitude) : 2 x PI x ratio
     * * You can create an unclosed sphere on its height with the parameter `slice` (positive float, default1), valued between 0 and 1, what is the height ratio (longitude)
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the sphere mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#sphere
     */
    export function CreateSphere(name: string, options?: {
        segments?: number;
        diameter?: number;
        diameterX?: number;
        diameterY?: number;
        diameterZ?: number;
        arc?: number;
        slice?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateSphere directly
     */
    export var SphereBuilder: {
        CreateSphere: typeof CreateSphere;
    };
    /**
     * Register side effects for sphereBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSphereBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sphereBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates an extruded shape mesh. The extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.
     * * The parameter `shape` is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis.
     * * The parameter `path` is a required array of successive Vector3. This is the axis curve the shape is extruded along.
     * * The parameter `rotation` (float, default 0 radians) is the angle value to rotate the shape each step (each path point), from the former step (so rotation added each step) along the curve.
     * * The parameter `scale` (float, default 1) is the value to scale the shape.
     * * The parameter `closeShape` (boolean, default false) closes the shape when true, since v5.0.0.
     * * The parameter `closePath` (boolean, default false) closes the path when true and no caps, since v5.0.0.
     * * The parameter `cap` sets the way the extruded shape is capped. Possible values : BABYLON.Mesh.NO_CAP (default), BABYLON.Mesh.CAP_START, BABYLON.Mesh.CAP_END, BABYLON.Mesh.CAP_ALL
     * * The optional parameter `instance` is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape
     * * Remember you can only change the shape or path point positions, not their number when updating an extruded shape.
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The optional parameter `invertUV` (boolean, default false) swaps in the geometry the U and V coordinates to apply a texture.
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.
     * * The optional parameter `firstNormal` (Vector3) defines the direction of the first normal of the supplied path. Consider using this for any path that is straight, and particular for paths in the xy plane.
     * * The optional `adjustFrame` (boolean, default false) will cause the internally generated Path3D tangents, normals, and binormals to be adjusted so that a) they are always well-defined, and b) they do not reverse from one path point to the next. This prevents the extruded shape from being flipped and/or rotated with resulting mesh self-intersections. This is primarily useful for straight paths that can reverse direction.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the extruded shape mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes
     */
    export function ExtrudeShape(name: string, options: {
        shape: Vector3[];
        path: Vector3[];
        scale?: number;
        rotation?: number;
        closeShape?: boolean;
        closePath?: boolean;
        cap?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        instance?: Mesh;
        invertUV?: boolean;
        firstNormal?: Vector3;
        adjustFrame?: boolean;
        capFunction?: Nullable<{
            (shapePath: Vector3[]): Vector3[];
        }>;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Creates an custom extruded shape mesh.
     * The custom extrusion is a parametric shape. It has no predefined shape. Its final shape will depend on the input parameters.
     * * The parameter `shape` is a required array of successive Vector3. This array depicts the shape to be extruded in its local space : the shape must be designed in the xOy plane and will be extruded along the Z axis.
     * * The parameter `path` is a required array of successive Vector3. This is the axis curve the shape is extruded along.
     * * The parameter `rotationFunction` (JS function) is a custom Javascript function called on each path point. This function is passed the position i of the point in the path and the distance of this point from the beginning of the path
     * * It must returns a float value that will be the rotation in radians applied to the shape on each path point.
     * * The parameter `scaleFunction` (JS function) is a custom Javascript function called on each path point. This function is passed the position i of the point in the path and the distance of this point from the beginning of the path
     * * The parameter `scaleVectorFunction` (JS function) has the same purpose as `scaleFunction` but instead of returning a float it returns a Vector3 to allow non uniform scaling. If provided, it takes precedence over `scaleFunction`.
     * * It must returns a float value that will be the scale value applied to the shape on each path point
     * * The parameter `closeShape` (boolean, default false) closes the shape when true, since v5.0.0.
     * * The parameter `closePath` (boolean, default false) closes the path when true and no caps, since v5.0.0.
     * * The parameter `ribbonClosePath` (boolean, default false) forces the extrusion underlying ribbon to close all the paths in its `pathArray` - depreciated in favor of closeShape
     * * The parameter `ribbonCloseArray` (boolean, default false) forces the extrusion underlying ribbon to close its `pathArray` - depreciated in favor of closePath
     * * The parameter `cap` sets the way the extruded shape is capped. Possible values : BABYLON.Mesh.NO_CAP (default), BABYLON.Mesh.CAP_START, BABYLON.Mesh.CAP_END, BABYLON.Mesh.CAP_ALL
     * * The optional parameter `instance` is an instance of an existing ExtrudedShape object to be updated with the passed `shape`, `path`, `scale` or `rotation` parameters : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#extruded-shape
     * * Remember you can only change the shape or path point positions, not their number when updating an extruded shape
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The optional parameter `invertUV` (boolean, default false) swaps in the geometry the U and V coordinates to apply a texture
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * * The optional parameter `firstNormal` (Vector3) defines the direction of the first normal of the supplied path. It should be supplied when the path is in the xy plane, and particularly if these sections are straight, because the underlying Path3D object will pick a normal in the xy plane that causes the extrusion to be collapsed into the plane. This should be used for any path that is straight.
     * * The optional `adjustFrame` (boolean, default false) will cause the internally generated Path3D tangents, normals, and binormals to be adjusted so that a) they are always well-defined, and b) they do not reverse from one path point to the next. This prevents the extruded shape from being flipped and/or rotated with resulting mesh self-intersections. This is primarily useful for straight paths that can reverse direction.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the custom extruded shape mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#custom-extruded-shapes
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#extruded-shapes
     */
    export function ExtrudeShapeCustom(name: string, options: {
        shape: Vector3[];
        path: Vector3[];
        scaleFunction?: Nullable<{
            (i: number, distance: number): number;
        }>;
        scaleVectorFunction?: Nullable<{
            (i: number, distance: number): Vector3;
        }>;
        rotationFunction?: Nullable<{
            (i: number, distance: number): number;
        }>;
        ribbonCloseArray?: boolean;
        ribbonClosePath?: boolean;
        closeShape?: boolean;
        closePath?: boolean;
        cap?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        instance?: Mesh;
        invertUV?: boolean;
        firstNormal?: Vector3;
        adjustFrame?: boolean;
        capFunction?: Nullable<{
            (shapePath: Vector3[]): Vector3[];
        }>;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated please use the functions directly from the module
     */
    export var ShapeBuilder: {
        ExtrudeShape: typeof ExtrudeShape;
        ExtrudeShapeCustom: typeof ExtrudeShapeCustom;
    };
    /**
     * Register side effects for shapeBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterShapeBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import shapeBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a Ribbon
     * @param options an object used to set the following optional parameters for the ribbon, required but can be empty
     * * pathArray array of paths, each of which an array of successive Vector3
     * * closeArray creates a seam between the first and the last paths of the pathArray, optional, default false
     * * closePath creates a seam between the first and the last points of each path of the path array, optional, default false
     * * offset a positive integer, only used when pathArray contains a single path (offset = 10 means the point 1 is joined to the point 11), default rounded half size of the pathArray length
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * * invertUV swaps in the U and V coordinates when applying a texture, optional, default false
     * * uvs a linear array, of length 2 * number of vertices, of custom UV values, optional
     * * colors a linear array, of length 4 * number of vertices, of custom color values, optional
     * @returns the VertexData of the ribbon
     */
    export function CreateRibbonVertexData(options: {
        pathArray: Vector3[][];
        closeArray?: boolean;
        closePath?: boolean;
        offset?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        invertUV?: boolean;
        uvs?: Vector2[];
        colors?: Color4[];
    }): VertexData;
    /**
     * Creates a ribbon mesh. The ribbon is a parametric shape.  It has no predefined shape. Its final shape will depend on the input parameters
     * * The parameter `pathArray` is a required array of paths, what are each an array of successive Vector3. The pathArray parameter depicts the ribbon geometry
     * * The parameter `closeArray` (boolean, default false) creates a seam between the first and the last paths of the path array
     * * The parameter `closePath` (boolean, default false) creates a seam between the first and the last points of each path of the path array
     * * The parameter `offset` (positive integer, default : rounded half size of the pathArray length), is taken in account only if the `pathArray` is containing a single path
     * * It's the offset to join the points from the same path. Ex : offset = 10 means the point 1 is joined to the point 11
     * * The optional parameter `instance` is an instance of an existing Ribbon object to be updated with the passed `pathArray` parameter : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#ribbon
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The optional parameter `invertUV` (boolean, default false) swaps in the geometry the U and V coordinates to apply a texture
     * * The parameter `uvs` is an optional flat array of `Vector2` to update/set each ribbon vertex with its own custom UV values instead of the computed ones
     * * The parameters `colors` is an optional flat array of `Color4` to set/update each ribbon vertex with its own custom color values
     * * Note that if you use the parameters `uvs` or `colors`, the passed arrays must be populated with the right number of elements, it is to say the number of ribbon vertices. Remember that if you set `closePath` to `true`, there's one extra vertex per path in the geometry
     * * Moreover, you can use the parameter `color` with `instance` (to update the ribbon), only if you previously used it at creation time
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the ribbon mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/ribbon_extra
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param
     */
    export function CreateRibbon(name: string, options: {
        pathArray: Vector3[][];
        closeArray?: boolean;
        closePath?: boolean;
        offset?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        instance?: Mesh;
        invertUV?: boolean;
        uvs?: Vector2[];
        colors?: Color4[];
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use CreateRibbon directly
     */
    export var RibbonBuilder: {
        CreateRibbon: typeof CreateRibbon;
    };
    /**
     * Register side effects for ribbonBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRibbonBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import ribbonBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a Polyhedron
     * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty
     * * type provided types are:
     *  * 0 : Tetrahedron, 1 : Octahedron, 2 : Dodecahedron, 3 : Icosahedron, 4 : Rhombicuboctahedron, 5 : Triangular Prism, 6 : Pentagonal Prism, 7 : Hexagonal Prism, 8 : Square Pyramid (J1)
     *  * 9 : Pentagonal Pyramid (J2), 10 : Triangular Dipyramid (J12), 11 : Pentagonal Dipyramid (J13), 12 : Elongated Square Dipyramid (J15), 13 : Elongated Pentagonal Dipyramid (J16), 14 : Elongated Pentagonal Cupola (J20)
     * * size the size of the IcoSphere, optional default 1
     * * sizeX allows stretching in the x direction, optional, default size
     * * sizeY allows stretching in the y direction, optional, default size
     * * sizeZ allows stretching in the z direction, optional, default size
     * * custom a number that overwrites the type to create from an extended set of polyhedron from https://www.babylonjs-playground.com/#21QRSK#15 with minimised editor
     * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
     * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
     * * flat when true creates a flat shaded mesh, optional, default true
     * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the Polyhedron
     */
    export function CreatePolyhedronVertexData(options: {
        type?: number;
        size?: number;
        sizeX?: number;
        sizeY?: number;
        sizeZ?: number;
        custom?: any;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        flat?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a polyhedron mesh
     * * The parameter `type` (positive integer, max 14, default 0) sets the polyhedron type to build among the 15 embbeded types. Please refer to the type sheet in the tutorial to choose the wanted type
     * * The parameter `size` (positive float, default 1) sets the polygon size
     * * You can overwrite the `size` on each dimension bu using the parameters `sizeX`, `sizeY` or `sizeZ` (positive floats, default to `size` value)
     * * You can build other polyhedron types than the 15 embbeded ones by setting the parameter `custom` (`polyhedronObject`, default null). If you set the parameter `custom`, this overrides the parameter `type`
     * * A `polyhedronObject` is a formatted javascript object. You'll find a full file with pre-set polyhedra here : https://github.com/BabylonJS/Extensions/tree/master/Polyhedron
     * * You can set the color and the UV of each side of the polyhedron with the parameters `faceColors` (Color4, default `(1, 1, 1, 1)`) and faceUV (Vector4, default `(0, 0, 1, 1)`)
     * * To understand how to set `faceUV` or `faceColors`, please read this by considering the right number of faces of your polyhedron, instead of only 6 for the box : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace
     * * The parameter `flat` (boolean, default true). If set to false, it gives the polyhedron a single global face, so less vertices and shared normals. In this case, `faceColors` and `faceUV` are ignored
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the polyhedron mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra
     */
    export function CreatePolyhedron(name: string, options?: {
        type?: number;
        size?: number;
        sizeX?: number;
        sizeY?: number;
        sizeZ?: number;
        custom?: any;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        flat?: boolean;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function directly from the module
     */
    export var PolyhedronBuilder: {
        CreatePolyhedron: typeof CreatePolyhedron;
    };
    /**
     * Register side effects for polyhedronBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPolyhedronBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import polyhedronBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for an irregular Polygon in the XoZ plane using a mesh built by polygonTriangulation.build()
     * All parameters are provided by CreatePolygon as needed
     * @param polygon a mesh built from polygonTriangulation.build()
     * @param sideOrientation takes the values Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * @param fUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
     * @param fColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
     * @param frontUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * @param backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @param wrp a boolean, default false, when true and fUVs used texture is wrapped around all sides, when false texture is applied side
     * @returns the VertexData of the Polygon
     */
    export function CreatePolygonVertexData(polygon: Mesh, sideOrientation: number, fUV?: Vector4[], fColors?: Color4[], frontUVs?: Vector4, backUVs?: Vector4, wrp?: boolean): VertexData;
    /**
     * Creates a polygon mesh
     * The polygon's shape will depend on the input parameters and is constructed parallel to a ground mesh
     * * The parameter `shape` is a required array of successive Vector3 representing the corners of the polygon in th XoZ plane, that is y = 0 for all vectors
     * * You can set the mesh side orientation with the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4)
     * * Remember you can only change the shape positions, not their number when updating a polygon
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @param earcutInjection can be used to inject your own earcut reference
     * @returns the polygon mesh
     */
    export function CreatePolygon(name: string, options: {
        shape: Vector3[];
        holes?: Vector3[][];
        depth?: number;
        smoothingThreshold?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        wrap?: boolean;
    }, scene?: Nullable<Scene>, earcutInjection?: any): Mesh;
    /**
     * Creates an extruded polygon mesh, with depth in the Y direction.
     * * You can set different colors and different images to the top, bottom and extruded side by using the parameters `faceColors` (an array of 3 Color3 elements) and `faceUV` (an array of 3 Vector4 elements)
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @param earcutInjection can be used to inject your own earcut reference
     * @returns the polygon mesh
     */
    export function ExtrudePolygon(name: string, options: {
        shape: Vector3[];
        holes?: Vector3[][];
        depth?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        wrap?: boolean;
    }, scene?: Nullable<Scene>, earcutInjection?: any): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the functions directly from the module
     */
    export var PolygonBuilder: {
        ExtrudePolygon: typeof ExtrudePolygon;
        CreatePolygon: typeof CreatePolygon;
    };
    /**
     * Register side effects for polygonBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPolygonBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import polygonBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a Plane
     * @param options an object used to set the following optional parameters for the plane, required but can be empty
     * * size sets the width and height of the plane to the value of size, optional default 1
     * * width sets the width (x direction) of the plane, overwrites the width set by size, optional, default size
     * * height sets the height (y direction) of the plane, overwrites the height set by size, optional, default size
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the box
     */
    export function CreatePlaneVertexData(options: {
        size?: number;
        width?: number;
        height?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a plane mesh
     * * The parameter `size` sets the size (float) of both sides of the plane at once (default 1)
     * * You can set some different plane dimensions by using the parameters `width` and `height` (both by default have the same value of `size`)
     * * The parameter `sourcePlane` is a Plane instance. It builds a mesh plane from a Math plane
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the plane mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#plane
     */
    export function CreatePlane(name: string, options?: {
        size?: number;
        width?: number;
        height?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        updatable?: boolean;
        sourcePlane?: Plane;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function directly from the module
     */
    export var PlaneBuilder: {
        CreatePlane: typeof CreatePlane;
    };
    /**
     * Register side effects for planeBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPlaneBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import planeBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData of the LineSystem
     * @param options an object used to set the following optional parameters for the LineSystem, required but can be empty
     *  - lines an array of lines, each line being an array of successive Vector3
     *  - colors an array of line colors, each of the line colors being an array of successive Color4, one per line point
     * @returns the VertexData of the LineSystem
     */
    export function CreateLineSystemVertexData(options: {
        lines: Vector3[][];
        colors?: Nullable<Color4[][]>;
    }): VertexData;
    /**
     * Create the VertexData for a DashedLines
     * @param options an object used to set the following optional parameters for the DashedLines, required but can be empty
     *  - points an array successive Vector3
     *  - dashSize the size of the dashes relative to the dash number, optional, default 3
     *  - gapSize the size of the gap between two successive dashes relative to the dash number, optional, default 1
     *  - dashNb the intended total number of dashes, optional, default 200
     * @returns the VertexData for the DashedLines
     */
    export function CreateDashedLinesVertexData(options: {
        points: Vector3[];
        dashSize?: number;
        gapSize?: number;
        dashNb?: number;
    }): VertexData;
    /**
     * Creates a line system mesh. A line system is a pool of many lines gathered in a single mesh
     * * A line system mesh is considered as a parametric shape since it has no predefined original shape. Its shape is determined by the passed array of lines as an input parameter
     * * Like every other parametric shape, it is dynamically updatable by passing an existing instance of LineSystem to this static function
     * * The parameter `lines` is an array of lines, each line being an array of successive Vector3
     * * The optional parameter `instance` is an instance of an existing LineSystem object to be updated with the passed `lines` parameter
     * * The optional parameter `colors` is an array of line colors, each line colors being an array of successive Color4, one per line point
     * * The optional parameter `useVertexAlpha` is to be set to `false` (default `true`) when you don't need the alpha blending (faster)
     * * The optional parameter `material` is the material to use to draw the lines if provided. If not, a default material will be created
     * * Updating a simple Line mesh, you just need to update every line in the `lines` array : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#lines-and-dashedlines
     * * When updating an instance, remember that only line point positions can change, not the number of points, neither the number of lines
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#line-system
     * @param name defines the name of the new line system
     * @param options defines the options used to create the line system
     * @param scene defines the hosting scene
     * @returns a new line system mesh
     */
    export function CreateLineSystem(name: string, options: {
        lines: Vector3[][];
        updatable?: boolean;
        instance?: Nullable<LinesMesh>;
        colors?: Nullable<Color4[][]>;
        useVertexAlpha?: boolean;
        material?: Material;
    }, scene?: Nullable<Scene>): LinesMesh;
    /**
     * Creates a line mesh
     * A line mesh is considered as a parametric shape since it has no predefined original shape. Its shape is determined by the passed array of points as an input parameter
     * * Like every other parametric shape, it is dynamically updatable by passing an existing instance of LineMesh to this static function
     * * The parameter `points` is an array successive Vector3
     * * The optional parameter `instance` is an instance of an existing LineMesh object to be updated with the passed `points` parameter : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#lines-and-dashedlines
     * * The optional parameter `colors` is an array of successive Color4, one per line point
     * * The optional parameter `useVertexAlpha` is to be set to `false` (default `true`) when you don't need alpha blending (faster)
     * * The optional parameter `material` is the material to use to draw the lines if provided. If not, a default material will be created
     * * When updating an instance, remember that only point positions can change, not the number of points
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#lines
     * @param name defines the name of the new line system
     * @param options defines the options used to create the line system
     * @param scene defines the hosting scene
     * @returns a new line mesh
     */
    export function CreateLines(name: string, options: {
        points: Vector3[];
        updatable?: boolean;
        instance?: Nullable<LinesMesh>;
        colors?: Color4[];
        useVertexAlpha?: boolean;
        material?: Material;
    }, scene?: Nullable<Scene>): LinesMesh;
    /**
     * Creates a dashed line mesh
     * * A dashed line mesh is considered as a parametric shape since it has no predefined original shape. Its shape is determined by the passed array of points as an input parameter
     * * Like every other parametric shape, it is dynamically updatable by passing an existing instance of LineMesh to this static function
     * * The parameter `points` is an array successive Vector3
     * * The parameter `dashNb` is the intended total number of dashes (positive integer, default 200)
     * * The parameter `dashSize` is the size of the dashes relatively the dash number (positive float, default 3)
     * * The parameter `gapSize` is the size of the gap between two successive dashes relatively the dash number (positive float, default 1)
     * * The optional parameter `instance` is an instance of an existing LineMesh object to be updated with the passed `points` parameter : https://doc.babylonjs.com/features/featuresDeepDive/mesh/dynamicMeshMorph#lines-and-dashedlines
     * * The optional parameter `useVertexAlpha` is to be set to `false` (default `true`) when you don't need the alpha blending (faster)
     * * The optional parameter `material` is the material to use to draw the lines if provided. If not, a default material will be created
     * * When updating an instance, remember that only point positions can change, not the number of points
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the dashed line mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#dashed-lines
     */
    export function CreateDashedLines(name: string, options: {
        points: Vector3[];
        dashSize?: number;
        gapSize?: number;
        dashNb?: number;
        updatable?: boolean;
        instance?: LinesMesh;
        useVertexAlpha?: boolean;
        material?: Material;
    }, scene?: Nullable<Scene>): LinesMesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the functions directly from the module
     */
    export var LinesBuilder: {
        CreateDashedLines: typeof CreateDashedLines;
        CreateLineSystem: typeof CreateLineSystem;
        CreateLines: typeof CreateLines;
    };
    /**
     * Register side effects for linesBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLinesBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import linesBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates lathe mesh.
     * The lathe is a shape with a symmetry axis : a 2D model shape is rotated around this axis to design the lathe
     * * The parameter `shape` is a required array of successive Vector3. This array depicts the shape to be rotated in its local space : the shape must be designed in the xOy plane and will be rotated around the Y axis. It's usually a 2D shape, so the Vector3 z coordinates are often set to zero
     * * The parameter `radius` (positive float, default 1) is the radius value of the lathe
     * * The parameter `tessellation` (positive integer, default 64) is the side number of the lathe
     * * The parameter `clip` (positive integer, default 0) is the number of sides to not create without effecting the general shape of the sides
     * * The parameter `arc` (positive float, default 1) is the ratio of the lathe. 0.5 builds for instance half a lathe, so an opened shape
     * * The parameter `closed` (boolean, default true) opens/closes the lathe circumference. This should be set to false when used with the parameter "arc"
     * * The parameter `cap` sets the way the extruded shape is capped. Possible values : BABYLON.Mesh.NO_CAP (default), BABYLON.Mesh.CAP_START, BABYLON.Mesh.CAP_END, BABYLON.Mesh.CAP_ALL
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The optional parameter `invertUV` (boolean, default false) swaps in the geometry the U and V coordinates to apply a texture
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the lathe mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param#lathe
     */
    export function CreateLathe(name: string, options: {
        shape: Vector3[];
        radius?: number;
        tessellation?: number;
        clip?: number;
        arc?: number;
        closed?: boolean;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        cap?: number;
        invertUV?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function direction from the module
     */
    export var LatheBuilder: {
        CreateLathe: typeof CreateLathe;
    };
    /**
     * Register side effects for latheBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLatheBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import latheBuilder.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData of the IcoSphere
     * @param options an object used to set the following optional parameters for the IcoSphere, required but can be empty
     * * radius the radius of the IcoSphere, optional default 1
     * * radiusX allows stretching in the x direction, optional, default radius
     * * radiusY allows stretching in the y direction, optional, default radius
     * * radiusZ allows stretching in the z direction, optional, default radius
     * * flat when true creates a flat shaded mesh, optional, default true
     * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the IcoSphere
     */
    export function CreateIcoSphereVertexData(options: {
        radius?: number;
        radiusX?: number;
        radiusY?: number;
        radiusZ?: number;
        flat?: boolean;
        subdivisions?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a sphere based upon an icosahedron with 20 triangular faces which can be subdivided
     * * The parameter `radius` sets the radius size (float) of the icosphere (default 1)
     * * You can set some different icosphere dimensions, for instance to build an ellipsoid, by using the parameters `radiusX`, `radiusY` and `radiusZ` (all by default have the same value of `radius`)
     * * The parameter `subdivisions` sets the number of subdivisions (positive integer, default 4). The more subdivisions, the more faces on the icosphere whatever its size
     * * The parameter `flat` (boolean, default true) gives each side its own normals. Set it to false to get a smooth continuous light reflection on the surface
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the icosahedron mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra#icosphere
     */
    export function CreateIcoSphere(name: string, options?: {
        radius?: number;
        radiusX?: number;
        radiusY?: number;
        radiusZ?: number;
        flat?: boolean;
        subdivisions?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function directly from the module
     */
    export var IcoSphereBuilder: {
        CreateIcoSphere: typeof CreateIcoSphere;
    };
    /**
     * Register side effects for icoSphereBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterIcoSphereBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import icoSphereBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates a hemisphere mesh
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the hemisphere mesh
     */
    export function CreateHemisphere(name: string, options?: {
        segments?: number;
        diameter?: number;
        sideOrientation?: number;
    }, scene?: Scene): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function directly from the module
     */
    export var HemisphereBuilder: {
        CreateHemisphere: typeof CreateHemisphere;
    };
    /**
     * Register side effects for hemisphereBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterHemisphereBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import hemisphereBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a Ground
     * @param options an object used to set the following optional parameters for the Ground, required but can be empty
     * - `width` the width (x direction) of the ground, optional, default 1
     * - `height` the height (z direction) of the ground, optional, default 1
     * - `subdivisions` the number of subdivisions per side, optional, default 1
     * - `subdivisionsX` the number of subdivisions in the x direction, overrides options.subdivisions, optional, default undefined
     * - `subdivisionsY` the number of subdivisions in the y direction, overrides options.subdivisions, optional, default undefined
     * @returns the VertexData of the Ground
     */
    export function CreateGroundVertexData(options: {
        size?: number;
        width?: number;
        height?: number;
        subdivisions?: number;
        subdivisionsX?: number;
        subdivisionsY?: number;
    }): VertexData;
    /**
     * Creates the VertexData for a TiledGround by subdividing the ground into tiles
     * @param options an object used to set the following optional parameters for the Ground
     * - `xmin` ground minimum X coordinate, default -1
     * - `zmin` ground minimum Z coordinate, default -1
     * - `xmax` ground maximum X coordinate, default 1
     * - `zmax` ground maximum Z coordinate, default 1
     * - `subdivisions` a javascript object `\{w: positive integer, h: positive integer\}`, `w` and `h` are the numbers of subdivisions on the ground width and height creating 'tiles', default `\{w: 6, h: 6\}`
     * - `precision` a javascript object `\{w: positive integer, h: positive integer\}`, `w` and `h` are the numbers of subdivisions on the tile width and height, default `\{w: 2, h: 2\}`
     * @returns the VertexData of the TiledGround
     */
    export function CreateTiledGroundVertexData(options: {
        xmin: number;
        zmin: number;
        xmax: number;
        zmax: number;
        subdivisions?: {
            w: number;
            h: number;
        };
        precision?: {
            w: number;
            h: number;
        };
    }): VertexData;
    /**
     * Creates the VertexData of the Ground designed from a heightmap
     * @param options an object used to set the following parameters for the Ground, required and provided by CreateGroundFromHeightMap
     * - `width` the width (x direction) of the ground
     * - `height` the height (z direction) of the ground
     * - `subdivisions` the number of subdivisions per side
     * - `minHeight` the minimum altitude on the ground, optional, default 0
     * - `maxHeight` the maximum altitude on the ground, optional default 1
     * - `colorFilter` the filter to apply to the image pixel colors to compute the height, optional Color3, default (0.3, 0.59, 0.11)
     * - `buffer` the array holding the image color data
     * - `bufferWidth` the width of image
     * - `bufferHeight` the height of image
     * - `alphaFilter` Remove any data where the alpha channel is below this value, defaults 0 (all data visible)
     * - `heightBuffer` a array of floats where the height data can be saved, if its length is greater than zero.
     * @returns the VertexData of the Ground designed from a heightmap
     */
    export function CreateGroundFromHeightMapVertexData(options: {
        width: number;
        height: number;
        subdivisions: number;
        minHeight: number;
        maxHeight: number;
        colorFilter: Color3;
        buffer: Uint8Array;
        bufferWidth: number;
        bufferHeight: number;
        alphaFilter: number;
        heightBuffer?: Float32Array;
    }): VertexData;
    /**
     * Creates a ground mesh
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * - `width` set the width size (float, default 1)
     * - `height` set the height size (float, default 1)
     * - `subdivisions` sets the number of subdivision per side (default 1)
     * - `subdivisionsX` sets the number of subdivision on the X axis (overrides subdivisions)
     * - `subdivisionsY` sets the number of subdivision on the Y axis (overrides subdivisions)
     * - `updatable` defines if the mesh must be flagged as updatable (default false)
     * @param scene defines the hosting scene
     * @returns the ground mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground
     */
    export function CreateGround(name: string, options?: {
        width?: number;
        height?: number;
        subdivisions?: number;
        subdivisionsX?: number;
        subdivisionsY?: number;
        updatable?: boolean;
    }, scene?: Scene): GroundMesh;
    /**
     * Creates a tiled ground mesh
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * - `xmin` ground minimum X coordinate (float, default -1)
     * - `zmin` ground minimum Z coordinate (float, default -1)
     * - `xmax` ground maximum X coordinate (float, default 1)
     * - `zmax` ground maximum Z coordinate (float, default 1)
     * - `subdivisions` a javascript object `{w: positive integer, h: positive integer}` (default `{w: 6, h: 6}`). `w` and `h` are the numbers of subdivisions on the ground width and height. Each subdivision is called a tile
     * - `subdivisions.w` positive integer, default 6
     * - `subdivisions.h` positive integer, default 6
     * - `precision` a javascript object `{w: positive integer, h: positive integer}` (default `{w: 2, h: 2}`). `w` and `h` are the numbers of subdivisions on the ground width and height of each tile
     * - `precision.w` positive integer, default 2
     * - `precision.h` positive integer, default 2
     * - `updatable` boolean, default false, true if the mesh must be flagged as updatable
     * @param scene defines the hosting scene
     * @returns the tiled ground mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#tiled-ground
     */
    export function CreateTiledGround(name: string, options: {
        xmin: number;
        zmin: number;
        xmax: number;
        zmax: number;
        subdivisions?: {
            w: number;
            h: number;
        };
        precision?: {
            w: number;
            h: number;
        };
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Creates a ground mesh from a height map. The height map download can take some frames,
     * so the mesh is not immediately ready. To wait for the mesh to be completely built,
     * you should use the `onReady` callback option.
     * @param name defines the name of the mesh
     * @param url sets the URL of the height map image resource.
     * @param options defines the options used to create the mesh
     * - `width` sets the ground width size (positive float, default 10)
     * - `height` sets the ground height size (positive float, default 10)
     * - `subdivisions` sets the number of subdivision per side (positive integer, default 1)
     * - `minHeight` is the minimum altitude on the ground (float, default 0)
     * - `maxHeight` is the maximum altitude on the ground (float, default 1)
     * - `colorFilter` is the filter to apply to the image pixel colors to compute the height (optional Color3, default (0.3, 0.59, 0.11) )
     * - `alphaFilter` will filter any data where the alpha channel is below this value, defaults 0 (all data visible)
     * - `updatable` defines if the mesh must be flagged as updatable
     * - `onReady` is a javascript callback function that will be called once the mesh is just built (the height map download can last some time)
     * - `onError` is a javascript callback function that will be called if there is an error
     * - `passHeightBufferInCallback` a boolean that indicates if the calculated height data will be passed in the onReady callback. Useful if you need the height data for physics, for example.
     * @param scene defines the hosting scene
     * @returns the ground mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/height_map
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#ground-from-a-height-map
     */
    export function CreateGroundFromHeightMap(name: string, url: string | {
        data: Uint8Array;
        width: number;
        height: number;
    }, options?: {
        width?: number;
        height?: number;
        subdivisions?: number;
        minHeight?: number;
        maxHeight?: number;
        colorFilter?: Color3;
        alphaFilter?: number;
        updatable?: boolean;
        onReady?: (mesh: GroundMesh, heightBuffer?: Float32Array) => void;
        onError?: (message?: string, exception?: any) => void;
        passHeightBufferInCallback?: boolean;
    }, scene?: Nullable<Scene>): GroundMesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the functions directly from the module
     */
    export var GroundBuilder: {
        CreateGround: typeof CreateGround;
        CreateGroundFromHeightMap: typeof CreateGroundFromHeightMap;
        CreateTiledGround: typeof CreateTiledGround;
    };
    /**
     * Register side effects for groundBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGroundBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import groundBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * How are the colors distributed along the color table
     * {@link https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/greased_line#colors-and-colordistribution}
     */
    export enum GreasedLineMeshColorDistribution {
        /**
         * Do no modify the color table
         */
        COLOR_DISTRIBUTION_NONE = 0,
        /**
         * Repeat the colors until the color table is full
         */
        COLOR_DISTRIBUTION_REPEAT = 1,
        /**
         * Distribute the colors evenly through the color table
         */
        COLOR_DISTRIBUTION_EVEN = 2,
        /**
         * Put the colors to start of the color table a fill the rest with the default color
         */
        COLOR_DISTRIBUTION_START = 3,
        /**
         * Put the colors to the end of the color table and fill the rest with the default color
         */
        COLOR_DISTRIBUTION_END = 4,
        /**
         * Put the colors to start and to the end of the color table and fill the gap between with the default color
         */
        COLOR_DISTRIBUTION_START_END = 5
    }
    /**
     * How are the widths distributed along the width table
     * {@link https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/greased_line#widths-and-widthdistribution}
     */
    export enum GreasedLineMeshWidthDistribution {
        /**
         * Do no modify the width table
         */
        WIDTH_DISTRIBUTION_NONE = 0,
        /**
         * Repeat the widths until the width table is full
         */
        WIDTH_DISTRIBUTION_REPEAT = 1,
        /**
         * Distribute the widths evenly through the width table
         */
        WIDTH_DISTRIBUTION_EVEN = 2,
        /**
         * Put the widths to start of the width table a fill the rest with the default width
         */
        WIDTH_DISTRIBUTION_START = 3,
        /**
         * Put the widths to the end of the width table and fill the rest with the default width
         */
        WIDTH_DISTRIBUTION_END = 4,
        /**
         * Put the widths to start and to the end of the width table and fill the gap between with the default width
         */
        WIDTH_DISTRIBUTION_START_END = 5
    }
    /**
     * Material options for GreasedLineBuilder
     */
    export interface GreasedLineMaterialBuilderOptions extends GreasedLineMaterialOptions {
        /**
         * If set to true a new material will be created and a new material plugin will be attached
         * to the material. The material will be set on the mesh. If the instance option is specified in the mesh options,
         * no material will be created/assigned. Defaults to true.
         */
        createAndAssignMaterial?: boolean;
        /**
         * Distribution of the colors if the color table contains fewer entries than needed. Defaults to GreasedLineMeshColorDistribution.COLOR_DISTRIBUTION_START
         * @see CompleteGreasedLineColorTable
         */
        colorDistribution?: GreasedLineMeshColorDistribution;
    }
    /**
     * Line mesh options for GreasedLineBuilder
     */
    export interface GreasedLineMeshBuilderOptions extends GreasedLineMeshOptions {
        /**
         * Distribution of the widths if the width table contains fewer entries than needed. Defaults to GreasedLineMeshWidthDistribution.WIDTH_DISTRIBUTION_START
         * @see CompleteGreasedLineWidthTable
         */
        widthDistribution?: GreasedLineMeshWidthDistribution;
    }
    /**
     * Builder functions for creating GreasedLineMeshes
     */
    /**
     * Creates a new @see GreasedLinePluginMaterial
     * @param name name of the material
     * @param options material options @see GreasedLineMaterialOptions
     * @param scene scene or null to use the last scene
     * @returns StandardMaterial or PBRMaterial with the @see GreasedLinePluginMaterial attached to it
     */
    export function CreateGreasedLineMaterial(name: string, options: GreasedLineMaterialOptions, scene: Nullable<Scene>): StandardMaterial | PBRMaterial | GreasedLineSimpleMaterial;
    /**
     * Creates a GreasedLine mesh
     * @param name name of the mesh
     * @param options options for the mesh
     * @param materialOptions material options for the mesh
     * @param scene scene where the mesh will be created
     * @returns instance of GreasedLineMesh
     */
    export function CreateGreasedLine(name: string, options: GreasedLineMeshBuilderOptions, materialOptions?: Nullable<GreasedLineMaterialBuilderOptions>, scene?: Nullable<Scene>): GreasedLineBaseMesh | GreasedLineMesh | GreasedLineRibbonMesh;
    /**
     * Counts the number of points
     * @param allPoints Array of points [[x, y, z], [x, y, z], ...] or Array of points [x, y, z, x, y, z, ...]
     * @returns total number of points
     */
    export function GetPointsCount(allPoints: number[][]): number;
    /**
     * Completes the width table/fills the missing entries. It means it creates a width entry for every point of the line mesh.
     * You can provide more points the widths when creating the mesh. This function will fill the empty entries.
     * The algorithm used to fill the empty entries can be
     * GreasedLineMeshWidthDistribution.REPEAT - the width table will be repeatedly copied to the empty values [wL, wU] = [wL, wU, wL, wU, wL, wU, wL, wU, ...]
     * GreasedLineMeshWidthDistribution.EVEN - the width table will be evenly copied to the empty values [wL, wU] = [wL, wL, wL, wL, wU, wU, wU, wU]
     * GreasedLineMeshWidthDistribution.START - the width table will be copied at the start of the empty values
     * and rest will be filled width the default width upper and default width lower values [wU, wL] = [wL, wU, dwL, dwU, dwL, dwU, dwL, dwU]
     * GreasedLineMeshWidthDistribution.END - the width table will be copied at the end of the empty values
     * and rest will be filled width the default values [wL, wU] = [wL, wU, dwL, dwU, dwL, dwU, wL, wU]
     * @param pointCount number of points of the line mesh
     * @param widths array of widths [widhtLower, widthUpper, widthLower, widthUpper ...]. Two widths (lower/upper) per point.
     * @param widthsDistribution how to distribute widths if the widths array has fewer entries than pointCount
     * @param defaultWidthUpper the default value which will be used to fill empty width entries - upper width
     * @param defaultWidthLower the default value which will be used to fill empty width entries - lower width
     * @returns completed width table.
     */
    export function CompleteGreasedLineWidthTable(pointCount: number, widths: number[], widthsDistribution: GreasedLineMeshWidthDistribution, defaultWidthUpper?: number, defaultWidthLower?: number): number[];
    /**
     * Completes the color table/fill the missing color entries. It means it creates a color entry for every point of the line mesh.
     * You can provide more points the colors when creating the mesh. This function will fill the empty entries.
     * The algorithm used to fill the empty entries can be
     * GreasedLineMesColorhDistribution.REPEAT - the color table will be repeatedly copied to the empty values [c1, c2] = [c1, c2, c1, c2, c1, c2, c1, c2]
     * GreasedLineMesColorhDistribution.EVEN - the color table will be evenly copied to the empty values [c1, c2] = [c1, c1, c1, c1, c2, c2, c2, c2]
     * GreasedLineMesColorhDistribution.START - the color table will be copied at the start of the empty values
     * and rest will be filled color the default color value [c1, c2] = [c1, c2, dc, dc, dc, dc, dc, dc]
     * GreasedLineMesColorhDistribution.START_END - the color table will be copied at the start and the end of the empty values
     * and rest will be filled color the default color value [c1, c2] = [c1, c2, dc, dc, dc, dc, c1, c2]
     * @param pointCount number of points of the line mesh
     * @param colors array of Color3 for the color table
     * @param colorDistribution how to distribute colors if the colors array has fewer entries than pointCount
     * @param defaultColor default color to be used to fill empty entries in the color table
     * @returns completed array of Color3s
     */
    export function CompleteGreasedLineColorTable(pointCount: number, colors: Color3[], colorDistribution: GreasedLineMeshColorDistribution, defaultColor: Color3): Color3[];


    /**
     * Defines the set of data required to create goldberg vertex data.
     */
    export type GoldbergVertexDataOption = {
        /**
         * the size of the Goldberg, optional default 1
         */
        size?: number;
        /**
         * allows stretching in the x direction, optional, default size
         */
        sizeX?: number;
        /**
         * allows stretching in the y direction, optional, default size
         */
        sizeY?: number;
        /**
         * allows stretching in the z direction, optional, default size
         */
        sizeZ?: number;
        /**
         * optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
         */
        sideOrientation?: number;
    };
    /**
     * Defines the set of data required to create a goldberg mesh.
     */
    export type GoldbergCreationOption = {
        /**
         * number of horizontal steps along an isogrid
         */
        m?: number;
        /**
         * number of angled steps along an isogrid
         */
        n?: number;
        /**
         * defines if the mesh must be flagged as updatable
         */
        updatable?: boolean;
    } & GoldbergVertexDataOption;
    /**
     * Creates the Mesh for a Goldberg Polyhedron
     * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty
     * @param goldbergData polyhedronData defining the Goldberg polyhedron
     * @returns GoldbergSphere mesh
     */
    export function CreateGoldbergVertexData(options: GoldbergVertexDataOption, goldbergData: PolyhedronData): VertexData;
    /**
     * Creates the Mesh for a Goldberg Polyhedron which is made from 12 pentagonal and the rest hexagonal faces
     * @see https://en.wikipedia.org/wiki/Goldberg_polyhedron
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra/goldberg_poly
     * @param name defines the name of the mesh
     * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty
     * @param scene defines the hosting scene
     * @returns Goldberg mesh
     */
    export function CreateGoldberg(name: string, options: GoldbergCreationOption, scene?: Nullable<Scene>): GoldbergMesh;


    /**
     * Creates the Mesh for a Geodesic Polyhedron
     * @see https://en.wikipedia.org/wiki/Geodesic_polyhedron
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/polyhedra/geodesic_poly
     * @param name defines the name of the mesh
     * @param options an object used to set the following optional parameters for the polyhedron, required but can be empty
     * * m number of horizontal steps along an isogrid
     * * n number of angled steps along an isogrid
     * * size the size of the Geodesic, optional default 1
     * * sizeX allows stretching in the x direction, optional, default size
     * * sizeY allows stretching in the y direction, optional, default size
     * * sizeZ allows stretching in the z direction, optional, default size
     * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
     * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
     * * flat when true creates a flat shaded mesh, optional, default true
     * * subdivisions increasing the subdivisions increases the number of faces, optional, default 4
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @param scene defines the hosting scene
     * @returns Geodesic mesh
     */
    export function CreateGeodesic(name: string, options: {
        m?: number;
        n?: number;
        size?: number;
        sizeX?: number;
        sizeY?: number;
        sizeZ?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        flat?: boolean;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Nullable<Scene>): Mesh;


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData of the Disc or regular Polygon
     * @param options an object used to set the following optional parameters for the disc, required but can be empty
     * * radius the radius of the disc, optional default 0.5
     * * tessellation the number of polygon sides, optional, default 64
     * * arc a number from 0 to 1, to create an unclosed polygon based on the fraction of the circumference given by the arc value, optional, default 1
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the box
     */
    export function CreateDiscVertexData(options: {
        radius?: number;
        tessellation?: number;
        arc?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a plane polygonal mesh.  By default, this is a disc
     * * The parameter `radius` sets the radius size (float) of the polygon (default 0.5)
     * * The parameter `tessellation` sets the number of polygon sides (positive integer, default 64). So a tessellation valued to 3 will build a triangle, to 4 a square, etc
     * * You can create an unclosed polygon with the parameter `arc` (positive float, default 1), valued between 0 and 1, what is the ratio of the circumference : 2 x PI x ratio
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the plane polygonal mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#disc-or-regular-polygon
     */
    export function CreateDisc(name: string, options?: {
        radius?: number;
        tessellation?: number;
        arc?: number;
        updatable?: boolean;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated please use CreateDisc directly
     */
    export var DiscBuilder: {
        CreateDisc: typeof CreateDisc;
    };
    /**
     * Register side effects for discBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDiscBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import discBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates a decal mesh.
     * A decal is a mesh usually applied as a model onto the surface of another mesh. So don't forget the parameter `sourceMesh` depicting the decal
     * * The parameter `position` (Vector3, default `(0, 0, 0)`) sets the position of the decal in World coordinates
     * * The parameter `normal` (Vector3, default `Vector3.Up`) sets the normal of the mesh where the decal is applied onto in World coordinates
     * * The parameter `size` (Vector3, default `(1, 1, 1)`) sets the decal scaling
     * * The parameter `angle` (float in radian, default 0) sets the angle to rotate the decal
     * * The parameter `captureUVS` defines if we need to capture the uvs or compute them
     * * The parameter `cullBackFaces` defines if the back faces should be removed from the decal mesh
     * * The parameter `localMode` defines that the computations should be done with the local mesh coordinates instead of the world space coordinates.
     * *    Use this mode if you want the decal to be parented to the sourceMesh and move/rotate with it.
     * Note: Meshes with morph targets are not supported!
     * @param name defines the name of the mesh
     * @param sourceMesh defines the mesh where the decal must be applied
     * @param options defines the options used to create the mesh
     * @returns the decal mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/decals
     */
    export function CreateDecal(name: string, sourceMesh: AbstractMesh, options: {
        position?: Vector3;
        normal?: Vector3;
        size?: Vector3;
        angle?: number;
        captureUVS?: boolean;
        cullBackFaces?: boolean;
        localMode?: boolean;
    }): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated use the function directly from the module
     */
    export var DecalBuilder: {
        CreateDecal: typeof CreateDecal;
    };
    /**
     * Register side effects for decalBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDecalBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import decalBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a cylinder, cone or prism
     * @param options an object used to set the following optional parameters for the box, required but can be empty
     * * height sets the height (y direction) of the cylinder, optional, default 2
     * * diameterTop sets the diameter of the top of the cone, overwrites diameter,  optional, default diameter
     * * diameterBottom sets the diameter of the bottom of the cone, overwrites diameter,  optional, default diameter
     * * diameter sets the diameter of the top and bottom of the cone, optional default 1
     * * tessellation the number of prism sides, 3 for a triangular prism, optional, default 24
     * * `subdivisions` the number of rings along the cylinder height, optional, default 1
     * * arc a number from 0 to 1, to create an unclosed cylinder based on the fraction of the circumference given by the arc value, optional, default 1
     * * faceColors an array of Color3 elements used to set different colors to the top, rings and bottom respectively
     * * faceUV an array of Vector4 elements used to set different images to the top, rings and bottom respectively
     * * hasRings when true makes each subdivision independently treated as a face for faceUV and faceColors, optional, default false
     * * enclose when true closes an open cylinder by adding extra flat faces between the height axis and vertical edges, think cut cake
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the cylinder, cone or prism
     */
    export function CreateCylinderVertexData(options: {
        height?: number;
        diameterTop?: number;
        diameterBottom?: number;
        diameter?: number;
        tessellation?: number;
        subdivisions?: number;
        arc?: number;
        faceColors?: Color4[];
        faceUV?: Vector4[];
        hasRings?: boolean;
        enclose?: boolean;
        cap?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }): VertexData;
    /**
     * Creates a cylinder or a cone mesh
     * * The parameter `height` sets the height size (float) of the cylinder/cone (float, default 2).
     * * The parameter `diameter` sets the diameter of the top and bottom cap at once (float, default 1).
     * * The parameters `diameterTop` and `diameterBottom` overwrite the parameter `diameter` and set respectively the top cap and bottom cap diameter (floats, default 1). The parameter "diameterBottom" can't be zero.
     * * The parameter `tessellation` sets the number of cylinder sides (positive integer, default 24). Set it to 3 to get a prism for instance.
     * * The parameter `subdivisions` sets the number of rings along the cylinder height (positive integer, default 1).
     * * The parameter `hasRings` (boolean, default false) makes the subdivisions independent from each other, so they become different faces.
     * * The parameter `enclose`  (boolean, default false) adds two extra faces per subdivision to a sliced cylinder to close it around its height axis.
     * * The parameter `cap` sets the way the cylinder is capped. Possible values : BABYLON.Mesh.NO_CAP, BABYLON.Mesh.CAP_START, BABYLON.Mesh.CAP_END, BABYLON.Mesh.CAP_ALL (default).
     * * The parameter `arc` (float, default 1) is the ratio (max 1) to apply to the circumference to slice the cylinder.
     * * You can set different colors and different images to each box side by using the parameters `faceColors` (an array of n Color3 elements) and `faceUV` (an array of n Vector4 elements).
     * * The value of n is the number of cylinder faces. If the cylinder has only 1 subdivisions, n equals : top face + cylinder surface + bottom face = 3
     * * Now, if the cylinder has 5 independent subdivisions (hasRings = true), n equals : top face + 5 stripe surfaces + bottom face = 2 + 5 = 7
     * * Finally, if the cylinder has 5 independent subdivisions and is enclose, n equals : top face + 5 x (stripe surface + 2 closing faces) + bottom face = 2 + 5 * 3 = 17
     * * Each array (color or UVs) is always ordered the same way : the first element is the bottom cap, the last element is the top cap. The other elements are each a ring surface.
     * * If `enclose` is false, a ring surface is one element.
     * * If `enclose` is true, a ring surface is 3 successive elements in the array : the tubular surface, then the two closing faces.
     * * Example how to set colors and textures on a sliced cylinder : https://www.html5gamedevs.com/topic/17945-creating-a-closed-slice-of-a-cylinder/#comment-106379
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created.
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the cylinder mesh
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#cylinder-or-cone
     */
    export function CreateCylinder(name: string, options?: {
        height?: number;
        diameterTop?: number;
        diameterBottom?: number;
        diameter?: number;
        tessellation?: number;
        subdivisions?: number;
        arc?: number;
        faceColors?: Color4[];
        faceUV?: Vector4[];
        updatable?: boolean;
        hasRings?: boolean;
        enclose?: boolean;
        cap?: number;
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated Please use CreateCylinder directly
     */
    export var CylinderBuilder: {
        CreateCylinder: typeof CreateCylinder;
    };
    /**
     * Register side effects for cylinderBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCylinderBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cylinderBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Scripts based off of https://github.com/maximeq/three-js-capsule-geometry/blob/master/src/CapsuleBufferGeometry.js
     * @param options the constructors options used to shape the mesh.
     * @returns the capsule VertexData
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set/capsule
     */
    export function CreateCapsuleVertexData(options?: ICreateCapsuleOptions): VertexData;
    /**
     * The options Interface for creating a Capsule Mesh
     */
    export interface ICreateCapsuleOptions {
        /** The Orientation of the capsule.  Default : Vector3.Up() */
        orientation?: Vector3;
        /** Number of sub segments on the tube section of the capsule running parallel to orientation. */
        subdivisions?: number;
        /** Number of cylindrical segments on the capsule. */
        tessellation?: number;
        /** Height or Length of the capsule. */
        height?: number;
        /** Radius of the capsule. */
        radius?: number;
        /** Number of sub segments on the cap sections of the capsule running parallel to orientation. */
        capSubdivisions?: number;
        /** Overwrite for the top radius. */
        radiusTop?: number;
        /** Overwrite for the bottom radius. */
        radiusBottom?: number;
        /** Overwrite for the top capSubdivisions. */
        topCapSubdivisions?: number;
        /** Overwrite for the bottom capSubdivisions. */
        bottomCapSubdivisions?: number;
        /** Internal geometry is supposed to change once created. */
        updatable?: boolean;
    }
    /**
     * Creates a capsule or a pill mesh
     * @param name defines the name of the mesh
     * @param options The constructors options.
     * @param scene The scene the mesh is scoped to.
     * @returns Capsule Mesh
     */
    export function CreateCapsule(name: string, options?: ICreateCapsuleOptions, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated please use CreateCapsule directly
     */
    export var CapsuleBuilder: {
        CreateCapsule: typeof CreateCapsule;
    };
    /**
     * Register side effects for capsuleBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCapsuleBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import capsuleBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Creates the VertexData for a box
     * @param options an object used to set the following optional parameters for the box, required but can be empty
     * * size sets the width, height and depth of the box to the value of size, optional default 1
     * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size
     * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size
     * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size
     * * faceUV an array of 6 Vector4 elements used to set different images to each box side
     * * faceColors an array of 6 Color3 elements used to set different colors to each box side
     * * sideOrientation optional and takes the values : Mesh.FRONTSIDE (default), Mesh.BACKSIDE or Mesh.DOUBLESIDE
     * * frontUvs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the front side, optional, default vector4 (0, 0, 1, 1)
     * * backUVs only usable when you create a double-sided mesh, used to choose what parts of the texture image to crop and apply on the back side, optional, default vector4 (0, 0, 1, 1)
     * @returns the VertexData of the box
     */
    export function CreateBoxVertexData(options: {
        size?: number;
        width?: number;
        height?: number;
        depth?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        wrap?: boolean;
        topBaseAt?: number;
        bottomBaseAt?: number;
    }): VertexData;
    /**
     * Creates the VertexData for a segmented box
     * @param options an object used to set the following optional parameters for the box, required but can be empty
     * * size sets the width, height and depth of the box to the value of size, optional default 1
     * * width sets the width (x direction) of the box, overwrites the width set by size, optional, default size
     * * height sets the height (y direction) of the box, overwrites the height set by size, optional, default size
     * * depth sets the depth (z direction) of the box, overwrites the depth set by size, optional, default size
     * * segments sets the number of segments on the all axis (1 by default)
     * * widthSegments sets the number of segments on the x axis (1 by default)
     * * heightSegments sets the number of segments on the y axis (1 by default)
     * * depthSegments sets the number of segments on the z axis (1 by default)
     * @returns the VertexData of the box
     */
    export function CreateSegmentedBoxVertexData(options: {
        size?: number;
        width?: number;
        height?: number;
        depth?: number;
        segments?: number;
        widthSegments?: number;
        heightSegments?: number;
        depthSegments?: number;
    }): VertexData;
    /**
     * Creates a box mesh
     * * The parameter `size` sets the size (float) of each box side (default 1)
     * * You can set some different box dimensions by using the parameters `width`, `height` and `depth` (all by default have the same value of `size`)
     * * You can set different colors and different images to each box side by using the parameters `faceColors` (an array of 6 Color3 elements) and `faceUV` (an array of 6 Vector4 elements)
     * * Please read this tutorial : https://doc.babylonjs.com/features/featuresDeepDive/materials/using/texturePerBoxFace
     * * You can also set the mesh side orientation with the values : BABYLON.Mesh.FRONTSIDE (default), BABYLON.Mesh.BACKSIDE or BABYLON.Mesh.DOUBLESIDE
     * * If you create a double-sided mesh, you can choose what parts of the texture image to crop and stick respectively on the front and the back sides with the parameters `frontUVs` and `backUVs` (Vector4). Detail here : https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#side-orientation
     * * The mesh can be set to updatable with the boolean parameter `updatable` (default false) if its internal geometry is supposed to change once created
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/set#box
     * @param name defines the name of the mesh
     * @param options defines the options used to create the mesh
     * @param scene defines the hosting scene
     * @returns the box mesh
     */
    export function CreateBox(name: string, options?: {
        size?: number;
        width?: number;
        height?: number;
        depth?: number;
        faceUV?: Vector4[];
        faceColors?: Color4[];
        sideOrientation?: number;
        frontUVs?: Vector4;
        backUVs?: Vector4;
        wrap?: boolean;
        topBaseAt?: number;
        bottomBaseAt?: number;
        updatable?: boolean;
    }, scene?: Nullable<Scene>): Mesh;
    /**
     * Class containing static functions to help procedurally build meshes
     * @deprecated please use CreateBox directly
     */
    export var BoxBuilder: {
        CreateBox: typeof CreateBox;
    };
    /**
     * Register side effects for boxBuilder.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBoxBuilder(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import boxBuilder.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Computes the tensor dimension of a multi-dimensional array
     */
    export type Dimension<T> = T extends Array<infer U> ? [Length<T>, ...Dimension<U>] : T extends readonly [infer U, ...infer R] ? [Length<T>, ...Dimension<U>] : [];
    /**
     * Possible values for a Tensor
     */
    export type TensorValue = number[] | TensorValue[];
    /**
     * Extracts the value type of a Tensor
     */
    export type ValueOfTensor<T = unknown> = T extends Tensor<infer V, any> ? V : TensorValue;
    type TensorNumberArray<V extends TensorValue> = Length<Dimension<V>> extends 2 ? Tuple<number, 16> : V;
    export type TensorLike<T> = T extends Tensor<TensorValue, infer I> ? I : never;
    /**
     * Describes a mathematical tensor.
     * @see https://wikipedia.org/wiki/Tensor
     */
    export interface Tensor<V extends TensorValue, I> {
        /**
         * An array of the size of each dimension.
         * For example, [3] for a Vector3 and [4,4] for a Matrix
         * @remarks
         * This is to allow implementations with using a getter
         */
        readonly dimension: Readonly<Dimension<V>>;
        /**
         * The rank of the tensor. This is the same as the length of the tensor's dimension array.
         * @remarks
         * This is to allow implementations with using a getter
         */
        readonly rank: number;
        /**
         * Gets class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets current instance hash code
         * @returns the instance hash code as a number
         */
        getHashCode(): number;
        /**
         * Sets the instance coordinates in the given array from the given index.
         * @param array defines the source array
         * @param index defines the offset in source array
         * @returns the current instance
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current instance from an array
         * @param array defines the destination array
         * @param index defines the offset in the destination array
         * @returns the current instance
         */
        fromArray(array: DeepImmutable<FloatArray>, index?: number): this;
        /**
         * Copy the current instance to an array
         * @returns a new array with the instance coordinates.
         */
        asArray(): TensorNumberArray<V>;
        /**
         * Sets the current instance coordinates with the given source coordinates
         * @param source defines the source instance
         * @returns the current updated instance
         */
        copyFrom(source: DeepImmutable<I>): this;
        /**
         * Sets the instance coordinates with the given floats
         * @returns the current updated instance
         */
        copyFromFloats(...floats: TensorNumberArray<V>): this;
        /**
         * Sets the instance coordinates with the given floats
         * @returns the current updated instance
         */
        set(...values: TensorNumberArray<V>): this;
        /**
         * Sets the instance coordinates to the given value
         * @returns the current updated instance
         */
        setAll(value: number): this;
        /**
         * Add another instance with the current one
         * @param other defines the other instance
         * @returns a new instance set with the addition of the current instance and the given one coordinates
         */
        add(other: DeepImmutable<I>): Tensor<V, I>;
        /**
         * Sets the "result" coordinates with the addition of the current instance and the given one coordinates
         * @param other defines the other instance
         * @param result defines the target instance
         * @returns result input
         */
        addToRef<R extends I>(other: DeepImmutable<I>, result: R): R;
        /**
         * Set the instance coordinates by adding the given instance coordinates
         * @param other defines the other instance
         * @returns the current updated instance
         */
        addInPlace(other: DeepImmutable<I>): this;
        /**
         * Adds the given coordinates to the current instance
         * @param floats the floats to add
         * @returns the current updated instance
         */
        addInPlaceFromFloats(...floats: TensorNumberArray<V>): this;
        /**
         * Returns a new instance set with the subtracted coordinates of other's coordinates from the current coordinates.
         * @param other defines the other instance
         * @returns a new instance
         */
        subtract(other: DeepImmutable<I>): Tensor<V, I>;
        /**
         * Sets the "result" coordinates with the subtraction of the other's coordinates from the current coordinates.
         * @param other defines the other instance
         * @param result defines the target instance
         * @returns result input
         */
        subtractToRef<R extends I>(other: DeepImmutable<I>, result: R): R;
        /**
         * Sets the current instance coordinates by subtracting from it the given one coordinates
         * @param other defines the other instance
         * @returns the current updated instance
         */
        subtractInPlace(other: DeepImmutable<I>): this;
        /**
         * Returns a new instance set with the subtraction of the given floats from the current instance coordinates
         * @param floats the coordinates to subtract
         * @returns the resulting instance
         */
        subtractFromFloats(...floats: TensorNumberArray<V>): Tensor<V, I>;
        /**
         * Subtracts the given floats from the current instance coordinates and set the given instance "result" with this result
         * Note: Implementation uses array magic so types may be confusing.
         * @param args the coordinates to subtract with the last element as the result
         * @returns the result
         */
        subtractFromFloatsToRef<R extends I>(...args: [...TensorNumberArray<V>, R]): R;
        /**
         * Returns a new instance set with the multiplication of the current instance and the given one coordinates
         * @param other defines the other instance
         * @returns a new instance
         */
        multiply(other: DeepImmutable<I>): Tensor<V, I>;
        /**
         * Sets "result" coordinates with the multiplication of the current instance and the given one coordinates
         * @param other defines the other instance
         * @param result defines the target instance
         * @returns result input
         */
        multiplyToRef<R extends I>(other: DeepImmutable<I>, result: R): R;
        /**
         * Multiplies in place the current instance coordinates by the given ones
         * @param other defines the other instance
         * @returns the current updated instance
         */
        multiplyInPlace(other: DeepImmutable<I>): this;
        /**
         * Gets a new instance set with the instance coordinates multiplied by the given floats
         * @returns a new instance
         */
        multiplyByFloats(...floats: TensorNumberArray<V>): Tensor<V, I>;
        /**
         * Returns a new instance set with the instance coordinates divided by the given one coordinates
         * @param other defines the other instance
         * @returns a new instance
         */
        divide(other: DeepImmutable<I>): Tensor<V, I>;
        /**
         * Sets the "result" coordinates with the instance coordinates divided by the given one coordinates
         * @param other defines the other instance
         * @param result defines the target instance
         * @returns result input
         */
        divideToRef<R extends I>(other: DeepImmutable<I>, result: R): R;
        /**
         * Divides the current instance coordinates by the given ones
         * @param other defines the other instance
         * @returns the current updated instance
         */
        divideInPlace(other: DeepImmutable<I>): this;
        /**
         * Updates the current instance with the minmal coordinate values between its and the given instance ones.
         * @param other defines the other instance
         * @returns this current updated instance
         */
        minimizeInPlace(other: DeepImmutable<I>): this;
        /**
         * Updates the current instance with the minmal coordinate values between its and the given floats.
         * @param floats defines the floats to compare against
         * @returns this current updated instance
         */
        minimizeInPlaceFromFloats(...floats: TensorNumberArray<V>): this;
        /**
         * Updates the current instance with the maximal coordinate values between its and the given instance ones.
         * @param other defines the other instance
         * @returns this current updated instance
         */
        maximizeInPlace(other: DeepImmutable<I>): this;
        /**
         * Updates the current instance with the maximal coordinate values between its and the given floats.
         * @param floats defines the floats to compare against
         * @returns this current updated instance
         */
        maximizeInPlaceFromFloats(...floats: TensorNumberArray<V>): this;
        /**
         * Gets a new instance with current instance negated coordinates
         * @returns a new instance
         */
        negate(): Tensor<V, I>;
        /**
         * Negate this instance in place
         * @returns this
         */
        negateInPlace(): this;
        /**
         * Negate the current instance and stores the result in the given instance "result" coordinates
         * @param result defines the instance object where to store the result
         * @returns the result
         */
        negateToRef<R extends I>(result: R): R;
        /**
         * Multiply the instance coordinates by
         * @param scale defines the scaling factor
         * @returns the current updated instance
         */
        scaleInPlace(scale: number): this;
        /**
         * Returns a new instance scaled by "scale" from the current instance
         * @param scale defines the scaling factor
         * @returns a new instance
         */
        scale(scale: number): Tensor<V, I>;
        /**
         * Scale the current instance values by a factor to a given instance
         * @param scale defines the scale factor
         * @param result defines the instance object where to store the result
         * @returns result input
         */
        scaleToRef<R extends I>(scale: number, result: R): R;
        /**
         * Scale the current instance values by a factor and add the result to a given instance
         * @param scale defines the scale factor
         * @param result defines the instance object where to store the result
         * @returns result input
         */
        scaleAndAddToRef<R extends I>(scale: number, result: R): R;
        /**
         * Gets a boolean if two instances are equals
         * @param other defines the other instance
         * @returns true if the given instance coordinates strictly equal the current instance ones
         */
        equals(other: DeepImmutable<I>): boolean;
        /**
         * Gets a boolean if two instances are equals (using an epsilon value)
         * @param other defines the other instance
         * @param epsilon defines the minimal distance to consider equality
         * @returns true if the given instance coordinates are close to the current ones by a distance of epsilon.
         */
        equalsWithEpsilon(other: DeepImmutable<I>, epsilon?: number): boolean;
        /**
         * Returns true if the current Vectoe coordinates equals the given floats
         * @param floats defines the coordinates to compare against
         * @returns true if both instances are equal
         */
        equalsToFloats(...floats: TensorNumberArray<V>): boolean;
        /**
         * Gets a new instance from current instance floored values
         * eg (1.2, 2.31) returns (1, 2)
         * @returns a new instance
         */
        floor(): Tensor<V, I>;
        /**
         * Gets the current instance's floored values and stores them in result
         * @param result the instance to store the result in
         * @returns the result instance
         */
        floorToRef<R extends I>(result: R): R;
        /**
         * Gets a new instance from current instance fractional values
         * eg (1.2, 2.31) returns (0.2, 0.31)
         * @returns a new instance
         */
        fract(): Tensor<V, I>;
        /**
         * Gets the current instance's fractional values and stores them in result
         * @param result the instance to store the result in
         * @returns the result instance
         */
        fractToRef<R extends I>(result: R): R;
        /**
         * Gets a new instance copied from the instance
         * @returns a new instance
         */
        clone(): Tensor<V, I>;
    }
    /**
     * Static side of Tensor
     * @see Tensor
     */
    export interface TensorStatic<T extends Tensor<any[], _I>, _I = TensorLike<T>> {
        /**
         * Creates a new instance from the given coordinates
         */
        new (...coords: Flatten<ValueOfTensor<T>>): T;
        /**
         * So [[static]].prototype has typings, instead of just any
         */
        prototype: T;
        /**
         * Returns a new instance with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @returns a instance with random values between min and max
         */
        Random(min?: number, max?: number): T;
        /**
         * Returns a new instance with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @param result the result to store the random values in
         * @returns the updated result instance
         */
        RandomToRef(min: number | undefined, max: number | undefined, result: T): T;
        /**
         * Gets a new instance from the given index element of the given array
         * @param array defines the data source
         * @param offset defines the offset in the data source
         * @returns a new instance
         */
        FromArray(array: DeepImmutable<FloatArray>, offset?: number): T;
        /**
         * Sets "result" from the given index element of the given array
         * @param array defines the data source
         * @param offset defines the offset in the data source
         * @param result defines the target instance
         * @returns result input
         */
        FromArrayToRef(array: DeepImmutable<FloatArray>, offset: number, result: T): T;
        /**
         * Sets the given instance "result" with the given floats.
         * @param args defines the coordinates of the source with the last paramater being the result
         */
        FromFloatsToRef(...args: [...Flatten<ValueOfTensor<T>>, T]): T;
        /**
         * Gets the dot product of the instance "left" and the instance "right"
         * @param left defines first instance
         * @param right defines second instance
         * @returns the dot product (float)
         */
        Dot(left: DeepImmutable<_I>, right: DeepImmutable<_I>): number;
        /**
         * Gets a new instance set with the minimal coordinate values from the "left" and "right" instances
         * @param left defines 1st instance
         * @param right defines 2nd instance
         * @returns a new instance
         */
        Minimize(left: DeepImmutable<_I>, right: DeepImmutable<_I>): T;
        /**
         * Gets a new instance set with the maximal coordinate values from the "left" and "right" instances
         * @param left defines 1st instance
         * @param right defines 2nd instance
         * @returns a new instance
         */
        Maximize(left: DeepImmutable<_I>, right: DeepImmutable<_I>): T;
        /**
         * Gets the distance between the instances "value1" and "value2"
         * @param value1 defines first instance
         * @param value2 defines second instance
         * @returns the distance between instances
         */
        Distance(value1: DeepImmutable<_I>, value2: DeepImmutable<_I>): number;
        /**
         * Returns the squared distance between the instances "value1" and "value2"
         * @param value1 defines first instance
         * @param value2 defines second instance
         * @returns the squared distance between instances
         */
        DistanceSquared(value1: DeepImmutable<_I>, value2: DeepImmutable<_I>): number;
        /**
         * Gets a new instance located at the center of the instances "value1" and "value2"
         * @param value1 defines first instance
         * @param value2 defines second instance
         * @returns a new instance
         */
        Center(value1: DeepImmutable<_I>, value2: DeepImmutable<_I>): T;
        /**
         * Gets the center of the instances "value1" and "value2" and stores the result in the instance "ref"
         * @param value1 defines first instance
         * @param value2 defines second instance
         * @param ref defines third instance
         * @returns ref
         */
        CenterToRef(value1: DeepImmutable<_I>, value2: DeepImmutable<_I>, ref: T): T;
        /**
         * Returns a new instance set with same the coordinates than "value" ones if the instance "value" is in the square defined by "min" and "max".
         * If a coordinate of "value" is lower than "min" coordinates, the returned instance is given this "min" coordinate.
         * If a coordinate of "value" is greater than "max" coordinates, the returned instance is given this "max" coordinate
         * @param value defines the value to clamp
         * @param min defines the lower limit
         * @param max defines the upper limit
         * @returns a new instance
         */
        Clamp(value: DeepImmutable<_I>, min: DeepImmutable<_I>, max: DeepImmutable<_I>): T;
        /**
         * Returns a new instance set with same the coordinates than "value" ones if the instance "value" is in the square defined by "min" and "max".
         * If a coordinate of "value" is lower than "min" coordinates, the returned instance is given this "min" coordinate.
         * If a coordinate of "value" is greater than "max" coordinates, the returned instance is given this "max" coordinate
         * @param value defines the value to clamp
         * @param min defines the lower limit
         * @param max defines the upper limit
         * @param result defines the instance where to store the result
         * @returns the updated result instance
         */
        ClampToRef(value: DeepImmutable<_I>, min: DeepImmutable<_I>, max: DeepImmutable<_I>, result: T): T;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Class representing spherical harmonics coefficients to the 3rd degree
     */
    export class SphericalHarmonics {
        /**
         * Defines whether or not the harmonics have been prescaled for rendering.
         */
        preScaled: boolean;
        /**
         * The l0,0 coefficients of the spherical harmonics
         */
        l00: Vector3;
        /**
         * The l1,-1 coefficients of the spherical harmonics
         */
        l1_1: Vector3;
        /**
         * The l1,0 coefficients of the spherical harmonics
         */
        l10: Vector3;
        /**
         * The l1,1 coefficients of the spherical harmonics
         */
        l11: Vector3;
        /**
         * The l2,-2 coefficients of the spherical harmonics
         */
        l2_2: Vector3;
        /**
         * The l2,-1 coefficients of the spherical harmonics
         */
        l2_1: Vector3;
        /**
         * The l2,0 coefficients of the spherical harmonics
         */
        l20: Vector3;
        /**
         * The l2,1 coefficients of the spherical harmonics
         */
        l21: Vector3;
        /**
         * The l2,2 coefficients of the spherical harmonics
         */
        l22: Vector3;
        /**
         * Adds a light to the spherical harmonics
         * @param direction the direction of the light
         * @param color the color of the light
         * @param deltaSolidAngle the delta solid angle of the light
         */
        addLight(direction: Vector3, color: Color3, deltaSolidAngle: number): void;
        /**
         * Scales the spherical harmonics by the given amount
         * @param scale the amount to scale
         */
        scaleInPlace(scale: number): void;
        /**
         * Convert from incident radiance (Li) to irradiance (E) by applying convolution with the cosine-weighted hemisphere.
         *
         * ```
         * E_lm = A_l * L_lm
         * ```
         *
         * In spherical harmonics this convolution amounts to scaling factors for each frequency band.
         * This corresponds to equation 5 in "An Efficient Representation for Irradiance Environment Maps", where
         * the scaling factors are given in equation 9.
         */
        convertIncidentRadianceToIrradiance(): void;
        /**
         * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.
         *
         * ```
         * L = (1/pi) * E * rho
         * ```
         *
         * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.
         */
        convertIrradianceToLambertianRadiance(): void;
        /**
         * Integrates the reconstruction coefficients directly in to the SH preventing further
         * required operations at run time.
         *
         * This is simply done by scaling back the SH with Ylm constants parameter.
         * The trigonometric part being applied by the shader at run time.
         */
        preScaleForRendering(): void;
        /**
         * update the spherical harmonics coefficients from the given array
         * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)
         * @returns the spherical harmonics (this)
         */
        updateFromArray(data: ArrayLike<ArrayLike<number>>): SphericalHarmonics;
        /**
         * update the spherical harmonics coefficients from the given floats array
         * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)
         * @returns the spherical harmonics (this)
         */
        updateFromFloatsArray(data: ArrayLike<number>): SphericalHarmonics;
        /**
         * Constructs a spherical harmonics from an array.
         * @param data defines the 9x3 coefficients (l00, l1-1, l10, l11, l2-2, l2-1, l20, l21, l22)
         * @returns the spherical harmonics
         */
        static FromArray(data: ArrayLike<ArrayLike<number>>): SphericalHarmonics;
        /**
         * Gets the spherical harmonics from polynomial
         * @param polynomial the spherical polynomial
         * @returns the spherical harmonics
         */
        static FromPolynomial(polynomial: SphericalPolynomial): SphericalHarmonics;
    }
    /**
     * Class representing spherical polynomial coefficients to the 3rd degree
     */
    export class SphericalPolynomial {
        private _harmonics;
        /**
         * The spherical harmonics used to create the polynomials.
         */
        get preScaledHarmonics(): SphericalHarmonics;
        /**
         * The x coefficients of the spherical polynomial
         */
        x: Vector3;
        /**
         * The y coefficients of the spherical polynomial
         */
        y: Vector3;
        /**
         * The z coefficients of the spherical polynomial
         */
        z: Vector3;
        /**
         * The xx coefficients of the spherical polynomial
         */
        xx: Vector3;
        /**
         * The yy coefficients of the spherical polynomial
         */
        yy: Vector3;
        /**
         * The zz coefficients of the spherical polynomial
         */
        zz: Vector3;
        /**
         * The xy coefficients of the spherical polynomial
         */
        xy: Vector3;
        /**
         * The yz coefficients of the spherical polynomial
         */
        yz: Vector3;
        /**
         * The zx coefficients of the spherical polynomial
         */
        zx: Vector3;
        /**
         * Adds an ambient color to the spherical polynomial
         * @param color the color to add
         */
        addAmbient(color: Color3): void;
        /**
         * Scales the spherical polynomial by the given amount
         * @param scale the amount to scale
         */
        scaleInPlace(scale: number): void;
        /**
         * Updates the spherical polynomial from harmonics
         * @param harmonics the spherical harmonics
         * @returns the spherical polynomial
         */
        updateFromHarmonics(harmonics: SphericalHarmonics): SphericalPolynomial;
        /**
         * Gets the spherical polynomial from harmonics
         * @param harmonics the spherical harmonics
         * @returns the spherical polynomial
         */
        static FromHarmonics(harmonics: SphericalHarmonics): SphericalPolynomial;
        /**
         * Constructs a spherical polynomial from an array.
         * @param data defines the 9x3 coefficients (x, y, z, xx, yy, zz, yz, zx, xy)
         * @returns the spherical polynomial
         */
        static FromArray(data: ArrayLike<ArrayLike<number>>): SphericalPolynomial;
    }




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Class used to represent a viewport on screen
     */
    export class Viewport implements IViewportLike {
        /** viewport left coordinate */
        x: number;
        /** viewport top coordinate */
        y: number;
        /**viewport width */
        width: number;
        /** viewport height */
        height: number;
        /**
         * Creates a Viewport object located at (x, y) and sized (width, height)
         * @param x defines viewport left coordinate
         * @param y defines viewport top coordinate
         * @param width defines the viewport width
         * @param height defines the viewport height
         */
        constructor(
        /** viewport left coordinate */
        x: number, 
        /** viewport top coordinate */
        y: number, 
        /**viewport width */
        width: number, 
        /** viewport height */
        height: number);
        /**
         * Creates a new viewport using absolute sizing (from 0-> width, 0-> height instead of 0->1)
         * @param renderWidth defines the rendering width
         * @param renderHeight defines the rendering height
         * @returns a new Viewport
         */
        toGlobal(renderWidth: number, renderHeight: number): Viewport;
        /**
         * Stores absolute viewport value into a target viewport (from 0-> width, 0-> height instead of 0->1)
         * @param renderWidth defines the rendering width
         * @param renderHeight defines the rendering height
         * @param ref defines the target viewport
         * @returns the current viewport
         */
        toGlobalToRef(renderWidth: number, renderHeight: number, ref: Viewport): Viewport;
        /**
         * Returns a new Viewport copied from the current one
         * @returns a new Viewport
         */
        clone(): Viewport;
    }


    /**
     * Contains position and normal vectors for a vertex
     */
    export class PositionNormalVertex {
        /** [Vector3.Zero()] the position of the vertex (defaut: 0,0,0) */
        position: Vector3;
        /** [Vector3.Up()] the normal of the vertex (defaut: 0,1,0) */
        normal: Vector3;
        /**
         * Creates a PositionNormalVertex
         * @param position the position of the vertex (defaut: 0,0,0)
         * @param normal the normal of the vertex (defaut: 0,1,0)
         */
        constructor(
        /** [Vector3.Zero()] the position of the vertex (defaut: 0,0,0) */
        position?: Vector3, 
        /** [Vector3.Up()] the normal of the vertex (defaut: 0,1,0) */
        normal?: Vector3);
        /**
         * Clones the PositionNormalVertex
         * @returns the cloned PositionNormalVertex
         */
        clone(): PositionNormalVertex;
    }
    /**
     * Contains position, normal and uv vectors for a vertex
     */
    export class PositionNormalTextureVertex {
        /** [Vector3.Zero()] the position of the vertex (defaut: 0,0,0) */
        position: Vector3;
        /** [Vector3.Up()] the normal of the vertex (defaut: 0,1,0) */
        normal: Vector3;
        /** [Vector3.Zero()] the uv of the vertex (default: 0,0) */
        uv: Vector2;
        /**
         * Creates a PositionNormalTextureVertex
         * @param position the position of the vertex (defaut: 0,0,0)
         * @param normal the normal of the vertex (defaut: 0,1,0)
         * @param uv the uv of the vertex (default: 0,0)
         */
        constructor(
        /** [Vector3.Zero()] the position of the vertex (defaut: 0,0,0) */
        position?: Vector3, 
        /** [Vector3.Up()] the normal of the vertex (defaut: 0,1,0) */
        normal?: Vector3, 
        /** [Vector3.Zero()] the uv of the vertex (default: 0,0) */
        uv?: Vector2);
        /**
         * Clones the PositionNormalTextureVertex
         * @returns the cloned PositionNormalTextureVertex
         */
        clone(): PositionNormalTextureVertex;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Represents a vector of any dimension
     */
    export interface Vector<N extends number[], I> extends Tensor<N, I> {
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<Dimension<N>>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /**
         * Gets the length of the vector
         * @returns the vector length (float)
         */
        length(): number;
        /**
         * Gets the vector squared length
         * @returns the vector squared length (float)
         */
        lengthSquared(): number;
        /**
         * Normalize the vector
         * @returns the current updated Vector
         */
        normalize(): this;
        /**
         * Normalize the current Vector with the given input length.
         * Please note that this is an in place operation.
         * @param len the length of the vector
         * @returns the current updated Vector
         */
        normalizeFromLength(len: number): this;
        /**
         * Normalize the current Vector to a new vector
         * @returns the new Vector
         */
        normalizeToNew(): Vector<N, I>;
        /**
         * Normalize the current Vector to the reference
         * @param reference define the Vector to update
         * @returns the updated Vector
         */
        normalizeToRef<T extends I>(reference: T): T;
    }
    /**
     * Static side of Vector
     */
    export interface VectorStatic<T extends Vector<any[], _I>, _I = TensorLike<T>> extends TensorStatic<T, _I> {
        /**
         * Checks if a given vector is inside a specific range
         * @param value defines the vector to test
         * @param min defines the minimum range
         * @param max defines the maximum range
         */
        CheckExtends(value: _I, min: _I, max: _I): void;
        /**
         * Returns a new Vector equal to the normalized given vector
         * @param vector defines the vector to normalize
         * @returns a new Vector
         */
        Normalize(vector: DeepImmutable<T>): T;
        /**
         * Normalize a given vector into a second one
         * @param vector defines the vector to normalize
         * @param result defines the vector where to store the result
         * @returns result input
         */
        NormalizeToRef(vector: DeepImmutable<T>, result: T): T;
    }
    /**
     * Class representing a vector containing 2 coordinates
     * Example Playground - Overview -  https://playground.babylonjs.com/#QYBWV4#9
     */
    export class Vector2 implements Vector<Tuple<number, 2>, IVector2Like>, IVector2Like {
        /** [0] defines the first coordinate */
        x: number;
        /** [0] defines the second coordinate */
        y: number;
        /**
         * If the first vector is flagged with integers (as everything is 0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent vectors are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all Vector2 instances that it creates.
         * But the original Vector2 instances are unchanged and has a "deprecated map".
         * If we keep using the Vector2 instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Vector2>;
        private static _ZeroReadOnly;
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<[2]>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /**
         * Creates a new Vector2 from the given x and y coordinates
         * @param x defines the first coordinate
         * @param y defines the second coordinate
         */
        constructor(
        /** [0] defines the first coordinate */
        x?: number, 
        /** [0] defines the second coordinate */
        y?: number);
        /**
         * Gets a string with the Vector2 coordinates
         * @returns a string with the Vector2 coordinates
         */
        toString(): string;
        /**
         * Gets class name
         * @returns the string "Vector2"
         */
        getClassName(): string;
        /**
         * Gets current vector hash code
         * @returns the Vector2 hash code as a number
         */
        getHashCode(): number;
        /**
         * Sets the Vector2 coordinates in the given array or Float32Array from the given index.
         * Example Playground https://playground.babylonjs.com/#QYBWV4#15
         * @param array defines the source array
         * @param index defines the offset in source array
         * @returns the current Vector2
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current vector from an array
         * Example Playground https://playground.babylonjs.com/#QYBWV4#39
         * @param array defines the destination array
         * @param offset defines the offset in the destination array
         * @returns the current Vector2
         */
        fromArray(array: FloatArray, offset?: number): this;
        /**
         * Copy the current vector to an array
         * Example Playground https://playground.babylonjs.com/#QYBWV4#40
         * @returns a new array with 2 elements: the Vector2 coordinates.
         */
        asArray(): [number, number];
        /**
         * Sets the Vector2 coordinates with the given Vector2 coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#24
         * @param source defines the source Vector2
         * @returns the current updated Vector2
         */
        copyFrom(source: DeepImmutable<IVector2Like>): this;
        /**
         * Sets the Vector2 coordinates with the given floats
         * Example Playground https://playground.babylonjs.com/#QYBWV4#25
         * @param x defines the first coordinate
         * @param y defines the second coordinate
         * @returns the current updated Vector2
         */
        copyFromFloats(x: number, y: number): this;
        /**
         * Sets the Vector2 coordinates with the given floats
         * Example Playground https://playground.babylonjs.com/#QYBWV4#62
         * @param x defines the first coordinate
         * @param y defines the second coordinate
         * @returns the current updated Vector2
         */
        set(x: number, y: number): this;
        /**
         * Copies the given float to the current Vector2 coordinates
         * @param v defines the x and y coordinates of the operand
         * @returns the current updated Vector2
         */
        setAll(v: number): this;
        /**
         * Add another vector with the current one
         * Example Playground https://playground.babylonjs.com/#QYBWV4#11
         * @param otherVector defines the other vector
         * @returns a new Vector2 set with the addition of the current Vector2 and the given one coordinates
         */
        add(otherVector: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Sets the "result" coordinates with the addition of the current Vector2 and the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#12
         * @param otherVector defines the other vector
         * @param result defines the target vector
         * @returns result input
         */
        addToRef<T extends IVector2Like>(otherVector: DeepImmutable<IVector2Like>, result: T): T;
        /**
         * Set the Vector2 coordinates by adding the given Vector2 coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#13
         * @param otherVector defines the other vector
         * @returns the current updated Vector2
         */
        addInPlace(otherVector: DeepImmutable<IVector2Like>): this;
        /**
         * Adds the given coordinates to the current Vector2
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @returns the current updated Vector2
         */
        addInPlaceFromFloats(x: number, y: number): this;
        /**
         * Gets a new Vector2 by adding the current Vector2 coordinates to the given Vector3 x, y coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#14
         * @param otherVector defines the other vector
         * @returns a new Vector2
         */
        addVector3(otherVector: IVector3Like): Vector2;
        /**
         * Gets a new Vector2 set with the subtracted coordinates of the given one from the current Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#61
         * @param otherVector defines the other vector
         * @returns a new Vector2
         */
        subtract(otherVector: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Sets the "result" coordinates with the subtraction of the given one from the current Vector2 coordinates.
         * Example Playground https://playground.babylonjs.com/#QYBWV4#63
         * @param otherVector defines the other vector
         * @param result defines the target vector
         * @returns result input
         */
        subtractToRef<T extends IVector2Like>(otherVector: DeepImmutable<IVector2Like>, result: T): T;
        /**
         * Sets the current Vector2 coordinates by subtracting from it the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#88
         * @param otherVector defines the other vector
         * @returns the current updated Vector2
         */
        subtractInPlace(otherVector: DeepImmutable<IVector2Like>): this;
        /**
         * Multiplies in place the current Vector2 coordinates by the given ones
         * Example Playground https://playground.babylonjs.com/#QYBWV4#43
         * @param otherVector defines the other vector
         * @returns the current updated Vector2
         */
        multiplyInPlace(otherVector: DeepImmutable<IVector2Like>): this;
        /**
         * Returns a new Vector2 set with the multiplication of the current Vector2 and the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#42
         * @param otherVector defines the other vector
         * @returns a new Vector2
         */
        multiply(otherVector: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Sets "result" coordinates with the multiplication of the current Vector2 and the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#44
         * @param otherVector defines the other vector
         * @param result defines the target vector
         * @returns result input
         */
        multiplyToRef<T extends IVector2Like>(otherVector: DeepImmutable<IVector2Like>, result: T): T;
        /**
         * Gets a new Vector2 set with the Vector2 coordinates multiplied by the given floats
         * Example Playground https://playground.babylonjs.com/#QYBWV4#89
         * @param x defines the first coordinate
         * @param y defines the second coordinate
         * @returns a new Vector2
         */
        multiplyByFloats(x: number, y: number): Vector2;
        /**
         * Returns a new Vector2 set with the Vector2 coordinates divided by the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#27
         * @param otherVector defines the other vector
         * @returns a new Vector2
         */
        divide(otherVector: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Sets the "result" coordinates with the Vector2 divided by the given one coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#30
         * @param otherVector defines the other vector
         * @param result defines the target vector
         * @returns result input
         */
        divideToRef<T extends IVector2Like>(otherVector: DeepImmutable<IVector2Like>, result: T): T;
        /**
         * Divides the current Vector2 coordinates by the given ones
         * Example Playground https://playground.babylonjs.com/#QYBWV4#28
         * @param otherVector defines the other vector
         * @returns the current updated Vector2
         */
        divideInPlace(otherVector: DeepImmutable<IVector2Like>): this;
        /**
         * Updates the current Vector2 with the minimal coordinate values between its and the given vector ones
         * @param other defines the second operand
         * @returns the current updated Vector2
         */
        minimizeInPlace(other: DeepImmutable<IVector2Like>): this;
        /**
         * Updates the current Vector2 with the maximal coordinate values between its and the given vector ones.
         * @param other defines the second operand
         * @returns the current updated Vector2
         */
        maximizeInPlace(other: DeepImmutable<IVector2Like>): this;
        /**
         * Updates the current Vector2 with the minimal coordinate values between its and the given coordinates
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @returns the current updated Vector2
         */
        minimizeInPlaceFromFloats(x: number, y: number): this;
        /**
         * Updates the current Vector2 with the maximal coordinate values between its and the given coordinates.
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @returns the current updated Vector2
         */
        maximizeInPlaceFromFloats(x: number, y: number): this;
        /**
         * Returns a new Vector2 set with the subtraction of the given floats from the current Vector2 coordinates
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @returns the resulting Vector2
         */
        subtractFromFloats(x: number, y: number): Vector2;
        /**
         * Subtracts the given floats from the current Vector2 coordinates and set the given vector "result" with this result
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param result defines the Vector2 object where to store the result
         * @returns the result
         */
        subtractFromFloatsToRef<T extends IVector2Like>(x: number, y: number, result: T): T;
        /**
         * Gets a new Vector2 with current Vector2 negated coordinates
         * @returns a new Vector2
         */
        negate(): Vector2;
        /**
         * Negate this vector in place
         * Example Playground https://playground.babylonjs.com/#QYBWV4#23
         * @returns this
         */
        negateInPlace(): this;
        /**
         * Negate the current Vector2 and stores the result in the given vector "result" coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#41
         * @param result defines the Vector2 object where to store the result
         * @returns the result
         */
        negateToRef<T extends IVector2Like>(result: T): T;
        /**
         * Multiply the Vector2 coordinates by
         * Example Playground https://playground.babylonjs.com/#QYBWV4#59
         * @param scale defines the scaling factor
         * @returns the current updated Vector2
         */
        scaleInPlace(scale: number): this;
        /**
         * Returns a new Vector2 scaled by "scale" from the current Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#52
         * @param scale defines the scaling factor
         * @returns a new Vector2
         */
        scale(scale: number): Vector2;
        /**
         * Scale the current Vector2 values by a factor to a given Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#57
         * @param scale defines the scale factor
         * @param result defines the Vector2 object where to store the result
         * @returns result input
         */
        scaleToRef<T extends IVector2Like>(scale: number, result: T): T;
        /**
         * Scale the current Vector2 values by a factor and add the result to a given Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#58
         * @param scale defines the scale factor
         * @param result defines the Vector2 object where to store the result
         * @returns result input
         */
        scaleAndAddToRef<T extends IVector2Like>(scale: number, result: T): T;
        /**
         * Gets a boolean if two vectors are equals
         * Example Playground https://playground.babylonjs.com/#QYBWV4#31
         * @param otherVector defines the other vector
         * @returns true if the given vector coordinates strictly equal the current Vector2 ones
         */
        equals(otherVector: DeepImmutable<IVector2Like>): boolean;
        /**
         * Gets a boolean if two vectors are equals (using an epsilon value)
         * Example Playground https://playground.babylonjs.com/#QYBWV4#32
         * @param otherVector defines the other vector
         * @param epsilon defines the minimal distance to consider equality
         * @returns true if the given vector coordinates are close to the current ones by a distance of epsilon.
         */
        equalsWithEpsilon(otherVector: DeepImmutable<IVector2Like>, epsilon?: number): boolean;
        /**
         * Returns true if the current Vector2 coordinates equals the given floats
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @returns true if both vectors are equal
         */
        equalsToFloats(x: number, y: number): boolean;
        /**
         * Gets a new Vector2 from current Vector2 floored values
         * Example Playground https://playground.babylonjs.com/#QYBWV4#35
         * eg (1.2, 2.31) returns (1, 2)
         * @returns a new Vector2
         */
        floor(): Vector2;
        /**
         * Gets the current Vector2's floored values and stores them in result
         * @param result the Vector2 to store the result in
         * @returns the result Vector2
         */
        floorToRef<T extends IVector2Like>(result: T): T;
        /**
         * Gets a new Vector2 from current Vector2 fractional values
         * Example Playground https://playground.babylonjs.com/#QYBWV4#34
         * eg (1.2, 2.31) returns (0.2, 0.31)
         * @returns a new Vector2
         */
        fract(): Vector2;
        /**
         * Gets the current Vector2's fractional values and stores them in result
         * @param result the Vector2 to store the result in
         * @returns the result Vector2
         */
        fractToRef<T extends IVector2Like>(result: T): T;
        /**
         * Gets a new Vector2 rotated by the given angle
         * @param angle defines the rotation angle
         * @returns a new Vector2
         */
        rotate(angle: number): Vector2;
        /**
         * Rotate the current vector into a given result vector
         * Example Playground https://playground.babylonjs.com/#QYBWV4#49
         * @param angle defines the rotation angle
         * @param result defines the result vector where to store the rotated vector
         * @returns result input
         */
        rotateToRef<T extends IVector2Like>(angle: number, result: T): T;
        /**
         * Gets the length of the vector
         * @returns the vector length (float)
         */
        length(): number;
        /**
         * Gets the vector squared length
         * @returns the vector squared length (float)
         */
        lengthSquared(): number;
        /**
         * Normalize the vector
         * Example Playground https://playground.babylonjs.com/#QYBWV4#48
         * @returns the current updated Vector2
         */
        normalize(): this;
        /**
         * Normalize the current Vector2 with the given input length.
         * Please note that this is an in place operation.
         * @param len the length of the vector
         * @returns the current updated Vector2
         */
        normalizeFromLength(len: number): this;
        /**
         * Normalize the current Vector2 to a new vector
         * @returns the new Vector2
         */
        normalizeToNew(): Vector2;
        /**
         * Normalize the current Vector2 to the reference
         * @param result define the Vector to update
         * @returns the updated Vector2
         */
        normalizeToRef<T extends IVector2Like>(result: T): T;
        /**
         * Gets a new Vector2 copied from the Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#20
         * @returns a new Vector2
         */
        clone(): Vector2;
        /**
         * Gets the dot product of the current vector and the vector "otherVector"
         * @param otherVector defines second vector
         * @returns the dot product (float)
         */
        dot(otherVector: DeepImmutable<IVector2Like>): number;
        /**
         * Gets a new Vector2(0, 0)
         * @returns a new Vector2
         */
        static Zero(): Vector2;
        /**
         * Gets a new Vector2(1, 1)
         * @returns a new Vector2
         */
        static One(): Vector2;
        /**
         * Returns a new Vector2 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @returns a Vector2 with random values between min and max
         */
        static Random(min?: number, max?: number): Vector2;
        /**
         * Sets a Vector2 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @param ref the ref to store the values in
         * @returns the ref with random values between min and max
         */
        static RandomToRef<T extends Vector2>(min: number | undefined, max: number | undefined, ref: T): T;
        /**
         * Gets a zero Vector2 that must not be updated
         */
        static get ZeroReadOnly(): DeepImmutable<Vector2>;
        /**
         * Gets a new Vector2 set from the given index element of the given array
         * Example Playground https://playground.babylonjs.com/#QYBWV4#79
         * @param array defines the data source
         * @param offset defines the offset in the data source
         * @returns a new Vector2
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Vector2;
        /**
         * Sets "result" from the given index element of the given array
         * Example Playground https://playground.babylonjs.com/#QYBWV4#80
         * @param array defines the data source
         * @param offset defines the offset in the data source
         * @param result defines the target vector
         * @returns result input
         */
        static FromArrayToRef<T extends Vector2>(array: DeepImmutable<ArrayLike<number>>, offset: number, result: T): T;
        /**
         * Sets the given vector "result" with the given floats.
         * @param x defines the x coordinate of the source
         * @param y defines the y coordinate of the source
         * @param result defines the Vector2 where to store the result
         * @returns the result vector
         */
        static FromFloatsToRef<T extends Vector2>(x: number, y: number, result: T): T;
        /**
         * Gets a new Vector2 located for "amount" (float) on the CatmullRom spline defined by the given four Vector2
         * Example Playground https://playground.babylonjs.com/#QYBWV4#65
         * @param value1 defines 1st point of control
         * @param value2 defines 2nd point of control
         * @param value3 defines 3rd point of control
         * @param value4 defines 4th point of control
         * @param amount defines the interpolation factor
         * @returns a new Vector2
         */
        static CatmullRom(value1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>, value3: DeepImmutable<IVector2Like>, value4: DeepImmutable<IVector2Like>, amount: number): Vector2;
        /**
         * Sets reference with same the coordinates than "value" ones if the vector "value" is in the square defined by "min" and "max".
         * If a coordinate of "value" is lower than "min" coordinates, the returned Vector2 is given this "min" coordinate.
         * If a coordinate of "value" is greater than "max" coordinates, the returned Vector2 is given this "max" coordinate
         * @param value defines the value to clamp
         * @param min defines the lower limit
         * @param max defines the upper limit
         * @param ref the reference
         * @returns the reference
         */
        static ClampToRef<T extends Vector2>(value: DeepImmutable<IVector2Like>, min: DeepImmutable<IVector2Like>, max: DeepImmutable<IVector2Like>, ref: T): T;
        /**
         * Returns a new Vector2 set with same the coordinates than "value" ones if the vector "value" is in the square defined by "min" and "max".
         * If a coordinate of "value" is lower than "min" coordinates, the returned Vector2 is given this "min" coordinate.
         * If a coordinate of "value" is greater than "max" coordinates, the returned Vector2 is given this "max" coordinate
         * Example Playground https://playground.babylonjs.com/#QYBWV4#76
         * @param value defines the value to clamp
         * @param min defines the lower limit
         * @param max defines the upper limit
         * @returns a new Vector2
         */
        static Clamp(value: DeepImmutable<IVector2Like>, min: DeepImmutable<IVector2Like>, max: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Returns a new Vector2 located for "amount" (float) on the Hermite spline defined by the vectors "value1", "value2", "tangent1", "tangent2"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#81
         * @param value1 defines the 1st control point
         * @param tangent1 defines the outgoing tangent
         * @param value2 defines the 2nd control point
         * @param tangent2 defines the incoming tangent
         * @param amount defines the interpolation factor
         * @returns a new Vector2
         */
        static Hermite(value1: DeepImmutable<IVector2Like>, tangent1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>, tangent2: DeepImmutable<IVector2Like>, amount: number): Vector2;
        /**
         * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#QYBWV4#82
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @returns 1st derivative
         */
        static Hermite1stDerivative(value1: DeepImmutable<IVector2Like>, tangent1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>, tangent2: DeepImmutable<IVector2Like>, time: number): Vector2;
        /**
         * Returns a new Vector2 which is the 1st derivative of the Hermite spline defined by the vectors "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#QYBWV4#83
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @param result define where the derivative will be stored
         * @returns result input
         */
        static Hermite1stDerivativeToRef<T extends Vector2>(value1: DeepImmutable<IVector2Like>, tangent1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>, tangent2: DeepImmutable<IVector2Like>, time: number, result: T): T;
        /**
         * Returns a new Vector2 located for "amount" (float) on the linear interpolation between the vector "start" adn the vector "end".
         * Example Playground https://playground.babylonjs.com/#QYBWV4#84
         * @param start defines the start vector
         * @param end defines the end vector
         * @param amount defines the interpolation factor
         * @returns a new Vector2
         */
        static Lerp(start: DeepImmutable<IVector2Like>, end: DeepImmutable<IVector2Like>, amount: number): Vector2;
        /**
         * Sets the given vector "result" with the result of the linear interpolation from the vector "start" for "amount" to the vector "end"
         * @param start defines the start value
         * @param end defines the end value
         * @param amount max defines amount between both (between 0 and 1)
         * @param result defines the Vector2 where to store the result
         * @returns result input
         */
        static LerpToRef(start: DeepImmutable<IVector2Like>, end: DeepImmutable<IVector2Like>, amount: number, result: Vector2): Vector2;
        /**
         * Gets the dot product of the vector "left" and the vector "right"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#90
         * @param left defines first vector
         * @param right defines second vector
         * @returns the dot product (float)
         */
        static Dot(left: DeepImmutable<IVector2Like>, right: DeepImmutable<IVector2Like>): number;
        /**
         * Returns a new Vector2 equal to the normalized given vector
         * Example Playground https://playground.babylonjs.com/#QYBWV4#46
         * @param vector defines the vector to normalize
         * @returns a new Vector2
         */
        static Normalize(vector: DeepImmutable<Vector2>): Vector2;
        /**
         * Normalize a given vector into a second one
         * Example Playground https://playground.babylonjs.com/#QYBWV4#50
         * @param vector defines the vector to normalize
         * @param result defines the vector where to store the result
         * @returns result input
         */
        static NormalizeToRef<T extends Vector2>(vector: DeepImmutable<Vector2>, result: T): T;
        /**
         * Gets a new Vector2 set with the minimal coordinate values from the "left" and "right" vectors
         * Example Playground https://playground.babylonjs.com/#QYBWV4#86
         * @param left defines 1st vector
         * @param right defines 2nd vector
         * @returns a new Vector2
         */
        static Minimize(left: DeepImmutable<IVector2Like>, right: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Gets a new Vector2 set with the maximal coordinate values from the "left" and "right" vectors
         * Example Playground https://playground.babylonjs.com/#QYBWV4#86
         * @param left defines 1st vector
         * @param right defines 2nd vector
         * @returns a new Vector2
         */
        static Maximize(left: DeepImmutable<IVector2Like>, right: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Gets a new Vector2 set with the transformed coordinates of the given vector by the given transformation matrix
         * Example Playground https://playground.babylonjs.com/#QYBWV4#17
         * @param vector defines the vector to transform
         * @param transformation defines the matrix to apply
         * @returns a new Vector2
         */
        static Transform(vector: DeepImmutable<IVector2Like>, transformation: DeepImmutable<Matrix>): Vector2;
        /**
         * Transforms the given vector coordinates by the given transformation matrix and stores the result in the vector "result" coordinates
         * Example Playground https://playground.babylonjs.com/#QYBWV4#19
         * @param vector defines the vector to transform
         * @param transformation defines the matrix to apply
         * @param result defines the target vector
         * @returns result input
         */
        static TransformToRef<T extends Vector2>(vector: DeepImmutable<IVector2Like>, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Determines if a given vector is included in a triangle
         * Example Playground https://playground.babylonjs.com/#QYBWV4#87
         * @param p defines the vector to test
         * @param p0 defines 1st triangle point
         * @param p1 defines 2nd triangle point
         * @param p2 defines 3rd triangle point
         * @returns true if the point "p" is in the triangle defined by the vectors "p0", "p1", "p2"
         */
        static PointInTriangle(p: DeepImmutable<IVector2Like>, p0: DeepImmutable<IVector2Like>, p1: DeepImmutable<IVector2Like>, p2: DeepImmutable<IVector2Like>): boolean;
        /**
         * Gets the distance between the vectors "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#71
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @returns the distance between vectors
         */
        static Distance(value1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>): number;
        /**
         * Returns the squared distance between the vectors "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#72
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @returns the squared distance between vectors
         */
        static DistanceSquared(value1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>): number;
        /**
         * Gets a new Vector2 located at the center of the vectors "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#86
         * Example Playground https://playground.babylonjs.com/#QYBWV4#66
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @returns a new Vector2
         */
        static Center(value1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>): Vector2;
        /**
         * Gets the center of the vectors "value1" and "value2" and stores the result in the vector "ref"
         * Example Playground https://playground.babylonjs.com/#QYBWV4#66
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @param ref defines third vector
         * @returns ref
         */
        static CenterToRef<T extends Vector2>(value1: DeepImmutable<IVector2Like>, value2: DeepImmutable<IVector2Like>, ref: T): T;
        /**
         * Gets the shortest distance (float) between the point "p" and the segment defined by the two points "segA" and "segB".
         * Example Playground https://playground.babylonjs.com/#QYBWV4#77
         * @param p defines the middle point
         * @param segA defines one point of the segment
         * @param segB defines the other point of the segment
         * @returns the shortest distance
         */
        static DistanceOfPointFromSegment(p: DeepImmutable<Vector2>, segA: DeepImmutable<Vector2>, segB: DeepImmutable<Vector2>): number;
    }
    /**
     * Class used to store (x,y,z) vector representation
     * A Vector3 is the main object used in 3D geometry
     * It can represent either the coordinates of a point the space, either a direction
     * Reminder: js uses a left handed forward facing system
     * Example Playground - Overview - https://playground.babylonjs.com/#R1F8YU
     */
    export class Vector3 implements Vector<Tuple<number, 3>, IVector3LikeInternal>, IVector3Like {
        /**
         * If the first vector is flagged with integers (as everything is 0,0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent vectors are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all Vector3 instances that it creates.
         * But the original Vector3 instances are unchanged and has a "deprecated map".
         * If we keep using the Vector3 instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Vector3>;
        private static _UpReadOnly;
        private static _DownReadOnly;
        private static _LeftHandedForwardReadOnly;
        private static _RightHandedForwardReadOnly;
        private static _LeftHandedBackwardReadOnly;
        private static _RightHandedBackwardReadOnly;
        private static _RightReadOnly;
        private static _LeftReadOnly;
        private static _ZeroReadOnly;
        private static _OneReadOnly;
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<[3]>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /** @internal */
        _x: number;
        /** @internal */
        _y: number;
        /** @internal */
        _z: number;
        /** @internal */
        _isDirty: boolean;
        /** Gets or sets the x coordinate */
        get x(): number;
        set x(value: number);
        /** Gets or sets the y coordinate */
        get y(): number;
        set y(value: number);
        /** Gets or sets the z coordinate */
        get z(): number;
        set z(value: number);
        /**
         * Creates a new Vector3 object from the given x, y, z (floats) coordinates.
         * @param x defines the first coordinates (on X axis)
         * @param y defines the second coordinates (on Y axis)
         * @param z defines the third coordinates (on Z axis)
         */
        constructor(x?: number, y?: number, z?: number);
        /**
         * Creates a string representation of the Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#67
         * @returns a string with the Vector3 coordinates.
         */
        toString(): string;
        /**
         * Gets the class name
         * @returns the string "Vector3"
         */
        getClassName(): string;
        /**
         * Creates the Vector3 hash code
         * @returns a number which tends to be unique between Vector3 instances
         */
        getHashCode(): number;
        /**
         * Creates an array containing three elements : the coordinates of the Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#10
         * @returns a new array of numbers
         */
        asArray(): Tuple<number, 3>;
        /**
         * Populates the given array or Float32Array from the given index with the successive coordinates of the Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#65
         * @param array defines the destination array
         * @param index defines the offset in the destination array
         * @returns the current Vector3
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current vector from an array
         * Example Playground https://playground.babylonjs.com/#R1F8YU#24
         * @param array defines the destination array
         * @param offset defines the offset in the destination array
         * @returns the current Vector3
         */
        fromArray(array: DeepImmutable<FloatArray>, offset?: number): this;
        /**
         * Converts the current Vector3 into a quaternion (considering that the Vector3 contains Euler angles representation of a rotation)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#66
         * @returns a new Quaternion object, computed from the Vector3 coordinates
         */
        toQuaternion(): Quaternion;
        /**
         * Adds the given vector to the current Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#4
         * @param otherVector defines the second operand
         * @returns the current updated Vector3
         */
        addInPlace(otherVector: DeepImmutable<Vector3>): this;
        /**
         * Adds the given coordinates to the current Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#5
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the current updated Vector3
         */
        addInPlaceFromFloats(x: number, y: number, z: number): this;
        /**
         * Gets a new Vector3, result of the addition the current Vector3 and the given vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#3
         * @param otherVector defines the second operand
         * @returns the resulting Vector3
         */
        add(otherVector: DeepImmutable<IVector3LikeInternal>): Vector3;
        /**
         * Adds the current Vector3 to the given one and stores the result in the vector "result"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#6
         * @param otherVector defines the second operand
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        addToRef<T extends IVector3LikeInternal>(otherVector: DeepImmutable<IVector3LikeInternal>, result: T): T;
        /**
         * Subtract the given vector from the current Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#61
         * @param otherVector defines the second operand
         * @returns the current updated Vector3
         */
        subtractInPlace(otherVector: DeepImmutable<IVector3LikeInternal>): this;
        /**
         * Returns a new Vector3, result of the subtraction of the given vector from the current Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#60
         * @param otherVector defines the second operand
         * @returns the resulting Vector3
         */
        subtract(otherVector: DeepImmutable<IVector3LikeInternal>): Vector3;
        /**
         * Subtracts the given vector from the current Vector3 and stores the result in the vector "result".
         * Example Playground https://playground.babylonjs.com/#R1F8YU#63
         * @param otherVector defines the second operand
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        subtractToRef<T extends IVector3LikeInternal>(otherVector: DeepImmutable<IVector3LikeInternal>, result: T): T;
        /**
         * Returns a new Vector3 set with the subtraction of the given floats from the current Vector3 coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#62
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the resulting Vector3
         */
        subtractFromFloats(x: number, y: number, z: number): Vector3;
        /**
         * Subtracts the given floats from the current Vector3 coordinates and set the given vector "result" with this result
         * Example Playground https://playground.babylonjs.com/#R1F8YU#64
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        subtractFromFloatsToRef<T extends IVector3LikeInternal>(x: number, y: number, z: number, result: T): T;
        /**
         * Gets a new Vector3 set with the current Vector3 negated coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#35
         * @returns a new Vector3
         */
        negate(): Vector3;
        /**
         * Negate this vector in place
         * Example Playground https://playground.babylonjs.com/#R1F8YU#36
         * @returns this
         */
        negateInPlace(): this;
        /**
         * Negate the current Vector3 and stores the result in the given vector "result" coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#37
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        negateToRef<T extends IVector3LikeInternal>(result: T): T;
        /**
         * Multiplies the Vector3 coordinates by the float "scale"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#56
         * @param scale defines the multiplier factor
         * @returns the current updated Vector3
         */
        scaleInPlace(scale: number): this;
        /**
         * Returns a new Vector3 set with the current Vector3 coordinates multiplied by the float "scale"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#53
         * @param scale defines the multiplier factor
         * @returns a new Vector3
         */
        scale(scale: number): Vector3;
        /**
         * Multiplies the current Vector3 coordinates by the float "scale" and stores the result in the given vector "result" coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#57
         * @param scale defines the multiplier factor
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        scaleToRef<T extends IVector3LikeInternal>(scale: number, result: T): T;
        /**
         * Creates a vector normal (perpendicular) to the current Vector3 and stores the result in the given vector
         * Out of the infinite possibilities the normal chosen is the one formed by rotating the current vector
         * 90 degrees about an axis which lies perpendicular to the current vector
         * and its projection on the xz plane. In the case of a current vector in the xz plane
         * the normal is calculated to be along the y axis.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#230
         * Example Playground https://playground.babylonjs.com/#R1F8YU#231
         * @param result defines the Vector3 object where to store the resultant normal
         * @returns the result
         */
        getNormalToRef(result: Vector3): Vector3;
        /**
         * Rotates the vector using the given unit quaternion and stores the new vector in result
         * Example Playground https://playground.babylonjs.com/#R1F8YU#9
         * @param q the unit quaternion representing the rotation
         * @param result the output vector
         * @returns the result
         */
        applyRotationQuaternionToRef<T extends Vector3>(q: Quaternion, result: T): T;
        /**
         * Rotates the vector in place using the given unit quaternion
         * Example Playground https://playground.babylonjs.com/#R1F8YU#8
         * @param q the unit quaternion representing the rotation
         * @returns the current updated Vector3
         */
        applyRotationQuaternionInPlace(q: Quaternion): this;
        /**
         * Rotates the vector using the given unit quaternion and returns the new vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#7
         * @param q the unit quaternion representing the rotation
         * @returns a new Vector3
         */
        applyRotationQuaternion(q: Quaternion): Vector3;
        /**
         * Scale the current Vector3 values by a factor and add the result to a given Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#55
         * @param scale defines the scale factor
         * @param result defines the Vector3 object where to store the result
         * @returns result input
         */
        scaleAndAddToRef<T extends IVector3LikeInternal>(scale: number, result: T): T;
        /**
         * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#48
         * @param plane defines the plane to project to
         * @param origin defines the origin of the projection ray
         * @returns the projected vector3
         */
        projectOnPlane(plane: Plane, origin: Vector3): Vector3;
        /**
         * Projects the current point Vector3 to a plane along a ray starting from a specified origin and passing through the current point Vector3.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#49
         * @param plane defines the plane to project to
         * @param origin defines the origin of the projection ray
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        projectOnPlaneToRef<T extends Vector3>(plane: Plane, origin: Vector3, result: T): T;
        /**
         * Returns true if the current Vector3 and the given vector coordinates are strictly equal
         * Example Playground https://playground.babylonjs.com/#R1F8YU#19
         * @param otherVector defines the second operand
         * @returns true if both vectors are equals
         */
        equals(otherVector: DeepImmutable<Vector3>): boolean;
        /**
         * Returns true if the current Vector3 and the given vector coordinates are distant less than epsilon
         * Example Playground https://playground.babylonjs.com/#R1F8YU#21
         * @param otherVector defines the second operand
         * @param epsilon defines the minimal distance to define values as equals
         * @returns true if both vectors are distant less than epsilon
         */
        equalsWithEpsilon(otherVector: DeepImmutable<Vector3>, epsilon?: number): boolean;
        /**
         * Returns true if the current Vector3 coordinates equals the given floats
         * Example Playground https://playground.babylonjs.com/#R1F8YU#20
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns true if both vectors are equal
         */
        equalsToFloats(x: number, y: number, z: number): boolean;
        /**
         * Multiplies the current Vector3 coordinates by the given ones
         * Example Playground https://playground.babylonjs.com/#R1F8YU#32
         * @param otherVector defines the second operand
         * @returns the current updated Vector3
         */
        multiplyInPlace(otherVector: DeepImmutable<IVector3LikeInternal>): this;
        /**
         * Returns a new Vector3, result of the multiplication of the current Vector3 by the given vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#31
         * @param otherVector defines the second operand
         * @returns the new Vector3
         */
        multiply(otherVector: DeepImmutable<IVector3LikeInternal>): Vector3;
        /**
         * Multiplies the current Vector3 by the given one and stores the result in the given vector "result"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#33
         * @param otherVector defines the second operand
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        multiplyToRef<T extends IVector3LikeInternal>(otherVector: DeepImmutable<IVector3LikeInternal>, result: T): T;
        /**
         * Returns a new Vector3 set with the result of the multiplication of the current Vector3 coordinates by the given floats
         * Example Playground https://playground.babylonjs.com/#R1F8YU#34
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the new Vector3
         */
        multiplyByFloats(x: number, y: number, z: number): Vector3;
        /**
         * Returns a new Vector3 set with the result of the division of the current Vector3 coordinates by the given ones
         * Example Playground https://playground.babylonjs.com/#R1F8YU#16
         * @param otherVector defines the second operand
         * @returns the new Vector3
         */
        divide(otherVector: DeepImmutable<IVector3LikeInternal>): Vector3;
        /**
         * Divides the current Vector3 coordinates by the given ones and stores the result in the given vector "result"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#18
         * @param otherVector defines the second operand
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        divideToRef<T extends IVector3LikeInternal>(otherVector: DeepImmutable<IVector3LikeInternal>, result: T): T;
        /**
         * Divides the current Vector3 coordinates by the given ones.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#17
         * @param otherVector defines the second operand
         * @returns the current updated Vector3
         */
        divideInPlace(otherVector: DeepImmutable<IVector3LikeInternal>): this;
        /**
         * Updates the current Vector3 with the minimal coordinate values between its and the given vector ones
         * Example Playground https://playground.babylonjs.com/#R1F8YU#29
         * @param other defines the second operand
         * @returns the current updated Vector3
         */
        minimizeInPlace(other: DeepImmutable<IVector3LikeInternal>): this;
        /**
         * Updates the current Vector3 with the maximal coordinate values between its and the given vector ones.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#27
         * @param other defines the second operand
         * @returns the current updated Vector3
         */
        maximizeInPlace(other: DeepImmutable<IVector3LikeInternal>): this;
        /**
         * Updates the current Vector3 with the minimal coordinate values between its and the given coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#30
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the current updated Vector3
         */
        minimizeInPlaceFromFloats(x: number, y: number, z: number): this;
        /**
         * Updates the current Vector3 with the maximal coordinate values between its and the given coordinates.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#28
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the current updated Vector3
         */
        maximizeInPlaceFromFloats(x: number, y: number, z: number): this;
        /**
         * Due to float precision, scale of a mesh could be uniform but float values are off by a small fraction
         * Check if is non uniform within a certain amount of decimal places to account for this
         * @param epsilon the amount the values can differ
         * @returns if the vector is non uniform to a certain number of decimal places
         */
        isNonUniformWithinEpsilon(epsilon: number): boolean;
        /**
         * Gets a boolean indicating that the vector is non uniform meaning x, y or z are not all the same
         */
        get isNonUniform(): boolean;
        /**
         * Gets the current Vector3's floored values and stores them in result
         * @param result the vector to store the result in
         * @returns the result vector
         */
        floorToRef<T extends IVector3LikeInternal>(result: T): T;
        /**
         * Gets a new Vector3 from current Vector3 floored values
         * Example Playground https://playground.babylonjs.com/#R1F8YU#22
         * @returns a new Vector3
         */
        floor(): Vector3;
        /**
         * Gets the current Vector3's fractional values and stores them in result
         * @param result the vector to store the result in
         * @returns the result vector
         */
        fractToRef<T extends IVector3LikeInternal>(result: T): T;
        /**
         * Gets a new Vector3 from current Vector3 fractional values
         * Example Playground https://playground.babylonjs.com/#R1F8YU#23
         * @returns a new Vector3
         */
        fract(): Vector3;
        /**
         * Gets the length of the Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#25
         * @returns the length of the Vector3
         */
        length(): number;
        /**
         * Gets the squared length of the Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#26
         * @returns squared length of the Vector3
         */
        lengthSquared(): number;
        /**
         * Gets a boolean indicating if the vector contains a zero in one of its components
         * Example Playground https://playground.babylonjs.com/#R1F8YU#1
         */
        get hasAZeroComponent(): boolean;
        /**
         * Normalize the current Vector3.
         * Please note that this is an in place operation.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#122
         * @returns the current updated Vector3
         */
        normalize(): this;
        /**
         * Reorders the x y z properties of the vector in place
         * Example Playground https://playground.babylonjs.com/#R1F8YU#44
         * @param order new ordering of the properties (eg. for vector 1,2,3 with "ZYX" will produce 3,2,1)
         * @returns the current updated vector
         */
        reorderInPlace(order: string): this;
        /**
         * Rotates the vector around 0,0,0 by a quaternion
         * Example Playground https://playground.babylonjs.com/#R1F8YU#47
         * @param quaternion the rotation quaternion
         * @param result vector to store the result
         * @returns the resulting vector
         */
        rotateByQuaternionToRef<T extends Vector3>(quaternion: Quaternion, result: T): T;
        /**
         * Rotates a vector around a given point
         * Example Playground https://playground.babylonjs.com/#R1F8YU#46
         * @param quaternion the rotation quaternion
         * @param point the point to rotate around
         * @param result vector to store the result
         * @returns the resulting vector
         */
        rotateByQuaternionAroundPointToRef<T extends Vector3>(quaternion: Quaternion, point: Vector3, result: T): T;
        /**
         * Returns a new Vector3 as the cross product of the current vector and the "other" one
         * The cross product is then orthogonal to both current and "other"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#14
         * @param other defines the right operand
         * @returns the cross product
         */
        cross(other: Vector3): Vector3;
        /**
         * Normalize the current Vector3 with the given input length.
         * Please note that this is an in place operation.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#123
         * @param len the length of the vector
         * @returns the current updated Vector3
         */
        normalizeFromLength(len: number): this;
        /**
         * Normalize the current Vector3 to a new vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#124
         * @returns the new Vector3
         */
        normalizeToNew(): Vector3;
        /**
         * Normalize the current Vector3 to the reference
         * Example Playground https://playground.babylonjs.com/#R1F8YU#125
         * @param result define the Vector3 to update
         * @returns the updated Vector3
         */
        normalizeToRef<T extends IVector3LikeInternal>(result: T): T;
        /**
         * Creates a new Vector3 copied from the current Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#11
         * @returns the new Vector3
         */
        clone(): Vector3;
        /**
         * Copies the given vector coordinates to the current Vector3 ones
         * Example Playground https://playground.babylonjs.com/#R1F8YU#12
         * @param source defines the source Vector3
         * @returns the current updated Vector3
         */
        copyFrom(source: DeepImmutable<Vector3>): this;
        /**
         * Copies the given floats to the current Vector3 coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#13
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the current updated Vector3
         */
        copyFromFloats(x: number, y: number, z: number): this;
        /**
         * Copies the given floats to the current Vector3 coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#58
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @returns the current updated Vector3
         */
        set(x: number, y: number, z: number): this;
        /**
         * Copies the given float to the current Vector3 coordinates
         * Example Playground https://playground.babylonjs.com/#R1F8YU#59
         * @param v defines the x, y and z coordinates of the operand
         * @returns the current updated Vector3
         */
        setAll(v: number): this;
        /**
         * Get the clip factor between two vectors
         * Example Playground https://playground.babylonjs.com/#R1F8YU#126
         * @param vector0 defines the first operand
         * @param vector1 defines the second operand
         * @param axis defines the axis to use
         * @param size defines the size along the axis
         * @returns the clip factor
         */
        static GetClipFactor(vector0: DeepImmutable<Vector3>, vector1: DeepImmutable<Vector3>, axis: DeepImmutable<Vector3>, size: number): number;
        /**
         * Get angle between two vectors
         * Example Playground https://playground.babylonjs.com/#R1F8YU#86
         * @param vector0 the starting point
         * @param vector1 the ending point
         * @param normal direction of the normal
         * @returns the angle between vector0 and vector1
         */
        static GetAngleBetweenVectors(vector0: DeepImmutable<Vector3>, vector1: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>): number;
        /**
         * Get angle between two vectors projected on a plane
         * Example Playground https://playground.babylonjs.com/#R1F8YU#87
         * Expectation compute time: 0.01 ms (median) and 0.02 ms (percentile 95%)
         * @param vector0 angle between vector0 and vector1
         * @param vector1 angle between vector0 and vector1
         * @param normal Normal of the projection plane
         * @returns the angle in radians (float) between vector0 and vector1 projected on the plane with the specified normal
         */
        static GetAngleBetweenVectorsOnPlane(vector0: DeepImmutable<Vector3>, vector1: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>): number;
        /**
         * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point and stores it in the ref Vector3
         * Example PG https://playground.babylonjs.com/#R1F8YU#189
         * @param start the starting point
         * @param target the target point
         * @param ref the vector3 to store the result
         * @returns ref in the form (pitch, yaw, 0)
         */
        static PitchYawRollToMoveBetweenPointsToRef<T extends Vector3>(start: Vector3, target: Vector3, ref: T): T;
        /**
         * Gets the rotation that aligns the roll axis (Y) to the line joining the start point to the target point
         * Example PG https://playground.babylonjs.com/#R1F8YU#188
         * @param start the starting point
         * @param target the target point
         * @returns the rotation in the form (pitch, yaw, 0)
         */
        static PitchYawRollToMoveBetweenPoints(start: Vector3, target: Vector3): Vector3;
        /**
         * Slerp between two vectors. See also `SmoothToRef`
         * Slerp is a spherical linear interpolation
         * giving a slow in and out effect
         * Example Playground 1 https://playground.babylonjs.com/#R1F8YU#108
         * Example Playground 2 https://playground.babylonjs.com/#R1F8YU#109
         * @param vector0 Start vector
         * @param vector1 End vector
         * @param slerp amount (will be clamped between 0 and 1)
         * @param result The slerped vector
         * @returns The slerped vector
         */
        static SlerpToRef<T extends Vector3 = Vector3>(vector0: Vector3, vector1: Vector3, slerp: number, result: T): T;
        /**
         * Smooth interpolation between two vectors using Slerp
         * Example Playground https://playground.babylonjs.com/#R1F8YU#110
         * @param source source vector
         * @param goal goal vector
         * @param deltaTime current interpolation frame
         * @param lerpTime total interpolation time
         * @param result the smoothed vector
         * @returns the smoothed vector
         */
        static SmoothToRef<T extends Vector3 = Vector3>(source: Vector3, goal: Vector3, deltaTime: number, lerpTime: number, result: T): T;
        /**
         * Returns a new Vector3 set from the index "offset" of the given array
         * Example Playground https://playground.babylonjs.com/#R1F8YU#83
         * @param array defines the source array
         * @param offset defines the offset in the source array
         * @returns the new Vector3
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Vector3;
        /**
         * Returns a new Vector3 set from the index "offset" of the given Float32Array
         * @param array defines the source array
         * @param offset defines the offset in the source array
         * @returns the new Vector3
         * @deprecated Please use FromArray instead.
         */
        static FromFloatArray(array: DeepImmutable<Float32Array>, offset?: number): Vector3;
        /**
         * Sets the given vector "result" with the element values from the index "offset" of the given array
         * Example Playground https://playground.babylonjs.com/#R1F8YU#84
         * @param array defines the source array
         * @param offset defines the offset in the source array
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static FromArrayToRef<T extends Vector3>(array: DeepImmutable<ArrayLike<number>>, offset: number, result: T): T;
        /**
         * Sets the given vector "result" with the element values from the index "offset" of the given Float32Array
         * @param array defines the source array
         * @param offset defines the offset in the source array
         * @param result defines the Vector3 where to store the result
         * @deprecated Please use FromArrayToRef instead.
         * @returns result input
         */
        static FromFloatArrayToRef<T extends Vector3>(array: DeepImmutable<Float32Array>, offset: number, result: T): T;
        /**
         * Sets the given vector "result" with the given floats.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#85
         * @param x defines the x coordinate of the source
         * @param y defines the y coordinate of the source
         * @param z defines the z coordinate of the source
         * @param result defines the Vector3 where to store the result
         * @returns the result vector
         */
        static FromFloatsToRef<T extends Vector3 = Vector3>(x: number, y: number, z: number, result: T): T;
        /**
         * Returns a new Vector3 set to (0.0, 0.0, 0.0)
         * @returns a new empty Vector3
         */
        static Zero(): Vector3;
        /**
         * Returns a new Vector3 set to (1.0, 1.0, 1.0)
         * @returns a new Vector3
         */
        static One(): Vector3;
        /**
         * Returns a new Vector3 set to (0.0, 1.0, 0.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @returns a new up Vector3
         */
        static Up(): Vector3;
        /**
         * Gets an up Vector3 that must not be updated
         */
        static get UpReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a down Vector3 that must not be updated
         */
        static get DownReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a right Vector3 that must not be updated
         */
        static get RightReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a left Vector3 that must not be updated
         */
        static get LeftReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a forward Vector3 that must not be updated
         */
        static get LeftHandedForwardReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a forward Vector3 that must not be updated
         */
        static get RightHandedForwardReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a backward Vector3 that must not be updated
         */
        static get LeftHandedBackwardReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a backward Vector3 that must not be updated
         */
        static get RightHandedBackwardReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a zero Vector3 that must not be updated
         */
        static get ZeroReadOnly(): DeepImmutable<Vector3>;
        /**
         * Gets a one Vector3 that must not be updated
         */
        static get OneReadOnly(): DeepImmutable<Vector3>;
        /**
         * Returns a new Vector3 set to (0.0, -1.0, 0.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @returns a new down Vector3
         */
        static Down(): Vector3;
        /**
         * Returns a new Vector3 set to (0.0, 0.0, 1.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @param rightHandedSystem is the scene right-handed (negative z)
         * @returns a new forward Vector3
         */
        static Forward(rightHandedSystem?: boolean): Vector3;
        /**
         * Returns a new Vector3 set to (0.0, 0.0, -1.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @param rightHandedSystem is the scene right-handed (negative-z)
         * @returns a new Backward Vector3
         */
        static Backward(rightHandedSystem?: boolean): Vector3;
        /**
         * Returns a new Vector3 set to (1.0, 0.0, 0.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @returns a new right Vector3
         */
        static Right(): Vector3;
        /**
         * Returns a new Vector3 set to (-1.0, 0.0, 0.0)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#71
         * @returns a new left Vector3
         */
        static Left(): Vector3;
        /**
         * Returns a new Vector3 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @returns a Vector3 with random values between min and max
         */
        static Random(min?: number, max?: number): Vector3;
        /**
         * Sets a Vector3 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @param ref the ref to store the values in
         * @returns the ref with random values between min and max
         */
        static RandomToRef<T extends Vector3>(min: number | undefined, max: number | undefined, ref: T): T;
        /**
         * Returns a new Vector3 set with the result of the transformation by the given matrix of the given vector.
         * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#111
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @returns the transformed Vector3
         */
        static TransformCoordinates(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>): Vector3;
        /**
         * Sets the given vector "result" coordinates with the result of the transformation by the given matrix of the given vector
         * This method computes transformed coordinates only, not transformed direction vectors (ie. it takes translation in account)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#113
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static TransformCoordinatesToRef<T extends Vector3>(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Sets the given vector "result" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)
         * This method computes transformed coordinates only, not transformed direction vectors
         * Example Playground https://playground.babylonjs.com/#R1F8YU#115
         * @param x define the x coordinate of the source vector
         * @param y define the y coordinate of the source vector
         * @param z define the z coordinate of the source vector
         * @param transformation defines the transformation matrix
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static TransformCoordinatesFromFloatsToRef<T extends Vector3>(x: number, y: number, z: number, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Returns a new Vector3 set with the result of the normal transformation by the given matrix of the given vector
         * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#112
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @returns the new Vector3
         */
        static TransformNormal(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>): Vector3;
        /**
         * Sets the given vector "result" with the result of the normal transformation by the given matrix of the given vector
         * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#114
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static TransformNormalToRef<T extends Vector3>(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Sets the given vector "result" with the result of the normal transformation by the given matrix of the given floats (x, y, z)
         * This methods computes transformed normalized direction vectors only (ie. it does not apply translation)
         * Example Playground https://playground.babylonjs.com/#R1F8YU#116
         * @param x define the x coordinate of the source vector
         * @param y define the y coordinate of the source vector
         * @param z define the z coordinate of the source vector
         * @param transformation defines the transformation matrix
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static TransformNormalFromFloatsToRef<T extends Vector3>(x: number, y: number, z: number, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Returns a new Vector3 located for "amount" on the CatmullRom interpolation spline defined by the vectors "value1", "value2", "value3", "value4"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#69
         * @param value1 defines the first control point
         * @param value2 defines the second control point
         * @param value3 defines the third control point
         * @param value4 defines the fourth control point
         * @param amount defines the amount on the spline to use
         * @returns the new Vector3
         */
        static CatmullRom(value1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>, value3: DeepImmutable<Vector3>, value4: DeepImmutable<Vector3>, amount: number): Vector3;
        /**
         * Returns a new Vector3 set with the coordinates of "value", if the vector "value" is in the cube defined by the vectors "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * Example Playground https://playground.babylonjs.com/#R1F8YU#76
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @returns the new Vector3
         */
        static Clamp(value: DeepImmutable<Vector3>, min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>): Vector3;
        /**
         * Sets the given vector "result" with the coordinates of "value", if the vector "value" is in the cube defined by the vectors "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * Example Playground https://playground.babylonjs.com/#R1F8YU#77
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static ClampToRef<T extends Vector3>(value: DeepImmutable<Vector3>, min: DeepImmutable<Vector3>, max: DeepImmutable<Vector3>, result: T): T;
        /**
         * Checks if a given vector is inside a specific range
         * Example Playground https://playground.babylonjs.com/#R1F8YU#75
         * @param v defines the vector to test
         * @param min defines the minimum range
         * @param max defines the maximum range
         */
        static CheckExtends(v: Vector3, min: Vector3, max: Vector3): void;
        /**
         * Returns a new Vector3 located for "amount" (float) on the Hermite interpolation spline defined by the vectors "value1", "tangent1", "value2", "tangent2"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#89
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent vector
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent vector
         * @param amount defines the amount on the interpolation spline (between 0 and 1)
         * @returns the new Vector3
         */
        static Hermite(value1: DeepImmutable<Vector3>, tangent1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>, tangent2: DeepImmutable<Vector3>, amount: number): Vector3;
        /**
         * Returns a new Vector3 which is the 1st derivative of the Hermite spline defined by the vectors "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#R1F8YU#90
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @returns 1st derivative
         */
        static Hermite1stDerivative(value1: DeepImmutable<Vector3>, tangent1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>, tangent2: DeepImmutable<Vector3>, time: number): Vector3;
        /**
         * Update a Vector3 with the 1st derivative of the Hermite spline defined by the vectors "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#R1F8YU#91
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @param result define where to store the derivative
         * @returns result input
         */
        static Hermite1stDerivativeToRef<T extends Vector3>(value1: DeepImmutable<Vector3>, tangent1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>, tangent2: DeepImmutable<Vector3>, time: number, result: T): T;
        /**
         * Returns a new Vector3 located for "amount" (float) on the linear interpolation between the vectors "start" and "end"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#95
         * @param start defines the start value
         * @param end defines the end value
         * @param amount max defines amount between both (between 0 and 1)
         * @returns the new Vector3
         */
        static Lerp(start: DeepImmutable<Vector3>, end: DeepImmutable<Vector3>, amount: number): Vector3;
        /**
         * Sets the given vector "result" with the result of the linear interpolation from the vector "start" for "amount" to the vector "end"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#93
         * @param start defines the start value
         * @param end defines the end value
         * @param amount max defines amount between both (between 0 and 1)
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static LerpToRef<T extends Vector3>(start: DeepImmutable<Vector3>, end: DeepImmutable<Vector3>, amount: number, result: T): T;
        /**
         * Returns the dot product (float) between the vectors "left" and "right"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#82
         * @param left defines the left operand
         * @param right defines the right operand
         * @returns the dot product
         */
        static Dot(left: DeepImmutable<Vector3>, right: DeepImmutable<Vector3>): number;
        /**
         * Returns the dot product (float) between the current vectors and "otherVector"
         * @param otherVector defines the right operand
         * @returns the dot product
         */
        dot(otherVector: DeepImmutable<Vector3>): number;
        /**
         * Returns a new Vector3 as the cross product of the vectors "left" and "right"
         * The cross product is then orthogonal to both "left" and "right"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#15
         * @param left defines the left operand
         * @param right defines the right operand
         * @returns the cross product
         */
        static Cross(left: DeepImmutable<Vector3>, right: DeepImmutable<Vector3>): Vector3;
        /**
         * Sets the given vector "result" with the cross product of "left" and "right"
         * The cross product is then orthogonal to both "left" and "right"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#78
         * @param left defines the left operand
         * @param right defines the right operand
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static CrossToRef<T extends Vector3>(left: DeepImmutable<Vector3>, right: DeepImmutable<Vector3>, result: T): T;
        /**
         * Returns a new Vector3 as the normalization of the given vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#98
         * @param vector defines the Vector3 to normalize
         * @returns the new Vector3
         */
        static Normalize(vector: DeepImmutable<Vector3>): Vector3;
        /**
         * Sets the given vector "result" with the normalization of the given first vector
         * Example Playground https://playground.babylonjs.com/#R1F8YU#98
         * @param vector defines the Vector3 to normalize
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static NormalizeToRef<T extends Vector3>(vector: DeepImmutable<Vector3>, result: T): T;
        /**
         * Project a Vector3 onto screen space
         * Example Playground https://playground.babylonjs.com/#R1F8YU#101
         * @param vector defines the Vector3 to project
         * @param world defines the world matrix to use
         * @param transform defines the transform (view x projection) matrix to use
         * @param viewport defines the screen viewport to use
         * @returns the new Vector3
         */
        static Project(vector: DeepImmutable<Vector3>, world: DeepImmutable<Matrix>, transform: DeepImmutable<Matrix>, viewport: DeepImmutable<Viewport>): Vector3;
        /**
         * Project a Vector3 onto screen space to reference
         * Example Playground https://playground.babylonjs.com/#R1F8YU#102
         * @param vector defines the Vector3 to project
         * @param world defines the world matrix to use
         * @param transform defines the transform (view x projection) matrix to use
         * @param viewport defines the screen viewport to use
         * @param result the vector in which the screen space will be stored
         * @returns result input
         */
        static ProjectToRef<T extends Vector3>(vector: DeepImmutable<Vector3>, world: DeepImmutable<Matrix>, transform: DeepImmutable<Matrix>, viewport: DeepImmutable<Viewport>, result: T): T;
        /**
         * Reflects a vector off the plane defined by a normalized normal
         * @param inDirection defines the vector direction
         * @param normal defines the normal - Must be normalized
         * @returns the resulting vector
         */
        static Reflect(inDirection: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>): Vector3;
        /**
         * Reflects a vector off the plane defined by a normalized normal to reference
         * @param inDirection defines the vector direction
         * @param normal defines the normal - Must be normalized
         * @param ref defines the Vector3 where to store the result
         * @returns the resulting vector
         */
        static ReflectToRef<T extends Vector3>(inDirection: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>, ref: T): T;
        /**
         * Unproject from screen space to object space
         * Example Playground https://playground.babylonjs.com/#R1F8YU#121
         * @param source defines the screen space Vector3 to use
         * @param viewportWidth defines the current width of the viewport
         * @param viewportHeight defines the current height of the viewport
         * @param world defines the world matrix to use (can be set to Identity to go to world space)
         * @param transform defines the transform (view x projection) matrix to use
         * @returns the new Vector3
         */
        static UnprojectFromTransform(source: DeepImmutable<Vector3>, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, transform: DeepImmutable<Matrix>): Vector3;
        /**
         * Unproject from screen space to object space
         * Example Playground https://playground.babylonjs.com/#R1F8YU#117
         * @param source defines the screen space Vector3 to use
         * @param viewportWidth defines the current width of the viewport
         * @param viewportHeight defines the current height of the viewport
         * @param world defines the world matrix to use (can be set to Identity to go to world space)
         * @param view defines the view matrix to use
         * @param projection defines the projection matrix to use
         * @returns the new Vector3
         */
        static Unproject(source: DeepImmutable<Vector3>, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): Vector3;
        /**
         * Unproject from screen space to object space
         * Example Playground https://playground.babylonjs.com/#R1F8YU#119
         * @param source defines the screen space Vector3 to use
         * @param viewportWidth defines the current width of the viewport
         * @param viewportHeight defines the current height of the viewport
         * @param world defines the world matrix to use (can be set to Identity to go to world space)
         * @param view defines the view matrix to use
         * @param projection defines the projection matrix to use
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static UnprojectToRef<T extends Vector3>(source: DeepImmutable<Vector3>, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>, result: T): T;
        /**
         * Unproject from screen space to object space
         * Example Playground https://playground.babylonjs.com/#R1F8YU#120
         * @param sourceX defines the screen space x coordinate to use
         * @param sourceY defines the screen space y coordinate to use
         * @param sourceZ defines the screen space z coordinate to use
         * @param viewportWidth defines the current width of the viewport
         * @param viewportHeight defines the current height of the viewport
         * @param world defines the world matrix to use (can be set to Identity to go to world space)
         * @param view defines the view matrix to use
         * @param projection defines the projection matrix to use
         * @param result defines the Vector3 where to store the result
         * @returns result input
         */
        static UnprojectFloatsToRef<T extends Vector3>(sourceX: float, sourceY: float, sourceZ: float, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>, result: T): T;
        /**
         * Gets the minimal coordinate values between two Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#97
         * @param left defines the first operand
         * @param right defines the second operand
         * @returns the new Vector3
         */
        static Minimize(left: DeepImmutable<Vector3>, right: DeepImmutable<Vector3>): Vector3;
        /**
         * Gets the maximal coordinate values between two Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#96
         * @param left defines the first operand
         * @param right defines the second operand
         * @returns the new Vector3
         */
        static Maximize(left: DeepImmutable<Vector3>, right: DeepImmutable<Vector3>): Vector3;
        /**
         * Returns the distance between the vectors "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#81
         * @param value1 defines the first operand
         * @param value2 defines the second operand
         * @returns the distance
         */
        static Distance(value1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>): number;
        /**
         * Returns the squared distance between the vectors "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#80
         * @param value1 defines the first operand
         * @param value2 defines the second operand
         * @returns the squared distance
         */
        static DistanceSquared(value1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>): number;
        /**
         * Projects "vector" on the triangle determined by its extremities "p0", "p1" and "p2", stores the result in "ref"
         * and returns the distance to the projected point.
         * Example Playground https://playground.babylonjs.com/#R1F8YU#104
         * From http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.4264&rep=rep1&type=pdf
         *
         * @param vector the vector to get distance from
         * @param p0 extremity of the triangle
         * @param p1 extremity of the triangle
         * @param p2 extremity of the triangle
         * @param ref variable to store the result to
         * @returns The distance between "ref" and "vector"
         */
        static ProjectOnTriangleToRef(vector: DeepImmutable<Vector3>, p0: DeepImmutable<Vector3>, p1: DeepImmutable<Vector3>, p2: DeepImmutable<Vector3>, ref: Vector3): number;
        /**
         * Returns a new Vector3 located at the center between "value1" and "value2"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#72
         * @param value1 defines the first operand
         * @param value2 defines the second operand
         * @returns the new Vector3
         */
        static Center(value1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>): Vector3;
        /**
         * Gets the center of the vectors "value1" and "value2" and stores the result in the vector "ref"
         * Example Playground https://playground.babylonjs.com/#R1F8YU#73
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @param ref defines third vector
         * @returns ref
         */
        static CenterToRef<T extends Vector3>(value1: DeepImmutable<Vector3>, value2: DeepImmutable<Vector3>, ref: T): T;
        /**
         * Given three orthogonal normalized left-handed oriented Vector3 axis in space (target system),
         * RotationFromAxis() returns the rotation Euler angles (ex : rotation.x, rotation.y, rotation.z) to apply
         * to something in order to rotate it from its local system to the given target system
         * Note: axis1, axis2 and axis3 are normalized during this operation
         * Example Playground https://playground.babylonjs.com/#R1F8YU#106
         * @param axis1 defines the first axis
         * @param axis2 defines the second axis
         * @param axis3 defines the third axis
         * @returns a new Vector3
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/target_align
         */
        static RotationFromAxis(axis1: DeepImmutable<Vector3>, axis2: DeepImmutable<Vector3>, axis3: DeepImmutable<Vector3>): Vector3;
        /**
         * The same than RotationFromAxis but updates the given ref Vector3 parameter instead of returning a new Vector3
         * Example Playground https://playground.babylonjs.com/#R1F8YU#107
         * @param axis1 defines the first axis
         * @param axis2 defines the second axis
         * @param axis3 defines the third axis
         * @param ref defines the Vector3 where to store the result
         * @returns result input
         */
        static RotationFromAxisToRef<T extends Vector3>(axis1: DeepImmutable<Vector3>, axis2: DeepImmutable<Vector3>, axis3: DeepImmutable<Vector3>, ref: T): T;
    }
    /**
     * Vector4 class created for EulerAngle class conversion to Quaternion
     */
    export class Vector4 implements Vector<Tuple<number, 4>, IVector4Like>, IVector4Like {
        /**
         * If the first vector is flagged with integers (as everything is 0,0,0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent vectors are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all Vector4 instances that it creates.
         * But the original Vector4 instances are unchanged and has a "deprecated map".
         * If we keep using the Vector4 instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Vector4>;
        private static _ZeroReadOnly;
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<[4]>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /** @internal */
        _x: number;
        /** @internal */
        _y: number;
        /** @internal */
        _z: number;
        /** @internal */
        _w: number;
        /** @internal */
        _isDirty: boolean;
        /** Gets or sets the x coordinate */
        get x(): number;
        set x(value: number);
        /** Gets or sets the y coordinate */
        get y(): number;
        set y(value: number);
        /** Gets or sets the z coordinate */
        get z(): number;
        set z(value: number);
        /** Gets or sets the w coordinate */
        get w(): number;
        set w(value: number);
        /**
         * Creates a Vector4 object from the given floats.
         * @param x x value of the vector
         * @param y y value of the vector
         * @param z z value of the vector
         * @param w w value of the vector
         */
        constructor(x?: number, y?: number, z?: number, w?: number);
        /**
         * Returns the string with the Vector4 coordinates.
         * @returns a string containing all the vector values
         */
        toString(): string;
        /**
         * Returns the string "Vector4".
         * @returns "Vector4"
         */
        getClassName(): string;
        /**
         * Returns the Vector4 hash code.
         * @returns a unique hash code
         */
        getHashCode(): number;
        /**
         * Returns a new array populated with 4 elements : the Vector4 coordinates.
         * @returns the resulting array
         */
        asArray(): Tuple<number, 4>;
        /**
         * Populates the given array from the given index with the Vector4 coordinates.
         * @param array array to populate
         * @param index index of the array to start at (default: 0)
         * @returns the Vector4.
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current vector from an array
         * @param array defines the destination array
         * @param offset defines the offset in the destination array
         * @returns the current Vector3
         */
        fromArray(array: FloatArray, offset?: number): this;
        /**
         * Adds the given vector to the current Vector4.
         * @param otherVector the vector to add
         * @returns the updated Vector4.
         */
        addInPlace(otherVector: DeepImmutable<Vector4>): this;
        /**
         * Adds the given coordinates to the current Vector4
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @param w defines the w coordinate of the operand
         * @returns the current updated Vector4
         */
        addInPlaceFromFloats(x: number, y: number, z: number, w: number): this;
        /**
         * Returns a new Vector4 as the result of the addition of the current Vector4 and the given one.
         * @param otherVector the vector to add
         * @returns the resulting vector
         */
        add(otherVector: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Updates the given vector "result" with the result of the addition of the current Vector4 and the given one.
         * @param otherVector the vector to add
         * @param result the vector to store the result
         * @returns result input
         */
        addToRef<T extends IVector4Like>(otherVector: DeepImmutable<IVector4Like>, result: T): T;
        /**
         * Subtract in place the given vector from the current Vector4.
         * @param otherVector the vector to subtract
         * @returns the updated Vector4.
         */
        subtractInPlace(otherVector: DeepImmutable<IVector4Like>): this;
        /**
         * Returns a new Vector4 with the result of the subtraction of the given vector from the current Vector4.
         * @param otherVector the vector to add
         * @returns the new vector with the result
         */
        subtract(otherVector: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Sets the given vector "result" with the result of the subtraction of the given vector from the current Vector4.
         * @param otherVector the vector to subtract
         * @param result the vector to store the result
         * @returns result input
         */
        subtractToRef<T extends IVector4Like>(otherVector: DeepImmutable<IVector4Like>, result: T): T;
        /**
         * Returns a new Vector4 set with the result of the subtraction of the given floats from the current Vector4 coordinates.
         * @param x value to subtract
         * @param y value to subtract
         * @param z value to subtract
         * @param w value to subtract
         * @returns new vector containing the result
         */
        subtractFromFloats(x: number, y: number, z: number, w: number): Vector4;
        /**
         * Sets the given vector "result" set with the result of the subtraction of the given floats from the current Vector4 coordinates.
         * @param x value to subtract
         * @param y value to subtract
         * @param z value to subtract
         * @param w value to subtract
         * @param result the vector to store the result in
         * @returns result input
         */
        subtractFromFloatsToRef<T extends IVector4Like>(x: number, y: number, z: number, w: number, result: T): T;
        /**
         * Returns a new Vector4 set with the current Vector4 negated coordinates.
         * @returns a new vector with the negated values
         */
        negate(): Vector4;
        /**
         * Negate this vector in place
         * @returns this
         */
        negateInPlace(): this;
        /**
         * Negate the current Vector4 and stores the result in the given vector "result" coordinates
         * @param result defines the Vector3 object where to store the result
         * @returns the result
         */
        negateToRef<T extends IVector4Like>(result: T): T;
        /**
         * Multiplies the current Vector4 coordinates by scale (float).
         * @param scale the number to scale with
         * @returns the updated Vector4.
         */
        scaleInPlace(scale: number): this;
        /**
         * Returns a new Vector4 set with the current Vector4 coordinates multiplied by scale (float).
         * @param scale the number to scale with
         * @returns a new vector with the result
         */
        scale(scale: number): Vector4;
        /**
         * Sets the given vector "result" with the current Vector4 coordinates multiplied by scale (float).
         * @param scale the number to scale with
         * @param result a vector to store the result in
         * @returns result input
         */
        scaleToRef<T extends IVector4Like>(scale: number, result: T): T;
        /**
         * Scale the current Vector4 values by a factor and add the result to a given Vector4
         * @param scale defines the scale factor
         * @param result defines the Vector4 object where to store the result
         * @returns result input
         */
        scaleAndAddToRef<T extends IVector4Like>(scale: number, result: T): T;
        /**
         * Boolean : True if the current Vector4 coordinates are stricly equal to the given ones.
         * @param otherVector the vector to compare against
         * @returns true if they are equal
         */
        equals(otherVector: DeepImmutable<IVector4Like>): boolean;
        /**
         * Boolean : True if the current Vector4 coordinates are each beneath the distance "epsilon" from the given vector ones.
         * @param otherVector vector to compare against
         * @param epsilon (Default: very small number)
         * @returns true if they are equal
         */
        equalsWithEpsilon(otherVector: DeepImmutable<IVector4Like>, epsilon?: number): boolean;
        /**
         * Boolean : True if the given floats are strictly equal to the current Vector4 coordinates.
         * @param x x value to compare against
         * @param y y value to compare against
         * @param z z value to compare against
         * @param w w value to compare against
         * @returns true if equal
         */
        equalsToFloats(x: number, y: number, z: number, w: number): boolean;
        /**
         * Multiplies in place the current Vector4 by the given one.
         * @param otherVector vector to multiple with
         * @returns the updated Vector4.
         */
        multiplyInPlace(otherVector: DeepImmutable<IVector4Like>): this;
        /**
         * Returns a new Vector4 set with the multiplication result of the current Vector4 and the given one.
         * @param otherVector vector to multiple with
         * @returns resulting new vector
         */
        multiply(otherVector: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Updates the given vector "result" with the multiplication result of the current Vector4 and the given one.
         * @param otherVector vector to multiple with
         * @param result vector to store the result
         * @returns result input
         */
        multiplyToRef<T extends IVector4Like>(otherVector: DeepImmutable<IVector4Like>, result: T): T;
        /**
         * Returns a new Vector4 set with the multiplication result of the given floats and the current Vector4 coordinates.
         * @param x x value multiply with
         * @param y y value multiply with
         * @param z z value multiply with
         * @param w w value multiply with
         * @returns resulting new vector
         */
        multiplyByFloats(x: number, y: number, z: number, w: number): Vector4;
        /**
         * Returns a new Vector4 set with the division result of the current Vector4 by the given one.
         * @param otherVector vector to devide with
         * @returns resulting new vector
         */
        divide(otherVector: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Updates the given vector "result" with the division result of the current Vector4 by the given one.
         * @param otherVector vector to devide with
         * @param result vector to store the result
         * @returns result input
         */
        divideToRef<T extends IVector4Like>(otherVector: DeepImmutable<IVector4Like>, result: T): T;
        /**
         * Divides the current Vector3 coordinates by the given ones.
         * @param otherVector vector to devide with
         * @returns the updated Vector3.
         */
        divideInPlace(otherVector: DeepImmutable<IVector4Like>): this;
        /**
         * Updates the Vector4 coordinates with the minimum values between its own and the given vector ones
         * @param other defines the second operand
         * @returns the current updated Vector4
         */
        minimizeInPlace(other: DeepImmutable<IVector4Like>): this;
        /**
         * Updates the Vector4 coordinates with the maximum values between its own and the given vector ones
         * @param other defines the second operand
         * @returns the current updated Vector4
         */
        maximizeInPlace(other: DeepImmutable<IVector4Like>): this;
        /**
         * Updates the current Vector4 with the minimal coordinate values between its and the given coordinates
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @param w defines the w coordinate of the operand
         * @returns the current updated Vector4
         */
        minimizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this;
        /**
         * Updates the current Vector4 with the maximal coordinate values between its and the given coordinates.
         * @param x defines the x coordinate of the operand
         * @param y defines the y coordinate of the operand
         * @param z defines the z coordinate of the operand
         * @param w defines the w coordinate of the operand
         * @returns the current updated Vector4
         */
        maximizeInPlaceFromFloats(x: number, y: number, z: number, w: number): this;
        /**
         * Gets the current Vector4's floored values and stores them in result
         * @param result the vector to store the result in
         * @returns the result vector
         */
        floorToRef<T extends IVector4Like>(result: T): T;
        /**
         * Gets a new Vector4 from current Vector4 floored values
         * @returns a new Vector4
         */
        floor(): Vector4;
        /**
         * Gets the current Vector4's fractional values and stores them in result
         * @param result the vector to store the result in
         * @returns the result vector
         */
        fractToRef<T extends IVector4Like>(result: T): T;
        /**
         * Gets a new Vector4 from current Vector4 fractional values
         * @returns a new Vector4
         */
        fract(): Vector4;
        /**
         * Returns the Vector4 length (float).
         * @returns the length
         */
        length(): number;
        /**
         * Returns the Vector4 squared length (float).
         * @returns the length squared
         */
        lengthSquared(): number;
        /**
         * Normalizes in place the Vector4.
         * @returns the updated Vector4.
         */
        normalize(): this;
        /**
         * Normalize the current Vector4 with the given input length.
         * Please note that this is an in place operation.
         * @param len the length of the vector
         * @returns the current updated Vector4
         */
        normalizeFromLength(len: number): this;
        /**
         * Normalize the current Vector4 to a new vector
         * @returns the new Vector4
         */
        normalizeToNew(): Vector4;
        /**
         * Normalize the current Vector4 to the reference
         * @param reference define the Vector4 to update
         * @returns the updated Vector4
         */
        normalizeToRef<T extends IVector4Like>(reference: T): T;
        /**
         * Returns a new Vector3 from the Vector4 (x, y, z) coordinates.
         * @returns this converted to a new vector3
         */
        toVector3(): Vector3;
        /**
         * Returns a new Vector4 copied from the current one.
         * @returns the new cloned vector
         */
        clone(): Vector4;
        /**
         * Updates the current Vector4 with the given one coordinates.
         * @param source the source vector to copy from
         * @returns the updated Vector4.
         */
        copyFrom(source: DeepImmutable<IVector4Like>): this;
        /**
         * Updates the current Vector4 coordinates with the given floats.
         * @param x float to copy from
         * @param y float to copy from
         * @param z float to copy from
         * @param w float to copy from
         * @returns the updated Vector4.
         */
        copyFromFloats(x: number, y: number, z: number, w: number): this;
        /**
         * Updates the current Vector4 coordinates with the given floats.
         * @param x float to set from
         * @param y float to set from
         * @param z float to set from
         * @param w float to set from
         * @returns the updated Vector4.
         */
        set(x: number, y: number, z: number, w: number): this;
        /**
         * Copies the given float to the current Vector4 coordinates
         * @param v defines the x, y, z and w coordinates of the operand
         * @returns the current updated Vector4
         */
        setAll(v: number): this;
        /**
         * Returns the dot product (float) between the current vectors and "otherVector"
         * @param otherVector defines the right operand
         * @returns the dot product
         */
        dot(otherVector: DeepImmutable<IVector4Like>): number;
        /**
         * Returns a new Vector4 set from the starting index of the given array.
         * @param array the array to pull values from
         * @param offset the offset into the array to start at
         * @returns the new vector
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Vector4;
        /**
         * Updates the given vector "result" from the starting index of the given array.
         * @param array the array to pull values from
         * @param offset the offset into the array to start at
         * @param result the vector to store the result in
         * @returns result input
         */
        static FromArrayToRef<T extends IVector4Like>(array: DeepImmutable<ArrayLike<number>>, offset: number, result: T): T;
        /**
         * Updates the given vector "result" from the starting index of the given Float32Array.
         * @param array the array to pull values from
         * @param offset the offset into the array to start at
         * @param result the vector to store the result in
         * @returns result input
         */
        static FromFloatArrayToRef<T extends IVector4Like>(array: DeepImmutable<Float32Array>, offset: number, result: T): T;
        /**
         * Updates the given vector "result" coordinates from the given floats.
         * @param x float to set from
         * @param y float to set from
         * @param z float to set from
         * @param w float to set from
         * @param result the vector to the floats in
         * @returns result input
         */
        static FromFloatsToRef<T extends IVector4Like>(x: number, y: number, z: number, w: number, result: T): T;
        /**
         * Returns a new Vector4 set to (0.0, 0.0, 0.0, 0.0)
         * @returns the new vector
         */
        static Zero(): Vector4;
        /**
         * Returns a new Vector4 set to (1.0, 1.0, 1.0, 1.0)
         * @returns the new vector
         */
        static One(): Vector4;
        /**
         * Returns a new Vector4 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @returns a Vector4 with random values between min and max
         */
        static Random(min?: number, max?: number): Vector4;
        /**
         * Sets a Vector4 with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @param ref the ref to store the values in
         * @returns the ref with random values between min and max
         */
        static RandomToRef<T extends IVector4Like>(min: number | undefined, max: number | undefined, ref: T): T;
        /**
         * Returns a new Vector4 set with the coordinates of "value", if the vector "value" is in the cube defined by the vectors "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @returns the new Vector4
         */
        static Clamp(value: DeepImmutable<IVector4Like>, min: DeepImmutable<IVector4Like>, max: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Sets the given vector "result" with the coordinates of "value", if the vector "value" is in the cube defined by the vectors "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @param result defines the Vector4 where to store the result
         * @returns result input
         */
        static ClampToRef<T extends IVector4Like>(value: DeepImmutable<IVector4Like>, min: DeepImmutable<IVector4Like>, max: DeepImmutable<IVector4Like>, result: T): T;
        /**
         * Checks if a given vector is inside a specific range
         * Example Playground https://playground.babylonjs.com/#R1F8YU#75
         * @param v defines the vector to test
         * @param min defines the minimum range
         * @param max defines the maximum range
         */
        static CheckExtends(v: IVector4Like, min: Vector4, max: Vector4): void;
        /**
         * Gets a zero Vector4 that must not be updated
         */
        static get ZeroReadOnly(): DeepImmutable<Vector4>;
        /**
         * Returns a new normalized Vector4 from the given one.
         * @param vector the vector to normalize
         * @returns the vector
         */
        static Normalize(vector: DeepImmutable<Vector4>): Vector4;
        /**
         * Updates the given vector "result" from the normalization of the given one.
         * @param vector the vector to normalize
         * @param result the vector to store the result in
         * @returns result input
         */
        static NormalizeToRef<T extends IVector4Like>(vector: DeepImmutable<Vector4>, result: T): T;
        /**
         * Returns a vector with the minimum values from the left and right vectors
         * @param left left vector to minimize
         * @param right right vector to minimize
         * @returns a new vector with the minimum of the left and right vector values
         */
        static Minimize<T extends Vector4>(left: DeepImmutable<T>, right: DeepImmutable<Vector4>): Vector4;
        /**
         * Returns a vector with the maximum values from the left and right vectors
         * @param left left vector to maximize
         * @param right right vector to maximize
         * @returns a new vector with the maximum of the left and right vector values
         */
        static Maximize(left: DeepImmutable<IVector4Like>, right: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Returns the distance (float) between the vectors "value1" and "value2".
         * @param value1 value to calulate the distance between
         * @param value2 value to calulate the distance between
         * @returns the distance between the two vectors
         */
        static Distance(value1: DeepImmutable<IVector4Like>, value2: DeepImmutable<IVector4Like>): number;
        /**
         * Returns the squared distance (float) between the vectors "value1" and "value2".
         * @param value1 value to calulate the distance between
         * @param value2 value to calulate the distance between
         * @returns the distance between the two vectors squared
         */
        static DistanceSquared(value1: DeepImmutable<IVector4Like>, value2: DeepImmutable<IVector4Like>): number;
        /**
         * Returns a new Vector4 located at the center between the vectors "value1" and "value2".
         * @param value1 value to calulate the center between
         * @param value2 value to calulate the center between
         * @returns the center between the two vectors
         */
        static Center(value1: DeepImmutable<IVector4Like>, value2: DeepImmutable<IVector4Like>): Vector4;
        /**
         * Gets the center of the vectors "value1" and "value2" and stores the result in the vector "ref"
         * @param value1 defines first vector
         * @param value2 defines second vector
         * @param ref defines third vector
         * @returns ref
         */
        static CenterToRef<T extends IVector4Like>(value1: DeepImmutable<IVector4Like>, value2: DeepImmutable<IVector4Like>, ref: T): T;
        /**
         * Returns a new Vector4 set with the result of the transformation by the given matrix of the given vector.
         * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)
         * The difference with Vector3.TransformCoordinates is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @returns the transformed Vector4
         */
        static TransformCoordinates(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>): Vector4;
        /**
         * Sets the given vector "result" coordinates with the result of the transformation by the given matrix of the given vector
         * This method computes tranformed coordinates only, not transformed direction vectors (ie. it takes translation in account)
         * The difference with Vector3.TransformCoordinatesToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead
         * @param vector defines the Vector3 to transform
         * @param transformation defines the transformation matrix
         * @param result defines the Vector4 where to store the result
         * @returns result input
         */
        static TransformCoordinatesToRef<T extends IVector4Like>(vector: DeepImmutable<Vector3>, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Sets the given vector "result" coordinates with the result of the transformation by the given matrix of the given floats (x, y, z)
         * This method computes tranformed coordinates only, not transformed direction vectors
         * The difference with Vector3.TransformCoordinatesFromFloatsToRef is that the w component is not used to divide the other coordinates but is returned in the w coordinate instead
         * @param x define the x coordinate of the source vector
         * @param y define the y coordinate of the source vector
         * @param z define the z coordinate of the source vector
         * @param transformation defines the transformation matrix
         * @param result defines the Vector4 where to store the result
         * @returns result input
         */
        static TransformCoordinatesFromFloatsToRef<T extends IVector4Like>(x: number, y: number, z: number, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Returns a new Vector4 set with the result of the normal transformation by the given matrix of the given vector.
         * This methods computes transformed normalized direction vectors only.
         * @param vector the vector to transform
         * @param transformation the transformation matrix to apply
         * @returns the new vector
         */
        static TransformNormal(vector: DeepImmutable<IVector4Like>, transformation: DeepImmutable<Matrix>): Vector4;
        /**
         * Sets the given vector "result" with the result of the normal transformation by the given matrix of the given vector.
         * This methods computes transformed normalized direction vectors only.
         * @param vector the vector to transform
         * @param transformation the transformation matrix to apply
         * @param result the vector to store the result in
         * @returns result input
         */
        static TransformNormalToRef<T extends IVector4Like>(vector: DeepImmutable<IVector4Like>, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Sets the given vector "result" with the result of the normal transformation by the given matrix of the given floats (x, y, z, w).
         * This methods computes transformed normalized direction vectors only.
         * @param x value to transform
         * @param y value to transform
         * @param z value to transform
         * @param w value to transform
         * @param transformation the transformation matrix to apply
         * @param result the vector to store the results in
         * @returns result input
         */
        static TransformNormalFromFloatsToRef<T extends IVector4Like>(x: number, y: number, z: number, w: number, transformation: DeepImmutable<Matrix>, result: T): T;
        /**
         * Creates a new Vector4 from a Vector3
         * @param source defines the source data
         * @param w defines the 4th component (default is 0)
         * @returns a new Vector4
         */
        static FromVector3(source: Vector3, w?: number): Vector4;
        /**
         * Returns the dot product (float) between the vectors "left" and "right"
         * @param left defines the left operand
         * @param right defines the right operand
         * @returns the dot product
         */
        static Dot(left: DeepImmutable<IVector4Like>, right: DeepImmutable<IVector4Like>): number;
    }
    /**
     * Class used to store quaternion data
     * Example Playground - Overview - https://playground.babylonjs.com/#L49EJ7#100
     * @see https://en.wikipedia.org/wiki/Quaternion
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms
     */
    export class Quaternion implements Tensor<Tuple<number, 4>, Quaternion>, IQuaternionLike {
        /**
         * If the first quaternion is flagged with integers (as everything is 0,0,0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent quaternion are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all quaternion instances that it creates.
         * But the original quaternion instances are unchanged and has a "deprecated map".
         * If we keep using the quaternion instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Quaternion>;
        /** @internal */
        _x: number;
        /** @internal */
        _y: number;
        /** @internal */
        _z: number;
        /** @internal */
        _w: number;
        /** @internal */
        _isDirty: boolean;
        /** Gets or sets the x coordinate */
        get x(): number;
        set x(value: number);
        /** Gets or sets the y coordinate */
        get y(): number;
        set y(value: number);
        /** Gets or sets the z coordinate */
        get z(): number;
        set z(value: number);
        /** Gets or sets the w coordinate */
        get w(): number;
        set w(value: number);
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<[4]>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /**
         * Creates a new Quaternion from the given floats
         * @param x defines the first component (0 by default)
         * @param y defines the second component (0 by default)
         * @param z defines the third component (0 by default)
         * @param w defines the fourth component (1.0 by default)
         */
        constructor(x?: number, y?: number, z?: number, w?: number);
        /**
         * Gets a string representation for the current quaternion
         * @returns a string with the Quaternion coordinates
         */
        toString(): string;
        /**
         * Gets the class name of the quaternion
         * @returns the string "Quaternion"
         */
        getClassName(): string;
        /**
         * Gets a hash code for this quaternion
         * @returns the quaternion hash code
         */
        getHashCode(): number;
        /**
         * Copy the quaternion to an array
         * Example Playground https://playground.babylonjs.com/#L49EJ7#13
         * @returns a new array populated with 4 elements from the quaternion coordinates
         */
        asArray(): Tuple<number, 4>;
        /**
         * Stores from the starting index in the given array the Quaternion successive values
         * Example Playground https://playground.babylonjs.com/#L49EJ7#59
         * @param array defines the array where to store the x,y,z,w components
         * @param index defines an optional index in the target array to define where to start storing values
         * @returns the current Quaternion object
         */
        toArray(array: FloatArray, index?: number): this;
        fromArray(array: FloatArray, index?: number): this;
        /**
         * Check if two quaternions are equals
         * Example Playground https://playground.babylonjs.com/#L49EJ7#38
         * @param otherQuaternion defines the second operand
         * @returns true if the current quaternion and the given one coordinates are strictly equals
         */
        equals(otherQuaternion: DeepImmutable<Quaternion>): boolean;
        /**
         * Gets a boolean if two quaternions are equals (using an epsilon value)
         * Example Playground https://playground.babylonjs.com/#L49EJ7#37
         * @param otherQuaternion defines the other quaternion
         * @param epsilon defines the minimal distance to consider equality
         * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.
         */
        equalsWithEpsilon(otherQuaternion: DeepImmutable<Quaternion>, epsilon?: number): boolean;
        /**
         * Gets a boolean if two quaternions are equals (using an epsilon value), taking care of double cover : https://www.reedbeta.com/blog/why-quaternions-double-cover/
         * @param otherQuaternion defines the other quaternion
         * @param epsilon defines the minimal distance to consider equality
         * @returns true if the given quaternion coordinates are close to the current ones by a distance of epsilon.
         */
        isApprox(otherQuaternion: DeepImmutable<Quaternion>, epsilon?: number): boolean;
        /**
         * Clone the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#12
         * @returns a new quaternion copied from the current one
         */
        clone(): Quaternion;
        /**
         * Copy a quaternion to the current one
         * Example Playground https://playground.babylonjs.com/#L49EJ7#86
         * @param other defines the other quaternion
         * @returns the updated current quaternion
         */
        copyFrom(other: DeepImmutable<Quaternion>): this;
        /**
         * Updates the current quaternion with the given float coordinates
         * Example Playground https://playground.babylonjs.com/#L49EJ7#87
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns the updated current quaternion
         */
        copyFromFloats(x: number, y: number, z: number, w: number): this;
        /**
         * Updates the current quaternion from the given float coordinates
         * Example Playground https://playground.babylonjs.com/#L49EJ7#56
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns the updated current quaternion
         */
        set(x: number, y: number, z: number, w: number): this;
        /**
         * Sets all the quaternion coordinates to the given value
         * @param value the value to set
         * @returns the current updated quaternion
         */
        setAll(value: number): this;
        /**
         * Adds two quaternions
         * Example Playground https://playground.babylonjs.com/#L49EJ7#10
         * @param other defines the second operand
         * @returns a new quaternion as the addition result of the given one and the current quaternion
         */
        add(other: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Add a quaternion to the current one
         * Example Playground https://playground.babylonjs.com/#L49EJ7#11
         * @param other defines the quaternion to add
         * @returns the current quaternion
         */
        addInPlace(other: DeepImmutable<Quaternion>): this;
        addToRef<T extends Quaternion>(other: DeepImmutable<this>, result: T): T;
        /**
         * Adds in place the given floats to the current quaternion
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns the current updated quaternion
         */
        addInPlaceFromFloats(x: number, y: number, z: number, w: number): this;
        subtractToRef<T extends Quaternion>(other: DeepImmutable<this>, result: T): T;
        /**
         * Subtracts the given floats from the current quaternion
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns a new quaternion as the subtraction result
         */
        subtractFromFloats(x: number, y: number, z: number, w: number): Quaternion;
        /**
         * Subtracts the given floats from the current quaternion and stores the result in the given one
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @param result defines the quaternion to store the result
         * @returns result input
         */
        subtractFromFloatsToRef<T extends Quaternion>(x: number, y: number, z: number, w: number, result: T): T;
        /**
         * Subtract two quaternions
         * Example Playground https://playground.babylonjs.com/#L49EJ7#57
         * @param other defines the second operand
         * @returns a new quaternion as the subtraction result of the given one from the current one
         */
        subtract(other: DeepImmutable<this>): Quaternion;
        /**
         * Subtract a quaternion to the current one
         * Example Playground https://playground.babylonjs.com/#L49EJ7#58
         * @param other defines the quaternion to subtract
         * @returns the current quaternion
         */
        subtractInPlace(other: DeepImmutable<Quaternion>): this;
        /**
         * Multiplies the current quaternion by a scale factor
         * Example Playground https://playground.babylonjs.com/#L49EJ7#88
         * @param value defines the scale factor
         * @returns a new quaternion set by multiplying the current quaternion coordinates by the float "scale"
         */
        scale(value: number): Quaternion;
        /**
         * Scale the current quaternion values by a factor and stores the result to a given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#89
         * @param scale defines the scale factor
         * @param result defines the Quaternion object where to store the result
         * @returns result input
         */
        scaleToRef<T extends Quaternion>(scale: number, result: T): T;
        /**
         * Multiplies in place the current quaternion by a scale factor
         * Example Playground https://playground.babylonjs.com/#L49EJ7#90
         * @param value defines the scale factor
         * @returns the current modified quaternion
         */
        scaleInPlace(value: number): this;
        /**
         * Scale the current quaternion values by a factor and add the result to a given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#91
         * @param scale defines the scale factor
         * @param result defines the Quaternion object where to store the result
         * @returns result input
         */
        scaleAndAddToRef<T extends Quaternion>(scale: number, result: T): T;
        /**
         * Multiplies two quaternions
         * Example Playground https://playground.babylonjs.com/#L49EJ7#43
         * @param q1 defines the second operand
         * @returns a new quaternion set as the multiplication result of the current one with the given one "q1"
         */
        multiply(q1: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Sets the given "result" as the multiplication result of the current one with the given one "q1"
         * Example Playground https://playground.babylonjs.com/#L49EJ7#45
         * @param q1 defines the second operand
         * @param result defines the target quaternion
         * @returns the current quaternion
         */
        multiplyToRef<T extends Quaternion>(q1: DeepImmutable<Quaternion>, result: T): T;
        /**
         * Updates the current quaternion with the multiplication of itself with the given one "q1"
         * Example Playground https://playground.babylonjs.com/#L49EJ7#46
         * @param other defines the second operand
         * @returns the currentupdated quaternion
         */
        multiplyInPlace(other: DeepImmutable<Quaternion>): this;
        /**
         * Multiplies the current quaternion coordinates by the given floats
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns the current updated quaternion
         */
        multiplyByFloats(x: number, y: number, z: number, w: number): this;
        /**
         * @internal
         * Do not use
         */
        divide(_other: DeepImmutable<this>): this;
        /**
         * @internal
         * Do not use
         */
        divideToRef<T extends Quaternion>(_other: DeepImmutable<this>, _result: T): T;
        /**
         * @internal
         * Do not use
         */
        divideInPlace(_other: DeepImmutable<this>): this;
        /**
         * @internal
         * Do not use
         */
        minimizeInPlace(): this;
        /**
         * @internal
         * Do not use
         */
        minimizeInPlaceFromFloats(): this;
        /**
         * @internal
         * Do not use
         */
        maximizeInPlace(): this;
        /**
         * @internal
         * Do not use
         */
        maximizeInPlaceFromFloats(): this;
        negate(): Quaternion;
        negateInPlace(): this;
        negateToRef<T extends Quaternion>(result: T): T;
        /**
         * Determines if the current quaternion equals the given floats
         * @param x defines the x coordinate
         * @param y defines the y coordinate
         * @param z defines the z coordinate
         * @param w defines the w coordinate
         * @returns true if the quaternion coordinates match the given floats
         */
        equalsToFloats(x: number, y: number, z: number, w: number): boolean;
        /**
         * @internal
         * Do not use
         */
        floorToRef<T extends Quaternion>(_result: T): T;
        /**
         * @internal
         * Do not use
         */
        floor(): Quaternion;
        /**
         * @internal
         * Do not use
         */
        fractToRef<T extends Quaternion>(_result: T): T;
        /**
         * @internal
         * Do not use
         */
        fract(): Quaternion;
        /**
         * Conjugates the current quaternion and stores the result in the given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#81
         * @param ref defines the target quaternion
         * @returns result input
         */
        conjugateToRef<T extends Quaternion>(ref: T): T;
        /**
         * Conjugates in place the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#82
         * @returns the current updated quaternion
         */
        conjugateInPlace(): this;
        /**
         * Conjugates (1-q) the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#83
         * @returns a new quaternion
         */
        conjugate(): Quaternion;
        /**
         * Returns the inverse of the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#84
         * @returns a new quaternion
         */
        invert(): Quaternion;
        /**
         * Invert in place the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#85
         * @returns this quaternion
         */
        invertInPlace(): this;
        /**
         * Gets squared length of current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#29
         * @returns the quaternion length (float)
         */
        lengthSquared(): number;
        /**
         * Gets length of current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#28
         * @returns the quaternion length (float)
         */
        length(): number;
        /**
         * Normalize in place the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#54
         * @returns the current updated quaternion
         */
        normalize(): this;
        /**
         * Normalize the current quaternion with the given input length.
         * Please note that this is an in place operation.
         * @param len the length of the quaternion
         * @returns the current updated Quaternion
         */
        normalizeFromLength(len: number): this;
        /**
         * Normalize a copy of the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#55
         * @returns the normalized quaternion
         */
        normalizeToNew(): Quaternion;
        /**
         * Normalize the current Quaternion to the reference
         * @param reference define the Quaternion to update
         * @returns the updated Quaternion
         */
        normalizeToRef<T extends Quaternion>(reference: T): T;
        /**
         * Returns a new Vector3 set with the Euler angles translated from the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#32
         * @returns a new Vector3 containing the Euler angles
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions
         */
        toEulerAngles(): Vector3;
        /**
         * Sets the given vector3 "result" with the Euler angles translated from the current quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#31
         * @param result defines the vector which will be filled with the Euler angles
         * @returns result input
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions
         */
        toEulerAnglesToRef<T extends Vector3>(result: T): T;
        /**
         * Sets the given vector3 "result" with the Alpha, Beta, Gamma Euler angles translated from the current quaternion
         * @param result defines the vector which will be filled with the Euler angles
         * @returns result input
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/rotation_conventions
         */
        toAlphaBetaGammaToRef<T extends Vector3>(result: T): T;
        /**
         * Updates the given rotation matrix with the current quaternion values
         * Example Playground https://playground.babylonjs.com/#L49EJ7#67
         * @param result defines the target matrix
         * @returns the updated matrix with the rotation
         */
        toRotationMatrix<T extends Matrix>(result: T): T;
        /**
         * Updates the current quaternion from the given rotation matrix values
         * Example Playground https://playground.babylonjs.com/#L49EJ7#41
         * @param matrix defines the source matrix
         * @returns the current updated quaternion
         */
        fromRotationMatrix(matrix: DeepImmutable<Matrix>): this;
        /**
         * Returns the dot product (float) between the current quaternions and "other"
         * @param other defines the right operand
         * @returns the dot product
         */
        dot(other: DeepImmutable<this>): number;
        /**
         * Converts the current quaternion to an axis angle representation
         * @returns the axis and angle in radians
         */
        toAxisAngle(): {
            axis: Vector3;
            angle: number;
        };
        /**
         * Converts the current quaternion to an axis angle representation
         * @param axis defines the target axis vector
         * @returns the angle in radians
         */
        toAxisAngleToRef<T extends Vector3>(axis: T): number;
        /**
         * Creates a new quaternion from a rotation matrix
         * Example Playground https://playground.babylonjs.com/#L49EJ7#101
         * @param matrix defines the source matrix
         * @returns a new quaternion created from the given rotation matrix values
         */
        static FromRotationMatrix(matrix: DeepImmutable<Matrix>): Quaternion;
        /**
         * Updates the given quaternion with the given rotation matrix values
         * Example Playground https://playground.babylonjs.com/#L49EJ7#102
         * @param matrix defines the source matrix
         * @param result defines the target quaternion
         * @returns result input
         */
        static FromRotationMatrixToRef<T extends Quaternion>(matrix: DeepImmutable<Matrix>, result: T): T;
        /**
         * Returns the dot product (float) between the quaternions "left" and "right"
         * Example Playground https://playground.babylonjs.com/#L49EJ7#61
         * @param left defines the left operand
         * @param right defines the right operand
         * @returns the dot product
         */
        static Dot(left: DeepImmutable<Quaternion>, right: DeepImmutable<Quaternion>): number;
        /**
         * Checks if the orientations of two rotation quaternions are close to each other
         * Example Playground https://playground.babylonjs.com/#L49EJ7#60
         * @param quat0 defines the first quaternion to check
         * @param quat1 defines the second quaternion to check
         * @param epsilon defines closeness, 0 same orientation, 1 PI apart, default 0.1
         * @returns true if the two quaternions are close to each other within epsilon
         */
        static AreClose(quat0: DeepImmutable<Quaternion>, quat1: DeepImmutable<Quaternion>, epsilon?: number): boolean;
        /**
         * Smooth interpolation between two quaternions using Slerp
         * Example Playground https://playground.babylonjs.com/#L49EJ7#93
         * @param source source quaternion
         * @param goal goal quaternion
         * @param deltaTime current interpolation frame
         * @param lerpTime total interpolation time
         * @param result the smoothed quaternion
         * @returns the smoothed quaternion
         */
        static SmoothToRef<T extends Quaternion>(source: Quaternion, goal: Quaternion, deltaTime: number, lerpTime: number, result: T): T;
        /**
         * Creates an empty quaternion
         * @returns a new quaternion set to (0.0, 0.0, 0.0)
         */
        static Zero(): Quaternion;
        /**
         * Inverse a given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#103
         * @param q defines the source quaternion
         * @returns a new quaternion as the inverted current quaternion
         */
        static Inverse(q: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Inverse a given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#104
         * @param q defines the source quaternion
         * @param result the quaternion the result will be stored in
         * @returns the result quaternion
         */
        static InverseToRef<T extends Quaternion>(q: Quaternion, result: T): T;
        /**
         * Creates an identity quaternion
         * @returns the identity quaternion
         */
        static Identity(): Quaternion;
        /**
         * Gets a boolean indicating if the given quaternion is identity
         * @param quaternion defines the quaternion to check
         * @returns true if the quaternion is identity
         */
        static IsIdentity(quaternion: DeepImmutable<Quaternion>): boolean;
        /**
         * Creates a quaternion from a rotation around an axis
         * Example Playground https://playground.babylonjs.com/#L49EJ7#72
         * @param axis defines the axis to use
         * @param angle defines the angle to use
         * @returns a new quaternion created from the given axis (Vector3) and angle in radians (float)
         */
        static RotationAxis(axis: DeepImmutable<Vector3>, angle: number): Quaternion;
        /**
         * Creates a rotation around an axis and stores it into the given quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#73
         * @param axis defines the axis to use
         * @param angle defines the angle to use
         * @param result defines the target quaternion
         * @returns the target quaternion
         */
        static RotationAxisToRef<T extends Quaternion>(axis: DeepImmutable<Vector3>, angle: number, result: T): T;
        /**
         * Creates a new quaternion from data stored into an array
         * Example Playground https://playground.babylonjs.com/#L49EJ7#63
         * @param array defines the data source
         * @param offset defines the offset in the source array where the data starts
         * @returns a new quaternion
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Quaternion;
        /**
         * Updates the given quaternion "result" from the starting index of the given array.
         * Example Playground https://playground.babylonjs.com/#L49EJ7#64
         * @param array the array to pull values from
         * @param offset the offset into the array to start at
         * @param result the quaternion to store the result in
         * @returns result input
         */
        static FromArrayToRef<T extends Quaternion>(array: DeepImmutable<ArrayLike<number>>, offset: number, result: T): T;
        /**
         * Sets the given quaternion "result" with the given floats.
         * @param x defines the x coordinate of the source
         * @param y defines the y coordinate of the source
         * @param z defines the z coordinate of the source
         * @param w defines the w coordinate of the source
         * @param result defines the quaternion where to store the result
         * @returns the result quaternion
         */
        static FromFloatsToRef<T extends Quaternion = Quaternion>(x: number, y: number, z: number, w: number, result: T): T;
        /**
         * Create a quaternion from Euler rotation angles
         * Example Playground https://playground.babylonjs.com/#L49EJ7#33
         * @param x Pitch
         * @param y Yaw
         * @param z Roll
         * @returns the new Quaternion
         */
        static FromEulerAngles(x: number, y: number, z: number): Quaternion;
        /**
         * Updates a quaternion from Euler rotation angles
         * Example Playground https://playground.babylonjs.com/#L49EJ7#34
         * @param x Pitch
         * @param y Yaw
         * @param z Roll
         * @param result the quaternion to store the result
         * @returns the updated quaternion
         */
        static FromEulerAnglesToRef<T extends Quaternion>(x: number, y: number, z: number, result: T): T;
        /**
         * Create a quaternion from Euler rotation vector
         * Example Playground https://playground.babylonjs.com/#L49EJ7#35
         * @param vec the Euler vector (x Pitch, y Yaw, z Roll)
         * @returns the new Quaternion
         */
        static FromEulerVector(vec: DeepImmutable<Vector3>): Quaternion;
        /**
         * Updates a quaternion from Euler rotation vector
         * Example Playground https://playground.babylonjs.com/#L49EJ7#36
         * @param vec the Euler vector (x Pitch, y Yaw, z Roll)
         * @param result the quaternion to store the result
         * @returns the updated quaternion
         */
        static FromEulerVectorToRef<T extends Quaternion>(vec: DeepImmutable<Vector3>, result: T): T;
        /**
         * Updates a quaternion so that it rotates vector vecFrom to vector vecTo
         * Example Playground - https://playground.babylonjs.com/#L49EJ7#70
         * @param vecFrom defines the direction vector from which to rotate
         * @param vecTo defines the direction vector to which to rotate
         * @param result the quaternion to store the result
         * @param epsilon defines the minimal dot value to define vecs as opposite. Default: `BABYLON.Epsilon`
         * @returns the updated quaternion
         */
        static FromUnitVectorsToRef<T extends Quaternion>(vecFrom: DeepImmutable<Vector3>, vecTo: DeepImmutable<Vector3>, result: T, epsilon?: number): T;
        /**
         * Creates a new quaternion from the given Euler float angles (y, x, z)
         * Example Playground https://playground.babylonjs.com/#L49EJ7#77
         * @param yaw defines the rotation around Y axis
         * @param pitch defines the rotation around X axis
         * @param roll defines the rotation around Z axis
         * @returns the new quaternion
         */
        static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Quaternion;
        /**
         * Creates a new rotation from the given Euler float angles (y, x, z) and stores it in the target quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#561
         * @param yaw defines the rotation around Y axis
         * @param pitch defines the rotation around X axis
         * @param roll defines the rotation around Z axis
         * @param result defines the target quaternion
         * @returns result input
         */
        static RotationYawPitchRollToRef<T extends Quaternion>(yaw: number, pitch: number, roll: number, result: T): T;
        /**
         * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation
         * Example Playground https://playground.babylonjs.com/#L49EJ7#68
         * @param alpha defines the rotation around first axis
         * @param beta defines the rotation around second axis
         * @param gamma defines the rotation around third axis
         * @returns the new quaternion
         */
        static RotationAlphaBetaGamma(alpha: number, beta: number, gamma: number): Quaternion;
        /**
         * Creates a new quaternion from the given Euler float angles expressed in z-x-z orientation and stores it in the target quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#69
         * @param alpha defines the rotation around first axis
         * @param beta defines the rotation around second axis
         * @param gamma defines the rotation around third axis
         * @param result defines the target quaternion
         * @returns result input
         */
        static RotationAlphaBetaGammaToRef<T extends Quaternion>(alpha: number, beta: number, gamma: number, result: T): T;
        /**
         * Creates a new quaternion containing the rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation)
         * Example Playground https://playground.babylonjs.com/#L49EJ7#75
         * @param axis1 defines the first axis
         * @param axis2 defines the second axis
         * @param axis3 defines the third axis
         * @returns the new quaternion
         */
        static RotationQuaternionFromAxis(axis1: DeepImmutable<Vector3>, axis2: DeepImmutable<Vector3>, axis3: DeepImmutable<Vector3>): Quaternion;
        /**
         * Creates a rotation value to reach the target (axis1, axis2, axis3) orientation as a rotated XYZ system (axis1, axis2 and axis3 are normalized during this operation) and stores it in the target quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#76
         * @param axis1 defines the first axis
         * @param axis2 defines the second axis
         * @param axis3 defines the third axis
         * @param ref defines the target quaternion
         * @returns result input
         */
        static RotationQuaternionFromAxisToRef<T extends Quaternion>(axis1: DeepImmutable<Vector3>, axis2: DeepImmutable<Vector3>, axis3: DeepImmutable<Vector3>, ref: T): T;
        /**
         * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like "up".
         * This function works in left handed mode
         * Example Playground https://playground.babylonjs.com/#L49EJ7#96
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @returns A new quaternion oriented toward the specified forward and up.
         */
        static FromLookDirectionLH(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Quaternion;
        /**
         * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like "up", and stores it in the target quaternion.
         * This function works in left handed mode
         * Example Playground https://playground.babylonjs.com/#L49EJ7#97
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @param ref defines the target quaternion.
         * @returns result input
         */
        static FromLookDirectionLHToRef<T extends Quaternion>(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, ref: T): T;
        /**
         * Creates a new rotation value to orient an object to look towards the given forward direction, the up direction being oriented like "up".
         * This function works in right handed mode
         * Example Playground https://playground.babylonjs.com/#L49EJ7#98
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @returns A new quaternion oriented toward the specified forward and up.
         */
        static FromLookDirectionRH(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Quaternion;
        /**
         * Creates a new rotation value to orient an object to look towards the given forward direction with the up direction being oriented like "up", and stores it in the target quaternion.
         * This function works in right handed mode
         * Example Playground https://playground.babylonjs.com/#L49EJ7#105
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @param ref defines the target quaternion.
         * @returns result input
         */
        static FromLookDirectionRHToRef<T extends Quaternion>(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, ref: T): T;
        /**
         * Interpolates between two quaternions
         * Example Playground https://playground.babylonjs.com/#L49EJ7#79
         * @param left defines first quaternion
         * @param right defines second quaternion
         * @param amount defines the gradient to use
         * @returns the new interpolated quaternion
         */
        static Slerp(left: DeepImmutable<Quaternion>, right: DeepImmutable<Quaternion>, amount: number): Quaternion;
        /**
         * Interpolates between two quaternions and stores it into a target quaternion
         * Example Playground https://playground.babylonjs.com/#L49EJ7#92
         * @param left defines first quaternion
         * @param right defines second quaternion
         * @param amount defines the gradient to use
         * @param result defines the target quaternion
         * @returns result input
         */
        static SlerpToRef<T extends Quaternion>(left: DeepImmutable<Quaternion>, right: DeepImmutable<Quaternion>, amount: number, result: T): T;
        /**
         * Interpolate between two quaternions using Hermite interpolation
         * Example Playground https://playground.babylonjs.com/#L49EJ7#47
         * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-quaternion-spline
         * @param value1 defines first quaternion
         * @param tangent1 defines the incoming tangent
         * @param value2 defines second quaternion
         * @param tangent2 defines the outgoing tangent
         * @param amount defines the target quaternion
         * @returns the new interpolated quaternion
         */
        static Hermite(value1: DeepImmutable<Quaternion>, tangent1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>, tangent2: DeepImmutable<Quaternion>, amount: number): Quaternion;
        /**
         * Returns a new Quaternion which is the 1st derivative of the Hermite spline defined by the quaternions "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#L49EJ7#48
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @returns 1st derivative
         */
        static Hermite1stDerivative(value1: DeepImmutable<Quaternion>, tangent1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>, tangent2: DeepImmutable<Quaternion>, time: number): Quaternion;
        /**
         * Update a Quaternion with the 1st derivative of the Hermite spline defined by the quaternions "value1", "value2", "tangent1", "tangent2".
         * Example Playground https://playground.babylonjs.com/#L49EJ7#49
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @param result define where to store the derivative
         * @returns result input
         */
        static Hermite1stDerivativeToRef<T extends Quaternion>(value1: DeepImmutable<Quaternion>, tangent1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>, tangent2: DeepImmutable<Quaternion>, time: number, result: T): T;
        /**
         * Returns a new Quaternion as the normalization of the given Quaternion
         * @param quat defines the Quaternion to normalize
         * @returns the new Quaternion
         */
        static Normalize(quat: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Sets the given Quaternion "result" with the normalization of the given first Quaternion
         * @param quat defines the Quaternion to normalize
         * @param result defines the Quaternion where to store the result
         * @returns result input
         */
        static NormalizeToRef<T extends Quaternion>(quat: DeepImmutable<Quaternion>, result: T): T;
        /**
         * Returns a new Quaternion set with the coordinates of "value", if the quaternion "value" is in the cube defined by the quaternions "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @returns the new Quaternion
         */
        static Clamp(value: DeepImmutable<Quaternion>, min: DeepImmutable<Quaternion>, max: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Sets the given quaternion "result" with the coordinates of "value", if the quaternion "value" is in the cube defined by the quaternions "min" and "max"
         * If a coordinate value of "value" is lower than one of the "min" coordinate, then this "value" coordinate is set with the "min" one
         * If a coordinate value of "value" is greater than one of the "max" coordinate, then this "value" coordinate is set with the "max" one
         * @param value defines the current value
         * @param min defines the lower range value
         * @param max defines the upper range value
         * @param result defines the Quaternion where to store the result
         * @returns result input
         */
        static ClampToRef<T extends Quaternion>(value: DeepImmutable<Quaternion>, min: DeepImmutable<Quaternion>, max: DeepImmutable<Quaternion>, result: T): T;
        /**
         * Returns a new Quaternion with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @returns a Quaternion with random values between min and max
         */
        static Random(min?: number, max?: number): Quaternion;
        /**
         * Sets a Quaternion with random values between min and max
         * @param min the minimum random value
         * @param max the maximum random value
         * @param ref the ref to store the values in
         * @returns the ref with random values between min and max
         */
        static RandomToRef<T extends Quaternion>(min: number | undefined, max: number | undefined, ref: T): T;
        /**
         * Do not use
         * @internal
         */
        static Minimize(): Quaternion;
        /**
         * Do not use
         * @internal
         */
        static Maximize(): Quaternion;
        /**
         * Returns the distance (float) between the quaternions "value1" and "value2".
         * @param value1 value to calulate the distance between
         * @param value2 value to calulate the distance between
         * @returns the distance between the two quaternions
         */
        static Distance(value1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>): number;
        /**
         * Returns the squared distance (float) between the quaternions "value1" and "value2".
         * @param value1 value to calulate the distance between
         * @param value2 value to calulate the distance between
         * @returns the distance between the two quaternions squared
         */
        static DistanceSquared(value1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>): number;
        /**
         * Returns a new Quaternion located at the center between the quaternions "value1" and "value2".
         * @param value1 value to calulate the center between
         * @param value2 value to calulate the center between
         * @returns the center between the two quaternions
         */
        static Center(value1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>): Quaternion;
        /**
         * Gets the center of the quaternions "value1" and "value2" and stores the result in the quaternion "ref"
         * @param value1 defines first quaternion
         * @param value2 defines second quaternion
         * @param ref defines third quaternion
         * @returns ref
         */
        static CenterToRef<T extends Quaternion>(value1: DeepImmutable<Quaternion>, value2: DeepImmutable<Quaternion>, ref: T): T;
    }
    /**
     * Class used to store matrix data (4x4)
     * Note on matrix definitions in Babylon.js for setting values directly
     * rather than using one of the methods available.
     * Matrix size is given by rows x columns.
     * A Vector3 is a 1 X 3 matrix [x, y, z].
     *
     * In Babylon.js multiplying a 1 x 3 matrix by a 4 x 4 matrix
     * is done using BABYLON.Vector4.TransformCoordinates(Vector3, Matrix).
     * and extending the passed Vector3 to a Vector4, V = [x, y, z, 1].
     * Let M be a matrix with elements m(row, column), so that
     * m(2, 3) is the element in row 2 column 3 of M.
     *
     * Multiplication is of the form VM and has the resulting Vector4
     * VM = [xm(0, 0) + ym(1, 0) + zm(2, 0) + m(3, 0), xm(0, 1) + ym(1, 1) + zm(2, 1) + m(3, 1), xm(0, 2) + ym(1, 2) + zm(2, 2) + m(3, 2), xm(0, 3) + ym(1, 3) + zm(2, 3) + m(3, 3)].
     * On the web you will find many examples that use the opposite convention of MV,
     * in which case to make use of the examples you will need to transpose the matrix.
     *
     * Example Playground - Overview Linear Algebra - https://playground.babylonjs.com/#AV9X17
     * Example Playground - Overview Transformation - https://playground.babylonjs.com/#AV9X17#1
     * Example Playground - Overview Projection - https://playground.babylonjs.com/#AV9X17#2
     */
    export class Matrix implements Tensor<Tuple<Tuple<number, 4>, 4>, Matrix>, IMatrixLike {
        /**
         * @see Tensor.dimension
         */
        readonly dimension: Readonly<[4, 4]>;
        /**
         * @see Tensor.rank
         */
        readonly rank: 2;
        /**
         * Gets the precision of matrix computations
         */
        static get Use64Bits(): boolean;
        private static _IdentityReadOnly;
        private _isIdentity;
        private _isIdentityDirty;
        private _isIdentity3x2;
        private _isIdentity3x2Dirty;
        /**
         * Gets the update flag of the matrix which is an unique number for the matrix.
         * It will be incremented every time the matrix data change.
         * You can use it to speed the comparison between two versions of the same matrix.
         */
        updateFlag: number;
        private readonly _m;
        /**
         * Gets the internal data of the matrix
         */
        get m(): DeepImmutable<Tuple<number, 16>>;
        /**
         * Update the updateFlag to indicate that the matrix has been updated
         */
        markAsUpdated(): void;
        private _updateIdentityStatus;
        /**
         * Creates an empty matrix (filled with zeros)
         */
        constructor();
        /**
         * Check if the current matrix is identity
         * @returns true is the matrix is the identity matrix
         */
        isIdentity(): boolean;
        /**
         * Check if the current matrix is identity as a texture matrix (3x2 store in 4x4)
         * @returns true is the matrix is the identity matrix
         */
        isIdentityAs3x2(): boolean;
        /**
         * Gets the determinant of the matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#34
         * @returns the matrix determinant
         */
        determinant(): number;
        /**
         * Gets a string with the Matrix values
         * @returns a string with the Matrix values
         */
        toString(): string;
        /**
         * Returns the matrix as a Float32Array or Array<number>
         * @deprecated Use asArray
         */
        toArray(): FloatArray;
        /**
         * Stores the matrix in a Float32Array or Array<number>
         * Example Playground - https://playground.babylonjs.com/#AV9X17#49
         * @param array The destination array
         * @param index The destination index to start ay
         * @returns the matrix
         */
        toArray(array: FloatArray, index: number): this;
        /**
         * Returns the matrix as a Float32Array or Array<number>
         * Example Playground - https://playground.babylonjs.com/#AV9X17#114
         * @returns the matrix underlying array.
         */
        asArray(): Tuple<number, 16>;
        fromArray(array: FloatArray, index?: number): this;
        /**
         * Sets all the matrix values from a float array
         * @param floats the 16 float values to set
         * @returns the current updated matrix
         */
        copyFromFloats(...floats: Tuple<number, 16>): this;
        /**
         * Sets the matrix values
         * @param values the 16 values to set
         * @returns the current updated matrix
         */
        set(...values: Tuple<number, 16>): this;
        /**
         * Sets all the matrix values to the given value
         * @param value the value to set
         * @returns the current updated matrix
         */
        setAll(value: number): this;
        /**
         * Inverts the current matrix in place
         * Example Playground - https://playground.babylonjs.com/#AV9X17#118
         * @returns the current inverted matrix
         */
        invert(): this;
        /**
         * Sets all the matrix elements to zero
         * @returns the current matrix
         */
        reset(): this;
        /**
         * Adds the current matrix with a second one
         * Example Playground - https://playground.babylonjs.com/#AV9X17#44
         * @param other defines the matrix to add
         * @returns a new matrix as the addition of the current matrix and the given one
         */
        add(other: DeepImmutable<Matrix>): Matrix;
        /**
         * Sets the given matrix "result" to the addition of the current matrix and the given one
         * Example Playground - https://playground.babylonjs.com/#AV9X17#45
         * @param other defines the matrix to add
         * @param result defines the target matrix
         * @returns result input
         */
        addToRef<T extends Matrix>(other: DeepImmutable<Matrix>, result: T): T;
        /**
         * Adds in place the given matrix to the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#46
         * @param other defines the second operand
         * @returns the current updated matrix
         */
        addToSelf(other: DeepImmutable<Matrix>): this;
        addInPlace(other: DeepImmutable<Matrix>): this;
        addInPlaceFromFloats(...floats: Tuple<number, 16>): this;
        subtract(other: DeepImmutable<Matrix>): this;
        subtractToRef<T extends Matrix>(other: DeepImmutable<Matrix>, result: T): T;
        subtractInPlace(other: DeepImmutable<Matrix>): this;
        subtractFromFloats(...floats: Tuple<number, 16>): Matrix;
        subtractFromFloatsToRef<T extends Matrix>(...args: [...Tuple<number, 16>, T]): T;
        /**
         * Sets the given matrix to the current inverted Matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#119
         * @param other defines the target matrix
         * @returns result input
         */
        invertToRef<T extends Matrix>(other: T): T;
        /**
         * add a value at the specified position in the current Matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#47
         * @param index the index of the value within the matrix. between 0 and 15.
         * @param value the value to be added
         * @returns the current updated matrix
         */
        addAtIndex(index: number, value: number): this;
        /**
         * mutiply the specified position in the current Matrix by a value
         * @param index the index of the value within the matrix. between 0 and 15.
         * @param value the value to be added
         * @returns the current updated matrix
         */
        multiplyAtIndex(index: number, value: number): this;
        /**
         * Inserts the translation vector (using 3 floats) in the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#120
         * @param x defines the 1st component of the translation
         * @param y defines the 2nd component of the translation
         * @param z defines the 3rd component of the translation
         * @returns the current updated matrix
         */
        setTranslationFromFloats(x: number, y: number, z: number): this;
        /**
         * Adds the translation vector (using 3 floats) in the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#20
         * Example Playground - https://playground.babylonjs.com/#AV9X17#48
         * @param x defines the 1st component of the translation
         * @param y defines the 2nd component of the translation
         * @param z defines the 3rd component of the translation
         * @returns the current updated matrix
         */
        addTranslationFromFloats(x: number, y: number, z: number): this;
        /**
         * Inserts the translation vector in the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#121
         * @param vector3 defines the translation to insert
         * @returns the current updated matrix
         */
        setTranslation(vector3: DeepImmutable<Vector3>): this;
        /**
         * Gets the translation value of the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#122
         * @returns a new Vector3 as the extracted translation from the matrix
         */
        getTranslation(): Vector3;
        /**
         * Fill a Vector3 with the extracted translation from the matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#123
         * @param result defines the Vector3 where to store the translation
         * @returns the current matrix
         */
        getTranslationToRef<T extends Vector3>(result: T): T;
        /**
         * Remove rotation and scaling part from the matrix
         * @returns the updated matrix
         */
        removeRotationAndScaling(): this;
        /**
         * Copy the current matrix from the given one
         * Example Playground - https://playground.babylonjs.com/#AV9X17#21
         * @param other defines the source matrix
         * @returns the current updated matrix
         */
        copyFrom(other: DeepImmutable<Matrix>): this;
        /**
         * Populates the given array from the starting index with the current matrix values
         * @param array defines the target array
         * @param offset defines the offset in the target array where to start storing values
         * @returns the current matrix
         */
        copyToArray(array: Float32Array | Array<number>, offset?: number): this;
        /**
         * Multiply two matrices
         * Example Playground - https://playground.babylonjs.com/#AV9X17#15
         * A.multiply(B) means apply B to A so result is B x A
         * @param other defines the second operand
         * @returns a new matrix set with the multiplication result of the current Matrix and the given one
         */
        multiply(other: DeepImmutable<Matrix>): Matrix;
        /**
         * This method performs component-by-component in-place multiplication, rather than true matrix multiplication.
         * Use multiply or multiplyToRef for matrix multiplication.
         * @param other defines the second operand
         * @returns the current updated matrix
         */
        multiplyInPlace(other: DeepImmutable<Matrix>): this;
        /**
         * This method performs a component-by-component multiplication of the current matrix with the array of transmitted numbers.
         * Use multiply or multiplyToRef for matrix multiplication.
         * @param floats defines the array of numbers to multiply the matrix by
         * @returns the current updated matrix
         */
        multiplyByFloats(...floats: Tuple<number, 16>): this;
        /**
         * Multiples the current matrix by the given floats and stores them in the given ref
         * @param args The floats and ref
         * @returns The updated ref
         */
        multiplyByFloatsToRef<T extends Matrix>(...args: [...Tuple<number, 16>, T]): T;
        /**
         * Sets the given matrix "result" with the multiplication result of the current Matrix and the given one
         * A.multiplyToRef(B, R) means apply B to A and store in R and R = B x A
         * Example Playground - https://playground.babylonjs.com/#AV9X17#16
         * @param other defines the second operand
         * @param result defines the matrix where to store the multiplication
         * @returns result input
         */
        multiplyToRef<T extends Matrix>(other: DeepImmutable<Matrix>, result: T): T;
        /**
         * Sets the Float32Array "result" from the given index "offset" with the multiplication of the current matrix and the given one
         * @param other defines the second operand
         * @param result defines the array where to store the multiplication
         * @param offset defines the offset in the target array where to start storing values
         * @returns the current matrix
         */
        multiplyToArray(other: DeepImmutable<Matrix>, result: Float32Array | Array<number>, offset: number): this;
        divide(other: DeepImmutable<Matrix>): Matrix;
        divideToRef<T extends Matrix>(other: DeepImmutable<Matrix>, result: T): T;
        divideInPlace(other: DeepImmutable<Matrix>): this;
        minimizeInPlace(other: DeepImmutable<Matrix>): this;
        minimizeInPlaceFromFloats(...floats: Tuple<number, 16>): this;
        maximizeInPlace(other: DeepImmutable<Matrix>): this;
        maximizeInPlaceFromFloats(...floats: Tuple<number, 16>): this;
        negate(): Matrix;
        negateInPlace(): this;
        negateToRef<T extends Matrix>(result: T): T;
        /**
         * Check equality between this matrix and a second one
         * @param value defines the second matrix to compare
         * @returns true is the current matrix and the given one values are strictly equal
         */
        equals(value: DeepImmutable<Matrix>): boolean;
        equalsWithEpsilon(other: DeepImmutable<Matrix>, epsilon?: number): boolean;
        equalsToFloats(...floats: Tuple<number, 16>): boolean;
        floor(): Matrix;
        floorToRef<T extends Matrix>(result: T): T;
        fract(): Matrix;
        fractToRef<T extends Matrix>(result: T): T;
        /**
         * Clone the current matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#18
         * @returns a new matrix from the current matrix
         */
        clone(): Matrix;
        /**
         * Returns the name of the current matrix class
         * @returns the string "Matrix"
         */
        getClassName(): string;
        /**
         * Gets the hash code of the current matrix
         * @returns the hash code
         */
        getHashCode(): number;
        /**
         * Decomposes the current Matrix into a translation, rotation and scaling components of the provided node
         * Example Playground - https://playground.babylonjs.com/#AV9X17#13
         * @param node the node to decompose the matrix to
         * @returns true if operation was successful
         */
        decomposeToTransformNode(node: TransformNode): boolean;
        /**
         * Decomposes the current Matrix into a translation, rotation and scaling components
         * Example Playground - https://playground.babylonjs.com/#AV9X17#12
         * @param scale defines the scale vector3 given as a reference to update
         * @param rotation defines the rotation quaternion given as a reference to update
         * @param translation defines the translation vector3 given as a reference to update
         * @param preserveScalingNode Use scaling sign coming from this node. Otherwise scaling sign might change.
         * @param useAbsoluteScaling Use scaling sign coming from this absoluteScaling when true or scaling otherwise.
         * @returns true if operation was successful
         */
        decompose(scale?: Vector3, rotation?: Quaternion, translation?: Vector3, preserveScalingNode?: TransformNode, useAbsoluteScaling?: boolean): boolean;
        /**
         * Gets specific row of the matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#36
         * @param index defines the number of the row to get
         * @returns the index-th row of the current matrix as a new Vector4
         */
        getRow(index: number): Nullable<Vector4>;
        /**
         * Gets specific row of the matrix to ref
         * Example Playground - https://playground.babylonjs.com/#AV9X17#36
         * @param index defines the number of the row to get
         * @param rowVector vector to store the index-th row of the current matrix
         * @returns result input
         */
        getRowToRef<T extends Vector4>(index: number, rowVector: T): T;
        /**
         * Sets the index-th row of the current matrix to the vector4 values
         * Example Playground - https://playground.babylonjs.com/#AV9X17#36
         * @param index defines the number of the row to set
         * @param row defines the target vector4
         * @returns the updated current matrix
         */
        setRow(index: number, row: Vector4): this;
        /**
         * Compute the transpose of the matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#40
         * @returns the new transposed matrix
         */
        transpose(): Matrix;
        /**
         * Compute the transpose of the matrix and store it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#41
         * @param result defines the target matrix
         * @returns result input
         */
        transposeToRef<T extends Matrix>(result: T): T;
        /**
         * Sets the index-th row of the current matrix with the given 4 x float values
         * Example Playground - https://playground.babylonjs.com/#AV9X17#36
         * @param index defines the row index
         * @param x defines the x component to set
         * @param y defines the y component to set
         * @param z defines the z component to set
         * @param w defines the w component to set
         * @returns the updated current matrix
         */
        setRowFromFloats(index: number, x: number, y: number, z: number, w: number): this;
        /**
         * Compute a new matrix set with the current matrix values multiplied by scale (float)
         * @param scale defines the scale factor
         * @returns a new matrix
         */
        scale(scale: number): Matrix;
        /**
         * Scale the current matrix values by a factor to a given result matrix
         * @param scale defines the scale factor
         * @param result defines the matrix to store the result
         * @returns result input
         */
        scaleToRef<T extends Matrix>(scale: number, result: T): T;
        /**
         * Scale the current matrix values by a factor and add the result to a given matrix
         * @param scale defines the scale factor
         * @param result defines the Matrix to store the result
         * @returns result input
         */
        scaleAndAddToRef<T extends Matrix>(scale: number, result: T): T;
        scaleInPlace(scale: number): this;
        /**
         * Writes to the given matrix a normal matrix, computed from this one (using values from identity matrix for fourth row and column).
         * Example Playground - https://playground.babylonjs.com/#AV9X17#17
         * @param ref matrix to store the result
         * @returns the reference matrix
         */
        toNormalMatrix<T extends Matrix>(ref: T): T;
        /**
         * Gets only rotation part of the current matrix
         * @returns a new matrix sets to the extracted rotation matrix from the current one
         */
        getRotationMatrix(): Matrix;
        /**
         * Extracts the rotation matrix from the current one and sets it as the given "result"
         * @param result defines the target matrix to store data to
         * @returns result input
         */
        getRotationMatrixToRef<T extends Matrix>(result: T): T;
        /**
         * Toggles model matrix from being right handed to left handed in place and vice versa
         * @returns the current updated matrix
         */
        toggleModelMatrixHandInPlace(): this;
        /**
         * Toggles projection matrix from being right handed to left handed in place and vice versa
         * @returns the current updated matrix
         */
        toggleProjectionMatrixHandInPlace(): this;
        /**
         * Creates a matrix from an array
         * Example Playground - https://playground.babylonjs.com/#AV9X17#42
         * @param array defines the source array
         * @param offset defines an offset in the source array
         * @returns a new Matrix set from the starting index of the given array
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Matrix;
        /**
         * Copy the content of an array into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#43
         * @param array defines the source array
         * @param offset defines an offset in the source array
         * @param result defines the target matrix
         * @returns result input
         */
        static FromArrayToRef<T extends Matrix>(array: DeepImmutable<ArrayLike<number>>, offset: number, result: T): T;
        /**
         * Stores an array into a matrix after having multiplied each component by a given factor
         * Example Playground - https://playground.babylonjs.com/#AV9X17#50
         * @param array defines the source array
         * @param offset defines the offset in the source array
         * @param scale defines the scaling factor
         * @param result defines the target matrix
         * @returns result input
         */
        static FromFloat32ArrayToRefScaled<T extends Matrix>(array: DeepImmutable<Float32Array | Array<number>>, offset: number, scale: number, result: T): T;
        /**
         * Gets an identity matrix that must not be updated
         */
        static get IdentityReadOnly(): DeepImmutable<Matrix>;
        /**
         * Stores a list of values (16) inside a given matrix
         * @param initialM11 defines 1st value of 1st row
         * @param initialM12 defines 2nd value of 1st row
         * @param initialM13 defines 3rd value of 1st row
         * @param initialM14 defines 4th value of 1st row
         * @param initialM21 defines 1st value of 2nd row
         * @param initialM22 defines 2nd value of 2nd row
         * @param initialM23 defines 3rd value of 2nd row
         * @param initialM24 defines 4th value of 2nd row
         * @param initialM31 defines 1st value of 3rd row
         * @param initialM32 defines 2nd value of 3rd row
         * @param initialM33 defines 3rd value of 3rd row
         * @param initialM34 defines 4th value of 3rd row
         * @param initialM41 defines 1st value of 4th row
         * @param initialM42 defines 2nd value of 4th row
         * @param initialM43 defines 3rd value of 4th row
         * @param initialM44 defines 4th value of 4th row
         * @param result defines the target matrix
         */
        static FromValuesToRef(initialM11: number, initialM12: number, initialM13: number, initialM14: number, initialM21: number, initialM22: number, initialM23: number, initialM24: number, initialM31: number, initialM32: number, initialM33: number, initialM34: number, initialM41: number, initialM42: number, initialM43: number, initialM44: number, result: Matrix): void;
        /**
         * Creates new matrix from a list of values (16)
         * @param initialM11 defines 1st value of 1st row
         * @param initialM12 defines 2nd value of 1st row
         * @param initialM13 defines 3rd value of 1st row
         * @param initialM14 defines 4th value of 1st row
         * @param initialM21 defines 1st value of 2nd row
         * @param initialM22 defines 2nd value of 2nd row
         * @param initialM23 defines 3rd value of 2nd row
         * @param initialM24 defines 4th value of 2nd row
         * @param initialM31 defines 1st value of 3rd row
         * @param initialM32 defines 2nd value of 3rd row
         * @param initialM33 defines 3rd value of 3rd row
         * @param initialM34 defines 4th value of 3rd row
         * @param initialM41 defines 1st value of 4th row
         * @param initialM42 defines 2nd value of 4th row
         * @param initialM43 defines 3rd value of 4th row
         * @param initialM44 defines 4th value of 4th row
         * @returns the new matrix
         */
        static FromValues(initialM11: number, initialM12: number, initialM13: number, initialM14: number, initialM21: number, initialM22: number, initialM23: number, initialM24: number, initialM31: number, initialM32: number, initialM33: number, initialM34: number, initialM41: number, initialM42: number, initialM43: number, initialM44: number): Matrix;
        /**
         * Creates a new matrix composed by merging scale (vector3), rotation (quaternion) and translation (vector3)
         * Example Playground - https://playground.babylonjs.com/#AV9X17#24
         * @param scale defines the scale vector3
         * @param rotation defines the rotation quaternion
         * @param translation defines the translation vector3
         * @returns a new matrix
         */
        static Compose(scale: DeepImmutable<Vector3>, rotation: DeepImmutable<Quaternion>, translation: DeepImmutable<Vector3>): Matrix;
        /**
         * Sets a matrix to a value composed by merging scale (vector3), rotation (quaternion) and translation (vector3)
         * Example Playground - https://playground.babylonjs.com/#AV9X17#25
         * @param scale defines the scale vector3
         * @param rotation defines the rotation quaternion
         * @param translation defines the translation vector3
         * @param result defines the target matrix
         * @returns result input
         */
        static ComposeToRef<T extends Matrix>(scale: DeepImmutable<Vector3>, rotation: DeepImmutable<Quaternion>, translation: DeepImmutable<Vector3>, result: T): T;
        /**
         * Creates a new identity matrix
         * @returns a new identity matrix
         */
        static Identity(): Matrix;
        /**
         * Creates a new identity matrix and stores the result in a given matrix
         * @param result defines the target matrix
         * @returns result input
         */
        static IdentityToRef<T extends Matrix>(result: T): T;
        /**
         * Creates a new zero matrix
         * @returns a new zero matrix
         */
        static Zero(): Matrix;
        /**
         * Creates a new rotation matrix for "angle" radians around the X axis
         * Example Playground - https://playground.babylonjs.com/#AV9X17#97
         * @param angle defines the angle (in radians) to use
         * @returns the new matrix
         */
        static RotationX(angle: number): Matrix;
        /**
         * Creates a new matrix as the invert of a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#124
         * @param source defines the source matrix
         * @returns the new matrix
         */
        static Invert(source: DeepImmutable<Matrix>): Matrix;
        /**
         * Creates a new rotation matrix for "angle" radians around the X axis and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#98
         * @param angle defines the angle (in radians) to use
         * @param result defines the target matrix
         * @returns result input
         */
        static RotationXToRef<T extends Matrix>(angle: number, result: T): T;
        /**
         * Creates a new rotation matrix for "angle" radians around the Y axis
         * Example Playground - https://playground.babylonjs.com/#AV9X17#99
         * @param angle defines the angle (in radians) to use
         * @returns the new matrix
         */
        static RotationY(angle: number): Matrix;
        /**
         * Creates a new rotation matrix for "angle" radians around the Y axis and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#100
         * @param angle defines the angle (in radians) to use
         * @param result defines the target matrix
         * @returns result input
         */
        static RotationYToRef<T extends Matrix>(angle: number, result: T): T;
        /**
         * Creates a new rotation matrix for "angle" radians around the Z axis
         * Example Playground - https://playground.babylonjs.com/#AV9X17#101
         * @param angle defines the angle (in radians) to use
         * @returns the new matrix
         */
        static RotationZ(angle: number): Matrix;
        /**
         * Creates a new rotation matrix for "angle" radians around the Z axis and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#102
         * @param angle defines the angle (in radians) to use
         * @param result defines the target matrix
         * @returns result input
         */
        static RotationZToRef<T extends Matrix>(angle: number, result: T): T;
        /**
         * Creates a new rotation matrix for "angle" radians around the given axis
         * Example Playground - https://playground.babylonjs.com/#AV9X17#96
         * @param axis defines the axis to use
         * @param angle defines the angle (in radians) to use
         * @returns the new matrix
         */
        static RotationAxis(axis: DeepImmutable<Vector3>, angle: number): Matrix;
        /**
         * Creates a new rotation matrix for "angle" radians around the given axis and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#94
         * @param axis defines the axis to use
         * @param angle defines the angle (in radians) to use
         * @param result defines the target matrix
         * @returns result input
         */
        static RotationAxisToRef<T extends Matrix>(axis: DeepImmutable<Vector3>, angle: number, result: T): T;
        /**
         * Takes normalised vectors and returns a rotation matrix to align "from" with "to".
         * Taken from http://www.iquilezles.org/www/articles/noacos/noacos.htm
         * Example Playground - https://playground.babylonjs.com/#AV9X17#93
         * @param from defines the vector to align
         * @param to defines the vector to align to
         * @param result defines the target matrix
         * @param useYAxisForCoplanar defines a boolean indicating that we should favor Y axis for coplanar vectors (default is false)
         * @returns result input
         */
        static RotationAlignToRef<T extends Matrix>(from: DeepImmutable<Vector3>, to: DeepImmutable<Vector3>, result: T, useYAxisForCoplanar?: boolean): T;
        /**
         * Creates a rotation matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#103
         * Example Playground - https://playground.babylonjs.com/#AV9X17#105
         * @param yaw defines the yaw angle in radians (Y axis)
         * @param pitch defines the pitch angle in radians (X axis)
         * @param roll defines the roll angle in radians (Z axis)
         * @returns the new rotation matrix
         */
        static RotationYawPitchRoll(yaw: number, pitch: number, roll: number): Matrix;
        /**
         * Creates a rotation matrix and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#104
         * @param yaw defines the yaw angle in radians (Y axis)
         * @param pitch defines the pitch angle in radians (X axis)
         * @param roll defines the roll angle in radians (Z axis)
         * @param result defines the target matrix
         * @returns result input
         */
        static RotationYawPitchRollToRef<T extends Matrix>(yaw: number, pitch: number, roll: number, result: T): T;
        /**
         * Creates a scaling matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#107
         * @param x defines the scale factor on X axis
         * @param y defines the scale factor on Y axis
         * @param z defines the scale factor on Z axis
         * @returns the new matrix
         */
        static Scaling(x: number, y: number, z: number): Matrix;
        /**
         * Creates a scaling matrix and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#108
         * @param x defines the scale factor on X axis
         * @param y defines the scale factor on Y axis
         * @param z defines the scale factor on Z axis
         * @param result defines the target matrix
         * @returns result input
         */
        static ScalingToRef<T extends Matrix>(x: number, y: number, z: number, result: T): T;
        /**
         * Creates a translation matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#109
         * @param x defines the translation on X axis
         * @param y defines the translation on Y axis
         * @param z defines the translationon Z axis
         * @returns the new matrix
         */
        static Translation(x: number, y: number, z: number): Matrix;
        /**
         * Creates a translation matrix and stores it in a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#110
         * @param x defines the translation on X axis
         * @param y defines the translation on Y axis
         * @param z defines the translationon Z axis
         * @param result defines the target matrix
         * @returns result input
         */
        static TranslationToRef<T extends Matrix>(x: number, y: number, z: number, result: T): T;
        /**
         * Returns a new Matrix whose values are the interpolated values for "gradient" (float) between the ones of the matrices "startValue" and "endValue".
         * Example Playground - https://playground.babylonjs.com/#AV9X17#55
         * @param startValue defines the start value
         * @param endValue defines the end value
         * @param gradient defines the gradient factor
         * @returns the new matrix
         */
        static Lerp(startValue: DeepImmutable<Matrix>, endValue: DeepImmutable<Matrix>, gradient: number): Matrix;
        /**
         * Set the given matrix "result" as the interpolated values for "gradient" (float) between the ones of the matrices "startValue" and "endValue".
         * Example Playground - https://playground.babylonjs.com/#AV9X17#54
         * @param startValue defines the start value
         * @param endValue defines the end value
         * @param gradient defines the gradient factor
         * @param result defines the Matrix object where to store data
         * @returns result input
         */
        static LerpToRef<T extends Matrix>(startValue: DeepImmutable<Matrix>, endValue: DeepImmutable<Matrix>, gradient: number, result: T): T;
        /**
         * Builds a new matrix whose values are computed by:
         * * decomposing the "startValue" and "endValue" matrices into their respective scale, rotation and translation matrices
         * * interpolating for "gradient" (float) the values between each of these decomposed matrices between the start and the end
         * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices
         * Example Playground - https://playground.babylonjs.com/#AV9X17#22
         * Example Playground - https://playground.babylonjs.com/#AV9X17#51
         * @param startValue defines the first matrix
         * @param endValue defines the second matrix
         * @param gradient defines the gradient between the two matrices
         * @returns the new matrix
         */
        static DecomposeLerp(startValue: DeepImmutable<Matrix>, endValue: DeepImmutable<Matrix>, gradient: number): Matrix;
        /**
         * Update a matrix to values which are computed by:
         * * decomposing the "startValue" and "endValue" matrices into their respective scale, rotation and translation matrices
         * * interpolating for "gradient" (float) the values between each of these decomposed matrices between the start and the end
         * * recomposing a new matrix from these 3 interpolated scale, rotation and translation matrices
         * Example Playground - https://playground.babylonjs.com/#AV9X17#23
         * Example Playground - https://playground.babylonjs.com/#AV9X17#53
         * @param startValue defines the first matrix
         * @param endValue defines the second matrix
         * @param gradient defines the gradient between the two matrices
         * @param result defines the target matrix
         * @returns result input
         */
        static DecomposeLerpToRef<T extends Matrix>(startValue: DeepImmutable<Matrix>, endValue: DeepImmutable<Matrix>, gradient: number, result: T): T;
        /**
         * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.
         * This function generates a matrix suitable for a left handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#58
         * Example Playground - https://playground.babylonjs.com/#AV9X17#59
         * @param eye defines the final position of the entity
         * @param target defines where the entity should look at
         * @param up defines the up vector for the entity
         * @returns the new matrix
         */
        static LookAtLH(eye: DeepImmutable<Vector3>, target: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Matrix;
        /**
         * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.
         * This function generates a matrix suitable for a left handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#60
         * Example Playground - https://playground.babylonjs.com/#AV9X17#61
         * @param eye defines the final position of the entity
         * @param target defines where the entity should look at
         * @param up defines the up vector for the entity
         * @param result defines the target matrix
         * @returns result input
         */
        static LookAtLHToRef(eye: DeepImmutable<Vector3>, target: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, result: Matrix): Matrix;
        /**
         * Creates a new matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.
         * This function generates a matrix suitable for a right handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#62
         * Example Playground - https://playground.babylonjs.com/#AV9X17#63
         * @param eye defines the final position of the entity
         * @param target defines where the entity should look at
         * @param up defines the up vector for the entity
         * @returns the new matrix
         */
        static LookAtRH(eye: DeepImmutable<Vector3>, target: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Matrix;
        /**
         * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes three vectors as arguments that together describe the position and orientation of the camera.
         * This function generates a matrix suitable for a right handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#64
         * Example Playground - https://playground.babylonjs.com/#AV9X17#65
         * @param eye defines the final position of the entity
         * @param target defines where the entity should look at
         * @param up defines the up vector for the entity
         * @param result defines the target matrix
         * @returns result input
         */
        static LookAtRHToRef<T extends Matrix>(eye: DeepImmutable<Vector3>, target: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, result: T): T;
        /**
         * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)
         * This function generates a matrix suitable for a left handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#66
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @returns the new matrix
         */
        static LookDirectionLH(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Matrix;
        /**
         * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)
         * This function generates a matrix suitable for a left handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#67
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @param result defines the target matrix
         * @returns result input
         */
        static LookDirectionLHToRef<T extends Matrix>(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, result: T): T;
        /**
         * Creates a new matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)
         * This function generates a matrix suitable for a right handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#68
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @returns the new matrix
         */
        static LookDirectionRH(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>): Matrix;
        /**
         * Sets the given "result" Matrix to a matrix that transforms vertices from world space to camera space. It takes two vectors as arguments that together describe the orientation of the camera. The position is assumed to be at the origin (0,0,0)
         * This function generates a matrix suitable for a right handed coordinate system
         * Example Playground - https://playground.babylonjs.com/#AV9X17#69
         * @param forward defines the forward direction - Must be normalized and orthogonal to up.
         * @param up defines the up vector for the entity - Must be normalized and orthogonal to forward.
         * @param result defines the target matrix
         * @returns result input
         */
        static LookDirectionRHToRef<T extends Matrix>(forward: DeepImmutable<Vector3>, up: DeepImmutable<Vector3>, result: T): T;
        /**
         * Create a left-handed orthographic projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#70
         * @param width defines the viewport width
         * @param height defines the viewport height
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns a new matrix as a left-handed orthographic projection matrix
         */
        static OrthoLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean): Matrix;
        /**
         * Store a left-handed orthographic projection to a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#71
         * @param width defines the viewport width
         * @param height defines the viewport height
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param result defines the target matrix
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns result input
         */
        static OrthoLHToRef<T extends Matrix>(width: number, height: number, znear: number, zfar: number, result: T, halfZRange?: boolean): T;
        /**
         * Create a left-handed orthographic projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#72
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns a new matrix as a left-handed orthographic projection matrix
         */
        static OrthoOffCenterLH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix;
        /**
         * Stores a left-handed orthographic projection into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#73
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param result defines the target matrix
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns result input
         */
        static OrthoOffCenterLHToRef<T extends Matrix>(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, result: T, halfZRange?: boolean): T;
        /**
         * Stores a left-handed oblique projection into a given matrix
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param length Length of the shear
         * @param angle Angle (along X/Y Plane) to apply shear
         * @param distance Distance from shear point
         * @param result defines the target matrix
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns result input
         */
        static ObliqueOffCenterLHToRef<T extends Matrix>(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, length: number, angle: number, distance: number, result: T, halfZRange?: boolean): T;
        /**
         * Creates a right-handed orthographic projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#76
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns a new matrix as a right-handed orthographic projection matrix
         */
        static OrthoOffCenterRH(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, halfZRange?: boolean): Matrix;
        /**
         * Stores a right-handed orthographic projection into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#77
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param result defines the target matrix
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns result input
         */
        static OrthoOffCenterRHToRef<T extends Matrix>(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, result: T, halfZRange?: boolean): T;
        /**
         * Stores a right-handed oblique projection into a given matrix
         * @param left defines the viewport left coordinate
         * @param right defines the viewport right coordinate
         * @param bottom defines the viewport bottom coordinate
         * @param top defines the viewport top coordinate
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param length Length of the shear
         * @param angle Angle (along X/Y Plane) to apply shear
         * @param distance Distance from shear point
         * @param result defines the target matrix
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @returns result input
         */
        static ObliqueOffCenterRHToRef<T extends Matrix>(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, length: number, angle: number, distance: number, result: T, halfZRange?: boolean): T;
        /**
         * Creates a left-handed perspective projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#85
         * @param width defines the viewport width
         * @param height defines the viewport height
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @returns a new matrix as a left-handed perspective projection matrix
         */
        static PerspectiveLH(width: number, height: number, znear: number, zfar: number, halfZRange?: boolean, projectionPlaneTilt?: number): Matrix;
        /**
         * Creates a left-handed perspective projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#78
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane. If 0, assume we are in "infinite zfar" mode
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)
         * @returns a new matrix as a left-handed perspective projection matrix
         */
        static PerspectiveFovLH(fov: number, aspect: number, znear: number, zfar: number, halfZRange?: boolean, projectionPlaneTilt?: number, reverseDepthBufferMode?: boolean): Matrix;
        /**
         * Stores a left-handed perspective projection into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#81
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane. If 0, assume we are in "infinite zfar" mode
         * @param result defines the target matrix
         * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)
         * @returns result input
         */
        static PerspectiveFovLHToRef<T extends Matrix>(fov: number, aspect: number, znear: number, zfar: number, result: T, isVerticalFovFixed?: boolean, halfZRange?: boolean, projectionPlaneTilt?: number, reverseDepthBufferMode?: boolean): T;
        /**
         * Stores a left-handed perspective projection into a given matrix with depth reversed
         * Example Playground - https://playground.babylonjs.com/#AV9X17#89
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar not used as infinity is used as far clip
         * @param result defines the target matrix
         * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @returns result input
         */
        static PerspectiveFovReverseLHToRef<T extends Matrix>(fov: number, aspect: number, znear: number, zfar: number, result: T, isVerticalFovFixed?: boolean, halfZRange?: boolean, projectionPlaneTilt?: number): T;
        /**
         * Creates a right-handed perspective projection matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#83
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane. If 0, assume we are in "infinite zfar" mode
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)
         * @returns a new matrix as a right-handed perspective projection matrix
         */
        static PerspectiveFovRH(fov: number, aspect: number, znear: number, zfar: number, halfZRange?: boolean, projectionPlaneTilt?: number, reverseDepthBufferMode?: boolean): Matrix;
        /**
         * Stores a right-handed perspective projection into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#84
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar defines the far clip plane. If 0, assume we are in "infinite zfar" mode
         * @param result defines the target matrix
         * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @param reverseDepthBufferMode true to indicate that we are in a reverse depth buffer mode (meaning znear and zfar have been inverted when calling the function)
         * @returns result input
         */
        static PerspectiveFovRHToRef<T extends Matrix>(fov: number, aspect: number, znear: number, zfar: number, result: T, isVerticalFovFixed?: boolean, halfZRange?: boolean, projectionPlaneTilt?: number, reverseDepthBufferMode?: boolean): T;
        /**
         * Stores a right-handed perspective projection into a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#90
         * @param fov defines the horizontal field of view
         * @param aspect defines the aspect ratio
         * @param znear defines the near clip plane
         * @param zfar not used as infinity is used as far clip
         * @param result defines the target matrix
         * @param isVerticalFovFixed defines it the fov is vertically fixed (default) or horizontally
         * @param halfZRange true to generate NDC coordinates between 0 and 1 instead of -1 and 1 (default: false)
         * @param projectionPlaneTilt optional tilt angle of the projection plane around the X axis (horizontal)
         * @returns result input
         */
        static PerspectiveFovReverseRHToRef<T extends Matrix>(fov: number, aspect: number, znear: number, zfar: number, result: T, isVerticalFovFixed?: boolean, halfZRange?: boolean, projectionPlaneTilt?: number): T;
        /**
         * Computes a complete transformation matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#113
         * @param viewport defines the viewport to use
         * @param world defines the world matrix
         * @param view defines the view matrix
         * @param projection defines the projection matrix
         * @param zmin defines the near clip plane
         * @param zmax defines the far clip plane
         * @returns the transformation matrix
         */
        static GetFinalMatrix(viewport: DeepImmutable<Viewport>, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>, zmin: number, zmax: number): Matrix;
        /**
         * Extracts a 2x2 matrix from a given matrix and store the result in a Float32Array
         * @param matrix defines the matrix to use
         * @returns a new Float32Array array with 4 elements : the 2x2 matrix extracted from the given matrix
         */
        static GetAsMatrix2x2(matrix: DeepImmutable<Matrix>): Float32Array | Array<number>;
        /**
         * Extracts a 3x3 matrix from a given matrix and store the result in a Float32Array
         * @param matrix defines the matrix to use
         * @returns a new Float32Array array with 9 elements : the 3x3 matrix extracted from the given matrix
         */
        static GetAsMatrix3x3(matrix: DeepImmutable<Matrix>): Float32Array | Array<number>;
        /**
         * Compute the transpose of a given matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#111
         * @param matrix defines the matrix to transpose
         * @returns the new matrix
         */
        static Transpose(matrix: DeepImmutable<Matrix>): Matrix;
        /**
         * Compute the transpose of a matrix and store it in a target matrix
         * Example Playground - https://playground.babylonjs.com/#AV9X17#112
         * @param matrix defines the matrix to transpose
         * @param result defines the target matrix
         * @returns result input
         */
        static TransposeToRef<T extends Matrix>(matrix: DeepImmutable<Matrix>, result: T): T;
        /**
         * Computes a reflection matrix from a plane
         * Example Playground - https://playground.babylonjs.com/#AV9X17#87
         * @param plane defines the reflection plane
         * @returns a new matrix
         */
        static Reflection(plane: DeepImmutable<IPlaneLike>): Matrix;
        /**
         * Computes a reflection matrix from a plane
         * Example Playground - https://playground.babylonjs.com/#AV9X17#88
         * @param plane defines the reflection plane
         * @param result defines the target matrix
         * @returns result input
         */
        static ReflectionToRef<T extends Matrix>(plane: DeepImmutable<IPlaneLike>, result: T): T;
        /**
         * Sets the given matrix as a rotation matrix composed from the 3 left handed axes
         * @param xaxis defines the value of the 1st axis
         * @param yaxis defines the value of the 2nd axis
         * @param zaxis defines the value of the 3rd axis
         * @param result defines the target matrix
         * @returns result input
         */
        static FromXYZAxesToRef<T extends Matrix>(xaxis: DeepImmutable<Vector3>, yaxis: DeepImmutable<Vector3>, zaxis: DeepImmutable<Vector3>, result: T): T;
        /**
         * Creates a rotation matrix from a quaternion and stores it in a target matrix
         * @param quat defines the quaternion to use
         * @param result defines the target matrix
         * @returns result input
         */
        static FromQuaternionToRef<T extends Matrix>(quat: DeepImmutable<Quaternion>, result: T): T;
    }
    /**
     * @internal
     */
    export class TmpVectors {
        /** 3 temp Vector2 at once should be enough */
        static Vector2: [Vector2, Vector2, Vector2];
        /** 13 temp Vector3 at once should be enough */
        static Vector3: [Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3, Vector3];
        /** 3 temp Vector4 at once should be enough */
        static Vector4: [Vector4, Vector4, Vector4];
        /** 3 temp Quaternion at once should be enough */
        static Quaternion: [Quaternion, Quaternion, Quaternion];
        /** 8 temp Matrices at once should be enough */
        static Matrix: [Matrix, Matrix, Matrix, Matrix, Matrix, Matrix, Matrix, Matrix];
    }
    /**
     * Register side effects for mathVector.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMathVector(): void;


    /**
     * Creates a string representation of the IVector2Like
     * @param vector defines the IVector2Like to stringify
     * @param decimalCount defines the number of decimals to use
     * @returns a string with the IVector2Like coordinates.
     */
    export function Vector2ToFixed(vector: DeepImmutable<IVector2Like>, decimalCount: number): string;
    /**
     * Computes the dot product of two IVector3Like objects.
     * @param a defines the first vector
     * @param b defines the second vector
     * @returns the dot product
     */
    export function Vector3Dot(a: DeepImmutable<IVector3Like>, b: DeepImmutable<IVector3Like>): number;
    /**
     * Computes the squared length of the IVector3Like
     * @param vector the vector to measure
     * @returns the squared length of the vector
     */
    export function Vector3LengthSquared(vector: DeepImmutable<IVector3Like>): number;
    /**
     * Computes the length of the IVector3Like
     * @param vector the vector to measure
     * @returns the length of the vector
     */
    export function Vector3Length(vector: DeepImmutable<IVector3Like>): number;
    /**
     * Computes the squared distance between the IVector3Like objects
     * @param a defines the first vector
     * @param b defines the second vector
     * @returns the squared distance
     */
    export function Vector3DistanceSquared(a: DeepImmutable<IVector3Like>, b: DeepImmutable<IVector3Like>): number;
    /**
     * Computes the distance between the IVector3Like objects
     * @param a defines the first vector
     * @param b defines the second vector
     * @returns the distance
     */
    export function Vector3Distance(a: DeepImmutable<IVector3Like>, b: DeepImmutable<IVector3Like>): number;
    /**
     * Sets the given floats into the result.
     * @param x defines the x coordinate
     * @param y defines the y coordinate
     * @param z defines the z coordinate
     * @param result defines the result vector
     * @returns the result vector
     */
    export function Vector3FromFloatsToRef<T extends IVector3Like>(x: number, y: number, z: number, result: T): T;
    /**
     * Stores the scaled values of a vector into the result.
     * @param a defines the source vector
     * @param scale defines the scale factor
     * @param result defines the result vector
     * @returns the scaled vector
     */
    export function Vector3ScaleToRef<T extends IVector3Like>(a: DeepImmutable<IVector3Like>, scale: number, result: T): T;
    /**
     * Scales the current vector values in place by a factor.
     * @param vector defines the vector to scale
     * @param scale defines the scale factor
     * @returns the scaled vector
     */
    export function Vector3ScaleInPlace<T extends IVector3Like>(vector: T, scale: number): T;
    export function Vector3SubtractToRef<T extends IVector3Like>(a: DeepImmutable<IVector3Like>, b: DeepImmutable<IVector3Like>, result: T): T;
    export function Vector3CopyToRef<T extends IVector3Like>(source: DeepImmutable<IVector3Like>, result: T): T;
    export function Vector3LerpToRef<T extends IVector3Like>(start: DeepImmutable<IVector3Like>, end: DeepImmutable<IVector3Like>, amount: number, result: T): T;
    export function Vector3NormalizeToRef<T extends IVector3Like>(vector: DeepImmutable<IVector3Like>, result: T): T;
    /**
     * Computes the signed distance between the specified point and plane.
     * @param origin defines a point on the plane
     * @param normal defines the plane normal (assumes normalized)
     * @param point defines the point to compute the signed distance to
     * @returns the signed distance
     */
    export function Vector3SignedDistanceToPlaneFromPositionAndNormal(origin: DeepImmutable<IVector3Like>, normal: DeepImmutable<IVector3Like>, point: DeepImmutable<IVector3Like>): number;
    /**
     * Creates a string representation of the IVector3Like
     * @param vector defines the IVector3Like to stringify
     * @param decimalCount defines the number of decimals to use
     * @returns a string with the IVector3Like coordinates.
     */
    export function Vector3ToFixed(vector: DeepImmutable<IVector3Like>, decimalCount: number): string;
    /**
     * Computes the dot product of two IVector4Like objects
     * @param a defines the first vector
     * @param b defines the second vector
     * @returns the dot product
     */
    export function Vector4Dot(a: DeepImmutable<IVector4Like>, b: DeepImmutable<IVector4Like>): number;
    /**
     * Creates a string representation of the IVector4Like
     * @param vector defines the IVector4Like to stringify
     * @param decimalCount defines the number of decimals to use
     * @returns a string with the IVector4Like coordinates.
     */
    export function Vector4ToFixed(vector: DeepImmutable<IVector4Like>, decimalCount: number): string;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import math.vector.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Interface for the size containing width and height
     */
    export interface ISize {
        /**
         * Width
         */
        width: number;
        /**
         * Height
         */
        height: number;
    }
    /**
     * Size containing width and height
     */
    export class Size implements ISize {
        /**
         * Width
         */
        width: number;
        /**
         * Height
         */
        height: number;
        /**
         * Creates a Size object from the given width and height (floats).
         * @param width width of the new size
         * @param height height of the new size
         */
        constructor(width: number, height: number);
        /**
         * Returns a string with the Size width and height
         * @returns a string with the Size width and height
         */
        toString(): string;
        /**
         * "Size"
         * @returns the string "Size"
         */
        getClassName(): string;
        /**
         * Returns the Size hash code.
         * @returns a hash code for a unique width and height
         */
        getHashCode(): number;
        /**
         * Updates the current size from the given one.
         * @param src the given size
         */
        copyFrom(src: Size): void;
        /**
         * Updates in place the current Size from the given floats.
         * @param width width of the new size
         * @param height height of the new size
         * @returns the updated Size.
         */
        copyFromFloats(width: number, height: number): Size;
        /**
         * Updates in place the current Size from the given floats.
         * @param width width to set
         * @param height height to set
         * @returns the updated Size.
         */
        set(width: number, height: number): Size;
        /**
         * Multiplies the width and height by numbers
         * @param w factor to multiple the width by
         * @param h factor to multiple the height by
         * @returns a new Size set with the multiplication result of the current Size and the given floats.
         */
        multiplyByFloats(w: number, h: number): Size;
        /**
         * Clones the size
         * @returns a new Size copied from the given one.
         */
        clone(): Size;
        /**
         * True if the current Size and the given one width and height are strictly equal.
         * @param other the other size to compare against
         * @returns True if the current Size and the given one width and height are strictly equal.
         */
        equals(other: Size): boolean;
        /**
         * The surface of the Size : width * height (float).
         */
        get surface(): number;
        /**
         * Create a new size of zero
         * @returns a new Size set to (0.0, 0.0)
         */
        static Zero(): Size;
        /**
         * Sums the width and height of two sizes
         * @param otherSize size to add to this size
         * @returns a new Size set as the addition result of the current Size and the given one.
         */
        add(otherSize: Size): Size;
        /**
         * Subtracts the width and height of two
         * @param otherSize size to subtract to this size
         * @returns a new Size set as the subtraction result of  the given one from the current Size.
         */
        subtract(otherSize: Size): Size;
        /**
         * Scales the width and height
         * @param scale the scale to multiply the width and height by
         * @returns a new Size set with the multiplication result of the current Size and the given floats.
         */
        scale(scale: number): Size;
        /**
         * Creates a new Size set at the linear interpolation "amount" between "start" and "end"
         * @param start starting size to lerp between
         * @param end end size to lerp between
         * @param amount amount to lerp between the start and end values
         * @returns a new Size set at the linear interpolation "amount" between "start" and "end"
         */
        static Lerp(start: Size, end: Size, amount: number): Size;
    }


    /**
     * Extract int value
     * @param value number value
     * @returns int value
     */
    export function ExtractAsInt(value: number): number;
    /**
     * Boolean : true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)
     * @param a number
     * @param b number
     * @param epsilon (default = 1.401298E-45)
     * @returns true if the absolute difference between a and b is lower than epsilon (default = 1.401298E-45)
     */
    export function WithinEpsilon(a: number, b: number, epsilon?: number): boolean;
    /**
     * Boolean : true if the number is outside a range
     * @param num number
     * @param min min value
     * @param max max value
     * @param epsilon (default = Number.EPSILON)
     * @returns true if the number is between min and max values
     */
    export function OutsideRange(num: number, min: number, max: number, epsilon?: number): boolean;
    /**
     * Returns a random float number between and min and max values
     * @param min min value of random
     * @param max max value of random
     * @returns random value
     */
    export function RandomRange(min: number, max: number): number;
    /**
     * Creates a new scalar with values linearly interpolated of "amount" between the start scalar and the end scalar.
     * @param start start value
     * @param end target value
     * @param amount amount to lerp between
     * @returns the lerped value
     */
    export function Lerp(start: number, end: number, amount: number): number;
    /**
     * Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.
     * The parameter t is clamped to the range [0, 1]. Variables a and b are assumed to be in degrees.
     * @param start start value
     * @param end target value
     * @param amount amount to lerp between
     * @returns the lerped value
     */
    export function LerpAngle(start: number, end: number, amount: number): number;
    /**
     * Calculates the linear parameter t that produces the interpolant value within the range [a, b].
     * @param a start value
     * @param b target value
     * @param value value between a and b
     * @returns the inverseLerp value
     */
    export function InverseLerp(a: number, b: number, value: number): number;
    /**
     * Returns a new scalar located for "amount" (float) on the Hermite spline defined by the scalars "value1", "value3", "tangent1", "tangent2".
     * @see http://mathworld.wolfram.com/HermitePolynomial.html
     * @param value1 defines the first control point
     * @param tangent1 defines the first tangent
     * @param value2 defines the second control point
     * @param tangent2 defines the second tangent
     * @param amount defines the amount on the interpolation spline (between 0 and 1)
     * @returns hermite result
     */
    export function Hermite(value1: number, tangent1: number, value2: number, tangent2: number, amount: number): number;
    /**
     * Returns a new scalar which is the 1st derivative of the Hermite spline defined by the scalars "value1", "value2", "tangent1", "tangent2".
     * @param value1 defines the first control point
     * @param tangent1 defines the first tangent
     * @param value2 defines the second control point
     * @param tangent2 defines the second tangent
     * @param time define where the derivative must be done
     * @returns 1st derivative
     */
    export function Hermite1stDerivative(value1: number, tangent1: number, value2: number, tangent2: number, time: number): number;
    /**
     * Returns the value itself if it's between min and max.
     * Returns min if the value is lower than min.
     * Returns max if the value is greater than max.
     * @param value the value to clmap
     * @param min the min value to clamp to (default: 0)
     * @param max the max value to clamp to (default: 1)
     * @returns the clamped value
     */
    export function Clamp(value: number, min?: number, max?: number): number;
    /**
     * Returns the angle converted to equivalent value between -Math.PI and Math.PI radians.
     * @param angle The angle to normalize in radian.
     * @returns The converted angle.
     */
    export function NormalizeRadians(angle: number): number;
    /**
     * Returns a string : the upper case translation of the number i to hexadecimal.
     * @param i number
     * @returns the upper case translation of the number i to hexadecimal.
     */
    export function ToHex(i: number): string;
    /**
     * the floor part of a log2 value.
     * @param value the value to compute log2 of
     * @returns the log2 of value.
     */
    export function ILog2(value: number): number;
    /**
     * Loops the value, so that it is never larger than length and never smaller than 0.
     *
     * This is similar to the modulo operator but it works with floating point numbers.
     * For example, using 3.0 for t and 2.5 for length, the result would be 0.5.
     * With t = 5 and length = 2.5, the result would be 0.0.
     * Note, however, that the behaviour is not defined for negative numbers as it is for the modulo operator
     * @param value the value
     * @param length the length
     * @returns the looped value
     */
    export function Repeat(value: number, length: number): number;
    /**
     * Normalize the value between 0.0 and 1.0 using min and max values
     * @param value value to normalize
     * @param min max to normalize between
     * @param max min to normalize between
     * @returns the normalized value
     */
    export function Normalize(value: number, min: number, max: number): number;
    /**
     * Denormalize the value from 0.0 and 1.0 using min and max values
     * @param normalized value to denormalize
     * @param min max to denormalize between
     * @param max min to denormalize between
     * @returns the denormalized value
     */
    export function Denormalize(normalized: number, min: number, max: number): number;
    /**
     * Calculates the shortest difference between two given angles given in degrees.
     * @param current current angle in degrees
     * @param target target angle in degrees
     * @returns the delta
     */
    export function DeltaAngle(current: number, target: number): number;
    /**
     * PingPongs the value t, so that it is never larger than length and never smaller than 0.
     * @param tx value
     * @param length length
     * @returns The returned value will move back and forth between 0 and length
     */
    export function PingPong(tx: number, length: number): number;
    /**
     * Interpolates between min and max with smoothing at the limits.
     *
     * This function interpolates between min and max in a similar way to Lerp. However, the interpolation will gradually speed up
     * from the start and slow down toward the end. This is useful for creating natural-looking animation, fading and other transitions.
     * @param from from
     * @param to to
     * @param tx value
     * @returns the smooth stepped value
     */
    export function SmoothStep(from: number, to: number, tx: number): number;
    /**
     * Moves a value current towards target.
     *
     * This is essentially the same as Mathf.Lerp but instead the function will ensure that the speed never exceeds maxDelta.
     * Negative values of maxDelta pushes the value away from target.
     * @param current current value
     * @param target target value
     * @param maxDelta max distance to move
     * @returns resulting value
     */
    export function MoveTowards(current: number, target: number, maxDelta: number): number;
    /**
     * Same as MoveTowards but makes sure the values interpolate correctly when they wrap around 360 degrees.
     *
     * Variables current and target are assumed to be in degrees. For optimization reasons, negative values of maxDelta
     *  are not supported and may cause oscillation. To push current away from a target angle, add 180 to that angle instead.
     * @param current current value
     * @param target target value
     * @param maxDelta max distance to move
     * @returns resulting angle
     */
    export function MoveTowardsAngle(current: number, target: number, maxDelta: number): number;
    /**
     * This function returns percentage of a number in a given range.
     *
     * RangeToPercent(40,20,60) will return 0.5 (50%)
     * RangeToPercent(34,0,100) will return 0.34 (34%)
     * @param number to convert to percentage
     * @param min min range
     * @param max max range
     * @returns the percentage
     */
    export function RangeToPercent(number: number, min: number, max: number): number;
    /**
     * This function returns number that corresponds to the percentage in a given range.
     *
     * PercentToRange(0.34,0,100) will return 34.
     * @param percent to convert to number
     * @param min min range
     * @param max max range
     * @returns the number
     */
    export function PercentToRange(percent: number, min: number, max: number): number;
    /**
     * Returns the highest common factor of two integers.
     * @param a first parameter
     * @param b second parameter
     * @returns HCF of a and b
     */
    export function HighestCommonFactor(a: number, b: number): number;


    /**
     * Scalar computation library
     */
    export var Scalar: {
        /**
         * Two pi constants convenient for computation.
         */
        TwoPi: number;
        /**
         * Returns -1 if value is negative and +1 is value is positive.
         * @param value the value
         * @returns the value itself if it's equal to zero.
         */
        Sign: (x: number) => number;
        /**
         * the log2 of value.
         * @param value the value to compute log2 of
         * @returns the log2 of value.
         */
        Log2: (x: number) => number;
        /**
         * Returns the highest common factor of two integers.
         * @param a first parameter
         * @param b second parameter
         * @returns HCF of a and b
         */
        HCF: (a: number, b: number) => number;
        ExtractAsInt(value: number): number;
        WithinEpsilon(a: number, b: number, epsilon?: number): boolean;
        OutsideRange(num: number, min: number, max: number, epsilon?: number): boolean;
        RandomRange(min: number, max: number): number;
        Lerp(start: number, end: number, amount: number): number;
        LerpAngle(start: number, end: number, amount: number): number;
        InverseLerp(a: number, b: number, value: number): number;
        Hermite(value1: number, tangent1: number, value2: number, tangent2: number, amount: number): number;
        Hermite1stDerivative(value1: number, tangent1: number, value2: number, tangent2: number, time: number): number;
        Clamp(value: number, min?: number, max?: number): number;
        NormalizeRadians(angle: number): number;
        ToHex(i: number): string;
        ILog2(value: number): number;
        Repeat(value: number, length: number): number;
        Normalize(value: number, min: number, max: number): number;
        Denormalize(normalized: number, min: number, max: number): number;
        DeltaAngle(current: number, target: number): number;
        PingPong(tx: number, length: number): number;
        SmoothStep(from: number, to: number, tx: number): number;
        MoveTowards(current: number, target: number, maxDelta: number): number;
        MoveTowardsAngle(current: number, target: number, maxDelta: number): number;
        RangeToPercent(number: number, min: number, max: number): number;
        PercentToRange(percent: number, min: number, max: number): number;
        HighestCommonFactor(a: number, b: number): number;
    };


    /**
     * Class used to store (r, theta) vector representation
     */
    export class Polar {
        radius: number;
        theta: number;
        /**
         * Creates a new Polar object
         * @param radius the radius of the vector
         * @param theta the angle of the vector
         */
        constructor(radius: number, theta: number);
        /**
         * Gets the class name
         * @returns the string "Polar"
         */
        getClassName(): string;
        /**
         * Converts the current polar to a string
         * @returns the current polar as a string
         */
        toString(): string;
        /**
         * Converts the current polar to an array
         * @returns the current polar as an array
         */
        asArray(): number[];
        /**
         * Adds the current Polar and the given Polar and stores the result
         * @param polar the polar to add
         * @param ref the polar to store the result in
         * @returns the updated ref
         */
        addToRef(polar: Polar, ref: Polar): Polar;
        /**
         * Adds the current Polar and the given Polar
         * @param polar the polar to add
         * @returns the sum polar
         */
        add(polar: Polar): Polar;
        /**
         * Adds the given polar to the current polar
         * @param polar the polar to add
         * @returns the current polar
         */
        addInPlace(polar: Polar): this;
        /**
         * Adds the provided values to the current polar
         * @param radius the amount to add to the radius
         * @param theta the amount to add to the theta
         * @returns the current polar
         */
        addInPlaceFromFloats(radius: number, theta: number): this;
        /**
         * Subtracts the given Polar from the current Polar and stores the result
         * @param polar the polar to subtract
         * @param ref the polar to store the result in
         * @returns the updated ref
         */
        subtractToRef(polar: Polar, ref: Polar): Polar;
        /**
         * Subtracts the given Polar from the current Polar
         * @param polar the polar to subtract
         * @returns the difference polar
         */
        subtract(polar: Polar): Polar;
        /**
         * Subtracts the given Polar from the current Polar
         * @param polar the polar to subtract
         * @returns the current polar
         */
        subtractInPlace(polar: Polar): this;
        /**
         * Subtracts the given floats from the current polar
         * @param radius the amount to subtract from the radius
         * @param theta the amount to subtract from the theta
         * @param ref the polar to store the result in
         * @returns the updated ref
         */
        subtractFromFloatsToRef(radius: number, theta: number, ref: Polar): Polar;
        /**
         * Subtracts the given floats from the current polar
         * @param radius the amount to subtract from the radius
         * @param theta the amount to subtract from the theta
         * @returns the difference polar
         */
        subtractFromFloats(radius: number, theta: number): Polar;
        /**
         * Multiplies the given Polar with the current Polar and stores the result
         * @param polar the polar to multiply
         * @param ref the polar to store the result in
         * @returns the updated ref
         */
        multiplyToRef(polar: Polar, ref: Polar): Polar;
        /**
         * Multiplies the given Polar with the current Polar
         * @param polar the polar to multiply
         * @returns the product polar
         */
        multiply(polar: Polar): Polar;
        /**
         * Multiplies the given Polar with the current Polar
         * @param polar the polar to multiply
         * @returns the current polar
         */
        multiplyInPlace(polar: Polar): this;
        /**
         * Divides the current Polar by the given Polar and stores the result
         * @param polar the polar to divide
         * @param ref the polar to store the result in
         * @returns the updated ref
         */
        divideToRef(polar: Polar, ref: Polar): Polar;
        /**
         * Divides the current Polar by the given Polar
         * @param polar the polar to divide
         * @returns the quotient polar
         */
        divide(polar: Polar): Polar;
        /**
         * Divides the current Polar by the given Polar
         * @param polar the polar to divide
         * @returns the current polar
         */
        divideInPlace(polar: Polar): this;
        /**
         * Clones the current polar
         * @returns a clone of the current polar
         */
        clone(): Polar;
        /**
         * Copies the source polar into the current polar
         * @param source the polar to copy from
         * @returns the current polar
         */
        copyFrom(source: Polar): this;
        /**
         * Copies the given values into the current polar
         * @param radius the radius to use
         * @param theta the theta to use
         * @returns the current polar
         */
        copyFromFloats(radius: number, theta: number): this;
        /**
         * Scales the current polar and stores the result
         * @param scale defines the multiplication factor
         * @param ref where to store the result
         * @returns the updated ref
         */
        scaleToRef(scale: number, ref: Polar): Polar;
        /**
         * Scales the current polar and returns a new polar with the scaled coordinates
         * @param scale defines the multiplication factor
         * @returns the scaled polar
         */
        scale(scale: number): Polar;
        /**
         * Scales the current polar
         * @param scale defines the multiplication factor
         * @returns the current polar
         */
        scaleInPlace(scale: number): this;
        /**
         * Sets the values of the current polar
         * @param radius the new radius
         * @param theta the new theta
         * @returns the current polar
         */
        set(radius: number, theta: number): this;
        /**
         * Sets the values of the current polar
         * @param value the new values
         * @returns the current polar
         */
        setAll(value: number): this;
        /**
         * Gets the rectangular coordinates of the current Polar
         * @param ref the reference to assign the result
         * @returns the updated reference
         */
        toVector2ToRef(ref: Vector2): Vector2;
        /**
         * Gets the rectangular coordinates of the current Polar
         * @returns the rectangular coordinates
         */
        toVector2(): Vector2;
        /**
         * Converts a given Vector2 to its polar coordinates
         * @param v the Vector2 to convert
         * @param ref the reference to assign the result
         * @returns the updated reference
         */
        static FromVector2ToRef(v: Vector2, ref: Polar): Polar;
        /**
         * Converts a given Vector2 to its polar coordinates
         * @param v the Vector2 to convert
         * @returns a Polar
         */
        static FromVector2(v: Vector2): Polar;
        /**
         * Converts an array of floats to a polar
         * @param array the array to convert
         * @returns the converted polar
         */
        static FromArray(array: number[]): Polar;
    }
    /**
     * Class used for (radius, theta, phi) vector representation.
     */
    export class Spherical {
        radius: number;
        theta: number;
        phi: number;
        /**
         * Creates a new Spherical object from the given spherical coordinates
         * @param radius spherical radius
         * @param theta angle from positive y axis to radial line from 0 to PI (vertical)
         * @param phi angle from positive x axis measured anticlockwise from -PI to PI (horizontal)
         */
        constructor(radius: number, theta: number, phi: number);
        /**
         * Gets the class name
         * @returns the string "Spherical"
         */
        getClassName(): string;
        /**
         * Converts the current spherical to a string
         * @returns the current spherical as a string
         */
        toString(): string;
        /**
         * Converts the current spherical to an array
         * @returns the current spherical as an array
         */
        asArray(): number[];
        /**
         * Adds the current Spherical and the given Spherical and stores the result
         * @param spherical the spherical to add
         * @param ref the spherical to store the result in
         * @returns the updated ref
         */
        addToRef(spherical: Spherical, ref: Spherical): Spherical;
        /**
         * Adds the current Spherical and the given Spherical
         * @param spherical the spherical to add
         * @returns the sum spherical
         */
        add(spherical: Spherical): Spherical;
        /**
         * Adds the given spherical to the current spherical
         * @param spherical the spherical to add
         * @returns the current spherical
         */
        addInPlace(spherical: Spherical): this;
        /**
         * Adds the provided values to the current spherical
         * @param radius the amount to add to the radius
         * @param theta the amount to add to the theta
         * @param phi the amount to add to the phi
         * @returns the current spherical
         */
        addInPlaceFromFloats(radius: number, theta: number, phi: number): this;
        /**
         * Subtracts the given Spherical from the current Spherical and stores the result
         * @param spherical the spherical to subtract
         * @param ref the spherical to store the result in
         * @returns the updated ref
         */
        subtractToRef(spherical: Spherical, ref: Spherical): Spherical;
        /**
         * Subtracts the given Spherical from the current Spherical
         * @param spherical the spherical to subtract
         * @returns the difference spherical
         */
        subtract(spherical: Spherical): Spherical;
        /**
         * Subtracts the given Spherical from the current Spherical
         * @param spherical the spherical to subtract
         * @returns the current spherical
         */
        subtractInPlace(spherical: Spherical): this;
        /**
         * Subtracts the given floats from the current spherical
         * @param radius the amount to subtract from the radius
         * @param theta the amount to subtract from the theta
         * @param phi the amount to subtract from the phi
         * @param ref the spherical to store the result in
         * @returns the updated ref
         */
        subtractFromFloatsToRef(radius: number, theta: number, phi: number, ref: Spherical): Spherical;
        /**
         * Subtracts the given floats from the current spherical
         * @param radius the amount to subtract from the radius
         * @param theta the amount to subtract from the theta
         * @param phi the amount to subtract from the phi
         * @returns the difference spherical
         */
        subtractFromFloats(radius: number, theta: number, phi: number): Spherical;
        /**
         * Multiplies the given Spherical with the current Spherical and stores the result
         * @param spherical the spherical to multiply
         * @param ref the spherical to store the result in
         * @returns the updated ref
         */
        multiplyToRef(spherical: Spherical, ref: Spherical): Spherical;
        /**
         * Multiplies the given Spherical with the current Spherical
         * @param spherical the spherical to multiply
         * @returns the product spherical
         */
        multiply(spherical: Spherical): Spherical;
        /**
         * Multiplies the given Spherical with the current Spherical
         * @param spherical the spherical to multiply
         * @returns the current spherical
         */
        multiplyInPlace(spherical: Spherical): this;
        /**
         * Divides the current Spherical by the given Spherical and stores the result
         * @param spherical the spherical to divide
         * @param ref the spherical to store the result in
         * @returns the updated ref
         */
        divideToRef(spherical: Spherical, ref: Spherical): Spherical;
        /**
         * Divides the current Spherical by the given Spherical
         * @param spherical the spherical to divide
         * @returns the quotient spherical
         */
        divide(spherical: Spherical): Spherical;
        /**
         * Divides the current Spherical by the given Spherical
         * @param spherical the spherical to divide
         * @returns the current spherical
         */
        divideInPlace(spherical: Spherical): this;
        /**
         * Clones the current spherical
         * @returns a clone of the current spherical
         */
        clone(): Spherical;
        /**
         * Copies the source spherical into the current spherical
         * @param source the spherical to copy from
         * @returns the current spherical
         */
        copyFrom(source: Spherical): this;
        /**
         * Copies the given values into the current spherical
         * @param radius the radius to use
         * @param theta the theta to use
         * @param phi the phi to use
         * @returns the current spherical
         */
        copyFromFloats(radius: number, theta: number, phi: number): this;
        /**
         * Scales the current spherical and stores the result
         * @param scale defines the multiplication factor
         * @param ref where to store the result
         * @returns the updated ref
         */
        scaleToRef(scale: number, ref: Spherical): Spherical;
        /**
         * Scales the current spherical and returns a new spherical with the scaled coordinates
         * @param scale defines the multiplication factor
         * @returns the scaled spherical
         */
        scale(scale: number): Spherical;
        /**
         * Scales the current spherical
         * @param scale defines the multiplication factor
         * @returns the current spherical
         */
        scaleInPlace(scale: number): this;
        /**
         * Sets the values of the current spherical
         * @param radius the new radius
         * @param theta the new theta
         * @param phi the new phi
         * @returns the current spherical
         */
        set(radius: number, theta: number, phi: number): this;
        /**
         * Sets the values of the current spherical
         * @param value the new values
         * @returns the current spherical
         */
        setAll(value: number): this;
        /**
         * Assigns the rectangular coordinates of the current Spherical to a Vector3
         * @param ref the Vector3 to update
         * @returns the updated Vector3
         */
        toVector3ToRef(ref: Vector3): Vector3;
        /**
         * Gets a Vector3 from the current spherical coordinates
         * @returns the (x, y,z) form of the current Spherical
         */
        toVector3(): Vector3;
        /**
         * Assigns the spherical coordinates from a Vector3
         * @param vector the vector to convert
         * @param ref the Spherical to update
         * @returns the updated ref
         */
        static FromVector3ToRef(vector: DeepImmutable<Vector3>, ref: Spherical): Spherical;
        /**
         * Gets a Spherical from a Vector3
         * @param vector defines the vector in (x, y, z) coordinate space
         * @returns a new Spherical
         */
        static FromVector3(vector: DeepImmutable<Vector3>): Spherical;
        /**
         * Converts an array of floats to a spherical
         * @param array the array to convert
         * @returns the converted spherical
         */
        static FromArray(array: number[]): Spherical;
    }


    /**
     * Represents a plane by the equation ax + by + cz + d = 0
     */
    export class Plane implements IPlaneLike {
        private static _TmpMatrix;
        /**
         * Normal of the plane (a,b,c)
         */
        normal: Vector3;
        /**
         * d component of the plane
         */
        d: number;
        /**
         * Creates a Plane object according to the given floats a, b, c, d and the plane equation : ax + by + cz + d = 0
         * @param a a component of the plane
         * @param b b component of the plane
         * @param c c component of the plane
         * @param d d component of the plane
         */
        constructor(a: number, b: number, c: number, d: number);
        /**
         * @returns the plane coordinates as a new array of 4 elements [a, b, c, d].
         */
        asArray(): number[];
        /**
         * @returns a new plane copied from the current Plane.
         */
        clone(): Plane;
        /**
         * @returns the string "Plane".
         */
        getClassName(): string;
        /**
         * @returns the Plane hash code.
         */
        getHashCode(): number;
        /**
         * Normalize the current Plane in place.
         * @returns the updated Plane.
         */
        normalize(): Plane;
        /**
         * Applies a transformation the plane and returns the result
         * @param transformation the transformation matrix to be applied to the plane
         * @returns a new Plane as the result of the transformation of the current Plane by the given matrix.
         */
        transform(transformation: DeepImmutable<Matrix>): Plane;
        /**
         * Compute the dot product between the point and the plane normal
         * @param point point to calculate the dot product with
         * @returns the dot product (float) of the point coordinates and the plane normal.
         */
        dotCoordinate(point: DeepImmutable<Vector3>): number;
        /**
         * Updates the current Plane from the plane defined by the three given points.
         * @param point1 one of the points used to construct the plane
         * @param point2 one of the points used to construct the plane
         * @param point3 one of the points used to construct the plane
         * @returns the updated Plane.
         */
        copyFromPoints(point1: DeepImmutable<Vector3>, point2: DeepImmutable<Vector3>, point3: DeepImmutable<Vector3>): Plane;
        /**
         * Checks if the plane is facing a given direction (meaning if the plane's normal is pointing in the opposite direction of the given vector).
         * Note that for this function to work as expected you should make sure that:
         *   - direction and the plane normal are normalized
         *   - epsilon is a number just bigger than -1, something like -0.99 for eg
         * @param direction the direction to check if the plane is facing
         * @param epsilon value the dot product is compared against (returns true if dot <= epsilon)
         * @returns True if the plane is facing the given direction
         */
        isFrontFacingTo(direction: DeepImmutable<Vector3>, epsilon: number): boolean;
        /**
         * Calculates the distance to a point
         * @param point point to calculate distance to
         * @returns the signed distance (float) from the given point to the Plane.
         */
        signedDistanceTo(point: DeepImmutable<Vector3>): number;
        /**
         * Creates a plane from an  array
         * @param array the array to create a plane from
         * @returns a new Plane from the given array.
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>): Plane;
        /**
         * Creates a plane from three points
         * @param point1 point used to create the plane
         * @param point2 point used to create the plane
         * @param point3 point used to create the plane
         * @returns a new Plane defined by the three given points.
         */
        static FromPoints(point1: DeepImmutable<Vector3>, point2: DeepImmutable<Vector3>, point3: DeepImmutable<Vector3>): Plane;
        /**
         * Creates a plane from an origin point and a normal
         * @param origin origin of the plane to be constructed
         * @param normal normal of the plane to be constructed
         * @returns a new Plane the normal vector to this plane at the given origin point.
         */
        static FromPositionAndNormal(origin: DeepImmutable<Vector3>, normal: Vector3): Plane;
        /**
         * Updates the given Plane "result" from an origin point and a normal.
         * @param origin origin of the plane to be constructed
         * @param normal the normalized normals of the plane to be constructed
         * @param result defines the Plane where to store the result
         * @returns result input
         */
        static FromPositionAndNormalToRef<T extends Plane>(origin: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>, result: T): T;
        /**
         * Calculates the distance from a plane and a point
         * @param origin origin of the plane to be constructed
         * @param normal normal of the plane to be constructed
         * @param point point to calculate distance to
         * @returns the signed distance between the plane defined by the normal vector at the "origin"" point and the given other point.
         */
        static SignedDistanceToPlaneFromPositionAndNormal(origin: DeepImmutable<Vector3>, normal: DeepImmutable<Vector3>, point: DeepImmutable<Vector3>): number;
    }


    /**
     * Defines potential orientation for back face culling
     */
    export enum Orientation {
        /**
         * Clockwise
         */
        CW = 0,
        /** Counter clockwise */
        CCW = 1
    }
    /** Class used to represent a Bezier curve */
    export class BezierCurve {
        /**
         * Returns the cubic Bezier interpolated value (float) at "t" (float) from the given x1, y1, x2, y2 floats
         * @param t defines the time
         * @param x1 defines the left coordinate on X axis
         * @param y1 defines the left coordinate on Y axis
         * @param x2 defines the right coordinate on X axis
         * @param y2 defines the right coordinate on Y axis
         * @returns the interpolated value
         */
        static Interpolate(t: number, x1: number, y1: number, x2: number, y2: number): number;
    }
    /**
     * Defines angle representation
     */
    export class Angle {
        private _radians;
        /**
         * Creates an Angle object of "radians" radians (float).
         * @param radians the angle in radians
         */
        constructor(radians: number);
        /**
         * Get value in degrees
         * @returns the Angle value in degrees (float)
         */
        degrees(): number;
        /**
         * Get value in radians
         * @returns the Angle value in radians (float)
         */
        radians(): number;
        /**
         * Gets a new Angle object with a value of the angle (in radians) between the line connecting the two points and the x-axis
         * @param a defines first point as the origin
         * @param b defines point
         * @returns a new Angle
         */
        static BetweenTwoPoints(a: DeepImmutable<Vector2>, b: DeepImmutable<Vector2>): Angle;
        /**
         * Gets the angle between the two vectors
         * @param a defines first vector
         * @param b defines vector
         * @returns Returns an new Angle between 0 and PI
         */
        static BetweenTwoVectors<Vec extends Vector2 | Vector3 | Vector4>(a: DeepImmutable<Vec>, b: DeepImmutable<Vec>): Angle;
        /**
         * Gets a new Angle object from the given float in radians
         * @param radians defines the angle value in radians
         * @returns a new Angle
         */
        static FromRadians(radians: number): Angle;
        /**
         * Gets a new Angle object from the given float in degrees
         * @param degrees defines the angle value in degrees
         * @returns a new Angle
         */
        static FromDegrees(degrees: number): Angle;
    }
    /**
     * This represents an arc in a 2d space.
     */
    export class Arc2 {
        /** Defines the start point of the arc */
        startPoint: Vector2;
        /** Defines the mid point of the arc */
        midPoint: Vector2;
        /** Defines the end point of the arc */
        endPoint: Vector2;
        /**
         * Defines the center point of the arc.
         */
        centerPoint: Vector2;
        /**
         * Defines the radius of the arc.
         */
        radius: number;
        /**
         * Defines the angle of the arc (from mid point to end point).
         */
        angle: Angle;
        /**
         * Defines the start angle of the arc (from start point to middle point).
         */
        startAngle: Angle;
        /**
         * Defines the orientation of the arc (clock wise/counter clock wise).
         */
        orientation: Orientation;
        /**
         * Creates an Arc object from the three given points : start, middle and end.
         * @param startPoint Defines the start point of the arc
         * @param midPoint Defines the middle point of the arc
         * @param endPoint Defines the end point of the arc
         */
        constructor(
        /** Defines the start point of the arc */
        startPoint: Vector2, 
        /** Defines the mid point of the arc */
        midPoint: Vector2, 
        /** Defines the end point of the arc */
        endPoint: Vector2);
    }
    /**
     * Represents a 2D path made up of multiple 2D points
     */
    export class Path2 {
        private _points;
        private _length;
        /**
         * If the path start and end point are the same
         */
        closed: boolean;
        /**
         * Creates a Path2 object from the starting 2D coordinates x and y.
         * @param x the starting points x value
         * @param y the starting points y value
         */
        constructor(x: number, y: number);
        /**
         * Adds a new segment until the given coordinates (x, y) to the current Path2.
         * @param x the added points x value
         * @param y the added points y value
         * @returns the updated Path2.
         */
        addLineTo(x: number, y: number): Path2;
        /**
         * Adds _numberOfSegments_ segments according to the arc definition (middle point coordinates, end point coordinates, the arc start point being the current Path2 last point) to the current Path2.
         * @param midX middle point x value
         * @param midY middle point y value
         * @param endX end point x value
         * @param endY end point y value
         * @param numberOfSegments (default: 36)
         * @returns the updated Path2.
         */
        addArcTo(midX: number, midY: number, endX: number, endY: number, numberOfSegments?: number): Path2;
        /**
         * Adds _numberOfSegments_ segments according to the quadratic curve definition to the current Path2.
         * @param controlX control point x value
         * @param controlY control point y value
         * @param endX end point x value
         * @param endY end point y value
         * @param numberOfSegments (default: 36)
         * @returns the updated Path2.
         */
        addQuadraticCurveTo(controlX: number, controlY: number, endX: number, endY: number, numberOfSegments?: number): Path2;
        /**
         * Adds _numberOfSegments_ segments according to the bezier curve definition to the current Path2.
         * @param originTangentX tangent vector at the origin point x value
         * @param originTangentY tangent vector at the origin point y value
         * @param destinationTangentX tangent vector at the destination point x value
         * @param destinationTangentY tangent vector at the destination point y value
         * @param endX end point x value
         * @param endY end point y value
         * @param numberOfSegments (default: 36)
         * @returns the updated Path2.
         */
        addBezierCurveTo(originTangentX: number, originTangentY: number, destinationTangentX: number, destinationTangentY: number, endX: number, endY: number, numberOfSegments?: number): Path2;
        /**
         * Defines if a given point is inside the polygon defines by the path
         * @param point defines the point to test
         * @returns true if the point is inside
         */
        isPointInside(point: Vector2): boolean;
        /**
         * Closes the Path2.
         * @returns the Path2.
         */
        close(): Path2;
        /**
         * Gets the sum of the distance between each sequential point in the path
         * @returns the Path2 total length (float).
         */
        length(): number;
        /**
         * Gets the area of the polygon defined by the path
         * @returns area value
         */
        area(): number;
        /**
         * Gets the points which construct the path
         * @returns the Path2 internal array of points.
         */
        getPoints(): Vector2[];
        /**
         * Retrieves the point at the distance aways from the starting point
         * @param normalizedLengthPosition the length along the path to retrieve the point from
         * @returns a new Vector2 located at a percentage of the Path2 total length on this path.
         */
        getPointAtLengthPosition(normalizedLengthPosition: number): Vector2;
        /**
         * Creates a new path starting from an x and y position
         * @param x starting x value
         * @param y starting y value
         * @returns a new Path2 starting at the coordinates (x, y).
         */
        static StartingAt(x: number, y: number): Path2;
    }
    /**
     * Represents a 3D path made up of multiple 3D points
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D
     */
    export class Path3D {
        /**
         * an array of Vector3, the curve axis of the Path3D
         */
        path: Vector3[];
        private _curve;
        private _distances;
        private _tangents;
        private _normals;
        private _binormals;
        private _raw;
        private _alignTangentsWithPath;
        private readonly _pointAtData;
        /**
         * new Path3D(path, normal, raw)
         * Creates a Path3D. A Path3D is a logical math object, so not a mesh.
         * please read the description in the tutorial : https://doc.babylonjs.com/features/featuresDeepDive/mesh/path3D
         * @param path an array of Vector3, the curve axis of the Path3D
         * @param firstNormal (options) Vector3, the first wanted normal to the curve. Ex (0, 1, 0) for a vertical normal.
         * @param raw (optional, default false) : boolean, if true the returned Path3D isn't normalized. Useful to depict path acceleration or speed.
         * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path.
         */
        constructor(
        /**
         * an array of Vector3, the curve axis of the Path3D
         */
        path: Vector3[], firstNormal?: Nullable<Vector3>, raw?: boolean, alignTangentsWithPath?: boolean);
        /**
         * Returns the Path3D array of successive Vector3 designing its curve.
         * @returns the Path3D array of successive Vector3 designing its curve.
         */
        getCurve(): Vector3[];
        /**
         * Returns the Path3D array of successive Vector3 designing its curve.
         * @returns the Path3D array of successive Vector3 designing its curve.
         */
        getPoints(): Vector3[];
        /**
         * @returns the computed length (float) of the path.
         */
        length(): number;
        /**
         * Returns an array populated with tangent vectors on each Path3D curve point.
         * @returns an array populated with tangent vectors on each Path3D curve point.
         */
        getTangents(): Vector3[];
        /**
         * Returns an array populated with normal vectors on each Path3D curve point.
         * @returns an array populated with normal vectors on each Path3D curve point.
         */
        getNormals(): Vector3[];
        /**
         * Returns an array populated with binormal vectors on each Path3D curve point.
         * @returns an array populated with binormal vectors on each Path3D curve point.
         */
        getBinormals(): Vector3[];
        /**
         * Returns an array populated with distances (float) of the i-th point from the first curve point.
         * @returns an array populated with distances (float) of the i-th point from the first curve point.
         */
        getDistances(): number[];
        /**
         * Returns an interpolated point along this path
         * @param position the position of the point along this path, from 0.0 to 1.0
         * @returns a new Vector3 as the point
         */
        getPointAt(position: number): Vector3;
        /**
         * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.
         * @param position the position of the point along this path, from 0.0 to 1.0
         * @param interpolated (optional, default false) : boolean, if true returns an interpolated tangent instead of the tangent of the previous path point.
         * @returns a tangent vector corresponding to the interpolated Path3D curve point, if not interpolated, the tangent is taken from the precomputed tangents array.
         */
        getTangentAt(position: number, interpolated?: boolean): Vector3;
        /**
         * Returns the tangent vector of an interpolated Path3D curve point at the specified position along this path.
         * @param position the position of the point along this path, from 0.0 to 1.0
         * @param interpolated (optional, default false) : boolean, if true returns an interpolated normal instead of the normal of the previous path point.
         * @returns a normal vector corresponding to the interpolated Path3D curve point, if not interpolated, the normal is taken from the precomputed normals array.
         */
        getNormalAt(position: number, interpolated?: boolean): Vector3;
        /**
         * Returns the binormal vector of an interpolated Path3D curve point at the specified position along this path.
         * @param position the position of the point along this path, from 0.0 to 1.0
         * @param interpolated (optional, default false) : boolean, if true returns an interpolated binormal instead of the binormal of the previous path point.
         * @returns a binormal vector corresponding to the interpolated Path3D curve point, if not interpolated, the binormal is taken from the precomputed binormals array.
         */
        getBinormalAt(position: number, interpolated?: boolean): Vector3;
        /**
         * Returns the distance (float) of an interpolated Path3D curve point at the specified position along this path.
         * @param position the position of the point along this path, from 0.0 to 1.0
         * @returns the distance of the interpolated Path3D curve point at the specified position along this path.
         */
        getDistanceAt(position: number): number;
        /**
         * Returns the array index of the previous point of an interpolated point along this path
         * @param position the position of the point to interpolate along this path, from 0.0 to 1.0
         * @returns the array index
         */
        getPreviousPointIndexAt(position: number): number;
        /**
         * Returns the position of an interpolated point relative to the two path points it lies between, from 0.0 (point A) to 1.0 (point B)
         * @param position the position of the point to interpolate along this path, from 0.0 to 1.0
         * @returns the sub position
         */
        getSubPositionAt(position: number): number;
        /**
         * Returns the position of the closest virtual point on this path to an arbitrary Vector3, from 0.0 to 1.0
         * @param target the vector of which to get the closest position to
         * @returns the position of the closest virtual point on this path to the target vector
         */
        getClosestPositionTo(target: Vector3): number;
        /**
         * Returns a sub path (slice) of this path
         * @param start the position of the fist path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values
         * @param end the position of the last path point, from 0.0 to 1.0, or a negative value, which will get wrapped around from the end of the path to 0.0 to 1.0 values
         * @returns a sub path (slice) of this path
         */
        slice(start?: number, end?: number): Path3D;
        /**
         * Forces the Path3D tangent, normal, binormal and distance recomputation.
         * @param path path which all values are copied into the curves points
         * @param firstNormal which should be projected onto the curve
         * @param alignTangentsWithPath (optional, default false) : boolean, if true the tangents will be aligned with the path
         * @returns the same object updated.
         */
        update(path: Vector3[], firstNormal?: Nullable<Vector3>, alignTangentsWithPath?: boolean): Path3D;
        private _compute;
        private _getFirstNonNullVector;
        private _getLastNonNullVector;
        private _normalVector;
        /**
         * Updates the point at data for an interpolated point along this curve
         * @param position the position of the point along this curve, from 0.0 to 1.0
         * @param interpolateTNB
         * @interpolateTNB whether to compute the interpolated tangent, normal and binormal
         * @returns the (updated) point at data
         */
        private _updatePointAtData;
        /**
         * Updates the point at data from the specified parameters
         * @param position where along the path the interpolated point is, from 0.0 to 1.0
         * @param subPosition
         * @param point the interpolated point
         * @param parentIndex the index of an existing curve point that is on, or else positionally the first behind, the interpolated point
         * @param interpolateTNB whether to compute the interpolated tangent, normal and binormal
         * @returns the (updated) point at data
         */
        private _setPointAtData;
        /**
         * Updates the point at interpolation matrix for the tangents, normals and binormals
         */
        private _updateInterpolationMatrix;
    }
    /**
     * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.
     * A Curve3 is designed from a series of successive Vector3.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves
     */
    export class Curve3 {
        private _points;
        private _length;
        /**
         * Returns a Curve3 object along a Quadratic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#quadratic-bezier-curve
         * @param v0 (Vector3) the origin point of the Quadratic Bezier
         * @param v1 (Vector3) the control point
         * @param v2 (Vector3) the end point of the Quadratic Bezier
         * @param nbPoints (integer) the wanted number of points in the curve
         * @returns the created Curve3
         */
        static CreateQuadraticBezier(v0: DeepImmutable<Vector3>, v1: DeepImmutable<Vector3>, v2: DeepImmutable<Vector3>, nbPoints: number): Curve3;
        /**
         * Returns a Curve3 object along a Cubic Bezier curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#cubic-bezier-curve
         * @param v0 (Vector3) the origin point of the Cubic Bezier
         * @param v1 (Vector3) the first control point
         * @param v2 (Vector3) the second control point
         * @param v3 (Vector3) the end point of the Cubic Bezier
         * @param nbPoints (integer) the wanted number of points in the curve
         * @returns the created Curve3
         */
        static CreateCubicBezier(v0: DeepImmutable<Vector3>, v1: DeepImmutable<Vector3>, v2: DeepImmutable<Vector3>, v3: DeepImmutable<Vector3>, nbPoints: number): Curve3;
        /**
         * Returns a Curve3 object along a Hermite Spline curve : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#hermite-spline
         * @param p1 (Vector3) the origin point of the Hermite Spline
         * @param t1 (Vector3) the tangent vector at the origin point
         * @param p2 (Vector3) the end point of the Hermite Spline
         * @param t2 (Vector3) the tangent vector at the end point
         * @param nSeg (integer) the number of curve segments or nSeg + 1 points in the array
         * @returns the created Curve3
         */
        static CreateHermiteSpline(p1: DeepImmutable<Vector3>, t1: DeepImmutable<Vector3>, p2: DeepImmutable<Vector3>, t2: DeepImmutable<Vector3>, nSeg: number): Curve3;
        /**
         * Returns a Curve3 object along a CatmullRom Spline curve :
         * @param points (array of Vector3) the points the spline must pass through. At least, four points required
         * @param nbPoints (integer) the wanted number of points between each curve control points
         * @param closed (boolean) optional with default false, when true forms a closed loop from the points
         * @returns the created Curve3
         */
        static CreateCatmullRomSpline(points: DeepImmutable<Vector3[]>, nbPoints: number, closed?: boolean): Curve3;
        /**
         * Returns a Curve3 object along an arc through three vector3 points:
         * The three points should not be colinear. When they are the Curve3 is empty.
         * @param first (Vector3) the first point the arc must pass through.
         * @param second (Vector3) the second point the arc must pass through.
         * @param third (Vector3) the third point the arc must pass through.
         * @param steps (number) the larger the number of steps the more detailed the arc.
         * @param closed (boolean) optional with default false, when true forms the chord from the first and third point
         * @param fullCircle Circle (boolean) optional with default false, when true forms the complete circle through the three points
         * @returns the created Curve3
         */
        static ArcThru3Points(first: Vector3, second: Vector3, third: Vector3, steps?: number, closed?: boolean, fullCircle?: boolean): Curve3;
        /**
         * A Curve3 object is a logical object, so not a mesh, to handle curves in the 3D geometric space.
         * A Curve3 is designed from a series of successive Vector3.
         * Tuto : https://doc.babylonjs.com/features/featuresDeepDive/mesh/drawCurves#curve3-object
         * @param points points which make up the curve
         */
        constructor(points: Vector3[]);
        /**
         * @returns the Curve3 stored array of successive Vector3
         */
        getPoints(): Vector3[];
        /**
         * @returns the computed length (float) of the curve.
         */
        length(): number;
        /**
         * Returns a new instance of Curve3 object : var curve = curveA.continue(curveB);
         * This new Curve3 is built by translating and sticking the curveB at the end of the curveA.
         * curveA and curveB keep unchanged.
         * @param curve the curve to continue from this curve
         * @returns the newly constructed curve
         */
        continue(curve: DeepImmutable<Curve3>): Curve3;
        private _computeLength;
    }


    /**
     * @internal
     */
    export interface IColor3Like {
        r: float;
        g: float;
        b: float;
    }
    /**
     * @internal
     */
    export interface IColor4Like extends IColor3Like {
        a: float;
    }
    /**
     * @internal
     */
    export interface IVector2Like {
        x: float;
        y: float;
    }
    /**
     * @internal
     */
    export interface IVector3Like extends IVector2Like {
        z: float;
    }
    /**
     * @internal
     */
    export interface IVector3LikeInternal {
        _x: number;
        _y: number;
        _z: number;
        _isDirty?: boolean;
    }
    /**
     * @internal
     */
    export interface IVector4Like extends IVector3Like {
        w: float;
    }
    /**
     * @internal
     */
    export interface IQuaternionLike extends IVector3Like {
        w: float;
    }
    /**
     * @internal
     */
    export interface IPlaneLike {
        normal: IVector3Like;
        d: float;
        normalize(): void;
    }
    /**
     * @internal
     */
    export interface IMatrixLike {
        asArray(): Tuple<number, 16>;
        updateFlag: int;
    }
    /**
     * @internal
     */
    export interface IViewportLike {
        x: float;
        y: float;
        width: float;
        height: float;
    }


    /**
     * Class representing an isovector a vector containing 2 INTEGER coordinates
     * x axis is horizontal
     * y axis is 60 deg counter clockwise from positive y axis
     * @internal
     */
    export class _IsoVector {
        /** [0] defines the first coordinate */
        x: number;
        /** [0] defines the second coordinate */
        y: number;
        /**
         * Creates a new isovector from the given x and y coordinates
         * @param x defines the first coordinate, must be an integer
         * @param y defines the second coordinate, must be an integer
         */
        constructor(
        /** [0] defines the first coordinate */
        x?: number, 
        /** [0] defines the second coordinate */
        y?: number);
        /**
         * Gets a new IsoVector copied from the IsoVector
         * @returns a new IsoVector
         */
        clone(): _IsoVector;
        /**
         * Rotates one IsoVector 60 degrees counter clockwise about another
         * Please note that this is an in place operation
         * @param other an IsoVector a center of rotation
         * @returns the rotated IsoVector
         */
        rotate60About(other: _IsoVector): this;
        /**
         * Rotates one IsoVector 60 degrees clockwise about another
         * Please note that this is an in place operation
         * @param other an IsoVector as center of rotation
         * @returns the rotated IsoVector
         */
        rotateNeg60About(other: _IsoVector): this;
        /**
         * For an equilateral triangle OAB with O at isovector (0, 0) and A at isovector (m, n)
         * Rotates one IsoVector 120 degrees counter clockwise about the center of the triangle
         * Please note that this is an in place operation
         * @param m integer a measure a Primary triangle of order (m, n) m > n
         * @param n >= 0 integer a measure for a Primary triangle of order (m, n)
         * @returns the rotated IsoVector
         */
        rotate120(m: number, n: number): this;
        /**
         * For an equilateral triangle OAB with O at isovector (0, 0) and A at isovector (m, n)
         * Rotates one IsoVector 120 degrees clockwise about the center of the triangle
         * Please note that this is an in place operation
         * @param m integer a measure a Primary triangle of order (m, n) m > n
         * @param n >= 0 integer a measure for a Primary triangle of order (m, n)
         * @returns the rotated IsoVector
         */
        rotateNeg120(m: number, n: number): this;
        /**
         * Transforms an IsoVector to one in Cartesian 3D space based on an isovector
         * @param origin an IsoVector
         * @param isoGridSize
         * @returns Point as a Vector3
         */
        toCartesianOrigin(origin: _IsoVector, isoGridSize: number): Vector3;
        /**
         * Gets a new IsoVector(0, 0)
         * @returns a new IsoVector
         */
        static Zero(): _IsoVector;
    }


    /**
     * The WGS84 reference ellipsoid used for Earth-related geospatial functions.
     * Derived from the semi-major axis (meters) and the inverse flattening.
     */
    export var Wgs84Ellipsoid: DeepImmutable<IEllipsoidLike>;
    /**
     * Converts the latitude and longitude specified in degrees to an {@link ILatLonLike} in radians.
     * @param lat - The latitude in degrees
     * @param lon - The longitude in degrees
     * @param result - The resulting {@link ILatLonLike} in radians
     * @returns The resulting {@link ILatLonLike} in radians
     */
    export function LatLonFromDegreesToRef<T extends ILatLonLike>(lat: number, lon: number, result: T): T;
    /**
     * Computes the normal (up direction) in ECEF (Earth-Centered, Earth-Fixed) coordinates from the specified latitude and longitude in radians.
     * For the calculation, latitude is clamped to -PI/2 to PI/2.
     * @param latLon - The latitude and longitude in radians
     * @param result - The resulting normal
     * @returns The resulting normal
     */
    export function LatLonToNormalToRef<T extends IVector3Like>(latLon: DeepImmutable<ILatLonLike>, result: T): T;
    /**
     * Converts latitude, longitude, and altitude to an ECEF (Earth-Centered, Earth-Fixed) position using the specified ellipsoid.
     * For the calculation, latitude is clamped to -PI/2 to PI/2.
     * @param latLonAlt - The latitude and longitude in radians, and the altitude relative to the reference ellipsoid's surface.
     * @param ellipsoid - Parameters for a reference ellipsoid (e.g., the {@link Wgs84Ellipsoid}).
     * @param result - The resulting ECEF position
     * @returns The resulting ECEF position
     */
    export function EcefFromLatLonAltToRef<T extends IVector3Like>(latLonAlt: DeepImmutable<ILatLonAltLike>, ellipsoid: DeepImmutable<Pick<IEllipsoidLike, "semiMajorAxis" | "firstEccentricitySquared">>, result: T): T;


    /** Latitude and longitude in radians. */
    export interface ILatLonLike {
        /** Latitude in radians. */
        lat: number;
        /** Longitude in radians. */
        lon: number;
    }
    /** Latitude and longitude in radians, and altitude, typically meters. */
    export interface ILatLonAltLike extends ILatLonLike {
        /** The height above the surface, typically meters. */
        alt: number;
    }
    /**
     * A reference ellipsoid used for geospatial functions.
     */
    export interface IEllipsoidLike {
        /** The larger radius for the ellipsoid. */
        semiMajorAxis: number;
        /** The smaller radius for the ellipsoid. */
        semiMinorAxis: number;
        /** The flattening for the ellipsoid. Zero for a sphere. */
        flattening: number;
        /** The first eccentricity, squared. */
        firstEccentricitySquared: number;
        /** The second eccentricity, squared. */
        secondEccentricitySquared: number;
    }


    /**
     * Extracts minimum and maximum values from a list of indexed positions
     * @param positions defines the positions to use
     * @param indices defines the indices to the positions
     * @param indexStart defines the start index
     * @param indexCount defines the end index
     * @param bias defines bias value to add to the result
     * @returns minimum and maximum values
     */
    export function extractMinAndMaxIndexed(positions: FloatArray, indices: IndicesArray, indexStart: number, indexCount: number, bias?: Nullable<Vector2>): {
        minimum: Vector3;
        maximum: Vector3;
    };
    /**
     * Extracts minimum and maximum values from a list of positions
     * @param positions defines the positions to use
     * @param start defines the start index in the positions array
     * @param count defines the number of positions to handle
     * @param bias defines bias value to add to the result
     * @param stride defines the stride size to use (distance between two positions in the positions array)
     * @returns minimum and maximum values
     */
    export function extractMinAndMax(positions: FloatArray, start: number, count: number, bias?: Nullable<Vector2>, stride?: number): {
        minimum: Vector3;
        maximum: Vector3;
    };
    /**
     * Flip flipped faces
     * @param positions defines the positions to use
     * @param indices defines the indices to use and update
     */
    export function FixFlippedFaces(positions: FloatArray, indices: IndicesArray): void;


    /**
     * Represents a camera frustum
     */
    export class Frustum {
        /**
         * Gets the planes representing the frustum
         * @param transform matrix to be applied to the returned planes
         * @returns a new array of 6 Frustum planes computed by the given transformation matrix.
         */
        static GetPlanes(transform: DeepImmutable<Matrix>): Plane[];
        /**
         * Gets the near frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetNearPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Gets the far frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetFarPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Gets the left frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetLeftPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Gets the right frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetRightPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Gets the top frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetTopPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Gets the bottom frustum plane transformed by the transform matrix
         * @param transform transformation matrix to be applied to the resulting frustum plane
         * @param frustumPlane the resulting frustum plane
         */
        static GetBottomPlaneToRef(transform: DeepImmutable<Matrix>, frustumPlane: Plane): void;
        /**
         * Sets the given array "frustumPlanes" with the 6 Frustum planes computed by the given transformation matrix.
         * @param transform transformation matrix to be applied to the resulting frustum planes
         * @param frustumPlanes the resulting frustum planes
         */
        static GetPlanesToRef(transform: DeepImmutable<Matrix>, frustumPlanes: Plane[]): void;
        /**
         * Tests if a point is located between the frustum planes.
         * @param point defines the point to test
         * @param frustumPlanes defines the frustum planes to test
         * @returns true if the point is located between the frustum planes
         */
        static IsPointInFrustum(point: Vector3, frustumPlanes: Array<DeepImmutable<Plane>>): boolean;
    }




    /**
     * Constant used to convert a value to gamma space
     */
    export var ToGammaSpace: number;
    /**
     * Constant used to convert a value to linear space
     */
    export const ToLinearSpace = 2.2;
    /**
     * Constant Golden Ratio value in Babylon.js
     */
    export var PHI: number;
    /**
     * Constant used to define the minimal number value in Babylon.js
     * Exported as "let" so advanced users can override the epsilon value in supported build targets (for example via the global BABYLON.Epsilon)
     * @ignorenaming
     */
    export let Epsilon: number;


    /** This file must only contain pure code and pure imports */
    /**
     * Class used to hold a RGB color
     */
    export class Color3 implements Tensor<Tuple<number, 3>, IColor3Like>, IColor3Like {
        /**
         * [0] Defines the red component (between 0 and 1, default is 0)
         */
        r: number;
        /**
         * [0] Defines the green component (between 0 and 1, default is 0)
         */
        g: number;
        /**
         * [0] Defines the blue component (between 0 and 1, default is 0)
         */
        b: number;
        /**
         * If the first color is flagged with integers (as everything is 0,0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent colors are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all color instances that it creates.
         * But the original color instances are unchanged and has a "deprecated map".
         * If we keep using the color instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Color3>;
        /**
         * @see Tensor.dimension
         */
        readonly dimension: [3];
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /**
         * Creates a new Color3 object from red, green, blue values, all between 0 and 1
         * @param r defines the red component (between 0 and 1, default is 0)
         * @param g defines the green component (between 0 and 1, default is 0)
         * @param b defines the blue component (between 0 and 1, default is 0)
         */
        constructor(
        /**
         * [0] Defines the red component (between 0 and 1, default is 0)
         */
        r?: number, 
        /**
         * [0] Defines the green component (between 0 and 1, default is 0)
         */
        g?: number, 
        /**
         * [0] Defines the blue component (between 0 and 1, default is 0)
         */
        b?: number);
        /**
         * Creates a string with the Color3 current values
         * @returns the string representation of the Color3 object
         */
        toString(): string;
        /**
         * Returns the string "Color3"
         * @returns "Color3"
         */
        getClassName(): string;
        /**
         * Compute the Color3 hash code
         * @returns an unique number that can be used to hash Color3 objects
         */
        getHashCode(): number;
        /**
         * Stores in the given array from the given starting index the red, green, blue values as successive elements
         * @param array defines the array where to store the r,g,b components
         * @param index defines an optional index in the target array to define where to start storing values
         * @returns the current Color3 object
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current color with values stored in an array from the starting index of the given array
         * @param array defines the source array
         * @param offset defines an offset in the source array
         * @returns the current Color3 object
         */
        fromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): this;
        /**
         * Returns a new Color4 object from the current Color3 and the given alpha
         * @param alpha defines the alpha component on the new Color4 object (default is 1)
         * @returns a new Color4 object
         */
        toColor4(alpha?: number): Color4;
        /**
         * Returns a new array populated with 3 numeric elements : red, green and blue values
         * @returns the new array
         */
        asArray(): Tuple<number, 3>;
        /**
         * Returns the luminance value
         * @returns a float value
         */
        toLuminance(): number;
        /**
         * Multiply each Color3 rgb values by the given Color3 rgb values in a new Color3 object
         * @param otherColor defines the second operand
         * @returns the new Color3 object
         */
        multiply(otherColor: DeepImmutable<IColor3Like>): Color3;
        /**
         * Multiply the rgb values of the Color3 and the given Color3 and stores the result in the object "result"
         * @param otherColor defines the second operand
         * @param result defines the Color3 object where to store the result
         * @returns the result Color3
         */
        multiplyToRef<T extends IColor3Like>(otherColor: DeepImmutable<IColor3Like>, result: T): T;
        /**
         * Multiplies the current Color3 coordinates by the given ones
         * @param otherColor defines the second operand
         * @returns the current updated Color3
         */
        multiplyInPlace(otherColor: DeepImmutable<IColor3Like>): this;
        /**
         * Returns a new Color3 set with the result of the multiplication of the current Color3 coordinates by the given floats
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @returns the new Color3
         */
        multiplyByFloats(r: number, g: number, b: number): Color3;
        /**
         * @internal
         * Do not use
         */
        divide(_other: DeepImmutable<IColor3Like>): never;
        /**
         * @internal
         * Do not use
         */
        divideToRef(_other: DeepImmutable<IColor3Like>, _result: IColor3Like): never;
        /**
         * @internal
         * Do not use
         */
        divideInPlace(_other: DeepImmutable<IColor3Like>): never;
        /**
         * Updates the current Color3 with the minimal coordinate values between its and the given color ones
         * @param other defines the second operand
         * @returns the current updated Color3
         */
        minimizeInPlace(other: DeepImmutable<IColor3Like>): this;
        /**
         * Updates the current Color3 with the maximal coordinate values between its and the given color ones.
         * @param other defines the second operand
         * @returns the current updated Color3
         */
        maximizeInPlace(other: DeepImmutable<IColor3Like>): this;
        /**
         * Updates the current Color3 with the minimal coordinate values between its and the given coordinates
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @returns the current updated Color3
         */
        minimizeInPlaceFromFloats(r: number, g: number, b: number): this;
        /**
         * Updates the current Color3 with the maximal coordinate values between its and the given coordinates.
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @returns the current updated Color3
         */
        maximizeInPlaceFromFloats(r: number, g: number, b: number): this;
        /**
         * @internal
         * Do not use
         */
        floorToRef(_result: IColor3Like): never;
        /**
         * @internal
         * Do not use
         */
        floor(): never;
        /**
         * @internal
         * Do not use
         */
        fractToRef(_result: IColor3Like): never;
        /**
         * @internal
         * Do not use
         */
        fract(): never;
        /**
         * Determines equality between Color3 objects
         * @param otherColor defines the second operand
         * @returns true if the rgb values are equal to the given ones
         */
        equals(otherColor: DeepImmutable<IColor3Like>): boolean;
        /**
         * Alias for equalsToFloats
         * @param r red color component
         * @param g green color component
         * @param b blue color component
         * @returns boolean
         */
        equalsFloats(r: number, g: number, b: number): boolean;
        /**
         * Determines equality between the current Color3 object and a set of r,b,g values
         * @param r defines the red component to check
         * @param g defines the green component to check
         * @param b defines the blue component to check
         * @returns true if the rgb values are equal to the given ones
         */
        equalsToFloats(r: number, g: number, b: number): boolean;
        /**
         * Returns true if the current Color3 and the given color coordinates are distant less than epsilon
         * @param otherColor defines the second operand
         * @param epsilon defines the minimal distance to define values as equals
         * @returns true if both colors are distant less than epsilon
         */
        equalsWithEpsilon(otherColor: DeepImmutable<IColor3Like>, epsilon?: number): boolean;
        /**
         * @internal
         * Do not use
         */
        negate(): never;
        /**
         * @internal
         * Do not use
         */
        negateInPlace(): never;
        /**
         * @internal
         * Do not use
         */
        negateToRef(_result: IColor3Like): never;
        /**
         * Creates a new Color3 with the current Color3 values multiplied by scale
         * @param scale defines the scaling factor to apply
         * @returns a new Color3 object
         */
        scale(scale: number): Color3;
        /**
         * Multiplies the Color3 values by the float "scale"
         * @param scale defines the scaling factor to apply
         * @returns the current updated Color3
         */
        scaleInPlace(scale: number): this;
        /**
         * Multiplies the rgb values by scale and stores the result into "result"
         * @param scale defines the scaling factor
         * @param result defines the Color3 object where to store the result
         * @returns the result Color3
         */
        scaleToRef<T extends IColor3Like>(scale: number, result: T): T;
        /**
         * Scale the current Color3 values by a factor and add the result to a given Color3
         * @param scale defines the scale factor
         * @param result defines color to store the result into
         * @returns the result Color3
         */
        scaleAndAddToRef<T extends IColor3Like>(scale: number, result: T): T;
        /**
         * Clamps the rgb values by the min and max values and stores the result into "result"
         * @param min defines minimum clamping value (default is 0)
         * @param max defines maximum clamping value (default is 1)
         * @param result defines color to store the result into
         * @returns the result Color3
         */
        clampToRef<T extends IColor3Like>(min: number | undefined, max: number | undefined, result: T): T;
        /**
         * Creates a new Color3 set with the added values of the current Color3 and of the given one
         * @param otherColor defines the second operand
         * @returns the new Color3
         */
        add(otherColor: DeepImmutable<IColor3Like>): Color3;
        /**
         * Adds the given color to the current Color3
         * @param otherColor defines the second operand
         * @returns the current updated Color3
         */
        addInPlace(otherColor: DeepImmutable<IColor3Like>): this;
        /**
         * Adds the given coordinates to the current Color3
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @returns the current updated Color3
         */
        addInPlaceFromFloats(r: number, g: number, b: number): this;
        /**
         * Stores the result of the addition of the current Color3 and given one rgb values into "result"
         * @param otherColor defines the second operand
         * @param result defines Color3 object to store the result into
         * @returns the unmodified current Color3
         */
        addToRef<T extends IColor3Like>(otherColor: DeepImmutable<IColor3Like>, result: T): T;
        /**
         * Returns a new Color3 set with the subtracted values of the given one from the current Color3
         * @param otherColor defines the second operand
         * @returns the new Color3
         */
        subtract(otherColor: DeepImmutable<IColor3Like>): Color3;
        /**
         * Stores the result of the subtraction of given one from the current Color3 rgb values into "result"
         * @param otherColor defines the second operand
         * @param result defines Color3 object to store the result into
         * @returns the unmodified current Color3
         */
        subtractToRef<T extends IColor3Like>(otherColor: DeepImmutable<IColor3Like>, result: T): T;
        /**
         * Subtract the given color from the current Color3
         * @param otherColor defines the second operand
         * @returns the current updated Color3
         */
        subtractInPlace(otherColor: DeepImmutable<IColor3Like>): this;
        /**
         * Returns a new Color3 set with the subtraction of the given floats from the current Color3 coordinates
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @returns the resulting Color3
         */
        subtractFromFloats(r: number, g: number, b: number): Color3;
        /**
         * Subtracts the given floats from the current Color3 coordinates and set the given color "result" with this result
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @param result defines the Color3 object where to store the result
         * @returns the result
         */
        subtractFromFloatsToRef<T extends IColor3Like>(r: number, g: number, b: number, result: T): T;
        /**
         * Copy the current object
         * @returns a new Color3 copied the current one
         */
        clone(): Color3;
        /**
         * Copies the rgb values from the source in the current Color3
         * @param source defines the source Color3 object
         * @returns the updated Color3 object
         */
        copyFrom(source: DeepImmutable<IColor3Like>): this;
        /**
         * Updates the Color3 rgb values from the given floats
         * @param r defines the red component to read from
         * @param g defines the green component to read from
         * @param b defines the blue component to read from
         * @returns the current Color3 object
         */
        copyFromFloats(r: number, g: number, b: number): this;
        /**
         * Updates the Color3 rgb values from the given floats
         * @param r defines the red component to read from
         * @param g defines the green component to read from
         * @param b defines the blue component to read from
         * @returns the current Color3 object
         */
        set(r: number, g: number, b: number): this;
        /**
         * Copies the given float to the current Color3 coordinates
         * @param v defines the r, g and b coordinates of the operand
         * @returns the current updated Color3
         */
        setAll(v: number): this;
        /**
         * Compute the Color3 hexadecimal code as a string
         * @returns a string containing the hexadecimal representation of the Color3 object
         */
        toHexString(): string;
        /**
         * Updates the Color3 rgb values from the string containing valid hexadecimal values
         * @param hex defines a string containing valid hexadecimal values
         * @returns the current Color3 object
         */
        fromHexString(hex: string): this;
        /**
         * Converts current color in rgb space to HSV values
         * @returns a new color3 representing the HSV values
         */
        toHSV(): Color3;
        /**
         * Converts current color in rgb space to HSV values
         * @param result defines the Color3 where to store the HSV values
         * @returns the updated result
         */
        toHSVToRef<T extends IColor3Like>(result: T): T;
        /**
         * Computes a new Color3 converted from the current one to linear space
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns a new Color3 object
         */
        toLinearSpace(exact?: boolean): Color3;
        /**
         * Converts the Color3 values to linear space and stores the result in "convertedColor"
         * @param convertedColor defines the Color3 object where to store the linear space version
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns the unmodified Color3
         */
        toLinearSpaceToRef(convertedColor: IColor3Like, exact?: boolean): this;
        /**
         * Computes a new Color3 converted from the current one to gamma space
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns a new Color3 object
         */
        toGammaSpace(exact?: boolean): Color3;
        /**
         * Converts the Color3 values to gamma space and stores the result in "convertedColor"
         * @param convertedColor defines the Color3 object where to store the gamma space version
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns the unmodified Color3
         */
        toGammaSpaceToRef(convertedColor: IColor3Like, exact?: boolean): this;
        private static _BlackReadOnly;
        /**
         * Converts Hue, saturation and value to a Color3 (RGB)
         * @param hue defines the hue (value between 0 and 360)
         * @param saturation defines the saturation (value between 0 and 1)
         * @param value defines the value (value between 0 and 1)
         * @param result defines the Color3 where to store the RGB values
         * @returns the updated result
         */
        static HSVtoRGBToRef<T extends IColor3Like>(hue: number, saturation: number, value: number, result: T): T;
        /**
         * Converts Hue, saturation and value to a new Color3 (RGB)
         * @param hue defines the hue (value between 0 and 360)
         * @param saturation defines the saturation (value between 0 and 1)
         * @param value defines the value (value between 0 and 1)
         * @returns a new Color3 object
         */
        static FromHSV(hue: number, saturation: number, value: number): Color3;
        /**
         * Creates a new Color3 from the string containing valid hexadecimal values
         * @param hex defines a string containing valid hexadecimal values
         * @returns a new Color3 object
         */
        static FromHexString(hex: string): Color3;
        /**
         * Creates a new Color3 from the starting index of the given array
         * @param array defines the source array
         * @param offset defines an offset in the source array
         * @returns a new Color3 object
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Color3;
        /**
         * Creates a new Color3 from the starting index element of the given array
         * @param array defines the source array to read from
         * @param offset defines the offset in the source array
         * @param result defines the target Color3 object
         */
        static FromArrayToRef(array: DeepImmutable<ArrayLike<number>>, offset: number | undefined, result: Color3): void;
        /**
         * Creates a new Color3 from integer values (\< 256)
         * @param r defines the red component to read from (value between 0 and 255)
         * @param g defines the green component to read from (value between 0 and 255)
         * @param b defines the blue component to read from (value between 0 and 255)
         * @returns a new Color3 object
         */
        static FromInts(r: number, g: number, b: number): Color3;
        /**
         * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3
         * @param start defines the start Color3 value
         * @param end defines the end Color3 value
         * @param amount defines the gradient value between start and end
         * @returns a new Color3 object
         */
        static Lerp(start: DeepImmutable<Color3>, end: DeepImmutable<Color3>, amount: number): Color3;
        /**
         * Creates a new Color3 with values linearly interpolated of "amount" between the start Color3 and the end Color3
         * @param left defines the start value
         * @param right defines the end value
         * @param amount defines the gradient factor
         * @param result defines the Color3 object where to store the result
         */
        static LerpToRef(left: DeepImmutable<Color3>, right: DeepImmutable<Color3>, amount: number, result: Color3): void;
        /**
         * Returns a new Color3 located for "amount" (float) on the Hermite interpolation spline defined by the vectors "value1", "tangent1", "value2", "tangent2"
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent Color3
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent Color3
         * @param amount defines the amount on the interpolation spline (between 0 and 1)
         * @returns the new Color3
         */
        static Hermite(value1: DeepImmutable<Color3>, tangent1: DeepImmutable<Color3>, value2: DeepImmutable<Color3>, tangent2: DeepImmutable<Color3>, amount: number): Color3;
        /**
         * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2".
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @returns 1st derivative
         */
        static Hermite1stDerivative(value1: DeepImmutable<Color3>, tangent1: DeepImmutable<Color3>, value2: DeepImmutable<Color3>, tangent2: DeepImmutable<Color3>, time: number): Color3;
        /**
         * Returns a new Color3 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2".
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @param result define where to store the derivative
         */
        static Hermite1stDerivativeToRef(value1: DeepImmutable<Color3>, tangent1: DeepImmutable<Color3>, value2: DeepImmutable<Color3>, tangent2: DeepImmutable<Color3>, time: number, result: Color3): void;
        /**
         * Returns a Color3 value containing a red color
         * @returns a new Color3 object
         */
        static Red(): Color3;
        /**
         * Returns a Color3 value containing a green color
         * @returns a new Color3 object
         */
        static Green(): Color3;
        /**
         * Returns a Color3 value containing a blue color
         * @returns a new Color3 object
         */
        static Blue(): Color3;
        /**
         * Returns a Color3 value containing a black color
         * @returns a new Color3 object
         */
        static Black(): Color3;
        /**
         * Gets a Color3 value containing a black color that must not be updated
         */
        static get BlackReadOnly(): DeepImmutable<Color3>;
        /**
         * Returns a Color3 value containing a white color
         * @returns a new Color3 object
         */
        static White(): Color3;
        /**
         * Returns a Color3 value containing a purple color
         * @returns a new Color3 object
         */
        static Purple(): Color3;
        /**
         * Returns a Color3 value containing a magenta color
         * @returns a new Color3 object
         */
        static Magenta(): Color3;
        /**
         * Returns a Color3 value containing a yellow color
         * @returns a new Color3 object
         */
        static Yellow(): Color3;
        /**
         * Returns a Color3 value containing a gray color
         * @returns a new Color3 object
         */
        static Gray(): Color3;
        /**
         * Returns a Color3 value containing a teal color
         * @returns a new Color3 object
         */
        static Teal(): Color3;
        /**
         * Returns a Color3 value containing a random color
         * @returns a new Color3 object
         */
        static Random(): Color3;
    }
    /**
     * Class used to hold a RBGA color
     */
    export class Color4 implements Tensor<Tuple<number, 4>, IColor4Like>, IColor4Like {
        /**
         * [0] Defines the red component (between 0 and 1, default is 0)
         */
        r: number;
        /**
         * [0] Defines the green component (between 0 and 1, default is 0)
         */
        g: number;
        /**
         * [0] Defines the blue component (between 0 and 1, default is 0)
         */
        b: number;
        /**
         * [1] Defines the alpha component (between 0 and 1, default is 1)
         */
        a: number;
        /**
         * If the first color is flagged with integers (as everything is 0,0,0,0), V8 stores all of the properties as integers internally because it doesn't know any better yet.
         * If subsequent colors are created with non-integer values, V8 determines that it would be best to represent these properties as doubles instead of integers,
         * and henceforth it will use floating-point representation for all color instances that it creates.
         * But the original color instances are unchanged and has a "deprecated map".
         * If we keep using the color instances from step 1, it will now be a poison pill which will mess up optimizations in any code it touches.
         */
        static _V8PerformanceHack: DeepImmutable<Color4>;
        /**
         * @see Tensor.dimension
         */
        readonly dimension: [4];
        /**
         * @see Tensor.rank
         */
        readonly rank: 1;
        /**
         * Creates a new Color4 object from red, green, blue values, all between 0 and 1
         * @param r defines the red component (between 0 and 1, default is 0)
         * @param g defines the green component (between 0 and 1, default is 0)
         * @param b defines the blue component (between 0 and 1, default is 0)
         * @param a defines the alpha component (between 0 and 1, default is 1)
         */
        constructor(
        /**
         * [0] Defines the red component (between 0 and 1, default is 0)
         */
        r?: number, 
        /**
         * [0] Defines the green component (between 0 and 1, default is 0)
         */
        g?: number, 
        /**
         * [0] Defines the blue component (between 0 and 1, default is 0)
         */
        b?: number, 
        /**
         * [1] Defines the alpha component (between 0 and 1, default is 1)
         */
        a?: number);
        /**
         * Creates a new array populated with 4 numeric elements : red, green, blue, alpha values
         * @returns the new array
         */
        asArray(): Tuple<number, 4>;
        /**
         * Stores from the starting index in the given array the Color4 successive values
         * @param array defines the array where to store the r,g,b components
         * @param index defines an optional index in the target array to define where to start storing values
         * @returns the current Color4 object
         */
        toArray(array: FloatArray, index?: number): this;
        /**
         * Update the current color with values stored in an array from the starting index of the given array
         * @param array defines the source array
         * @param offset defines an offset in the source array
         * @returns the current Color4 object
         */
        fromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): this;
        /**
         * Determines equality between Color4 objects
         * @param otherColor defines the second operand
         * @returns true if the rgba values are equal to the given ones
         */
        equals(otherColor: DeepImmutable<IColor4Like>): boolean;
        /**
         * Creates a new Color4 set with the added values of the current Color4 and of the given one
         * @param otherColor defines the second operand
         * @returns a new Color4 object
         */
        add(otherColor: DeepImmutable<IColor4Like>): Color4;
        /**
         * Updates the given color "result" with the result of the addition of the current Color4 and the given one.
         * @param otherColor the color to add
         * @param result the color to store the result
         * @returns result input
         */
        addToRef<T extends IColor4Like>(otherColor: DeepImmutable<IColor4Like>, result: T): T;
        /**
         * Adds in place the given Color4 values to the current Color4 object
         * @param otherColor defines the second operand
         * @returns the current updated Color4 object
         */
        addInPlace(otherColor: DeepImmutable<IColor4Like>): this;
        /**
         * Adds the given coordinates to the current Color4
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @param a defines the a coordinate of the operand
         * @returns the current updated Color4
         */
        addInPlaceFromFloats(r: number, g: number, b: number, a: number): this;
        /**
         * Creates a new Color4 set with the subtracted values of the given one from the current Color4
         * @param otherColor defines the second operand
         * @returns a new Color4 object
         */
        subtract(otherColor: DeepImmutable<IColor4Like>): Color4;
        /**
         * Subtracts the given ones from the current Color4 values and stores the results in "result"
         * @param otherColor defines the second operand
         * @param result defines the Color4 object where to store the result
         * @returns the result Color4 object
         */
        subtractToRef<T extends IColor4Like>(otherColor: DeepImmutable<IColor4Like>, result: T): T;
        /**
         * Subtract in place the given color from the current Color4.
         * @param otherColor the color to subtract
         * @returns the updated Color4.
         */
        subtractInPlace(otherColor: DeepImmutable<IColor4Like>): this;
        /**
         * Returns a new Color4 set with the result of the subtraction of the given floats from the current Color4 coordinates.
         * @param r value to subtract
         * @param g value to subtract
         * @param b value to subtract
         * @param a value to subtract
         * @returns new color containing the result
         */
        subtractFromFloats(r: number, g: number, b: number, a: number): Color4;
        /**
         * Sets the given color "result" set with the result of the subtraction of the given floats from the current Color4 coordinates.
         * @param r value to subtract
         * @param g value to subtract
         * @param b value to subtract
         * @param a value to subtract
         * @param result the color to store the result in
         * @returns result input
         */
        subtractFromFloatsToRef<T extends IColor4Like>(r: number, g: number, b: number, a: number, result: T): T;
        /**
         * Creates a new Color4 with the current Color4 values multiplied by scale
         * @param scale defines the scaling factor to apply
         * @returns a new Color4 object
         */
        scale(scale: number): Color4;
        /**
         * Multiplies the Color4 values by the float "scale"
         * @param scale defines the scaling factor to apply
         * @returns the current updated Color4
         */
        scaleInPlace(scale: number): this;
        /**
         * Multiplies the current Color4 values by scale and stores the result in "result"
         * @param scale defines the scaling factor to apply
         * @param result defines the Color4 object where to store the result
         * @returns the result Color4
         */
        scaleToRef<T extends IColor4Like>(scale: number, result: T): T;
        /**
         * Scale the current Color4 values by a factor and add the result to a given Color4
         * @param scale defines the scale factor
         * @param result defines the Color4 object where to store the result
         * @returns the result Color4
         */
        scaleAndAddToRef<T extends IColor4Like>(scale: number, result: T): T;
        /**
         * Clamps the rgb values by the min and max values and stores the result into "result"
         * @param min defines minimum clamping value (default is 0)
         * @param max defines maximum clamping value (default is 1)
         * @param result defines color to store the result into.
         * @returns the result Color4
         */
        clampToRef<T extends IColor4Like>(min: number | undefined, max: number | undefined, result: T): T;
        /**
         * Multiply an Color4 value by another and return a new Color4 object
         * @param color defines the Color4 value to multiply by
         * @returns a new Color4 object
         */
        multiply(color: DeepImmutable<IColor4Like>): Color4;
        /**
         * Multiply a Color4 value by another and push the result in a reference value
         * @param color defines the Color4 value to multiply by
         * @param result defines the Color4 to fill the result in
         * @returns the result Color4
         */
        multiplyToRef<T extends IColor4Like>(color: DeepImmutable<IColor4Like>, result: T): T;
        /**
         * Multiplies in place the current Color4 by the given one.
         * @param otherColor color to multiple with
         * @returns the updated Color4.
         */
        multiplyInPlace(otherColor: DeepImmutable<IColor4Like>): this;
        /**
         * Returns a new Color4 set with the multiplication result of the given floats and the current Color4 coordinates.
         * @param r value multiply with
         * @param g value multiply with
         * @param b value multiply with
         * @param a value multiply with
         * @returns resulting new color
         */
        multiplyByFloats(r: number, g: number, b: number, a: number): Color4;
        /**
         * @internal
         * Do not use
         */
        divide(_other: DeepImmutable<IColor4Like>): never;
        /**
         * @internal
         * Do not use
         */
        divideToRef(_other: DeepImmutable<IColor4Like>, _result: IColor4Like): never;
        /**
         * @internal
         * Do not use
         */
        divideInPlace(_other: DeepImmutable<IColor4Like>): never;
        /**
         * Updates the Color4 coordinates with the minimum values between its own and the given color ones
         * @param other defines the second operand
         * @returns the current updated Color4
         */
        minimizeInPlace(other: DeepImmutable<IColor4Like>): this;
        /**
         * Updates the Color4 coordinates with the maximum values between its own and the given color ones
         * @param other defines the second operand
         * @returns the current updated Color4
         */
        maximizeInPlace(other: DeepImmutable<IColor4Like>): this;
        /**
         * Updates the current Color4 with the minimal coordinate values between its and the given coordinates
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @param a defines the a coordinate of the operand
         * @returns the current updated Color4
         */
        minimizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this;
        /**
         * Updates the current Color4 with the maximal coordinate values between its and the given coordinates.
         * @param r defines the r coordinate of the operand
         * @param g defines the g coordinate of the operand
         * @param b defines the b coordinate of the operand
         * @param a defines the a coordinate of the operand
         * @returns the current updated Color4
         */
        maximizeInPlaceFromFloats(r: number, g: number, b: number, a: number): this;
        /**
         * @internal
         * Do not use
         */
        floorToRef(_result: IColor4Like): never;
        /**
         * @internal
         * Do not use
         */
        floor(): never;
        /**
         * @internal
         * Do not use
         */
        fractToRef(_result: IColor4Like): never;
        /**
         * @internal
         * Do not use
         */
        fract(): never;
        /**
         * @internal
         * Do not use
         */
        negate(): never;
        /**
         * @internal
         * Do not use
         */
        negateInPlace(): never;
        /**
         * @internal
         * Do not use
         */
        negateToRef(_result: IColor4Like): never;
        /**
         * Boolean : True if the current Color4 coordinates are each beneath the distance "epsilon" from the given color ones.
         * @param otherColor color to compare against
         * @param epsilon (Default: very small number)
         * @returns true if they are equal
         */
        equalsWithEpsilon(otherColor: DeepImmutable<IColor4Like>, epsilon?: number): boolean;
        /**
         * Boolean : True if the given floats are strictly equal to the current Color4 coordinates.
         * @param x x value to compare against
         * @param y y value to compare against
         * @param z z value to compare against
         * @param w w value to compare against
         * @returns true if equal
         */
        equalsToFloats(x: number, y: number, z: number, w: number): boolean;
        /**
         * Creates a string with the Color4 current values
         * @returns the string representation of the Color4 object
         */
        toString(): string;
        /**
         * Returns the string "Color4"
         * @returns "Color4"
         */
        getClassName(): string;
        /**
         * Compute the Color4 hash code
         * @returns an unique number that can be used to hash Color4 objects
         */
        getHashCode(): number;
        /**
         * Creates a new Color4 copied from the current one
         * @returns a new Color4 object
         */
        clone(): Color4;
        /**
         * Copies the given Color4 values into the current one
         * @param source defines the source Color4 object
         * @returns the current updated Color4 object
         */
        copyFrom(source: DeepImmutable<IColor4Like>): this;
        /**
         * Copies the given float values into the current one
         * @param r defines the red component to read from
         * @param g defines the green component to read from
         * @param b defines the blue component to read from
         * @param a defines the alpha component to read from
         * @returns the current updated Color4 object
         */
        copyFromFloats(r: number, g: number, b: number, a: number): this;
        /**
         * Copies the given float values into the current one
         * @param r defines the red component to read from
         * @param g defines the green component to read from
         * @param b defines the blue component to read from
         * @param a defines the alpha component to read from
         * @returns the current updated Color4 object
         */
        set(r: number, g: number, b: number, a: number): this;
        /**
         * Copies the given float to the current Vector4 coordinates
         * @param v defines the r, g, b, and a coordinates of the operand
         * @returns the current updated Vector4
         */
        setAll(v: number): this;
        /**
         * Compute the Color4 hexadecimal code as a string
         * @param returnAsColor3 defines if the string should only contains RGB values (off by default)
         * @returns a string containing the hexadecimal representation of the Color4 object
         */
        toHexString(returnAsColor3?: boolean): string;
        /**
         * Updates the Color4 rgba values from the string containing valid hexadecimal values.
         *
         * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.
         *
         * When a hex string without alpha is passed, the resulting Color4 keeps
         * its previous alpha value.
         *
         * An invalid string does not modify this object
         *
         * @param hex defines a string containing valid hexadecimal values
         * @returns the current updated Color4 object
         */
        fromHexString(hex: string): this;
        /**
         * Computes a new Color4 converted from the current one to linear space
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns a new Color4 object
         */
        toLinearSpace(exact?: boolean): Color4;
        /**
         * Converts the Color4 values to linear space and stores the result in "convertedColor"
         * @param convertedColor defines the Color4 object where to store the linear space version
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns the unmodified Color4
         */
        toLinearSpaceToRef(convertedColor: IColor4Like, exact?: boolean): this;
        /**
         * Computes a new Color4 converted from the current one to gamma space
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns a new Color4 object
         */
        toGammaSpace(exact?: boolean): Color4;
        /**
         * Converts the Color4 values to gamma space and stores the result in "convertedColor"
         * @param convertedColor defines the Color4 object where to store the gamma space version
         * @param exact defines if the conversion will be done in an exact way which is slower but more accurate (default is false)
         * @returns the unmodified Color4
         */
        toGammaSpaceToRef(convertedColor: IColor4Like, exact?: boolean): this;
        /**
         * Creates a new Color4 from the string containing valid hexadecimal values.
         *
         * A valid hex string is either in the format #RRGGBB or #RRGGBBAA.
         *
         * When a hex string without alpha is passed, the resulting Color4 has
         * its alpha value set to 1.0.
         *
         * An invalid string results in a Color with all its channels set to 0.0,
         * i.e. "transparent black".
         *
         * @param hex defines a string containing valid hexadecimal values
         * @returns a new Color4 object
         */
        static FromHexString(hex: string): Color4;
        /**
         * Creates a new Color4 object set with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object
         * @param left defines the start value
         * @param right defines the end value
         * @param amount defines the gradient factor
         * @returns a new Color4 object
         */
        static Lerp(left: DeepImmutable<IColor4Like>, right: DeepImmutable<IColor4Like>, amount: number): Color4;
        /**
         * Set the given "result" with the linearly interpolated values of "amount" between the left Color4 object and the right Color4 object
         * @param left defines the start value
         * @param right defines the end value
         * @param amount defines the gradient factor
         * @param result defines the Color4 object where to store data
         * @returns the updated result
         */
        static LerpToRef<T extends IColor4Like>(left: DeepImmutable<IColor4Like>, right: DeepImmutable<IColor4Like>, amount: number, result: T): T;
        /**
         * Interpolate between two Color4 using Hermite interpolation
         * @param value1 defines first Color4
         * @param tangent1 defines the incoming tangent
         * @param value2 defines second Color4
         * @param tangent2 defines the outgoing tangent
         * @param amount defines the target Color4
         * @returns the new interpolated Color4
         */
        static Hermite(value1: DeepImmutable<IColor4Like>, tangent1: DeepImmutable<IColor4Like>, value2: DeepImmutable<IColor4Like>, tangent2: DeepImmutable<IColor4Like>, amount: number): Color4;
        /**
         * Returns a new Color4 which is the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2".
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @returns 1st derivative
         */
        static Hermite1stDerivative(value1: DeepImmutable<IColor4Like>, tangent1: DeepImmutable<IColor4Like>, value2: DeepImmutable<IColor4Like>, tangent2: DeepImmutable<IColor4Like>, time: number): Color4;
        /**
         * Update a Color4 with the 1st derivative of the Hermite spline defined by the colors "value1", "value2", "tangent1", "tangent2".
         * @param value1 defines the first control point
         * @param tangent1 defines the first tangent
         * @param value2 defines the second control point
         * @param tangent2 defines the second tangent
         * @param time define where the derivative must be done
         * @param result define where to store the derivative
         */
        static Hermite1stDerivativeToRef(value1: DeepImmutable<IColor4Like>, tangent1: DeepImmutable<IColor4Like>, value2: DeepImmutable<IColor4Like>, tangent2: DeepImmutable<IColor4Like>, time: number, result: IColor4Like): void;
        /**
         * Creates a new Color4 from a Color3 and an alpha value
         * @param color3 defines the source Color3 to read from
         * @param alpha defines the alpha component (1.0 by default)
         * @returns a new Color4 object
         */
        static FromColor3(color3: DeepImmutable<IColor3Like>, alpha?: number): Color4;
        /**
         * Creates a new Color4 from the starting index element of the given array
         * @param array defines the source array to read from
         * @param offset defines the offset in the source array
         * @returns a new Color4 object
         */
        static FromArray(array: DeepImmutable<ArrayLike<number>>, offset?: number): Color4;
        /**
         * Creates a new Color4 from the starting index element of the given array
         * @param array defines the source array to read from
         * @param offset defines the offset in the source array
         * @param result defines the target Color4 object
         */
        static FromArrayToRef(array: DeepImmutable<ArrayLike<number>>, offset: number | undefined, result: Color4): void;
        /**
         * Creates a new Color3 from integer values (less than 256)
         * @param r defines the red component to read from (value between 0 and 255)
         * @param g defines the green component to read from (value between 0 and 255)
         * @param b defines the blue component to read from (value between 0 and 255)
         * @param a defines the alpha component to read from (value between 0 and 255)
         * @returns a new Color3 object
         */
        static FromInts(r: number, g: number, b: number, a: number): Color4;
        /**
         * Check the content of a given array and convert it to an array containing RGBA data
         * If the original array was already containing count * 4 values then it is returned directly
         * @param colors defines the array to check
         * @param count defines the number of RGBA data to expect
         * @returns an array containing count * 4 values (RGBA)
         */
        static CheckColors4(colors: number[], count: number): number[];
    }
    /**
     * @internal
     */
    export class TmpColors {
        static Color3: Color3[];
        static Color4: Color4[];
    }
    /**
     * Register side effects for mathColor.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMathColor(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import math.color.pure for tree-shakeable, side-effect-free usage.
     */


    /** Defines supported spaces */
    export enum Space {
        /** Local (object) space */
        LOCAL = 0,
        /** World space */
        WORLD = 1,
        /** Bone space */
        BONE = 2
    }
    /** Defines the 3 main axes */
    export class Axis {
        /** X axis */
        static X: Vector3;
        /** Y axis */
        static Y: Vector3;
        /** Z axis */
        static Z: Vector3;
    }
    /**
     * Defines cartesian components.
     */
    export enum Coordinate {
        /** X axis */
        X = 0,
        /** Y axis */
        Y = 1,
        /** Z axis */
        Z = 2
    }




    /**
     * Class for generating 2D Halton sequences.
     * From https://observablehq.com/@jrus/halton
     */
    export class Halton2DSequence {
        private _curIndex;
        private _sequence;
        private _numSamples;
        private _width;
        private _height;
        private _baseX;
        private _baseY;
        /**
         * The x coordinate of the current sample.
         */
        readonly x = 0;
        /**
         * The y coordinate of the current sample.
         */
        readonly y = 0;
        /**
         * Creates a new Halton2DSequence.
         * @param numSamples Number of samples in the sequence.
         * @param baseX The base for the x coordinate (default: 2).
         * @param baseY The base for the y coordinate (default: 3).
         * @param width Factor to scale the x coordinate by (default: 1). The scaling factor is 1/width.
         * @param height Factor to scale the y coordinate by (default: 1). The scaling factor is 1/height.
         */
        constructor(numSamples: number, baseX?: number, baseY?: number, width?: number, height?: number);
        /**
         * Regenerates the sequence with a new number of samples.
         * @param numSamples Number of samples in the sequence.
         */
        regenerate(numSamples: number): void;
        /**
         * Sets the dimensions of the sequence.
         * @param width Factor to scale the x coordinate by. The scaling factor is 1/width.
         * @param height Factor to scale the y coordinate by. The scaling factor is 1/height.
         */
        setDimensions(width: number, height: number): void;
        /**
         * Advances to the next sample in the sequence.
         */
        next(): void;
        private _generateSequence;
        private _halton;
    }


    /** @internal */
    export class MatrixManagement {
        /** @internal */
        static _UpdateFlagSeed: number;
    }
    /**
     * Marks the given matrix as dirty
     * @param matrix defines the matrix to mark as dirty
     */
    export function MarkAsDirty(matrix: IMatrixLike): void;
    /**
     * Sets the given matrix to the identity matrix
     * @param result defines the target matrix
     */
    export function IdentityMatrixToRef(result: IMatrixLike): void;
    /**
     * Creates a new translation matrix.
     * @param x defines the x coordinate
     * @param y defines the y coordinate
     * @param z defines the z coordinate
     * @param result defines the target matrix
     */
    export function TranslationMatrixToRef(x: number, y: number, z: number, result: IMatrixLike): void;
    /**
     * Creates a new scaling matrix.
     * @param x defines the scale factor on X axis
     * @param y defines the scale factor on Y axis
     * @param z defines the scale factor on Z axis
     * @param result defines the target matrix
     */
    export function ScalingMatrixToRef(x: number, y: number, z: number, result: IMatrixLike): void;
    /**
     * Multiplies two matrices and stores the result in the target array.
     * @param a defines the first matrix
     * @param b defines the second matrix
     * @param output defines the target array
     * @param offset defines the offset in the target array where to store the result (0 by default)
     */
    export function MultiplyMatricesToArray(a: DeepImmutable<IMatrixLike>, b: DeepImmutable<IMatrixLike>, output: Float32Array | Array<number>, offset?: number): void;
    /**
     * Multiplies two matrices and stores the result in a third matrix.
     * @param a defines the first matrix
     * @param b defines the second matrix
     * @param result defines the target matrix
     * @param offset defines the offset in the target matrix where to store the result (0 by default)
     */
    export function MultiplyMatricesToRef(a: DeepImmutable<IMatrixLike>, b: DeepImmutable<IMatrixLike>, result: IMatrixLike, offset?: number): void;
    /**
     * Populates the given matrix with the current matrix values
     * @param matrix defines the source matrix
     * @param target defines the target matrix
     */
    export function CopyMatrixToRef(matrix: DeepImmutable<IMatrixLike>, target: IMatrixLike): void;
    /**
     * Populates the given array from the starting index with the current matrix values
     * @param matrix defines the source matrix
     * @param array defines the target array
     * @param offset defines the offset in the target array where to start storing values
     */
    export function CopyMatrixToArray(matrix: DeepImmutable<IMatrixLike>, array: Float32Array | Array<number>, offset?: number): void;
    /**
     * Inverts the given matrix and stores the result in the target matrix
     * @param source defines the source matrix
     * @param target defines the target matrix
     * @returns true if the matrix was inverted successfully, false otherwise
     */
    export function InvertMatrixToRef(source: DeepImmutable<IMatrixLike>, target: IMatrixLike): boolean;
    /**
     * Inverts the given matrix and stores the result in the target array
     * @param source defines the source matrix
     * @param target defines the target array
     * @returns true if the matrix was inverted successfully, false otherwise
     */
    export function InvertMatrixToArray(source: DeepImmutable<IMatrixLike>, target: Float32Array | Array<number>): boolean;


    /**
     * A thin matrix class that is used for size reasons.
     * The class is identity by default
     */
    export class ThinMatrix implements IMatrixLike {
        private readonly _m;
        /**
         * Returns the matrix as a Array<number>
         * @returns the matrix underlying array.
         */
        asArray(): Tuple<number, 16>;
        /**
         * Gets the update flag of the matrix which is an unique number for the matrix.
         * It will be incremented every time the matrix data change.
         * You can use it to speed the comparison between two versions of the same matrix.
         */
        updateFlag: number;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * Interface representing metadata for vertex pulling
     */
    export interface IVertexPullingMetadata {
        /**
         * Offset in vertex buffer where data starts
         */
        offset: number;
        /**
         * Stride between elements in the vertex buffer
         */
        stride: number;
        /**
         * Type of the vertex buffer (e.g., float, int)
         */
        type: number;
        /**
         * Whether integer data should be normalized when read
         */
        normalized: boolean;
    }
    /**
     * Prepares vertex pulling uniforms for the given attributes and mesh
     * @param geometry The geometry containing the vertex buffers
     * @returns A map of attribute names to their metadata, or null if unavailable
     */
    export function PrepareVertexPullingUniforms(geometry: Geometry): Nullable<Map<string, IVertexPullingMetadata>>;
    /**
     * Bind vertex pulling uniforms to the effect
     * @param effect The effect to bind the uniforms to
     * @param metadata The vertex pulling metadata
     */
    export function BindVertexPullingUniforms(effect: Effect, metadata: Map<string, IVertexPullingMetadata>): void;


    type UVDefinesMixinConstructor<T = {}> = new (...args: any[]) => T;
    /**
     * Mixin to add UV defines to your material defines
     * @internal
     */
    export function UVDefinesMixin<Tbase extends UVDefinesMixinConstructor>(base: Tbase): {
        new (...args: any[]): {
            MAINUV1: boolean;
            MAINUV2: boolean;
            MAINUV3: boolean;
            MAINUV4: boolean;
            MAINUV5: boolean;
            MAINUV6: boolean;
            UV1: boolean;
            UV2: boolean;
            UV3: boolean;
            UV4: boolean;
            UV5: boolean;
            UV6: boolean;
        };
    } & Tbase;


    /** @internal */
    export class UniformBufferEffectCommonAccessor {
        setMatrix3x3: (name: string, matrix: Float32Array) => void;
        setMatrix2x2: (name: string, matrix: Float32Array) => void;
        setFloat: (name: string, x: number) => void;
        setFloat2: (name: string, x: number, y: number, suffix?: string) => void;
        setFloat3: (name: string, x: number, y: number, z: number, suffix?: string) => void;
        setFloat4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;
        setFloatArray: (name: string, array: Float32Array) => void;
        setArray: (name: string, array: number[]) => void;
        setIntArray: (name: string, array: Int32Array) => void;
        setMatrix: (name: string, mat: IMatrixLike) => void;
        setMatrices: (name: string, mat: Float32Array) => void;
        setVector3: (name: string, vector: IVector3Like) => void;
        setVector4: (name: string, vector: IVector4Like) => void;
        setColor3: (name: string, color: IColor3Like, suffix?: string) => void;
        setColor4: (name: string, color: IColor3Like, alpha: number, suffix?: string) => void;
        setDirectColor4: (name: string, color: IColor4Like) => void;
        setInt: (name: string, x: number, suffix?: string) => void;
        setInt2: (name: string, x: number, y: number, suffix?: string) => void;
        setInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;
        setInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;
        private _isUbo;
        constructor(uboOrEffect: UniformBuffer | Effect);
    }


    /**
     * Uniform buffer objects.
     *
     * Handles blocks of uniform on the GPU.
     *
     * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.
     *
     * For more information, please refer to :
     * https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object
     */
    export class UniformBuffer {
        private _engine;
        private _buffer;
        private _buffers;
        private _bufferIndex;
        private _bufferUpdatedLastFrame;
        private _createBufferOnWrite;
        private _data;
        private _bufferData;
        private _dynamic;
        private _uniformLocations;
        private _uniformSizes;
        private _uniformArraySizes;
        private _uniformNames;
        private _uniformLocationPointer;
        private _needSync;
        private _noUBO;
        private _currentEffect;
        private _currentEffectName;
        private _name;
        private _currentFrameId;
        private _trackUBOsInFrame;
        private static _MAX_UNIFORM_SIZE;
        private static _TempBuffer;
        private static _TempBufferInt32View;
        private static _TempBufferUInt32View;
        /**
         * Lambda to Update a 3x3 Matrix in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateMatrix3x3: (name: string, matrix: Float32Array) => void;
        /**
         * Lambda to Update a 2x2 Matrix in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateMatrix2x2: (name: string, matrix: Float32Array) => void;
        /**
         * Lambda to Update a single float in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateFloat: (name: string, x: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec2 of float in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateFloat2: (name: string, x: number, y: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec3 of float in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateFloat3: (name: string, x: number, y: number, z: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec4 of float in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateFloat4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;
        /**
         * Lambda to Update an array of float in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateFloatArray: (name: string, array: Float32Array, suffix?: string) => void;
        /**
         * Lambda to Update an array of number in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateArray: (name: string, array: number[]) => void;
        /**
         * Lambda to Update an array of number in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateIntArray: (name: string, array: Int32Array) => void;
        /**
         * Lambda to Update an array of number in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateUIntArray: (name: string, array: Uint32Array) => void;
        /**
         * Lambda to Update a 4x4 Matrix in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateMatrix: (name: string, mat: IMatrixLike) => void;
        /**
         * Lambda to Update an array of 4x4 Matrix in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateMatrices: (name: string, mat: Float32Array) => void;
        /**
         * Lambda to Update vec3 of float from a Vector in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateVector3: (name: string, vector: IVector3Like) => void;
        /**
         * Lambda to Update vec4 of float from a Vector in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateVector4: (name: string, vector: IVector4Like) => void;
        /**
         * Lambda to Update vec3 of float from a Color in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateColor3: (name: string, color: IColor3Like, suffix?: string) => void;
        /**
         * Lambda to Update vec4 of float from a Color in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateColor4: (name: string, color: IColor3Like, alpha: number, suffix?: string) => void;
        /**
         * Lambda to Update vec4 of float from a Color in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateDirectColor4: (name: string, color: IColor4Like, suffix?: string) => void;
        /**
         * Lambda to Update a int a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateInt: (name: string, x: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec2 of int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateInt2: (name: string, x: number, y: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec3 of int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec4 of int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;
        /**
         * Lambda to Update a unsigned int a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateUInt: (name: string, x: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec2 of unsigned int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateUInt2: (name: string, x: number, y: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec3 of unsigned int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateUInt3: (name: string, x: number, y: number, z: number, suffix?: string) => void;
        /**
         * Lambda to Update a vec4 of unsigned int in a uniform buffer.
         * This is dynamic to allow compat with webgl 1 and 2.
         * You will need to pass the name of the uniform as well as the value.
         */
        updateUInt4: (name: string, x: number, y: number, z: number, w: number, suffix?: string) => void;
        /**
         * Instantiates a new Uniform buffer objects.
         *
         * Handles blocks of uniform on the GPU.
         *
         * If WebGL 2 is not available, this class falls back on traditional setUniformXXX calls.
         *
         * For more information, please refer to :
         * @see https://www.khronos.org/opengl/wiki/Uniform_Buffer_Object
         * @param engine Define the engine the buffer is associated with
         * @param data Define the data contained in the buffer
         * @param dynamic Define if the buffer is updatable
         * @param name to assign to the buffer (debugging purpose)
         * @param forceNoUniformBuffer define that this object must not rely on UBO objects
         * @param trackUBOsInFrame define if the UBOs should be tracked in the frame (default: undefined - will use the value from Engine._features.trackUbosInFrame)
         */
        constructor(engine: AbstractEngine, data?: number[], dynamic?: boolean, name?: string, forceNoUniformBuffer?: boolean, trackUBOsInFrame?: boolean);
        /**
         * Indicates if the buffer is using the WebGL2 UBO implementation,
         * or just falling back on setUniformXXX calls.
         */
        get useUbo(): boolean;
        /**
         * Indicates if the WebGL underlying uniform buffer is in sync
         * with the javascript cache data.
         */
        get isSync(): boolean;
        /**
         * Indicates if the WebGL underlying uniform buffer is dynamic.
         * Also, a dynamic UniformBuffer will disable cache verification and always
         * update the underlying WebGL uniform buffer to the GPU.
         * @returns if Dynamic, otherwise false
         */
        isDynamic(): boolean;
        /**
         * The data cache on JS side.
         * @returns the underlying data as a float array
         */
        getData(): Float32Array;
        /**
         * The underlying WebGL Uniform buffer.
         * @returns the webgl buffer
         */
        getBuffer(): Nullable<DataBuffer>;
        /**
         * The names of the uniforms in the buffer.
         * @returns an array of uniform names
         */
        getUniformNames(): string[];
        /**
         * std140 layout specifies how to align data within an UBO structure.
         * See https://khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159
         * for specs.
         * @param size
         */
        private _fillAlignment;
        /**
         * Adds an uniform in the buffer.
         * Warning : the subsequents calls of this function must be in the same order as declared in the shader
         * for the layout to be correct ! The addUniform function only handles types like float, vec2, vec3, vec4, mat4,
         * meaning size=1,2,3,4 or 16. It does not handle struct types.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param size Data size, or data directly.
         * @param arraySize The number of elements in the array, 0 if not an array.
         */
        addUniform(name: string, size: number | number[], arraySize?: number): void;
        /**
         * Adds a Matrix 4x4 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param mat A 4x4 matrix.
         */
        addMatrix(name: string, mat: IMatrixLike): void;
        /**
         * Adds a vec2 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param x Define the x component value of the vec2
         * @param y Define the y component value of the vec2
         */
        addFloat2(name: string, x: number, y: number): void;
        /**
         * Adds a vec3 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param x Define the x component value of the vec3
         * @param y Define the y component value of the vec3
         * @param z Define the z component value of the vec3
         */
        addFloat3(name: string, x: number, y: number, z: number): void;
        /**
         * Adds a vec3 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param color Define the vec3 from a Color
         */
        addColor3(name: string, color: IColor3Like): void;
        /**
         * Adds a vec4 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param color Define the rgb components from a Color
         * @param alpha Define the a component of the vec4
         */
        addColor4(name: string, color: IColor3Like, alpha: number): void;
        /**
         * Adds a vec3 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         * @param vector Define the vec3 components from a Vector
         */
        addVector3(name: string, vector: IVector3Like): void;
        /**
         * Adds a Matrix 3x3 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         */
        addMatrix3x3(name: string): void;
        /**
         * Adds a Matrix 2x2 to the uniform buffer.
         * @param name Name of the uniform, as used in the uniform block in the shader.
         */
        addMatrix2x2(name: string): void;
        /**
         * Effectively creates the WebGL Uniform Buffer, once layout is completed with `addUniform`.
         */
        create(): void;
        private _getNamesDebug;
        /** @internal */
        _rebuild(): void;
        /** @internal */
        _rebuildAfterContextLost(): void;
        /** @internal */
        get _numBuffers(): number;
        /** @internal */
        get _indexBuffer(): number;
        /** Gets or sets the name of this buffer */
        get name(): string;
        set name(value: string);
        /** Gets the current effect */
        get currentEffect(): Nullable<Effect>;
        private _buffersEqual;
        private _copyBuffer;
        /**
         * Updates the WebGL Uniform Buffer on the GPU.
         * If the `dynamic` flag is set to true, no cache comparison is done.
         * Otherwise, the buffer will be updated only if the cache differs.
         */
        update(): void;
        private _createNewBuffer;
        private _checkNewFrame;
        /**
         * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.
         * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.
         * @param data Define the flattened data
         * @param size Define the size of the data.
         */
        updateUniform(uniformName: string, data: FloatArray, size: number): void;
        /**
         * Updates the value of an uniform. The `update` method must be called afterwards to make it effective in the GPU.
         * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.
         * @param data Define the flattened data
         * @param size Define the size of the data.
         */
        updateUniformArray(uniformName: string, data: FloatArray, size: number): void;
        private _valueCache;
        private _cacheMatrix;
        private _updateMatrix3x3ForUniform;
        private _updateMatrix3x3ForEffect;
        private _updateMatrix2x2ForEffect;
        private _updateMatrix2x2ForUniform;
        private _updateFloatForEffect;
        private _updateFloatForUniform;
        private _updateFloat2ForEffect;
        private _updateFloat2ForUniform;
        private _updateFloat3ForEffect;
        private _updateFloat3ForUniform;
        private _updateFloat4ForEffect;
        private _updateFloat4ForUniform;
        private _updateFloatArrayForEffect;
        private _updateFloatArrayForUniform;
        private _updateArrayForEffect;
        private _updateArrayForUniform;
        private _updateIntArrayForEffect;
        private _updateIntArrayForUniform;
        private _updateUIntArrayForEffect;
        private _updateUIntArrayForUniform;
        private _updateMatrixForEffect;
        private _updateMatrixForUniform;
        private _updateMatricesForEffect;
        private _updateMatricesForUniform;
        private _updateVector3ForEffect;
        private _updateVector3ForUniform;
        private _updateVector4ForEffect;
        private _updateVector4ForUniform;
        private _updateColor3ForEffect;
        private _updateColor3ForUniform;
        private _updateColor4ForEffect;
        private _updateDirectColor4ForEffect;
        private _updateColor4ForUniform;
        private _updateDirectColor4ForUniform;
        private _updateIntForEffect;
        private _updateIntForUniform;
        private _updateInt2ForEffect;
        private _updateInt2ForUniform;
        private _updateInt3ForEffect;
        private _updateInt3ForUniform;
        private _updateInt4ForEffect;
        private _updateInt4ForUniform;
        private _updateUIntForEffect;
        private _updateUIntForUniform;
        private _updateUInt2ForEffect;
        private _updateUInt2ForUniform;
        private _updateUInt3ForEffect;
        private _updateUInt3ForUniform;
        private _updateUInt4ForEffect;
        private _updateUInt4ForUniform;
        /**
         * Sets a sampler uniform on the effect.
         * @param name Define the name of the sampler.
         * @param texture Define the texture to set in the sampler
         */
        setTexture(name: string, texture: Nullable<ThinTexture>): void;
        /**
         * Sets an array of sampler uniforms on the effect.
         * @param name Define the name of uniform.
         * @param textures Define the textures to set in the array of samplers
         */
        setTextureArray(name: string, textures: ThinTexture[]): void;
        /**
         * Sets a sampler uniform on the effect.
         * @param name Define the name of the sampler.
         * @param texture Define the (internal) texture to set in the sampler
         */
        bindTexture(name: string, texture: Nullable<InternalTexture>): void;
        /**
         * Directly updates the value of the uniform in the cache AND on the GPU.
         * @param uniformName Define the name of the uniform, as used in the uniform block in the shader.
         * @param data Define the flattened data
         */
        updateUniformDirectly(uniformName: string, data: FloatArray): void;
        /**
         * Associates an effect to this uniform buffer
         * @param effect Define the effect to associate the buffer to
         * @param name Name of the uniform block in the shader.
         */
        bindToEffect(effect: Effect, name: string): void;
        /**
         * Binds the current (GPU) buffer to the effect
         */
        bindUniformBuffer(): void;
        /**
         * Dissociates the current effect from this uniform buffer
         */
        unbindEffect(): void;
        /**
         * Sets the current state of the class (_bufferIndex, _buffer) to point to the data buffer passed in parameter if this buffer is one of the buffers handled by the class (meaning if it can be found in the _buffers array)
         * This method is meant to be able to update a buffer at any time: just call setDataBuffer to set the class in the right state, call some updateXXX methods and then call udpate() => that will update the GPU buffer on the graphic card
         * @param dataBuffer buffer to look for
         * @returns true if the buffer has been found and the class internal state points to it, else false
         */
        setDataBuffer(dataBuffer: DataBuffer): boolean;
        /**
         * Checks if the uniform buffer has a uniform with the given name.
         * @param name Name of the uniform to check
         * @returns True if the uniform exists, false otherwise.
         */
        has(name: string): boolean;
        /**
         * Disposes the uniform buffer.
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    var StandardMaterialDefinesBase_base: {
        new (...args: any[]): {
            PREPASS: boolean;
            PREPASS_COLOR: boolean;
            PREPASS_COLOR_INDEX: number;
            PREPASS_IRRADIANCE_LEGACY: boolean;
            PREPASS_IRRADIANCE_LEGACY_INDEX: number;
            PREPASS_IRRADIANCE: boolean;
            PREPASS_IRRADIANCE_INDEX: number;
            PREPASS_ALBEDO: boolean;
            PREPASS_ALBEDO_INDEX: number;
            PREPASS_ALBEDO_SQRT: boolean;
            PREPASS_ALBEDO_SQRT_INDEX: number;
            PREPASS_DEPTH: boolean;
            PREPASS_DEPTH_INDEX: number;
            PREPASS_SCREENSPACE_DEPTH: boolean;
            PREPASS_SCREENSPACE_DEPTH_INDEX: number;
            PREPASS_NORMALIZED_VIEW_DEPTH: boolean;
            PREPASS_NORMALIZED_VIEW_DEPTH_INDEX: number;
            PREPASS_NORMAL: boolean;
            PREPASS_NORMAL_INDEX: number;
            PREPASS_NORMAL_WORLDSPACE: boolean;
            PREPASS_WORLD_NORMAL: boolean;
            PREPASS_WORLD_NORMAL_INDEX: number;
            PREPASS_POSITION: boolean;
            PREPASS_POSITION_INDEX: number;
            PREPASS_LOCAL_POSITION: boolean;
            PREPASS_LOCAL_POSITION_INDEX: number;
            PREPASS_VELOCITY: boolean;
            PREPASS_VELOCITY_INDEX: number;
            PREPASS_VELOCITY_LINEAR: boolean;
            PREPASS_VELOCITY_LINEAR_INDEX: number;
            PREPASS_REFLECTIVITY: boolean;
            PREPASS_REFLECTIVITY_INDEX: number;
            SCENE_MRT_COUNT: number;
        };
    } & {
        new (...args: any[]): {
            MAINUV1: boolean;
            MAINUV2: boolean;
            MAINUV3: boolean;
            MAINUV4: boolean;
            MAINUV5: boolean;
            MAINUV6: boolean;
            UV1: boolean;
            UV2: boolean;
            UV3: boolean;
            UV4: boolean;
            UV5: boolean;
            UV6: boolean;
        };
    } & typeof MaterialDefines;
    class StandardMaterialDefinesBase extends StandardMaterialDefinesBase_base {
    }
    var StandardMaterialDefines_base: {
        new (...args: any[]): {
            IMAGEPROCESSING: boolean;
            VIGNETTE: boolean;
            VIGNETTEBLENDMODEMULTIPLY: boolean;
            VIGNETTEBLENDMODEOPAQUE: boolean;
            TONEMAPPING: number;
            CONTRAST: boolean;
            COLORCURVES: boolean;
            COLORGRADING: boolean;
            COLORGRADING3D: boolean;
            SAMPLER3DGREENDEPTH: boolean;
            SAMPLER3DBGRMAP: boolean;
            DITHER: boolean;
            IMAGEPROCESSINGPOSTPROCESS: boolean;
            SKIPFINALCOLORCLAMP: boolean;
            EXPOSURE: boolean;
        };
    } & typeof StandardMaterialDefinesBase;
    /** @internal */
    export class StandardMaterialDefines extends StandardMaterialDefines_base {
        DIFFUSE: boolean;
        DIFFUSEDIRECTUV: number;
        BAKED_VERTEX_ANIMATION_TEXTURE: boolean;
        AMBIENT: boolean;
        AMBIENTDIRECTUV: number;
        OPACITY: boolean;
        OPACITYDIRECTUV: number;
        OPACITYRGB: boolean;
        REFLECTION: boolean;
        EMISSIVE: boolean;
        EMISSIVEDIRECTUV: number;
        SPECULAR: boolean;
        SPECULARDIRECTUV: number;
        BUMP: boolean;
        BUMPDIRECTUV: number;
        PARALLAX: boolean;
        PARALLAX_RHS: boolean;
        PARALLAXOCCLUSION: boolean;
        SPECULAROVERALPHA: boolean;
        CLIPPLANE: boolean;
        CLIPPLANE2: boolean;
        CLIPPLANE3: boolean;
        CLIPPLANE4: boolean;
        CLIPPLANE5: boolean;
        CLIPPLANE6: boolean;
        ALPHATEST: boolean;
        DEPTHPREPASS: boolean;
        ALPHAFROMDIFFUSE: boolean;
        POINTSIZE: boolean;
        FOG: boolean;
        SPECULARTERM: boolean;
        DIFFUSEFRESNEL: boolean;
        OPACITYFRESNEL: boolean;
        REFLECTIONFRESNEL: boolean;
        REFRACTIONFRESNEL: boolean;
        EMISSIVEFRESNEL: boolean;
        FRESNEL: boolean;
        NORMAL: boolean;
        TANGENT: boolean;
        VERTEXCOLOR: boolean;
        VERTEXALPHA: boolean;
        NUM_BONE_INFLUENCERS: number;
        BonesPerMesh: number;
        BONETEXTURE: boolean;
        BONES_VELOCITY_ENABLED: boolean;
        INSTANCES: boolean;
        THIN_INSTANCES: boolean;
        INSTANCESCOLOR: boolean;
        GLOSSINESS: boolean;
        ROUGHNESS: boolean;
        EMISSIVEASILLUMINATION: boolean;
        LINKEMISSIVEWITHDIFFUSE: boolean;
        REFLECTIONFRESNELFROMSPECULAR: boolean;
        LIGHTMAP: boolean;
        LIGHTMAPDIRECTUV: number;
        OBJECTSPACE_NORMALMAP: boolean;
        USELIGHTMAPASSHADOWMAP: boolean;
        REFLECTIONMAP_3D: boolean;
        REFLECTIONMAP_SPHERICAL: boolean;
        REFLECTIONMAP_PLANAR: boolean;
        REFLECTIONMAP_CUBIC: boolean;
        USE_LOCAL_REFLECTIONMAP_CUBIC: boolean;
        USE_LOCAL_REFRACTIONMAP_CUBIC: boolean;
        REFLECTIONMAP_PROJECTION: boolean;
        REFLECTIONMAP_SKYBOX: boolean;
        REFLECTIONMAP_EXPLICIT: boolean;
        REFLECTIONMAP_EQUIRECTANGULAR: boolean;
        REFLECTIONMAP_EQUIRECTANGULAR_FIXED: boolean;
        REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED: boolean;
        REFLECTIONMAP_OPPOSITEZ: boolean;
        INVERTCUBICMAP: boolean;
        LOGARITHMICDEPTH: boolean;
        REFRACTION: boolean;
        REFRACTIONMAP_3D: boolean;
        REFLECTIONOVERALPHA: boolean;
        TWOSIDEDLIGHTING: boolean;
        SHADOWFLOAT: boolean;
        MORPHTARGETS: boolean;
        MORPHTARGETS_POSITION: boolean;
        MORPHTARGETS_NORMAL: boolean;
        MORPHTARGETS_TANGENT: boolean;
        MORPHTARGETS_UV: boolean;
        MORPHTARGETS_UV2: boolean;
        MORPHTARGETS_COLOR: boolean;
        MORPHTARGETTEXTURE_HASPOSITIONS: boolean;
        MORPHTARGETTEXTURE_HASNORMALS: boolean;
        MORPHTARGETTEXTURE_HASTANGENTS: boolean;
        MORPHTARGETTEXTURE_HASUVS: boolean;
        MORPHTARGETTEXTURE_HASUV2S: boolean;
        MORPHTARGETTEXTURE_HASCOLORS: boolean;
        NUM_MORPH_INFLUENCERS: number;
        MORPHTARGETS_TEXTURE: boolean;
        NONUNIFORMSCALING: boolean;
        PREMULTIPLYALPHA: boolean;
        ALPHATEST_AFTERALLALPHACOMPUTATIONS: boolean;
        ALPHABLEND: boolean;
        RGBDLIGHTMAP: boolean;
        RGBDREFLECTION: boolean;
        RGBDREFRACTION: boolean;
        MULTIVIEW: boolean;
        ORDER_INDEPENDENT_TRANSPARENCY: boolean;
        ORDER_INDEPENDENT_TRANSPARENCY_16BITS: boolean;
        CAMERA_ORTHOGRAPHIC: boolean;
        CAMERA_PERSPECTIVE: boolean;
        AREALIGHTSUPPORTED: boolean;
        USE_VERTEX_PULLING: boolean;
        VERTEX_PULLING_USE_INDEX_BUFFER: boolean;
        VERTEX_PULLING_INDEX_BUFFER_32BITS: boolean;
        RIGHT_HANDED: boolean;
        CLUSTLIGHT_SLICES: number;
        CLUSTLIGHT_BATCH: number;
        /**
         * If the reflection texture on this material is in linear color space
         * @internal
         */
        IS_REFLECTION_LINEAR: boolean;
        /**
         * If the refraction texture on this material is in linear color space
         * @internal
         */
        IS_REFRACTION_LINEAR: boolean;
        DECAL_AFTER_DETAIL: boolean;
        TEXTURE_REPETITION_MODE: number;
        /**
         * Initializes the Standard Material defines.
         * @param externalProperties The external properties
         */
        constructor(externalProperties?: {
            [name: string]: {
                type: string;
                default: any;
            };
        });
    }
    var StandardMaterialBase_base: {
        new (...args: any[]): {
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            get cameraColorCurvesEnabled(): boolean;
            set cameraColorCurvesEnabled(value: boolean);
            get cameraColorGradingEnabled(): boolean;
            set cameraColorGradingEnabled(value: boolean);
            get cameraToneMappingEnabled(): boolean;
            set cameraToneMappingEnabled(value: boolean);
            get cameraExposure(): number;
            set cameraExposure(value: number);
            get cameraContrast(): number;
            set cameraContrast(value: number);
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            get cameraColorCurves(): Nullable<ColorCurves>;
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & typeof PushMaterial;
    class StandardMaterialBase extends StandardMaterialBase_base {
    }
    /**
     * This is the default material used in Babylon. It is the best trade off between quality
     * and performances.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
     */
    export class StandardMaterial extends StandardMaterialBase {
        /**
         * Force all the standard materials to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        private _diffuseTexture;
        /**
         * The basic texture of the material as viewed under a light.
         */
        diffuseTexture: Nullable<BaseTexture>;
        private _ambientTexture;
        /**
         * AKA Occlusion Texture in other nomenclature, it helps adding baked shadows into your material.
         */
        ambientTexture: Nullable<BaseTexture>;
        private _opacityTexture;
        /**
         * Define the transparency of the material from a texture.
         * The final alpha value can be read either from the red channel (if texture.getAlphaFromRGB is false)
         * or from the luminance or the current texel (if texture.getAlphaFromRGB is true)
         */
        opacityTexture: Nullable<BaseTexture>;
        private _reflectionTexture;
        /**
         * Define the texture used to display the reflection.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions
         */
        reflectionTexture: Nullable<BaseTexture>;
        private _emissiveTexture;
        /**
         * Define texture of the material as if self lit.
         * This will be mixed in the final result even in the absence of light.
         */
        emissiveTexture: Nullable<BaseTexture>;
        private _specularTexture;
        /**
         * Define how the color and intensity of the highlight given by the light in the material.
         */
        specularTexture: Nullable<BaseTexture>;
        private _bumpTexture;
        /**
         * Bump mapping is a technique to simulate bump and dents on a rendered surface.
         * These are made by creating a normal map from an image. The means to do this can be found on the web, a search for 'normal map generator' will bring up free and paid for methods of doing this.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#bump-map
         */
        bumpTexture: Nullable<BaseTexture>;
        private _lightmapTexture;
        /**
         * Complex lighting can be computationally expensive to compute at runtime.
         * To save on computation, lightmaps may be used to store calculated lighting in a texture which will be applied to a given mesh.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction#lightmaps
         */
        lightmapTexture: Nullable<BaseTexture>;
        private _refractionTexture;
        /**
         * Define the texture used to display the refraction.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions
         */
        refractionTexture: Nullable<BaseTexture>;
        /**
         * The color of the material lit by the environmental background lighting.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#ambient-color-example
         */
        ambientColor: Color3;
        /**
         * The basic color of the material as viewed under a light.
         */
        diffuseColor: Color3;
        /**
         * Define how the color and intensity of the highlight given by the light in the material.
         */
        specularColor: Color3;
        /**
         * Define the color of the material as if self lit.
         * This will be mixed in the final result even in the absence of light.
         */
        emissiveColor: Color3;
        /**
         * Defines how sharp are the highlights in the material.
         * The bigger the value the sharper giving a more glossy feeling to the result.
         * Reversely, the smaller the value the blurrier giving a more rough feeling to the result.
         */
        specularPower: number;
        private _useAlphaFromDiffuseTexture;
        /**
         * Does the transparency come from the diffuse texture alpha channel.
         */
        useAlphaFromDiffuseTexture: boolean;
        private _useEmissiveAsIllumination;
        /**
         * If true, the emissive value is added into the end result, otherwise it is multiplied in.
         */
        useEmissiveAsIllumination: boolean;
        private _linkEmissiveWithDiffuse;
        /**
         * If true, some kind of energy conservation will prevent the end result to be more than 1 by reducing
         * the emissive level when the final color is close to one.
         */
        linkEmissiveWithDiffuse: boolean;
        private _useSpecularOverAlpha;
        /**
         * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good exemple of that. When sun reflects on it you can not see what is behind.
         */
        useSpecularOverAlpha: boolean;
        private _useReflectionOverAlpha;
        /**
         * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good exemple of that. When the street lights reflects on it you can not see what is behind.
         */
        useReflectionOverAlpha: boolean;
        private _disableLighting;
        /**
         * Does lights from the scene impacts this material.
         * It can be a nice trick for performance to disable lighting on a fully emissive material.
         */
        disableLighting: boolean;
        private _useObjectSpaceNormalMap;
        /**
         * Allows using an object space normal map (instead of tangent space).
         */
        useObjectSpaceNormalMap: boolean;
        private _useParallax;
        /**
         * Is parallax enabled or not.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping
         */
        useParallax: boolean;
        private _useParallaxOcclusion;
        /**
         * Is parallax occlusion enabled or not.
         * If true, the outcome is way more realistic than traditional Parallax but you can expect a performance hit that worthes consideration.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/parallaxMapping
         */
        useParallaxOcclusion: boolean;
        /**
         * Apply a scaling factor that determine which "depth" the height map should reprensent. A value between 0.05 and 0.1 is reasonnable in Parallax, you can reach 0.2 using Parallax Occlusion.
         */
        parallaxScaleBias: number;
        private _roughness;
        /**
         * Helps to define how blurry the reflections should appears in the material.
         */
        roughness: number;
        /**
         * In case of refraction, define the value of the index of refraction.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions
         */
        indexOfRefraction: number;
        /**
         * Invert the refraction texture alongside the y axis.
         * It can be useful with procedural textures or probe for instance.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#how-to-obtain-reflections-and-refractions
         */
        invertRefractionY: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         */
        alphaCutOff: number;
        private _useLightmapAsShadowmap;
        /**
         * In case of light mapping, define whether the map contains light or shadow informations.
         */
        useLightmapAsShadowmap: boolean;
        private _diffuseFresnelParameters;
        /**
         * Define the diffuse fresnel parameters of the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        diffuseFresnelParameters: FresnelParameters;
        private _opacityFresnelParameters;
        /**
         * Define the opacity fresnel parameters of the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        opacityFresnelParameters: FresnelParameters;
        private _reflectionFresnelParameters;
        /**
         * Define the reflection fresnel parameters of the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        reflectionFresnelParameters: FresnelParameters;
        private _refractionFresnelParameters;
        /**
         * Define the refraction fresnel parameters of the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        refractionFresnelParameters: FresnelParameters;
        private _emissiveFresnelParameters;
        /**
         * Define the emissive fresnel parameters of the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        emissiveFresnelParameters: FresnelParameters;
        private _useReflectionFresnelFromSpecular;
        /**
         * If true automatically deducts the fresnels values from the material specularity.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
         */
        useReflectionFresnelFromSpecular: boolean;
        private _useGlossinessFromSpecularMapAlpha;
        /**
         * Defines if the glossiness/roughness of the material should be read from the specular map alpha channel
         */
        useGlossinessFromSpecularMapAlpha: boolean;
        private _maxSimultaneousLights;
        /**
         * Defines the maximum number of lights that can be used in the material
         */
        maxSimultaneousLights: number;
        private _invertNormalMapX;
        /**
         * If sets to true, x component of normal map value will invert (x = 1.0 - x).
         */
        invertNormalMapX: boolean;
        private _invertNormalMapY;
        /**
         * If sets to true, y component of normal map value will invert (y = 1.0 - y).
         */
        invertNormalMapY: boolean;
        private _twoSidedLighting;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         */
        twoSidedLighting: boolean;
        private _applyDecalMapAfterDetailMap;
        /**
         * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)
         */
        applyDecalMapAfterDetailMap: boolean;
        private _shadersLoaded;
        private _vertexPullingMetadata;
        /**
         * Defines additional PrePass parameters for the material.
         */
        readonly prePassConfiguration: PrePassConfiguration;
        /**
         * Can this material render to prepass
         */
        get isPrePassCapable(): boolean;
        /**
         * Can this material render to several textures at once
         */
        get canRenderToMRT(): boolean;
        /**
         * Defines the detail map parameters for the material.
         */
        readonly detailMap: DetailMapConfiguration;
        protected _renderTargets: SmartArray<RenderTargetTexture>;
        protected _globalAmbientColor: Color3;
        protected _cacheHasRenderTargetTextures: boolean;
        /**
         * Instantiates a new standard material.
         * This is the default material used in Babylon. It is the best trade off between quality
         * and performances.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
         * @param name Define the name of the material in the scene
         * @param scene Define the scene the material belong to
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean);
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * Gets the current class name of the material e.g. "StandardMaterial"
         * Mainly use in serialization.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Specifies if the material will require alpha blending
         * @returns a boolean specifying if alpha blending is needed
         */
        needAlphaBlending(): boolean;
        /**
         * Specifies if this material should be rendered in alpha test mode
         * @returns a boolean specifying if an alpha test is needed.
         */
        needAlphaTesting(): boolean;
        /**
         * @returns whether or not the alpha value of the diffuse texture should be used for alpha blending.
         */
        protected _shouldUseAlphaFromDiffuseTexture(): boolean;
        /**
         * @returns whether or not there is a usable alpha channel for transparency.
         */
        protected _hasAlphaChannel(): boolean;
        /**
         * Get the texture used for alpha test purpose.
         * @returns the diffuse texture in case of the standard material.
         */
        getAlphaTestTexture(): Nullable<BaseTexture>;
        /**
         * Get if the submesh is ready to be used and all its information available.
         * Child classes can use it to update shaders
         * @param mesh defines the mesh to check
         * @param subMesh defines which submesh to check
         * @param useInstances specifies that instances should be used
         * @returns a boolean indicating that the submesh is ready or not
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Builds the material UBO layouts.
         * Used internally during the effect preparation.
         */
        buildUniformLayout(): void;
        /**
         * Binds the submesh to this material by preparing the effect and shader to draw
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh containing the submesh
         * @param subMesh defines the submesh to bind the material to
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Get the list of animatables in the material.
         * @returns the list of animatables object used in the material
         */
        getAnimatables(): IAnimatable[];
        /**
         * Gets the active textures from the material
         * @returns an array of textures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Specifies if the material uses a texture
         * @param texture defines the texture to check against the material
         * @returns a boolean specifying if the material uses the texture
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Disposes the material
         * @param forceDisposeEffect specifies if effects should be forcefully disposed
         * @param forceDisposeTextures specifies if textures should be forcefully disposed
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void;
        /**
         * Makes a duplicate of the material, and gives it a new name
         * @param name defines the new name for the duplicated material
         * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.
         * @param rootUrl defines the root URL to use to load textures
         * @returns the cloned material
         */
        clone(name: string, cloneTexturesOnlyOnce?: boolean, rootUrl?: string): StandardMaterial;
        /**
         * Creates a standard material from parsed material data
         * @param source defines the JSON representation of the material
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a new standard material
         */
        static Parse(source: any, scene: Scene, rootUrl: string): StandardMaterial;
        /**
         * Are diffuse textures enabled in the application.
         */
        static get DiffuseTextureEnabled(): boolean;
        static set DiffuseTextureEnabled(value: boolean);
        /**
         * Are detail textures enabled in the application.
         */
        static get DetailTextureEnabled(): boolean;
        static set DetailTextureEnabled(value: boolean);
        /**
         * Are ambient textures enabled in the application.
         */
        static get AmbientTextureEnabled(): boolean;
        static set AmbientTextureEnabled(value: boolean);
        /**
         * Are opacity textures enabled in the application.
         */
        static get OpacityTextureEnabled(): boolean;
        static set OpacityTextureEnabled(value: boolean);
        /**
         * Are reflection textures enabled in the application.
         */
        static get ReflectionTextureEnabled(): boolean;
        static set ReflectionTextureEnabled(value: boolean);
        /**
         * Are emissive textures enabled in the application.
         */
        static get EmissiveTextureEnabled(): boolean;
        static set EmissiveTextureEnabled(value: boolean);
        /**
         * Are specular textures enabled in the application.
         */
        static get SpecularTextureEnabled(): boolean;
        static set SpecularTextureEnabled(value: boolean);
        /**
         * Are bump textures enabled in the application.
         */
        static get BumpTextureEnabled(): boolean;
        static set BumpTextureEnabled(value: boolean);
        /**
         * Are lightmap textures enabled in the application.
         */
        static get LightmapTextureEnabled(): boolean;
        static set LightmapTextureEnabled(value: boolean);
        /**
         * Are refraction textures enabled in the application.
         */
        static get RefractionTextureEnabled(): boolean;
        static set RefractionTextureEnabled(value: boolean);
        /**
         * Are color grading textures enabled in the application.
         */
        static get ColorGradingTextureEnabled(): boolean;
        static set ColorGradingTextureEnabled(value: boolean);
        /**
         * Are fresnels enabled in the application.
         */
        static get FresnelEnabled(): boolean;
        static set FresnelEnabled(value: boolean);
    }
    /**
     * Register side effects for standardMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStandardMaterial(): void;


        interface StandardMaterial {
            /** @internal */
            _decalMap: Nullable<DecalMapConfiguration>;
            /**
             * Defines the decal map parameters for the material.
             */
            decalMap: Nullable<DecalMapConfiguration>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for standardMaterialDecalMap.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStandardMaterialDecalMap(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import standardMaterial.decalMap.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import standardMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Options to be used when creating a shadow depth material
     */
    export interface IIOptionShadowDepthMaterial {
        /** Variables in the vertex shader code that need to have their names remapped.
         * The format is: ["var_name", "var_remapped_name", "var_name", "var_remapped_name", ...]
         * "var_name" should be either: worldPos or vNormalW
         * So, if the variable holding the world position in your vertex shader is not named worldPos, you must tell the system
         * the name to use instead by using: ["worldPos", "myWorldPosVar"] assuming the variable is named myWorldPosVar in your code.
         * If the normal must also be remapped: ["worldPos", "myWorldPosVar", "vNormalW", "myWorldNormal"]
         */
        remappedVariables?: string[];
        /** Set standalone to true if the base material wrapped by ShadowDepthMaterial is not used for a regular object but for depth shadow generation only */
        standalone?: boolean;
        /** Set doNotInjectCode if the specific shadow map generation code is already implemented by the material. That will prevent this code to be injected twice by ShadowDepthWrapper */
        doNotInjectCode?: boolean;
    }
    /**
     * Class that can be used to wrap a base material to generate accurate shadows when using custom vertex/fragment code in the base material
     */
    export class ShadowDepthWrapper {
        private _scene;
        private _options?;
        private _baseMaterial;
        private _onEffectCreatedObserver;
        private _subMeshToEffect;
        private _subMeshToDepthWrapper;
        private _meshes;
        /** Gets the standalone status of the wrapper */
        get standalone(): boolean;
        /** Gets the base material the wrapper is built upon */
        get baseMaterial(): Material;
        /** Gets the doNotInjectCode status of the wrapper */
        get doNotInjectCode(): boolean;
        /**
         * Instantiate a new shadow depth wrapper.
         * It works by injecting some specific code in the vertex/fragment shaders of the base material and is used by a shadow generator to
         * generate the shadow depth map. For more information, please refer to the documentation:
         * https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows
         * @param baseMaterial Material to wrap
         * @param scene Define the scene the material belongs to
         * @param options Options used to create the wrapper
         */
        constructor(baseMaterial: Material, scene?: Scene, options?: IIOptionShadowDepthMaterial);
        private _deleteDepthWrapperEffect;
        /**
         * Gets the effect to use to generate the depth map
         * @param subMesh subMesh to get the effect for
         * @param shadowGenerator shadow generator to get the effect for
         * @param passIdForDrawWrapper Id of the pass for which the effect from the draw wrapper must be retrieved from
         * @returns the effect to use to generate the depth map for the subMesh + shadow generator specified
         */
        getEffect(subMesh: Nullable<SubMesh>, shadowGenerator: ShadowGenerator, passIdForDrawWrapper: number): Nullable<DrawWrapper>;
        /**
         * Specifies that the submesh is ready to be used for depth rendering
         * @param subMesh submesh to check
         * @param defines the list of defines to take into account when checking the effect
         * @param shadowGenerator combined with subMesh, it defines the effect to check
         * @param useInstances specifies that instances should be used
         * @param passIdForDrawWrapper Id of the pass for which the draw wrapper should be created
         * @returns a boolean indicating that the submesh is ready or not
         */
        isReadyForSubMesh(subMesh: SubMesh, defines: string[], shadowGenerator: ShadowGenerator, useInstances: boolean, passIdForDrawWrapper: number): boolean;
        /**
         * Disposes the resources
         */
        dispose(): void;
        private _makeEffect;
    }


    type ShaderMaterialCreateFromSnippetAsyncType = typeof ShaderMaterialCreateFromSnippetAsync;
    type ShaderMaterialParseType = typeof ShaderMaterialParse;
    type ShaderMaterialParseFromFileAsyncType = typeof ShaderMaterialParseFromFileAsync;
    type ShaderMaterialParseFromSnippetAsyncType = typeof ShaderMaterialParseFromSnippetAsync;
        export namespace ShaderMaterial {
            let Parse: ShaderMaterialParseType;
            let ParseFromFileAsync: ShaderMaterialParseFromFileAsyncType;
            let ParseFromSnippetAsync: ShaderMaterialParseFromSnippetAsyncType;
            let CreateFromSnippetAsync: ShaderMaterialCreateFromSnippetAsyncType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the options associated with the creation of a shader material.
     */
    export interface IShaderMaterialOptions {
        /**
         * Does the material work in alpha blend mode
         */
        needAlphaBlending: boolean;
        /**
         * Does the material work in alpha test mode
         */
        needAlphaTesting: boolean;
        /**
         * The list of attribute names used in the shader
         */
        attributes: string[];
        /**
         * The list of uniform names used in the shader
         */
        uniforms: string[];
        /**
         * The list of UBO names used in the shader
         */
        uniformBuffers: string[];
        /**
         * The list of sampler (texture) names used in the shader
         */
        samplers: string[];
        /**
         * The list of external texture names used in the shader
         */
        externalTextures: string[];
        /**
         * The list of sampler object names used in the shader
         */
        samplerObjects: string[];
        /**
         * The list of storage buffer names used in the shader
         */
        storageBuffers: string[];
        /**
         * The list of defines used in the shader
         */
        defines: string[];
        /**
         * Defines if clip planes have to be turned on: true to turn them on, false to turn them off and null to turn them on/off depending on the scene configuration (scene.clipPlaneX)
         */
        useClipPlane: Nullable<boolean>;
        /**
         * The language the shader is written in (default: GLSL)
         */
        shaderLanguage?: ShaderLanguage;
        /**
         * Defines additional code to call to prepare the shader code
         */
        extraInitializationsAsync?: () => Promise<void>;
    }
    /**
     * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.
     *
     * This returned material effects how the mesh will look based on the code in the shaders.
     *
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial
     */
    export class ShaderMaterial extends PushMaterial {
        private _shaderPath;
        private _options;
        private _textures;
        private _internalTextures;
        private _textureArrays;
        private _externalTextures;
        private _floats;
        private _ints;
        private _uints;
        private _floatsArrays;
        private _colors3;
        private _colors3Arrays;
        private _colors4;
        private _colors4Arrays;
        private _vectors2;
        private _vectors3;
        private _vectors4;
        private _quaternions;
        private _quaternionsArrays;
        private _matrices;
        private _matrixArrays;
        private _matrices3x3;
        private _matrices2x2;
        private _vectors2Arrays;
        private _vectors3Arrays;
        private _vectors4Arrays;
        private _uniformBuffers;
        private _textureSamplers;
        private _storageBuffers;
        private _cachedWorldViewMatrix;
        private _cachedWorldViewProjectionMatrix;
        private _multiview;
        private _vertexPullingMetadata;
        /**
         * @internal
         */
        _materialHelperNeedsPreviousMatrices: boolean;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /** Snippet ID if the material was created from the snippet server */
        snippetId: string;
        /**
         * Instantiate a new shader material.
         * The ShaderMaterial object has the necessary methods to pass data from your scene to the Vertex and Fragment Shaders and returns a material that can be applied to any mesh.
         * This returned material effects how the mesh will look based on the code in the shaders.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/shaders/shaderMaterial
         * @param name Define the name of the material in the scene
         * @param scene Define the scene the material belongs to
         * @param shaderPath Defines  the route to the shader code.
         * @param options Define the options used to create the shader
         * @param storeEffectOnSubMeshes true to store effect on submeshes, false to store the effect directly in the material class.
         */
        constructor(name: string, scene: Scene, shaderPath: IShaderPath | string, options?: Partial<IShaderMaterialOptions>, storeEffectOnSubMeshes?: boolean);
        /**
         * Gets the shader path used to define the shader code
         * It can be modified to trigger a new compilation
         */
        get shaderPath(): IShaderPath | string;
        /**
         * Sets the shader path used to define the shader code
         * It can be modified to trigger a new compilation
         */
        set shaderPath(shaderPath: IShaderPath | string);
        /**
         * Gets the options used to compile the shader.
         * They can be modified to trigger a new compilation
         */
        get options(): IShaderMaterialOptions;
        /**
         * is multiview set to true?
         */
        get isMultiview(): boolean;
        /**
         * Gets the current class name of the material e.g. "ShaderMaterial"
         * Mainly use in serialization.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Specifies if the material will require alpha blending
         * @returns a boolean specifying if alpha blending is needed
         */
        needAlphaBlending(): boolean;
        /**
         * Specifies if this material should be rendered in alpha test mode
         * @returns a boolean specifying if an alpha test is needed.
         */
        needAlphaTesting(): boolean;
        private _checkUniform;
        /**
         * Set a texture in the shader.
         * @param name Define the name of the uniform samplers as defined in the shader
         * @param texture Define the texture to bind to this sampler
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setTexture(name: string, texture: BaseTexture): ShaderMaterial;
        /**
         * Set an internal texture in the shader.
         * @param name Define the name of the uniform samplers as defined in the shader
         * @param texture Define the texture to bind to this sampler
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setInternalTexture(name: string, texture: InternalTexture): ShaderMaterial;
        /**
         * Remove a texture from the material.
         * @param name Define the name of the texture to remove
         */
        removeTexture(name: string): void;
        /**
         * Set a texture array in the shader.
         * @param name Define the name of the uniform sampler array as defined in the shader
         * @param textures Define the list of textures to bind to this sampler
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setTextureArray(name: string, textures: BaseTexture[]): ShaderMaterial;
        /**
         * Set an internal texture in the shader.
         * @param name Define the name of the uniform samplers as defined in the shader
         * @param texture Define the texture to bind to this sampler
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setExternalTexture(name: string, texture: ExternalTexture): ShaderMaterial;
        /**
         * Set a float in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setFloat(name: string, value: number): ShaderMaterial;
        /**
         * Set a int in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setInt(name: string, value: number): ShaderMaterial;
        /**
         * Set a unsigned int in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setUInt(name: string, value: number): ShaderMaterial;
        /**
         * Set an array of floats in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setFloats(name: string, value: number[]): ShaderMaterial;
        /**
         * Set a vec3 in the shader from a Color3.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setColor3(name: string, value: IColor3Like): ShaderMaterial;
        /**
         * Set a vec3 array in the shader from a IColor3Like array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setColor3Array(name: string, value: IColor3Like[]): ShaderMaterial;
        /**
         * Set a vec4 in the shader from a Color4.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setColor4(name: string, value: IColor4Like): ShaderMaterial;
        /**
         * Set a vec4 array in the shader from a IColor4Like array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setColor4Array(name: string, value: IColor4Like[]): ShaderMaterial;
        /**
         * Set a vec2 in the shader from a Vector2.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setVector2(name: string, value: IVector2Like): ShaderMaterial;
        /**
         * Set a vec3 in the shader from a Vector3.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setVector3(name: string, value: IVector3Like): ShaderMaterial;
        /**
         * Set a vec4 in the shader from a Vector4.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setVector4(name: string, value: IVector4Like): ShaderMaterial;
        /**
         * Set a vec4 in the shader from a Quaternion.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setQuaternion(name: string, value: Quaternion): ShaderMaterial;
        /**
         * Set a vec4 array in the shader from a Quaternion array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setQuaternionArray(name: string, value: Quaternion[]): ShaderMaterial;
        /**
         * Set a mat4 in the shader from a Matrix.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setMatrix(name: string, value: Matrix): ShaderMaterial;
        /**
         * Set a float32Array in the shader from a matrix array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setMatrices(name: string, value: Matrix[]): ShaderMaterial;
        /**
         * Set a mat3 in the shader from a Float32Array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setMatrix3x3(name: string, value: Float32Array | Array<number>): ShaderMaterial;
        /**
         * Set a mat2 in the shader from a Float32Array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setMatrix2x2(name: string, value: Float32Array | Array<number>): ShaderMaterial;
        /**
         * Set a vec2 array in the shader from a number array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setArray2(name: string, value: number[]): ShaderMaterial;
        /**
         * Set a vec3 array in the shader from a number array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setArray3(name: string, value: number[]): ShaderMaterial;
        /**
         * Set a vec4 array in the shader from a number array.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setArray4(name: string, value: number[]): ShaderMaterial;
        /**
         * Set a uniform buffer in the shader
         * @param name Define the name of the uniform as defined in the shader
         * @param buffer Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setUniformBuffer(name: string, buffer: UniformBuffer): ShaderMaterial;
        /**
         * Set a texture sampler in the shader
         * @param name Define the name of the uniform as defined in the shader
         * @param sampler Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setTextureSampler(name: string, sampler: TextureSampler): ShaderMaterial;
        /**
         * Set a storage buffer in the shader
         * @param name Define the name of the storage buffer as defined in the shader
         * @param buffer Define the value to give to the uniform
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setStorageBuffer(name: string, buffer: StorageBuffer): ShaderMaterial;
        /**
         * Adds, removes, or replaces the specified shader define and value.
         * * setDefine("MY_DEFINE", true); // enables a boolean define
         * * setDefine("MY_DEFINE", "0.5"); // adds "#define MY_DEFINE 0.5" to the shader (or sets and replaces the value of any existing define with that name)
         * * setDefine("MY_DEFINE", false); // disables and removes the define
         * Note if the active defines do change, the shader will be recompiled and this can be expensive.
         * @param define the define name e.g., "OUTPUT_TO_SRGB" or "#define OUTPUT_TO_SRGB". If the define was passed into the constructor already, the version used should match that, and in either case, it should not include any appended value.
         * @param value either the value of the define (e.g. a numerical value) or for booleans, true if the define should be enabled or false if it should be disabled
         * @returns the material itself allowing "fluent" like uniform updates
         */
        setDefine(define: string, value: boolean | string): ShaderMaterial;
        /**
         * Specifies that the submesh is ready to be used
         * @param mesh defines the mesh to check
         * @param subMesh defines which submesh to check
         * @param useInstances specifies that instances should be used
         * @returns a boolean indicating that the submesh is ready or not
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Checks if the material is ready to render the requested mesh
         * @param mesh Define the mesh to render
         * @param useInstances Define whether or not the material is used with instances
         * @param subMesh defines which submesh to render
         * @returns true if ready, otherwise false
         */
        isReady(mesh?: AbstractMesh, useInstances?: boolean, subMesh?: SubMesh): boolean;
        /**
         * Binds the world matrix to the material
         * @param world defines the world transformation matrix
         * @param effectOverride - If provided, use this effect instead of internal effect
         */
        bindOnlyWorldMatrix(world: Matrix, effectOverride?: Nullable<Effect>): void;
        /**
         * Binds the submesh to this material by preparing the effect and shader to draw
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh containing the submesh
         * @param subMesh defines the submesh to bind the material to
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Binds the material to the mesh
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh to bind the material to
         * @param effectOverride - If provided, use this effect instead of internal effect
         * @param subMesh defines the submesh to bind the material to
         */
        bind(world: Matrix, mesh?: AbstractMesh, effectOverride?: Nullable<Effect>, subMesh?: SubMesh): void;
        /**
         * Gets the active textures from the material
         * @returns an array of textures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Specifies if the material uses a texture
         * @param texture defines the texture to check against the material
         * @returns a boolean specifying if the material uses the texture
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Makes a duplicate of the material, and gives it a new name
         * @param name defines the new name for the duplicated material
         * @returns the cloned material
         */
        clone(name: string): ShaderMaterial;
        /**
         * Disposes the material
         * @param forceDisposeEffect specifies if effects should be forcefully disposed
         * @param forceDisposeTextures specifies if textures should be forcefully disposed
         * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void;
        /**
         * Serializes this material in a JSON representation
         * @returns the serialized material object
         */
        serialize(): any;
    }
    /**
     * Creates a shader material from parsed shader material data
     * @param source defines the JSON representation of the material
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @returns a new material
     */
    export function ShaderMaterialParse(source: any, scene: Scene, rootUrl: string): ShaderMaterial;
    /**
     * Creates a new ShaderMaterial from a snippet saved in a remote file
     * @param name defines the name of the ShaderMaterial to create (can be null or empty to use the one from the json data)
     * @param url defines the url to load from
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @returns a promise that will resolve to the new ShaderMaterial
     */
    export function ShaderMaterialParseFromFileAsync(name: Nullable<string>, url: string, scene: Scene, rootUrl?: string): Promise<ShaderMaterial>;
    /**
     * Creates a ShaderMaterial from a snippet saved by the Inspector
     * @param snippetId defines the snippet to load
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @returns a promise that will resolve to the new ShaderMaterial
     */
    export function ShaderMaterialParseFromSnippetAsync(this: typeof ShaderMaterial | void, snippetId: string, scene: Scene, rootUrl?: string): Promise<ShaderMaterial>;
    /**
     * Creates a ShaderMaterial from a snippet saved by the Inspector
     * @deprecated Please use ShaderMaterialParseFromSnippetAsync instead
     * @param snippetId defines the snippet to load
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @returns a promise that will resolve to the new ShaderMaterial
     */
    export var ShaderMaterialCreateFromSnippetAsync: typeof ShaderMaterialParseFromSnippetAsync;
    /**
     * Register side effects for shaderMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterShaderMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import shaderMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Language of the shader code
     */
    export enum ShaderLanguage {
        /** language is GLSL (used by WebGL) */
        GLSL = 0,
        /** language is WGSL (used by WebGPU) */
        WGSL = 1
    }


    /**
     * Base class of materials working in push mode in babylon JS
     * @internal
     */
    export class PushMaterial extends Material {
        protected _activeEffect?: Effect;
        protected _normalMatrix: Matrix;
        constructor(name: string, scene?: Scene, storeEffectOnSubMeshes?: boolean, forceGLSL?: boolean);
        getEffect(): Effect;
        isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean;
        protected _isReadyForSubMesh(subMesh: SubMesh): boolean;
        /**
         * Binds the given world matrix to the active effect
         *
         * @param world the matrix to bind
         */
        bindOnlyWorldMatrix(world: Matrix): void;
        /**
         * Binds the given normal matrix to the active effect
         *
         * @param normalMatrix the matrix to bind
         */
        bindOnlyNormalMatrix(normalMatrix: Matrix): void;
        bind(world: Matrix, mesh?: Mesh): void;
        protected _afterBind(mesh?: AbstractMesh, effect?: Nullable<Effect>, subMesh?: SubMesh): void;
        protected _mustRebind(scene: Scene, effect: Effect, subMesh: SubMesh, visibility?: number): boolean;
        /**
         * Disposes the push material resources.
         * @param forceDisposeEffect defines whether to dispose the effect
         * @param forceDisposeTextures defines whether to dispose the textures
         * @param notBoundToMesh defines whether the material is not bound to a mesh
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    type PrepassDefinesMixinConstructor<T = {}> = new (...args: any[]) => T;
    /**
     * Mixin to add prepass defines to your material defines
     * @internal
     */
    export function PrepassDefinesMixin<Tbase extends PrepassDefinesMixinConstructor>(base: Tbase): {
        new (...args: any[]): {
            PREPASS: boolean;
            PREPASS_COLOR: boolean;
            PREPASS_COLOR_INDEX: number;
            PREPASS_IRRADIANCE_LEGACY: boolean;
            PREPASS_IRRADIANCE_LEGACY_INDEX: number;
            PREPASS_IRRADIANCE: boolean;
            PREPASS_IRRADIANCE_INDEX: number;
            PREPASS_ALBEDO: boolean;
            PREPASS_ALBEDO_INDEX: number;
            PREPASS_ALBEDO_SQRT: boolean;
            PREPASS_ALBEDO_SQRT_INDEX: number;
            PREPASS_DEPTH: boolean;
            PREPASS_DEPTH_INDEX: number;
            PREPASS_SCREENSPACE_DEPTH: boolean;
            PREPASS_SCREENSPACE_DEPTH_INDEX: number;
            PREPASS_NORMALIZED_VIEW_DEPTH: boolean;
            PREPASS_NORMALIZED_VIEW_DEPTH_INDEX: number;
            PREPASS_NORMAL: boolean;
            PREPASS_NORMAL_INDEX: number;
            PREPASS_NORMAL_WORLDSPACE: boolean;
            PREPASS_WORLD_NORMAL: boolean;
            PREPASS_WORLD_NORMAL_INDEX: number;
            PREPASS_POSITION: boolean;
            PREPASS_POSITION_INDEX: number;
            PREPASS_LOCAL_POSITION: boolean;
            PREPASS_LOCAL_POSITION_INDEX: number;
            PREPASS_VELOCITY: boolean;
            PREPASS_VELOCITY_INDEX: number;
            PREPASS_VELOCITY_LINEAR: boolean;
            PREPASS_VELOCITY_LINEAR_INDEX: number;
            PREPASS_REFLECTIVITY: boolean;
            PREPASS_REFLECTIVITY_INDEX: number;
            SCENE_MRT_COUNT: number;
        };
    } & Tbase;


    /**
     * Configuration needed for prepass-capable materials
     */
    export class PrePassConfiguration {
        /**
         * Previous world matrices of meshes carrying this material
         * Used for computing velocity
         */
        previousWorldMatrices: {
            [index: number]: Matrix;
        };
        /**
         * Previous view project matrix
         * Used for computing velocity
         */
        previousViewProjection: Matrix;
        /**
         * Current view projection matrix
         * Used for computing velocity
         */
        currentViewProjection: Matrix;
        /**
         * Previous bones of meshes carrying this material
         * Used for computing velocity
         */
        previousBones: {
            [index: number]: Float32Array;
        };
        private _lastUpdateFrameId;
        /**
         * Add the required uniforms to the current list.
         * @param uniforms defines the current uniform list.
         */
        static AddUniforms(uniforms: string[]): void;
        /**
         * Add the required samplers to the current list.
         * @param samplers defines the current sampler list.
         */
        static AddSamplers(samplers: string[]): void;
        /**
         * Binds the material data.
         * @param effect defines the effect to update
         * @param scene defines the scene the material belongs to.
         * @param mesh The mesh
         * @param world World matrix of this mesh
         * @param isFrozen Is the material frozen
         */
        bindForSubMesh(effect: Effect, scene: Scene, mesh: Mesh, world: Matrix, isFrozen: boolean): void;
    }


    type MultiMaterialParseMultiMaterialType = typeof MultiMaterialParseMultiMaterial;
        export namespace MultiMaterial {
            let ParseMultiMaterial: MultiMaterialParseMultiMaterialType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * A multi-material is used to apply different materials to different parts of the same object without the need of
     * separate meshes. This can be use to improve performances.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
     */
    export class MultiMaterial extends Material {
        private _subMaterials;
        /** @internal */
        _waitingSubMaterialsUniqueIds: string[];
        /**
         * Gets or Sets the list of Materials used within the multi material.
         * They need to be ordered according to the submeshes order in the associated mesh
         */
        get subMaterials(): Nullable<Material>[];
        set subMaterials(value: Nullable<Material>[]);
        /**
         * Function used to align with Node.getChildren()
         * @returns the list of Materials used within the multi material
         */
        getChildren(): Nullable<Material>[];
        /**
         * Instantiates a new Multi Material
         * A multi-material is used to apply different materials to different parts of the same object without the need of
         * separate meshes. This can be use to improve performances.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/multiMaterials
         * @param name Define the name in the scene
         * @param scene Define the scene the material belongs to
         */
        constructor(name: string, scene?: Scene);
        private _hookArray;
        /**
         * Get one of the submaterial by its index in the submaterials array
         * @param index The index to look the sub material at
         * @returns The Material if the index has been defined
         */
        getSubMaterial(index: number): Nullable<Material>;
        /**
         * Get the list of active textures for the whole sub materials list.
         * @returns All the textures that will be used during the rendering
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Specifies if any sub-materials of this multi-material use a given texture.
         * @param texture Defines the texture to check against this multi-material's sub-materials.
         * @returns A boolean specifying if any sub-material of this multi-material uses the texture.
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Gets the current class name of the material e.g. "MultiMaterial"
         * Mainly use in serialization.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Checks if the material is ready to render the requested sub mesh
         * @param mesh Define the mesh the submesh belongs to
         * @param subMesh Define the sub mesh to look readiness for
         * @param useInstances Define whether or not the material is used with instances
         * @returns true if ready, otherwise false
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Clones the current material and its related sub materials
         * @param name Define the name of the newly cloned material
         * @param cloneChildren Define if submaterial will be cloned or shared with the parent instance
         * @returns the cloned material
         */
        clone(name: string, cloneChildren?: boolean): MultiMaterial;
        /**
         * Serializes the materials into a JSON representation.
         * @returns the JSON representation
         */
        serialize(): any;
        /**
         * Dispose the material and release its associated resources
         * @param forceDisposeEffect Define if we want to force disposing the associated effect (if false the shader is not released and could be reuse later on)
         * @param forceDisposeTextures Define if we want to force disposing the associated textures (if false, they will not be disposed and can still be use elsewhere in the app)
         * @param forceDisposeChildren Define if we want to force disposing the associated submaterials (if false, they will not be disposed and can still be use elsewhere in the app)
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, forceDisposeChildren?: boolean): void;
    }
    /**
     * Creates a MultiMaterial from parsed MultiMaterial data.
     * @param parsedMultiMaterial defines parsed MultiMaterial data.
     * @param scene defines the hosting scene
     * @returns a new MultiMaterial
     */
    export function MultiMaterialParseMultiMaterial(parsedMultiMaterial: any, scene: Scene): MultiMaterial;
    /**
     * Register side effects for multiMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMultiMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import multiMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Supported visualizations of MeshDebugPluginMaterial
     */
    export enum MeshDebugMode {
        /**
         * Material without any mesh debug visualization
         */
        NONE = 0,
        /**
         * A wireframe of the mesh
         * NOTE: For this mode to work correctly, convertToUnIndexedMesh() or MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
         */
        TRIANGLES = 1,
        /**
         * Points drawn over vertices of mesh
         * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
         */
        VERTICES = 2,
        /**
         * A wireframe of the mesh, with points drawn over vertices
         * NOTE: For this mode to work correctly, MeshDebugPluginMaterial.PrepareMeshForTrianglesAndVerticesMode() must first be called on mesh.
         */
        TRIANGLES_VERTICES = 3,
        /**
         * A checkerboard grid of the mesh's UV set 0
         */
        UV0 = 4,
        /**
         * A checkerboard grid of the mesh's UV set 1
         */
        UV1 = 5,
        /**
         * The mesh's vertex colors displayed as the primary texture
         */
        VERTEXCOLORS = 6,
        /**
         * An arbitrary, distinguishable color to identify the material
         */
        MATERIALIDS = 7
    }
    /**
     * Options for MeshDebugPluginMaterial visualizations
     */
    export interface MeshDebugOptions {
        /**
         * The mesh debug visualization.
         * Defaults to NONE.
         */
        mode?: MeshDebugMode;
        /**
         * Whether the mesh debug visualization should multiply with color underneath.
         * Defaults to true.
         */
        multiply?: boolean;
        /**
         * Diffuse color used to shade the mesh.
         * Defaults to (1.0, 1.0, 1.0).
         */
        shadedDiffuseColor?: Color3;
        /**
         * Specular color used to shade the mesh.
         * Defaults to (0.8, 0.8, 0.8).
         */
        shadedSpecularColor?: Color3;
        /**
         * Specular power used to shade the mesh.
         * Defaults to 10.
         */
        shadedSpecularPower?: number;
        /**
         * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.
         * Defaults to 0.7.
         */
        wireframeThickness?: number;
        /**
         * Color of edge lines in TRIANGLES mode.
         * Defaults to (0.0, 0.0, 0.0).
         */
        wireframeTrianglesColor?: Color3;
        /**
         * Color of edge lines in TRIANGLES_VERTICES modes.
         * Defaults to (0.8, 0.8, 0.8).
         */
        wireframeVerticesColor?: Color3;
        /**
         * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.
         * Defaults to (0.0, 0.0, 0.0).
         */
        vertexColor?: Color3;
        /**
         * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.
         * Defaults to 1.2.
         */
        vertexRadius?: number;
        /**
         * Size of tiles in UV1 or UV2 modes.
         * Defaults to 20.
         */
        uvScale?: number;
        /**
         * 1st color of checkerboard grid in UV1 or UV2 modes.
         * Defaults to (1.0, 1.0, 1.0).
         */
        uvPrimaryColor?: Color3;
        /**
         * 2nd color of checkerboard grid in UV1 or UV2 modes.
         * Defaults to (0.5, 0.5, 0.5).
         */
        uvSecondaryColor?: Color3;
    }
    /** @internal */
    class MeshDebugDefines extends MaterialDefines {
        /**
         * Current mesh debug visualization.
         * Defaults to NONE.
         */
        DBG_MODE: MeshDebugMode;
        /**
         * Whether the mesh debug visualization multiplies with colors underneath.
         * Defaults to true.
         */
        DBG_MULTIPLY: boolean;
        /**
         * Whether the mesh debug plugin is enabled in the material.
         * Defaults to true.
         */
        DBG_ENABLED: boolean;
    }
    /**
     * Plugin that implements various mesh debug visualizations,
     * List of available visualizations can be found in MeshDebugMode enum.
     */
    export class MeshDebugPluginMaterial extends MaterialPluginBase {
        /**
         * Total number of instances of the plugin.
         * Starts at 0.
         */
        private static _PluginCount;
        /**
         * Color palette used for MATERIALIDS mode.
         * Defaults to `defaultMaterialColors`
         */
        static MaterialColors: Color3[];
        /**
         * Material ID color of this plugin instance.
         * Taken from index `_PluginCount` of `MaterialColors` at time of instantiation.
         */
        private _materialColor;
        /**
         * Whether the mesh debug plugin is enabled in the material.
         * Defaults to true in constructor.
         */
        private _isEnabled;
        private _mode;
        /**
         * The mesh debug visualization.
         * Defaults to NONE.
         */
        mode: MeshDebugMode;
        private _multiply;
        /**
         * Whether the mesh debug visualization should multiply with color underneath.
         * Defaults to true.
         */
        multiply: boolean;
        /**
         * Diffuse color used to shade the mesh.
         * Defaults to (1.0, 1.0, 1.0).
         */
        shadedDiffuseColor: Color3;
        /**
         * Specular color used to shade the mesh.
         * Defaults to (0.8, 0.8, 0.8).
         */
        shadedSpecularColor: Color3;
        /**
         * Specular power used to shade the mesh.
         * Defaults to 10.
         */
        shadedSpecularPower: number;
        /**
         * Width of edge lines in TRIANGLES and TRIANGLE_VERTICES modes.
         * Defaults to 0.7.
         */
        wireframeThickness: number;
        /**
         * Color of edge lines in TRIANGLES mode.
         * Defaults to (0.0, 0.0, 0.0).
         */
        wireframeTrianglesColor: Color3;
        /**
         * Color of edge lines in TRIANGLES_VERTICES modes.
         * Defaults to (0.8, 0.8, 0.8).
         */
        wireframeVerticesColor: Color3;
        /**
         * Color of vertices in TRIANGLES_VERTICES and VERTICES mode.
         * Defaults to (0.0, 0.0, 0.0).
         */
        vertexColor: Color3;
        /**
         * Radius of dots drawn over vertices in TRIANGLE_VERTICES and VERTICES mode.
         * Defaults to 1.2.
         */
        vertexRadius: number;
        /**
         * Size of tiles in UV1 or UV2 modes.
         * Defaults to 20.
         */
        uvScale: number;
        /**
         * 1st color of checkerboard grid in UV1 or UV2 modes.
         * Defaults to (1.0, 1.0, 1.0).
         */
        uvPrimaryColor: Color3;
        /**
         * 2nd color of checkerboard grid in UV1 or UV2 modes.
         * Defaults to (0.5, 0.5, 0.5).
         */
        uvSecondaryColor: Color3;
        /** @internal */
        protected _markAllDefinesAsDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @param shaderLanguage The shader language to use.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        /**
         * Creates a new MeshDebugPluginMaterial
         * @param material Material to attach the mesh debug plugin to
         * @param options Options for the mesh debug plugin
         */
        constructor(material: PBRBaseMaterial | StandardMaterial, options?: MeshDebugOptions);
        /**
         * Get the class name
         * @returns Class name
         */
        getClassName(): string;
        /**
         * Gets whether the mesh debug plugin is enabled in the material.
         */
        get isEnabled(): boolean;
        /**
         * Sets whether the mesh debug plugin is enabled in the material.
         * @param value enabled
         */
        set isEnabled(value: boolean);
        /**
         * Prepare the defines
         * @param defines Mesh debug defines
         * @param scene Scene
         * @param mesh Mesh associated with material
         */
        prepareDefines(defines: MeshDebugDefines, scene: Scene, mesh: AbstractMesh): void;
        /**
         * Get the shader attributes
         * @param attributes Array of attributes
         */
        getAttributes(attributes: string[]): void;
        /**
         * Get the shader uniforms
         * @param shaderLanguage The shader language to use.
         * @returns Uniforms
         */
        getUniforms(shaderLanguage?: ShaderLanguage): {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            fragment: string;
        };
        /**
         * Bind the uniform buffer
         * @param uniformBuffer Uniform buffer
         */
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        /**
         * Get shader code
         * @param shaderType "vertex" or "fragment"
         * @param shaderLanguage The shader language to use.
         * @returns Shader code
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        /**
         * Resets static variables of the plugin to their original state
         */
        static Reset(): void;
        /**
         * Renders triangles in a mesh 3 times by tripling the indices in the index buffer.
         * Used to prepare a mesh to be rendered in `TRIANGLES`, `VERTICES`, or `TRIANGLES_VERTICES` modes.
         * NOTE: This is a destructive operation. The mesh's index buffer and vertex buffers are modified, and a new vertex buffer is allocated.
         * If you'd like the ability to revert these changes, toggle the optional `returnRollback` flag.
         * @param mesh the mesh to target
         * @param returnRollback whether or not to return a function that reverts mesh to its initial state. Default: false.
         * @returns a rollback function if `returnRollback` is true, otherwise an empty function.
         */
        static PrepareMeshForTrianglesAndVerticesMode(mesh: Mesh, returnRollback?: boolean): () => void;
    }
    /**
     * Register side effects for meshDebugPluginMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshDebugPluginMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import meshDebugPluginMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class that holds the different stencil states of a material
     * Usage example: https://playground.babylonjs.com/#CW5PRI#10
     */
    export class MaterialStencilState implements IStencilState {
        /**
         * Creates a material stencil state instance
         */
        constructor();
        /**
         * Resets all the stencil states to default values
         */
        reset(): void;
        private _func;
        /**
         * Gets or sets the stencil function
         */
        get func(): number;
        set func(value: number);
        private _backFunc;
        /**
         * Gets or sets the stencil back function
         */
        get backFunc(): number;
        set backFunc(value: number);
        private _funcRef;
        /**
         * Gets or sets the stencil function reference
         */
        get funcRef(): number;
        set funcRef(value: number);
        private _funcMask;
        /**
         * Gets or sets the stencil function mask
         */
        get funcMask(): number;
        set funcMask(value: number);
        private _opStencilFail;
        /**
         * Gets or sets the operation when the stencil test fails
         */
        get opStencilFail(): number;
        set opStencilFail(value: number);
        private _opDepthFail;
        /**
         * Gets or sets the operation when the depth test fails
         */
        get opDepthFail(): number;
        set opDepthFail(value: number);
        private _opStencilDepthPass;
        /**
         * Gets or sets the operation when the stencil+depth test succeeds
         */
        get opStencilDepthPass(): number;
        set opStencilDepthPass(value: number);
        private _backOpStencilFail;
        /**
         * Gets or sets the operation when the back stencil test fails
         */
        get backOpStencilFail(): number;
        set backOpStencilFail(value: number);
        private _backOpDepthFail;
        /**
         * Gets or sets the operation when the back depth test fails
         */
        get backOpDepthFail(): number;
        set backOpDepthFail(value: number);
        private _backOpStencilDepthPass;
        /**
         * Gets or sets the operation when the back stencil+depth test succeeds
         */
        get backOpStencilDepthPass(): number;
        set backOpStencilDepthPass(value: number);
        private _mask;
        /**
         * Gets or sets the stencil mask
         */
        get mask(): number;
        set mask(value: number);
        private _enabled;
        /**
         * Enables or disables the stencil test
         */
        get enabled(): boolean;
        set enabled(value: boolean);
        /**
         * Get the current class name, useful for serialization or dynamic coding.
         * @returns "MaterialStencilState"
         */
        getClassName(): string;
        /**
         * Makes a duplicate of the current configuration into another one.
         * @param stencilState defines stencil state where to copy the info
         */
        copyTo(stencilState: MaterialStencilState): void;
        /**
         * Serializes this stencil configuration.
         * @returns - An object with the serialized config.
         */
        serialize(): any;
        /**
         * Parses a stencil state configuration from a serialized object.
         * @param source - Serialized object.
         * @param scene Defines the scene we are parsing for
         * @param rootUrl Defines the rootUrl to load from
         */
        parse(source: any, scene: Scene, rootUrl: string): void;
    }


        interface Material {
            /**
             * Plugin manager for this material
             */
            pluginManager?: MaterialPluginManager;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Class that manages the plugins of a material
     * @since 5.0
     */
    export class MaterialPluginManager {
        /** Map a plugin class name to a #define name (used in the vertex/fragment shaders as a marker of the plugin usage) */
        private static _MaterialPluginClassToMainDefine;
        private static _MaterialPluginCounter;
        protected _material: Material;
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        /** @internal */
        _plugins: MaterialPluginBase[];
        protected _activePlugins: MaterialPluginBase[];
        protected _activePluginsForExtraEvents: MaterialPluginBase[];
        protected _codeInjectionPoints: {
            [shaderType: string]: {
                [codeName: string]: boolean;
            };
        };
        protected _defineNamesFromPlugins?: {
            [name: string]: {
                type: string;
                default: any;
            };
        };
        protected _uboDeclaration: string;
        protected _vertexDeclaration: string;
        protected _fragmentDeclaration: string;
        protected _uniformList: string[];
        protected _samplerList: string[];
        protected _uboList: string[];
        /**
         * Creates a new instance of the plugin manager
         * @param material material that this manager will manage the plugins for
         */
        constructor(material: Material);
        /**
         * @internal
         */
        _addPlugin(plugin: MaterialPluginBase): boolean;
        /**
         * @internal
         */
        _activatePlugin(plugin: MaterialPluginBase): void;
        /**
         * Gets a plugin from the list of plugins managed by this manager
         * @param name name of the plugin
         * @returns the plugin if found, else null
         */
        getPlugin<T = MaterialPluginBase>(name: string): Nullable<T>;
        protected _handlePluginEventIsReadyForSubMesh(eventData: MaterialPluginIsReadyForSubMesh): void;
        protected _handlePluginEventPrepareDefinesBeforeAttributes(eventData: MaterialPluginPrepareDefines): void;
        protected _handlePluginEventPrepareDefines(eventData: MaterialPluginPrepareDefines): void;
        protected _handlePluginEventHardBindForSubMesh(eventData: MaterialPluginHardBindForSubMesh): void;
        protected _handlePluginEventBindForSubMesh(eventData: MaterialPluginBindForSubMesh): void;
        protected _handlePluginEventHasRenderTargetTextures(eventData: MaterialPluginHasRenderTargetTextures): void;
        protected _handlePluginEventFillRenderTargetTextures(eventData: MaterialPluginFillRenderTargetTextures): void;
        protected _handlePluginEvent(id: number, info: MaterialPluginGetActiveTextures | MaterialPluginGetAnimatables | MaterialPluginHasTexture | MaterialPluginDisposed | MaterialPluginGetDefineNames | MaterialPluginPrepareEffect | MaterialPluginPrepareUniformBuffer): void;
        protected _collectPointNames(shaderType: string, customCode: Nullable<{
            [pointName: string]: string;
        }> | undefined): void;
        protected _injectCustomCode(eventData: MaterialPluginPrepareEffect, existingCallback?: (shaderType: string, code: string) => string): ShaderCustomProcessingFunction;
    }
    /**
     * Type for plugin material factories.
     */
    export type PluginMaterialFactory = (material: Material) => Nullable<MaterialPluginBase>;
    /**
     * Registers side effects for the material plugin manager.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialPluginManager(): void;
    /**
     * Registers a new material plugin through a factory, or updates it. This makes the plugin available to all materials instantiated after its registration.
     * Register side effects for materialPlugin.
     * Safe to call multiple times; only the first call has an effect.
     * @param pluginName The plugin name
     * @param factory The factory function which allows to create the plugin
     */
    export function RegisterMaterialPlugin(pluginName: string, factory: PluginMaterialFactory): void;
    /**
     * Removes a material plugin from the list of global plugins.
     * @param pluginName The plugin name
     * @returns true if the plugin has been removed, else false
     */
    export function UnregisterMaterialPlugin(pluginName: string): boolean;
    /**
     * Clear the list of global material plugins
     */
    export function UnregisterAllMaterialPlugins(): void;




    /**
     * Creates an instance of the anisotropic plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRAnisotropicPlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the brdf plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRBRDFPlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the clear coat plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRClearCoatPlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the iridescence plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRIridescencePlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the sheen plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRSheenPlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the sub surface plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createPBRSubSurfacePlugin(material: Material): Nullable<MaterialPluginBase>;
    /**
     * Creates an instance of the detail map plugin
     * @param material parent material the plugin will be created for
     * @returns the plugin instance or null if the plugin is incompatible with material
     */
    export function createDetailMapPlugin(material: Material): Nullable<MaterialPluginBase>;


    /** @internal */
    export type MaterialPluginCreated = object;
    /** @internal */
    export type MaterialPluginDisposed = {
        forceDisposeTextures?: boolean;
    };
    /** @internal */
    export type MaterialPluginHasTexture = {
        hasTexture: boolean;
        texture: BaseTexture;
    };
    /** @internal */
    export type MaterialPluginIsReadyForSubMesh = {
        isReadyForSubMesh: boolean;
        defines: MaterialDefines;
        subMesh: SubMesh;
    };
    /** @internal */
    export type MaterialPluginGetDefineNames = {
        defineNames?: {
            [name: string]: {
                type: string;
                default: any;
            };
        };
    };
    /** @internal */
    export type MaterialPluginPrepareEffect = {
        defines: MaterialDefines;
        fallbacks: EffectFallbacks;
        fallbackRank: number;
        customCode?: ShaderCustomProcessingFunction;
        attributes: string[];
        uniforms: string[];
        samplers: string[];
        uniformBuffersNames: string[];
        mesh: AbstractMesh;
        indexParameters: any;
    };
    /** @internal */
    export type MaterialPluginPrepareDefines = {
        defines: MaterialDefines;
        mesh: AbstractMesh;
    };
    /** @internal */
    export type MaterialPluginPrepareUniformBuffer = {
        ubo: UniformBuffer;
    };
    /** @internal */
    export type MaterialPluginBindForSubMesh = {
        subMesh: SubMesh;
    };
    /** @internal */
    export type MaterialPluginGetAnimatables = {
        animatables: IAnimatable[];
    };
    /** @internal */
    export type MaterialPluginGetActiveTextures = {
        activeTextures: BaseTexture[];
    };
    /** @internal */
    export type MaterialPluginFillRenderTargetTextures = {
        renderTargets: SmartArray<RenderTargetTexture>;
    };
    /** @internal */
    export type MaterialPluginHasRenderTargetTextures = {
        hasRenderTargetTextures: boolean;
    };
    /** @internal */
    export type MaterialPluginHardBindForSubMesh = {
        subMesh: SubMesh;
    };
    /**
     * @internal
     */
    export enum MaterialPluginEvent {
        Created = 1,
        Disposed = 2,
        GetDefineNames = 4,
        PrepareUniformBuffer = 8,
        IsReadyForSubMesh = 16,
        PrepareDefines = 32,
        BindForSubMesh = 64,
        PrepareEffect = 128,
        GetAnimatables = 256,
        GetActiveTextures = 512,
        HasTexture = 1024,
        FillRenderTargetTextures = 2048,
        HasRenderTargetTextures = 4096,
        HardBindForSubMesh = 8192
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Base class for material plugins.
     * @since 5.0
     */
    export class MaterialPluginBase {
        /**
         * Defines the name of the plugin
         */
        name: string;
        /**
         * Defines the priority of the plugin. Lower numbers run first.
         */
        priority: number;
        /**
         * Indicates that any #include directive in the plugin code must be replaced by the corresponding code.
         */
        resolveIncludes: boolean;
        /**
         * Indicates that this plugin should be notified for the extra events (HasRenderTargetTextures / FillRenderTargetTextures / HardBindForSubMesh)
         */
        registerForExtraEvents: boolean;
        /**
         * Specifies if the material plugin should be serialized, `true` to skip serialization
         */
        doNotSerialize: boolean;
        protected _material: Material;
        protected _pluginManager: MaterialPluginManager;
        protected _pluginDefineNames?: {
            [name: string]: any;
        };
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @param shaderLanguage The shader language to use.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        protected _enable(enable: boolean): void;
        /**
         * Helper function to mark defines as being dirty.
         */
        readonly markAllDefinesAsDirty: () => void;
        /**
         * Creates a new material plugin
         * @param material parent material of the plugin
         * @param name name of the plugin
         * @param priority priority of the plugin
         * @param defines list of defines used by the plugin. The value of the property is the default value for this property
         * @param addToPluginList true to add the plugin to the list of plugins managed by the material plugin manager of the material (default: true)
         * @param enable true to enable the plugin (it is handy if the plugin does not handle properties to switch its current activation)
         * @param resolveIncludes Indicates that any #include directive in the plugin code must be replaced by the corresponding code (default: false)
         */
        constructor(material: Material, name: string, priority: number, defines?: {
            [key: string]: any;
        }, addToPluginList?: boolean, enable?: boolean, resolveIncludes?: boolean);
        /**
         * Gets the current class name useful for serialization or dynamic coding.
         * @returns The class name.
         */
        getClassName(): string;
        /**
         * Specifies that the submesh is ready to be used.
         * @param _defines the list of "defines" to update.
         * @param _scene defines the scene the material belongs to.
         * @param _engine the engine this scene belongs to.
         * @param _subMesh the submesh to check for readiness
         * @returns - boolean indicating that the submesh is ready or not.
         */
        isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean;
        /**
         * Binds the material data (this function is called even if mustRebind() returns false)
         * @param _uniformBuffer defines the Uniform buffer to fill in.
         * @param _scene defines the scene the material belongs to.
         * @param _engine defines the engine the material belongs to.
         * @param _subMesh the submesh to bind data for
         */
        hardBindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): void;
        /**
         * Binds the material data.
         * @param _uniformBuffer defines the Uniform buffer to fill in.
         * @param _scene defines the scene the material belongs to.
         * @param _engine the engine this scene belongs to.
         * @param _subMesh the submesh to bind data for
         */
        bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): void;
        /**
         * Disposes the resources of the material.
         * @param _forceDisposeTextures - Forces the disposal of all textures.
         */
        dispose(_forceDisposeTextures?: boolean): void;
        /**
         * Returns a list of custom shader code fragments to customize the shader.
         * @param _shaderType "vertex" or "fragment"
         * @param _shaderLanguage The shader language to use.
         * @returns null if no code to be added, or a list of pointName =\> code.
         * Note that `pointName` can also be a regular expression if it starts with a `!`.
         * In that case, the string found by the regular expression (if any) will be
         * replaced by the code provided.
         */
        getCustomCode(_shaderType: string, _shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        /**
         * Collects all defines.
         * @param defines The object to append to.
         */
        collectDefines(defines: {
            [name: string]: {
                type: string;
                default: any;
            };
        }): void;
        /**
         * Sets the defines for the next rendering. Called before PrepareDefinesForAttributes is called.
         * @param _defines the list of "defines" to update.
         * @param _scene defines the scene to the material belongs to.
         * @param _mesh the mesh being rendered
         */
        prepareDefinesBeforeAttributes(_defines: MaterialDefines, _scene: Scene, _mesh: AbstractMesh): void;
        /**
         * Sets the defines for the next rendering
         * @param _defines the list of "defines" to update.
         * @param _scene defines the scene to the material belongs to.
         * @param _mesh the mesh being rendered
         */
        prepareDefines(_defines: MaterialDefines, _scene: Scene, _mesh: AbstractMesh): void;
        /**
         * Checks to see if a texture is used in the material.
         * @param _texture - Base texture to use.
         * @returns - Boolean specifying if a texture is used in the material.
         */
        hasTexture(_texture: BaseTexture): boolean;
        /**
         * Gets a boolean indicating that current material needs to register RTT
         * @returns true if this uses a render target otherwise false.
         */
        hasRenderTargetTextures(): boolean;
        /**
         * Fills the list of render target textures.
         * @param _renderTargets the list of render targets to update
         */
        fillRenderTargetTextures(_renderTargets: SmartArray<RenderTargetTexture>): void;
        /**
         * Returns an array of the actively used textures.
         * @param _activeTextures Array of BaseTextures
         */
        getActiveTextures(_activeTextures: BaseTexture[]): void;
        /**
         * Returns the animatable textures.
         * @param _animatables Array of animatable textures.
         */
        getAnimatables(_animatables: IAnimatable[]): void;
        /**
         * Add fallbacks to the effect fallbacks list.
         * @param defines defines the Base texture to use.
         * @param fallbacks defines the current fallback list.
         * @param currentRank defines the current fallback rank.
         * @returns the new fallback rank.
         */
        addFallbacks(defines: MaterialDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Gets the samplers used by the plugin.
         * @param _samplers list that the sampler names should be added to.
         */
        getSamplers(_samplers: string[]): void;
        /**
         * Gets the attributes used by the plugin.
         * @param _attributes list that the attribute names should be added to.
         * @param _scene the scene that the material belongs to.
         * @param _mesh the mesh being rendered.
         */
        getAttributes(_attributes: string[], _scene: Scene, _mesh: AbstractMesh): void;
        /**
         * Gets the uniform buffers names added by the plugin.
         * @param _ubos list that the ubo names should be added to.
         */
        getUniformBuffersNames(_ubos: string[]): void;
        /**
         * Gets the description of the uniforms to add to the ubo (if engine supports ubos) or to inject directly in the vertex/fragment shaders (if engine does not support ubos)
         * @param _shaderLanguage The shader language to use.
         * @returns the description of the uniforms
         */
        getUniforms(_shaderLanguage?: ShaderLanguage): {
            ubo?: Array<{
                name: string;
                size?: number;
                type?: string;
                arraySize?: number;
            }>;
            vertex?: string;
            fragment?: string;
            externalUniforms?: string[];
        };
        /**
         * Makes a duplicate of the current configuration into another one.
         * @param plugin define the config where to copy the info
         */
        copyTo(plugin: MaterialPluginBase): void;
        /**
         * Serializes this plugin configuration.
         * @returns - An object with the serialized config.
         */
        serialize(): any;
        /**
         * Parses a plugin configuration from a serialized object.
         * @param source - Serialized object.
         * @param scene Defines the scene we are parsing for
         * @param rootUrl Defines the rootUrl to load from
         */
        parse(source: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for materialPluginBase.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialPluginBase(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import materialPluginBase.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Type of clear operation to perform on a geometry texture.
     */
    export enum GeometryRenderingTextureClearType {
        /**
         * Clear the texture with zero.
         */
        Zero = 0,
        /**
         * Clear the texture with one.
         */
        One = 1,
        /**
         * Clear the texture with the maximum view Z value.
         */
        MaxViewZ = 2,
        /**
         * Do not clear the texture.
         */
        NoClear = 3
    }
    /**
     * Configuration for geometry rendering.
     * A configuration is created for each rendering pass a geometry rendering is used in.
     */
    export type GeometryRenderingConfiguration = {
        /**
         * Defines used for the geometry rendering.
         */
        defines: {
            [name: string]: number;
        };
        /**
         * Previous world matrices for meshes.
         */
        previousWorldMatrices: {
            [index: number]: Matrix;
        };
        /**
         * Previous view projection matrix.
         */
        previousViewProjection: Matrix;
        /**
         * Current view projection matrix.
         */
        currentViewProjection: Matrix;
        /**
         * Previous bones for skinned meshes.
         */
        previousBones: {
            [index: number]: Float32Array;
        };
        /**
         * Last frame id the configuration was updated.
         */
        lastUpdateFrameId: number;
        /**
         * List of excluded skinned meshes.
         */
        excludedSkinnedMesh: AbstractMesh[];
        /**
         * Whether to reverse culling for the geometry rendering (meaning, if back faces should be culled, front faces are culled instead, and the other way around).
         */
        reverseCulling: boolean;
    };
    /**
     * Helper class to manage geometry rendering.
     */
    export class MaterialHelperGeometryRendering {
        /**
         * Descriptions of the geometry textures.
         */
        static readonly GeometryTextureDescriptions: {
            type: number;
            name: string;
            clearType: GeometryRenderingTextureClearType;
            define: string;
            defineIndex: string;
        }[];
        private static _Configurations;
        /**
         * Creates a new geometry rendering configuration.
         * @param renderPassId Render pass id the configuration is created for.
         * @returns The created configuration.
         */
        static CreateConfiguration(renderPassId: number): GeometryRenderingConfiguration;
        /**
         * Deletes a geometry rendering configuration.
         * @param renderPassId The render pass id of the configuration to delete.
         */
        static DeleteConfiguration(renderPassId: number): void;
        /**
         * Gets a geometry rendering configuration.
         * @param renderPassId The render pass id of the configuration to get.
         * @returns The configuration.
         */
        static GetConfiguration(renderPassId: number): GeometryRenderingConfiguration;
        /**
         * Adds uniforms and samplers for geometry rendering.
         * @param uniforms The array of uniforms to add to.
         * @param _samplers The array of samplers to add to.
         */
        static AddUniformsAndSamplers(uniforms: string[], _samplers: string[]): void;
        /**
         * Marks a list of meshes as dirty for geometry rendering.
         * @param renderPassId The render pass id the meshes are marked as dirty for.
         * @param meshes The list of meshes to mark as dirty.
         */
        static MarkAsDirty(renderPassId: number, meshes: AbstractMesh[]): void;
        /**
         * Prepares defines for geometry rendering.
         * @param renderPassId The render pass id the defines are prepared for.
         * @param mesh The mesh the defines are prepared for.
         * @param defines The defines to update according to the geometry rendering configuration.
         */
        static PrepareDefines(renderPassId: number, mesh: AbstractMesh, defines: MaterialDefines): void;
        /**
         * Binds geometry rendering data for a mesh.
         * @param renderPassId The render pass id the geometry rendering data is bound for.
         * @param effect The effect to bind the geometry rendering data to.
         * @param mesh The mesh to bind the geometry rendering data for.
         * @param world The world matrix of the mesh.
         * @param material The material of the mesh.
         */
        static Bind(renderPassId: number, effect: Effect, mesh: Mesh, world: Matrix, material: Material): void;
    }


    /**
     * Binds the logarithmic depth information from the scene to the effect for the given defines.
     * @param defines The generated defines used in the effect
     * @param effect The effect we are binding the data to
     * @param scene The scene we are willing to render with logarithmic scale for
     */
    export function BindLogDepth(defines: any, effect: Effect, scene: Scene): void;
    /**
     * Binds the fog information from the scene to the effect for the given mesh.
     * @param scene The scene the lights belongs to
     * @param mesh The mesh we are binding the information to render
     * @param effect The effect we are binding the data to
     * @param linearSpace Defines if the fog effect is applied in linear space
     */
    export function BindFogParameters(scene: Scene, mesh?: AbstractMesh, effect?: Effect, linearSpace?: boolean): void;
    /**
     * Prepares the list of attributes and defines required for morph targets.
     * @param morphTargetManager The manager for the morph targets
     * @param defines The current list of defines
     * @param attribs The current list of attributes
     * @param mesh The mesh to prepare the defines and attributes for
     * @param usePositionMorph Whether the position morph target is used
     * @param useNormalMorph Whether the normal morph target is used
     * @param useTangentMorph Whether the tangent morph target is used
     * @param useUVMorph Whether the UV morph target is used
     * @param useUV2Morph Whether the UV2 morph target is used
     * @param useColorMorph Whether the color morph target is used
     * @returns The maxSimultaneousMorphTargets for the effect
     */
    export function PrepareDefinesAndAttributesForMorphTargets(morphTargetManager: MorphTargetManager, defines: string[], attribs: string[], mesh: AbstractMesh, usePositionMorph: boolean, useNormalMorph: boolean, useTangentMorph: boolean, useUVMorph: boolean, useUV2Morph: boolean, useColorMorph: boolean): number;
    /**
     * Prepares the list of attributes required for morph targets according to the effect defines.
     * @param attribs The current list of supported attribs
     * @param mesh The mesh to prepare the morph targets attributes for
     * @param influencers The number of influencers
     */
    export function PrepareAttributesForMorphTargetsInfluencers(attribs: string[], mesh: AbstractMesh, influencers: number): void;
    /**
     * Prepares the list of attributes required for morph targets according to the effect defines.
     * @param attribs The current list of supported attribs
     * @param mesh The mesh to prepare the morph targets attributes for
     * @param defines The current Defines of the effect
     * @param usePositionMorph Whether the position morph target is used
     */
    export function PrepareAttributesForMorphTargets(attribs: string[], mesh: AbstractMesh, defines: any, usePositionMorph?: boolean): void;
    /**
     * Add the list of attributes required for instances to the attribs array.
     * @param attribs The current list of supported attribs
     * @param needsPreviousMatrices If the shader needs previous matrices
     */
    export function PushAttributesForInstances(attribs: string[], needsPreviousMatrices?: boolean): void;
    /**
     * Binds the morph targets information from the mesh to the effect.
     * @param abstractMesh The mesh we are binding the information to render
     * @param effect The effect we are binding the data to
     */
    export function BindMorphTargetParameters(abstractMesh: AbstractMesh, effect: Effect): void;
    /**
     * Binds the scene's uniform buffer to the effect.
     * @param effect defines the effect to bind to the scene uniform buffer
     * @param sceneUbo defines the uniform buffer storing scene data
     */
    export function BindSceneUniformBuffer(effect: Effect, sceneUbo: UniformBuffer): void;
    /**
     * Update parameters for IBL
     * @param scene The scene
     * @param defines The list of shader defines for the material
     * @param ubo The uniform buffer to update
     * @param reflectionColor The color to use for the reflection
     * @param reflectionTexture The IBL texture
     * @param realTimeFiltering Whether realtime filtering of IBL texture is being used
     * @param supportTextureInfo Whether the texture info is supported
     * @param supportLocalProjection Whether local projection is supported
     * @param usePBR Whether PBR is being used
     * @param supportSH Whether spherical harmonics are supported
     * @param useColor Whether to use the reflection color
     * @param reflectionBlur The level of blur of the reflection
     */
    export function BindIBLParameters(scene: Scene, defines: any, ubo: UniformBuffer, reflectionColor: Color3, reflectionTexture?: Nullable<BaseTexture>, realTimeFiltering?: boolean, supportTextureInfo?: boolean, supportLocalProjection?: boolean, usePBR?: boolean, supportSH?: boolean, useColor?: boolean, reflectionBlur?: number): void;
    /**
     * Update parameters for IBL
     * @param scene The scene
     * @param defines The list of shader defines for the material
     * @param ubo The uniform buffer to update
     * @param reflectionTexture The IBL texture
     * @param realTimeFiltering Whether realtime filtering of IBL texture is being used
     */
    export function BindIBLSamplers(scene: Scene, defines: any, ubo: UniformBuffer, reflectionTexture?: Nullable<BaseTexture>, realTimeFiltering?: boolean): void;
    /**
     * Helps preparing the defines values about the UVs in used in the effect.
     * UVs are shared as much as we can across channels in the shaders.
     * @param texture The texture we are preparing the UVs for
     * @param defines The defines to update
     * @param key The channel key "diffuse", "specular"... used in the shader
     */
    export function PrepareDefinesForMergedUV(texture: BaseTexture, defines: any, key: string): void;
    /**
     * Binds a texture matrix value to its corresponding uniform
     * @param texture The texture to bind the matrix for
     * @param uniformBuffer The uniform buffer receiving the data
     * @param key The channel key "diffuse", "specular"... used in the shader
     */
    export function BindTextureMatrix(texture: BaseTexture, uniformBuffer: UniformBuffer, key: string): void;
    /**
     * Prepares the list of attributes required for baked vertex animations according to the effect defines.
     * @param attribs The current list of supported attribs
     * @param mesh The mesh to prepare for baked vertex animations
     * @param defines The current Defines of the effect
     */
    export function PrepareAttributesForBakedVertexAnimation(attribs: string[], mesh: AbstractMesh, defines: any): void;
    /**
     * Binds the bones information from the mesh to the effect.
     * @param mesh The mesh we are binding the information to render
     * @param effect The effect we are binding the data to
     * @param prePassConfiguration Configuration for the prepass, in case prepass is activated
     */
    export function BindBonesParameters(mesh?: AbstractMesh, effect?: Effect, prePassConfiguration?: PrePassConfiguration): void;
    /**
     * Binds the light information to the effect.
     * @param light The light containing the generator
     * @param effect The effect we are binding the data to
     * @param lightIndex The light index in the effect used to render
     */
    export function BindLightProperties(light: Light, effect: Effect, lightIndex: number): void;
    /**
     * Binds the lights information from the scene to the effect for the given mesh.
     * @param light Light to bind
     * @param lightIndex Light index
     * @param scene The scene where the light belongs to
     * @param effect The effect we are binding the data to
     * @param useSpecular Defines if specular is supported
     * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows
     */
    export function BindLight(light: Light, lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows?: boolean): void;
    /**
     * Binds the lights information from the scene to the effect for the given mesh.
     * @param scene The scene the lights belongs to
     * @param mesh The mesh we are binding the information to render
     * @param effect The effect we are binding the data to
     * @param defines The generated defines for the effect
     * @param maxSimultaneousLights The maximum number of light that can be bound to the effect
     */
    export function BindLights(scene: Scene, mesh: AbstractMesh, effect: Effect, defines: any, maxSimultaneousLights?: number): void;
    /**
     * Prepares the list of attributes required for bones according to the effect defines.
     * @param attribs The current list of supported attribs
     * @param mesh The mesh to prepare the bones attributes for
     * @param defines The current Defines of the effect
     * @param fallbacks The current effect fallback strategy
     */
    export function PrepareAttributesForBones(attribs: string[], mesh: AbstractMesh, defines: any, fallbacks: EffectFallbacks): void;
    /**
     * Check and prepare the list of attributes required for instances according to the effect defines.
     * @param attribs The current list of supported attribs
     * @param defines The current MaterialDefines of the effect
     */
    export function PrepareAttributesForInstances(attribs: string[], defines: MaterialDefines): void;
    /**
     * This helps decreasing rank by rank the shadow quality (0 being the highest rank and quality)
     * @param defines The defines to update while falling back
     * @param fallbacks The authorized effect fallbacks
     * @param maxSimultaneousLights The maximum number of lights allowed
     * @param rank the current rank of the Effect
     * @returns The newly affected rank
     */
    export function HandleFallbacksForShadows(defines: any, fallbacks: EffectFallbacks, maxSimultaneousLights?: number, rank?: number): number;
    /**
     * Gets the current status of the fog (should it be enabled?)
     * @param mesh defines the mesh to evaluate for fog support
     * @param scene defines the hosting scene
     * @returns true if fog must be enabled
     */
    export function GetFogState(mesh: AbstractMesh, scene: Scene): boolean;
    /**
     * Helper used to prepare the list of defines associated with misc. values for shader compilation
     * @param mesh defines the current mesh
     * @param scene defines the current scene
     * @param useLogarithmicDepth defines if logarithmic depth has to be turned on
     * @param pointsCloud defines if point cloud rendering has to be turned on
     * @param fogEnabled defines if fog has to be turned on
     * @param alphaTest defines if alpha testing has to be turned on
     * @param defines defines the current list of defines
     * @param applyDecalAfterDetail Defines if the decal is applied after or before the detail
     * @param useVertexPulling Defines if vertex pulling is used
     * @param renderingMesh The mesh used for rendering
     * @param setVertexOutputInvariant Defines if the vertex output should be invariant
     */
    export function PrepareDefinesForMisc(mesh: AbstractMesh, scene: Scene, useLogarithmicDepth: boolean, pointsCloud: boolean, fogEnabled: boolean, alphaTest: boolean, defines: any, applyDecalAfterDetail?: boolean, useVertexPulling?: boolean, renderingMesh?: AbstractMesh, setVertexOutputInvariant?: boolean): void;
    /**
     * Checks whether the texture resources used by the lights that will affect the given mesh are ready.
     * This mirrors the light iteration performed by {@link PrepareDefinesForLights} and {@link BindLights}:
     * it only considers lights that can affect the mesh (already filtered into `mesh.lightSources`)
     * and respects the material's `maxSimultaneousLights` cap and the `disableLighting` flag.
     * @param scene The scene the mesh belongs to
     * @param mesh The mesh to check
     * @param maxSimultaneousLights The material's max simultaneous lights cap
     * @param disableLighting Whether lighting is disabled for the material
     * @returns true if all affecting lights report their textures are ready
     */
    export function AreLightsTexturesReady(scene: Scene, mesh: AbstractMesh, maxSimultaneousLights: number, disableLighting?: boolean): boolean;
    /**
     * Prepares the defines related to the light information passed in parameter
     * @param scene The scene we are intending to draw
     * @param mesh The mesh the effect is compiling for
     * @param defines The defines to update
     * @param specularSupported Specifies whether specular is supported or not (override lights data)
     * @param maxSimultaneousLights Specifies how manuy lights can be added to the effect at max
     * @param disableLighting Specifies whether the lighting is disabled (override scene and light)
     * @returns true if normals will be required for the rest of the effect
     */
    export function PrepareDefinesForLights(scene: Scene, mesh: AbstractMesh, defines: any, specularSupported: boolean, maxSimultaneousLights?: number, disableLighting?: boolean): boolean;
    /**
     * Prepare defines relating to IBL logic.
     * @param scene The scene
     * @param reflectionTexture The texture to use for IBL
     * @param defines The defines to update
     * @param realTimeFiltering Whether realtime filting of IBL texture is being used
     * @param realTimeFilteringQuality The quality of realtime filtering
     * @param forceSHInVertex Whether the SH are handled in the vertex shader
     * @returns true if the defines were updated
     */
    export function PrepareDefinesForIBL(scene: Scene, reflectionTexture: Nullable<BaseTexture>, defines: any, realTimeFiltering?: boolean, realTimeFilteringQuality?: number, forceSHInVertex?: boolean): boolean;
    /**
     * Prepares the defines related to the light information passed in parameter
     * @param scene The scene we are intending to draw
     * @param mesh The mesh the effect is compiling for
     * @param light The light the effect is compiling for
     * @param lightIndex The index of the light
     * @param defines The defines to update
     * @param specularSupported Specifies whether specular is supported or not (override lights data)
     * @param state Defines the current state regarding what is needed (normals, etc...)
     * @param state.needNormals
     * @param state.needRebuild
     * @param state.shadowEnabled
     * @param state.specularEnabled
     * @param state.lightmapMode
     */
    export function PrepareDefinesForLight(scene: Scene, mesh: AbstractMesh, light: Light, lightIndex: number, defines: any, specularSupported: boolean, state: {
        needNormals: boolean;
        needRebuild: boolean;
        shadowEnabled: boolean;
        specularEnabled: boolean;
        lightmapMode: boolean;
    }): void;
    /**
     * Helper used to prepare the list of defines associated with frame values for shader compilation
     * @param scene defines the current scene
     * @param engine defines the current engine
     * @param material defines the material we are compiling the shader for
     * @param defines specifies the list of active defines
     * @param useInstances defines if instances have to be turned on
     * @param useClipPlane defines if clip plane have to be turned on
     * @param useThinInstances defines if thin instances have to be turned on
     */
    export function PrepareDefinesForFrameBoundValues(scene: Scene, engine: AbstractEngine, material: Material, defines: any, useInstances: boolean, useClipPlane?: Nullable<boolean>, useThinInstances?: boolean): void;
    /**
     * Prepares the defines for bones
     * @param mesh The mesh containing the geometry data we will draw
     * @param defines The defines to update
     */
    export function PrepareDefinesForBones(mesh: AbstractMesh, defines: any): void;
    /**
     * Prepares the defines for morph targets
     * @param mesh The mesh containing the geometry data we will draw
     * @param defines The defines to update
     */
    export function PrepareDefinesForMorphTargets(mesh: AbstractMesh, defines: any): void;
    /**
     * Prepares the defines for baked vertex animation
     * @param mesh The mesh containing the geometry data we will draw
     * @param defines The defines to update
     */
    export function PrepareDefinesForBakedVertexAnimation(mesh: AbstractMesh, defines: any): void;
    /**
     * Prepares the defines used in the shader depending on the attributes data available in the mesh
     * @param mesh The mesh containing the geometry data we will draw
     * @param defines The defines to update
     * @param useVertexColor Precise whether vertex colors should be used or not (override mesh info)
     * @param useBones Precise whether bones should be used or not (override mesh info)
     * @param useMorphTargets Precise whether morph targets should be used or not (override mesh info)
     * @param useVertexAlpha Precise whether vertex alpha should be used or not (override mesh info)
     * @param useBakedVertexAnimation Precise whether baked vertex animation should be used or not (override mesh info)
     * @returns false if defines are considered not dirty and have not been checked
     */
    export function PrepareDefinesForAttributes(mesh: AbstractMesh, defines: any, useVertexColor: boolean, useBones: boolean, useMorphTargets?: boolean, useVertexAlpha?: boolean, useBakedVertexAnimation?: boolean): boolean;
    /**
     * Prepares the defines related to multiview
     * @param scene The scene we are intending to draw
     * @param defines The defines to update
     */
    export function PrepareDefinesForMultiview(scene: Scene, defines: any): void;
    /**
     * Prepares the defines related to order independant transparency
     * @param scene The scene we are intending to draw
     * @param defines The defines to update
     * @param needAlphaBlending Determines if the material needs alpha blending
     */
    export function PrepareDefinesForOIT(scene: Scene, defines: any, needAlphaBlending: boolean): void;
    /**
     * Prepares the defines related to the prepass
     * @param scene The scene we are intending to draw
     * @param defines The defines to update
     * @param canRenderToMRT Indicates if this material renders to several textures in the prepass
     */
    export function PrepareDefinesForPrePass(scene: Scene, defines: any, canRenderToMRT: boolean): void;
    /**
     * Helper used to prepare the defines relative to the active camera
     * @param scene defines the current scene
     * @param defines specifies the list of active defines
     * @returns true if the defines have been updated, else false
     */
    export function PrepareDefinesForCamera(scene: Scene, defines: any): boolean;
    /**
     * Prepares the uniforms and samplers list to be used in the effect (for a specific light)
     * @param lightIndex defines the light index
     * @param uniformsList The uniform list
     * @param samplersList The sampler list
     * @param projectedLightTexture defines if projected texture must be used
     * @param uniformBuffersList defines an optional list of uniform buffers
     * @param updateOnlyBuffersList True to only update the uniformBuffersList array
     * @param iesLightTexture defines if IES texture must be used
     * @param clusteredLightTextures defines if the clustered light textures must be used
     * @param rectAreaLightTexture defines if rect area light is using a emission texture.
     * @param clusteredLightStorageBuffer defines if the clustered light tile mask uses a storage buffer instead of a texture
     */
    export function PrepareUniformsAndSamplersForLight(lightIndex: number, uniformsList: string[], samplersList: string[], projectedLightTexture?: any, uniformBuffersList?: Nullable<string[]>, updateOnlyBuffersList?: boolean, iesLightTexture?: boolean, clusteredLightTextures?: boolean, rectAreaLightTexture?: boolean, clusteredLightStorageBuffer?: boolean): void;
    /**
     * Append uniforms and samplers related to IBL to the provided lists
     * @param uniformsList The list of uniforms to append to
     * @param samplersList The list of samplers to append to
     * @param useSH Whether to include spherical harmonics uniforms
     */
    export function PrepareUniformsAndSamplersForIBL(uniformsList: string[], samplersList: string[], useSH: boolean): void;
    /**
     * Prepares the uniforms and samplers list to be used in the effect
     * @param uniformsListOrOptions The uniform names to prepare or an EffectCreationOptions containing the list and extra information
     * @param samplersList The sampler list
     * @param defines The defines helping in the list generation
     * @param maxSimultaneousLights The maximum number of simultaneous light allowed in the effect
     */
    export function PrepareUniformsAndSamplersList(uniformsListOrOptions: string[] | IEffectCreationOptions, samplersList?: string[], defines?: any, maxSimultaneousLights?: number): void;
    /**
     *
     * @param ubo Add uniforms to UBO
     * @param supportTextureInfo Add uniforms for texture info if true
     * @param supportLocalProjection Add uniforms for local projection if true
     * @param usePBR Add uniforms for IBL if true
     * @param supportSH Add uniforms for spherical harmonics if true
     * @param useColor Add uniforms for reflection color if true
     */
    export function PrepareUniformLayoutForIBL(ubo: UniformBuffer, supportTextureInfo?: boolean, supportLocalProjection?: boolean, usePBR?: boolean, supportSH?: boolean, useColor?: boolean): void;


    /**
     * "Static Class" containing the most commonly used helper while dealing with material for rendering purpose.
     *
     * It contains the basic tools to help defining defines, binding uniform for the common part of the materials.
     *
     * This works by convention in BabylonJS but is meant to be use only with shader following the in place naming rules and conventions.
     */
    export class MaterialHelper {
        /**
         * Binds the scene's uniform buffer to the effect.
         * @param effect defines the effect to bind to the scene uniform buffer
         * @param sceneUbo defines the uniform buffer storing scene data
         */
        static BindSceneUniformBuffer: (effect: Effect, sceneUbo: UniformBuffer) => void;
        /**
         * Helps preparing the defines values about the UVs in used in the effect.
         * UVs are shared as much as we can across channels in the shaders.
         * @param texture The texture we are preparing the UVs for
         * @param defines The defines to update
         * @param key The channel key "diffuse", "specular"... used in the shader
         */
        static PrepareDefinesForMergedUV: (texture: BaseTexture, defines: any, key: string) => void;
        /**
         * Binds a texture matrix value to its corresponding uniform
         * @param texture The texture to bind the matrix for
         * @param uniformBuffer The uniform buffer receiving the data
         * @param key The channel key "diffuse", "specular"... used in the shader
         */
        static BindTextureMatrix: (texture: BaseTexture, uniformBuffer: UniformBuffer, key: string) => void;
        /**
         * Gets the current status of the fog (should it be enabled?)
         * @param mesh defines the mesh to evaluate for fog support
         * @param scene defines the hosting scene
         * @returns true if fog must be enabled
         */
        static GetFogState: (mesh: AbstractMesh, scene: Scene) => boolean;
        /**
         * Helper used to prepare the list of defines associated with misc. values for shader compilation
         * @param mesh defines the current mesh
         * @param scene defines the current scene
         * @param useLogarithmicDepth defines if logarithmic depth has to be turned on
         * @param pointsCloud defines if point cloud rendering has to be turned on
         * @param fogEnabled defines if fog has to be turned on
         * @param alphaTest defines if alpha testing has to be turned on
         * @param defines defines the current list of defines
         * @param applyDecalAfterDetail Defines if the decal is applied after or before the detail
         */
        static PrepareDefinesForMisc: (mesh: AbstractMesh, scene: Scene, useLogarithmicDepth: boolean, pointsCloud: boolean, fogEnabled: boolean, alphaTest: boolean, defines: any, applyDecalAfterDetail?: boolean) => void;
        /**
         * Helper used to prepare the defines relative to the active camera
         * @param scene defines the current scene
         * @param defines specifies the list of active defines
         * @returns true if the defines have been updated, else false
         */
        static PrepareDefinesForCamera: (scene: Scene, defines: any) => boolean;
        /**
         * Helper used to prepare the list of defines associated with frame values for shader compilation
         * @param scene defines the current scene
         * @param engine defines the current engine
         * @param material defines the material we are compiling the shader for
         * @param defines specifies the list of active defines
         * @param useInstances defines if instances have to be turned on
         * @param useClipPlane defines if clip plane have to be turned on
         * @param useThinInstances defines if thin instances have to be turned on
         */
        static PrepareDefinesForFrameBoundValues: (scene: Scene, engine: AbstractEngine, material: Material, defines: any, useInstances: boolean, useClipPlane?: Nullable<boolean>, useThinInstances?: boolean) => void;
        /**
         * Prepares the defines for bones
         * @param mesh The mesh containing the geometry data we will draw
         * @param defines The defines to update
         */
        static PrepareDefinesForBones: (mesh: AbstractMesh, defines: any) => void;
        /**
         * Prepares the defines for morph targets
         * @param mesh The mesh containing the geometry data we will draw
         * @param defines The defines to update
         */
        static PrepareDefinesForMorphTargets: (mesh: AbstractMesh, defines: any) => void;
        /**
         * Prepares the defines for baked vertex animation
         * @param mesh The mesh containing the geometry data we will draw
         * @param defines The defines to update
         */
        static PrepareDefinesForBakedVertexAnimation: (mesh: AbstractMesh, defines: any) => void;
        /**
         * Prepares the defines used in the shader depending on the attributes data available in the mesh
         * @param mesh The mesh containing the geometry data we will draw
         * @param defines The defines to update
         * @param useVertexColor Precise whether vertex colors should be used or not (override mesh info)
         * @param useBones Precise whether bones should be used or not (override mesh info)
         * @param useMorphTargets Precise whether morph targets should be used or not (override mesh info)
         * @param useVertexAlpha Precise whether vertex alpha should be used or not (override mesh info)
         * @param useBakedVertexAnimation Precise whether baked vertex animation should be used or not (override mesh info)
         * @returns false if defines are considered not dirty and have not been checked
         */
        static PrepareDefinesForAttributes: (mesh: AbstractMesh, defines: any, useVertexColor: boolean, useBones: boolean, useMorphTargets?: boolean, useVertexAlpha?: boolean, useBakedVertexAnimation?: boolean) => boolean;
        /**
         * Prepares the defines related to multiview
         * @param scene The scene we are intending to draw
         * @param defines The defines to update
         */
        static PrepareDefinesForMultiview: (scene: Scene, defines: any) => void;
        /**
         * Prepares the defines related to order independant transparency
         * @param scene The scene we are intending to draw
         * @param defines The defines to update
         * @param needAlphaBlending Determines if the material needs alpha blending
         */
        static PrepareDefinesForOIT: (scene: Scene, defines: any, needAlphaBlending: boolean) => void;
        /**
         * Prepares the defines related to the prepass
         * @param scene The scene we are intending to draw
         * @param defines The defines to update
         * @param canRenderToMRT Indicates if this material renders to several textures in the prepass
         */
        static PrepareDefinesForPrePass: (scene: Scene, defines: any, canRenderToMRT: boolean) => void;
        /**
         * Prepares the defines related to the light information passed in parameter
         * @param scene The scene we are intending to draw
         * @param mesh The mesh the effect is compiling for
         * @param light The light the effect is compiling for
         * @param lightIndex The index of the light
         * @param defines The defines to update
         * @param specularSupported Specifies whether specular is supported or not (override lights data)
         * @param state Defines the current state regarding what is needed (normals, etc...)
         * @param state.needNormals
         * @param state.needRebuild
         * @param state.shadowEnabled
         * @param state.specularEnabled
         * @param state.lightmapMode
         */
        static PrepareDefinesForLight: (scene: Scene, mesh: AbstractMesh, light: Light, lightIndex: number, defines: any, specularSupported: boolean, state: {
            needNormals: boolean;
            needRebuild: boolean;
            shadowEnabled: boolean;
            specularEnabled: boolean;
            lightmapMode: boolean;
        }) => void;
        /**
         * Prepares the defines related to the light information passed in parameter
         * @param scene The scene we are intending to draw
         * @param mesh The mesh the effect is compiling for
         * @param defines The defines to update
         * @param specularSupported Specifies whether specular is supported or not (override lights data)
         * @param maxSimultaneousLights Specifies how manuy lights can be added to the effect at max
         * @param disableLighting Specifies whether the lighting is disabled (override scene and light)
         * @returns true if normals will be required for the rest of the effect
         */
        static PrepareDefinesForLights: (scene: Scene, mesh: AbstractMesh, defines: any, specularSupported: boolean, maxSimultaneousLights?: number, disableLighting?: boolean) => boolean;
        /**
         * Prepares the uniforms and samplers list to be used in the effect (for a specific light)
         * @param lightIndex defines the light index
         * @param uniformsList The uniform list
         * @param samplersList The sampler list
         * @param projectedLightTexture defines if projected texture must be used
         * @param uniformBuffersList defines an optional list of uniform buffers
         * @param updateOnlyBuffersList True to only update the uniformBuffersList array
         */
        static PrepareUniformsAndSamplersForLight: (lightIndex: number, uniformsList: string[], samplersList: string[], projectedLightTexture?: any, uniformBuffersList?: Nullable<string[]>, updateOnlyBuffersList?: boolean) => void;
        /**
         * Prepares the uniforms and samplers list to be used in the effect
         * @param uniformsListOrOptions The uniform names to prepare or an EffectCreationOptions containing the list and extra information
         * @param samplersList The sampler list
         * @param defines The defines helping in the list generation
         * @param maxSimultaneousLights The maximum number of simultaneous light allowed in the effect
         */
        static PrepareUniformsAndSamplersList: (uniformsListOrOptions: string[] | IEffectCreationOptions, samplersList?: string[], defines?: any, maxSimultaneousLights?: number) => void;
        /**
         * This helps decreasing rank by rank the shadow quality (0 being the highest rank and quality)
         * @param defines The defines to update while falling back
         * @param fallbacks The authorized effect fallbacks
         * @param maxSimultaneousLights The maximum number of lights allowed
         * @param rank the current rank of the Effect
         * @returns The newly affected rank
         */
        static HandleFallbacksForShadows: (defines: any, fallbacks: EffectFallbacks, maxSimultaneousLights?: number, rank?: number) => number;
        /**
         * Prepares the list of attributes required for morph targets according to the effect defines.
         * @param attribs The current list of supported attribs
         * @param mesh The mesh to prepare the morph targets attributes for
         * @param influencers The number of influencers
         */
        static PrepareAttributesForMorphTargetsInfluencers: (attribs: string[], mesh: AbstractMesh, influencers: number) => void;
        /**
         * Prepares the list of attributes required for morph targets according to the effect defines.
         * @param attribs The current list of supported attribs
         * @param mesh The mesh to prepare the morph targets attributes for
         * @param defines The current Defines of the effect
         */
        static PrepareAttributesForMorphTargets: (attribs: string[], mesh: AbstractMesh, defines: any) => void;
        /**
         * Prepares the list of attributes required for baked vertex animations according to the effect defines.
         * @param attribs The current list of supported attribs
         * @param mesh The mesh to prepare for baked vertex animations
         * @param defines The current Defines of the effect
         */
        static PrepareAttributesForBakedVertexAnimation: (attribs: string[], mesh: AbstractMesh, defines: any) => void;
        /**
         * Prepares the list of attributes required for bones according to the effect defines.
         * @param attribs The current list of supported attribs
         * @param mesh The mesh to prepare the bones attributes for
         * @param defines The current Defines of the effect
         * @param fallbacks The current effect fallback strategy
         */
        static PrepareAttributesForBones: (attribs: string[], mesh: AbstractMesh, defines: any, fallbacks: EffectFallbacks) => void;
        /**
         * Check and prepare the list of attributes required for instances according to the effect defines.
         * @param attribs The current list of supported attribs
         * @param defines The current MaterialDefines of the effect
         */
        static PrepareAttributesForInstances: (attribs: string[], defines: MaterialDefines) => void;
        /**
         * Add the list of attributes required for instances to the attribs array.
         * @param attribs The current list of supported attribs
         * @param needsPreviousMatrices If the shader needs previous matrices
         */
        static PushAttributesForInstances: (attribs: string[], needsPreviousMatrices?: boolean) => void;
        /**
         * Binds the light information to the effect.
         * @param light The light containing the generator
         * @param effect The effect we are binding the data to
         * @param lightIndex The light index in the effect used to render
         */
        static BindLightProperties: (light: Light, effect: Effect, lightIndex: number) => void;
        /**
         * Binds the lights information from the scene to the effect for the given mesh.
         * @param light Light to bind
         * @param lightIndex Light index
         * @param scene The scene where the light belongs to
         * @param effect The effect we are binding the data to
         * @param useSpecular Defines if specular is supported
         * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows
         */
        static BindLight: (light: Light, lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows?: boolean) => void;
        /**
         * Binds the lights information from the scene to the effect for the given mesh.
         * @param scene The scene the lights belongs to
         * @param mesh The mesh we are binding the information to render
         * @param effect The effect we are binding the data to
         * @param defines The generated defines for the effect
         * @param maxSimultaneousLights The maximum number of light that can be bound to the effect
         */
        static BindLights: (scene: Scene, mesh: AbstractMesh, effect: Effect, defines: any, maxSimultaneousLights?: number) => void;
        /**
         * Binds the fog information from the scene to the effect for the given mesh.
         * @param scene The scene the lights belongs to
         * @param mesh The mesh we are binding the information to render
         * @param effect The effect we are binding the data to
         * @param linearSpace Defines if the fog effect is applied in linear space
         */
        static BindFogParameters: (scene: Scene, mesh?: AbstractMesh, effect?: Effect, linearSpace?: boolean) => void;
        /**
         * Binds the bones information from the mesh to the effect.
         * @param mesh The mesh we are binding the information to render
         * @param effect The effect we are binding the data to
         * @param prePassConfiguration Configuration for the prepass, in case prepass is activated
         */
        static BindBonesParameters: (mesh?: AbstractMesh, effect?: Effect, prePassConfiguration?: PrePassConfiguration) => void;
        /**
         * Binds the morph targets information from the mesh to the effect.
         * @param abstractMesh The mesh we are binding the information to render
         * @param effect The effect we are binding the data to
         */
        static BindMorphTargetParameters: (abstractMesh: AbstractMesh, effect: Effect) => void;
        /**
         * Binds the logarithmic depth information from the scene to the effect for the given defines.
         * @param defines The generated defines used in the effect
         * @param effect The effect we are binding the data to
         * @param scene The scene we are willing to render with logarithmic scale for
         */
        static BindLogDepth: (defines: any, effect: Effect, scene: Scene) => void;
    }


    /**
     * This groups all the flags used to control the materials channel.
     */
    export class MaterialFlags {
        private static _DiffuseTextureEnabled;
        /**
         * Are diffuse textures enabled in the application.
         */
        static get DiffuseTextureEnabled(): boolean;
        static set DiffuseTextureEnabled(value: boolean);
        private static _BaseWeightTextureEnabled;
        /**
         * Is the OpenPBR Base Weight texture enabled in the application.
         */
        static get BaseWeightTextureEnabled(): boolean;
        static set BaseWeightTextureEnabled(value: boolean);
        private static _BaseDiffuseRoughnessTextureEnabled;
        /**
         * Is the OpenPBR Base Diffuse Roughness texture enabled in the application.
         */
        static get BaseDiffuseRoughnessTextureEnabled(): boolean;
        static set BaseDiffuseRoughnessTextureEnabled(value: boolean);
        private static _DetailTextureEnabled;
        /**
         * Are detail textures enabled in the application.
         */
        static get DetailTextureEnabled(): boolean;
        static set DetailTextureEnabled(value: boolean);
        private static _DecalMapEnabled;
        /**
         * Are decal maps enabled in the application.
         */
        static get DecalMapEnabled(): boolean;
        static set DecalMapEnabled(value: boolean);
        private static _AmbientTextureEnabled;
        /**
         * Are ambient textures enabled in the application.
         */
        static get AmbientTextureEnabled(): boolean;
        static set AmbientTextureEnabled(value: boolean);
        private static _OpacityTextureEnabled;
        /**
         * Are opacity textures enabled in the application.
         */
        static get OpacityTextureEnabled(): boolean;
        static set OpacityTextureEnabled(value: boolean);
        private static _ReflectionTextureEnabled;
        /**
         * Are reflection textures enabled in the application.
         */
        static get ReflectionTextureEnabled(): boolean;
        static set ReflectionTextureEnabled(value: boolean);
        private static _EmissiveTextureEnabled;
        /**
         * Are emissive textures enabled in the application.
         */
        static get EmissiveTextureEnabled(): boolean;
        static set EmissiveTextureEnabled(value: boolean);
        private static _SpecularTextureEnabled;
        /**
         * Are specular textures enabled in the application.
         */
        static get SpecularTextureEnabled(): boolean;
        static set SpecularTextureEnabled(value: boolean);
        private static _BumpTextureEnabled;
        /**
         * Are bump textures enabled in the application.
         */
        static get BumpTextureEnabled(): boolean;
        static set BumpTextureEnabled(value: boolean);
        private static _LightmapTextureEnabled;
        /**
         * Are lightmap textures enabled in the application.
         */
        static get LightmapTextureEnabled(): boolean;
        static set LightmapTextureEnabled(value: boolean);
        private static _RefractionTextureEnabled;
        /**
         * Are refraction textures enabled in the application.
         */
        static get RefractionTextureEnabled(): boolean;
        static set RefractionTextureEnabled(value: boolean);
        private static _ColorGradingTextureEnabled;
        /**
         * Are color grading textures enabled in the application.
         */
        static get ColorGradingTextureEnabled(): boolean;
        static set ColorGradingTextureEnabled(value: boolean);
        private static _FresnelEnabled;
        /**
         * Are fresnels enabled in the application.
         */
        static get FresnelEnabled(): boolean;
        static set FresnelEnabled(value: boolean);
        private static _ClearCoatTextureEnabled;
        /**
         * Are clear coat textures enabled in the application.
         */
        static get ClearCoatTextureEnabled(): boolean;
        static set ClearCoatTextureEnabled(value: boolean);
        private static _ClearCoatBumpTextureEnabled;
        /**
         * Are clear coat bump textures enabled in the application.
         */
        static get ClearCoatBumpTextureEnabled(): boolean;
        static set ClearCoatBumpTextureEnabled(value: boolean);
        private static _ClearCoatTintTextureEnabled;
        /**
         * Are clear coat tint textures enabled in the application.
         */
        static get ClearCoatTintTextureEnabled(): boolean;
        static set ClearCoatTintTextureEnabled(value: boolean);
        private static _SheenTextureEnabled;
        /**
         * Are sheen textures enabled in the application.
         */
        static get SheenTextureEnabled(): boolean;
        static set SheenTextureEnabled(value: boolean);
        private static _AnisotropicTextureEnabled;
        /**
         * Are anisotropic textures enabled in the application.
         */
        static get AnisotropicTextureEnabled(): boolean;
        static set AnisotropicTextureEnabled(value: boolean);
        private static _ThicknessTextureEnabled;
        /**
         * Are thickness textures enabled in the application.
         */
        static get ThicknessTextureEnabled(): boolean;
        static set ThicknessTextureEnabled(value: boolean);
        private static _RefractionIntensityTextureEnabled;
        /**
         * Are refraction intensity textures enabled in the application.
         */
        static get RefractionIntensityTextureEnabled(): boolean;
        static set RefractionIntensityTextureEnabled(value: boolean);
        private static _TranslucencyIntensityTextureEnabled;
        /**
         * Are translucency intensity textures enabled in the application.
         */
        static get TranslucencyIntensityTextureEnabled(): boolean;
        static set TranslucencyIntensityTextureEnabled(value: boolean);
        private static _TranslucencyColorTextureEnabled;
        /**
         * Are translucency tint textures enabled in the application.
         */
        static get TranslucencyColorTextureEnabled(): boolean;
        static set TranslucencyColorTextureEnabled(value: boolean);
        private static _IridescenceTextureEnabled;
        /**
         * Are translucency intensity textures enabled in the application.
         */
        static get IridescenceTextureEnabled(): boolean;
        static set IridescenceTextureEnabled(value: boolean);
    }


    /**
     * Manages the defines for the Material
     */
    export class MaterialDefines {
        VERTEXOUTPUT_INVARIANT: boolean;
        /** @internal */
        protected _keys: string[];
        private _isDirty;
        /** @internal */
        _renderId: number;
        /** @internal */
        _areLightsDirty: boolean;
        /** @internal */
        _areLightsDisposed: boolean;
        /** @internal */
        _areAttributesDirty: boolean;
        /** @internal */
        _areTexturesDirty: boolean;
        /** @internal */
        _areFresnelDirty: boolean;
        /** @internal */
        _areMiscDirty: boolean;
        /** @internal */
        _arePrePassDirty: boolean;
        /** @internal */
        _areImageProcessingDirty: boolean;
        /** @internal */
        _normals: boolean;
        /** @internal */
        _uvs: boolean;
        /** @internal */
        _needNormals: boolean;
        /** @internal */
        _needUVs: boolean;
        protected _externalProperties?: {
            [name: string]: {
                type: string;
                default: any;
            };
        };
        [id: string]: any;
        /**
         * Creates a new instance
         * @param externalProperties list of external properties to inject into the object
         */
        constructor(externalProperties?: {
            [name: string]: {
                type: string;
                default: any;
            };
        });
        /**
         * Specifies if the material needs to be re-calculated
         */
        get isDirty(): boolean;
        /**
         * Marks the material to indicate that it has been re-calculated
         */
        markAsProcessed(): void;
        /**
         * Marks the material to indicate that it needs to be re-calculated
         */
        markAsUnprocessed(): void;
        /**
         * Marks the material to indicate all of its defines need to be re-calculated
         */
        markAllAsDirty(): void;
        /**
         * Marks the material to indicate that image processing needs to be re-calculated
         */
        markAsImageProcessingDirty(): void;
        /**
         * Marks the material to indicate the lights need to be re-calculated
         * @param disposed Defines whether the light is dirty due to dispose or not
         */
        markAsLightDirty(disposed?: boolean): void;
        /**
         * Marks the attribute state as changed
         */
        markAsAttributesDirty(): void;
        /**
         * Marks the texture state as changed
         */
        markAsTexturesDirty(): void;
        /**
         * Marks the fresnel state as changed
         */
        markAsFresnelDirty(): void;
        /**
         * Marks the misc state as changed
         */
        markAsMiscDirty(): void;
        /**
         * Marks the prepass state as changed
         */
        markAsPrePassDirty(): void;
        /**
         * Rebuilds the material defines
         */
        rebuild(): void;
        /**
         * Specifies if two material defines are equal
         * @param other - A material define instance to compare to
         * @returns - Boolean indicating if the material defines are equal (true) or not (false)
         */
        isEqual(other: MaterialDefines): boolean;
        /**
         * Clones this instance's defines to another instance
         * @param other - material defines to clone values to
         */
        cloneTo(other: MaterialDefines): void;
        /**
         * Resets the material define values
         */
        reset(): void;
        private _setDefaultValue;
        /**
         * Converts the material define values to a string
         * @returns - String of material define information
         */
        toString(): string;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Options for compiling materials.
     */
    export interface IMaterialCompilationOptions {
        /**
         * Defines whether clip planes are enabled.
         */
        clipPlane: boolean;
        /**
         * Defines whether instances are enabled.
         */
        useInstances: boolean;
    }
    /**
     * Options passed when calling customShaderNameResolve
     */
    export interface ICustomShaderNameResolveOptions {
        /**
         * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU
         */
        processFinalCode?: Nullable<ShaderCustomProcessingFunction>;
    }
    /**
     * Base class for the main features of a material in Babylon.js
     */
    export class Material implements IAnimatable, IClipPlanesHolder {
        /**
         * Returns the triangle fill mode
         */
        static readonly TriangleFillMode = 0;
        /**
         * Returns the wireframe mode
         */
        static readonly WireFrameFillMode = 1;
        /**
         * Returns the point fill mode
         */
        static readonly PointFillMode = 2;
        /**
         * Returns the point list draw mode
         */
        static readonly PointListDrawMode = 3;
        /**
         * Returns the line list draw mode
         */
        static readonly LineListDrawMode = 4;
        /**
         * Returns the line loop draw mode
         */
        static readonly LineLoopDrawMode = 5;
        /**
         * Returns the line strip draw mode
         */
        static readonly LineStripDrawMode = 6;
        /**
         * Returns the triangle strip draw mode
         */
        static readonly TriangleStripDrawMode = 7;
        /**
         * Returns the triangle fan draw mode
         */
        static readonly TriangleFanDrawMode = 8;
        /**
         * Stores the clock-wise side orientation
         */
        static readonly ClockWiseSideOrientation = 0;
        /**
         * Stores the counter clock-wise side orientation
         */
        static readonly CounterClockWiseSideOrientation = 1;
        /**
         * The dirty image processing flag value
         */
        static readonly ImageProcessingDirtyFlag = 64;
        /**
         * The dirty texture flag value
         */
        static readonly TextureDirtyFlag = 1;
        /**
         * The dirty light flag value
         */
        static readonly LightDirtyFlag = 2;
        /**
         * The dirty fresnel flag value
         */
        static readonly FresnelDirtyFlag = 4;
        /**
         * The dirty attribute flag value
         */
        static readonly AttributesDirtyFlag = 8;
        /**
         * The dirty misc flag value
         */
        static readonly MiscDirtyFlag = 16;
        /**
         * The dirty prepass flag value
         */
        static readonly PrePassDirtyFlag = 32;
        /**
         * The all dirty flag value
         */
        static readonly AllDirtyFlag = 127;
        /**
         * MaterialTransparencyMode: No transparency mode, Alpha channel is not use.
         */
        static readonly MATERIAL_OPAQUE = 0;
        /**
         * MaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.
         */
        static readonly MATERIAL_ALPHATEST = 1;
        /**
         * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         */
        static readonly MATERIAL_ALPHABLEND = 2;
        /**
         * MaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         * They are also discarded below the alpha cutoff threshold to improve performances.
         */
        static readonly MATERIAL_ALPHATESTANDBLEND = 3;
        /**
         * The Whiteout method is used to blend normals.
         * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/
         */
        static readonly MATERIAL_NORMALBLENDMETHOD_WHITEOUT = 0;
        /**
         * The Reoriented Normal Mapping method is used to blend normals.
         * Details of the algorithm can be found here: https://blog.selfshadow.com/publications/blending-in-detail/
         */
        static readonly MATERIAL_NORMALBLENDMETHOD_RNM = 1;
        /**
         * PBRMaterialLightFalloff Physical: light is falling off following the inverse squared distance law.
         */
        static readonly LIGHTFALLOFF_PHYSICAL = 0;
        /**
         * PBRMaterialLightFalloff gltf: light is falling off as described in the gltf moving to PBR document
         * to enhance interoperability with other engines.
         */
        static readonly LIGHTFALLOFF_GLTF = 1;
        /**
         * PBRMaterialLightFalloff Standard: light is falling off like in the standard material
         * to enhance interoperability with other materials.
         */
        static readonly LIGHTFALLOFF_STANDARD = 2;
        /**
         * Event observable which raises global events common to all materials (like MaterialPluginEvent.Created)
         */
        static OnEventObservable: Observable<Material>;
        /**
         * If true, all materials will have their vertex output set to invariant (see the vertexOutputInvariant property).
         */
        static ForceVertexOutputInvariant: boolean;
        /**
         * Custom callback helping to override the default shader used in the material.
         */
        customShaderNameResolve: (shaderName: string, uniforms: string[], uniformBuffers: string[], samplers: string[], defines: MaterialDefines | string[], attributes?: string[], options?: ICustomShaderNameResolveOptions) => string;
        /**
         * Custom shadow depth material to use for shadow rendering instead of the in-built one
         */
        shadowDepthWrapper: Nullable<ShadowDepthWrapper>;
        /**
         * Gets or sets a boolean indicating that the material is allowed (if supported) to do shader hot swapping.
         * This means that the material can keep using a previous shader while a new one is being compiled.
         * This is mostly used when shader parallel compilation is supported (true by default)
         */
        allowShaderHotSwapping: boolean;
        /** Shader language used by the material */
        protected _shaderLanguage: ShaderLanguage;
        protected _forceGLSL: boolean;
        protected _useVertexPulling: boolean;
        /**
         * Tells the engine to draw geometry using vertex pulling instead of index drawing. This will automatically
         * set the vertex buffers as storage buffers and make them accessible to the vertex shader (WebGPU only).
         */
        get useVertexPulling(): boolean;
        set useVertexPulling(value: boolean);
        /** @internal */
        get _supportGlowLayer(): boolean;
        /** @internal */
        set _glowModeEnabled(value: boolean);
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * The ID of the material
         */
        id: string;
        /**
         * Gets or sets the unique id of the material
         */
        uniqueId: number;
        /** @internal */
        _loadedUniqueId: string;
        /**
         * The name of the material
         */
        name: string;
        /**
         * Gets or sets user defined metadata
         */
        metadata: any;
        /** @internal */
        _internalMetadata: any;
        /**
         * For internal use only. Please do not use.
         */
        reservedDataStore: any;
        /**
         * Specifies if the ready state should be checked on each call
         */
        checkReadyOnEveryCall: boolean;
        /**
         * Specifies if the ready state should be checked once
         */
        checkReadyOnlyOnce: boolean;
        /**
         * The state of the material
         */
        state: string;
        /**
         * If the material can be rendered to several textures with MRT extension
         */
        get canRenderToMRT(): boolean;
        /**
         * The alpha value of the material
         */
        protected _alpha: number;
        /**
         * List of inspectable custom properties (used by the Inspector)
         * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
         */
        inspectableCustomProperties: IInspectable[];
        /**
         * Sets the alpha value of the material
         */
        set alpha(value: number);
        /**
         * Gets the alpha value of the material
         */
        get alpha(): number;
        /**
         * Specifies if back face culling is enabled
         */
        protected _backFaceCulling: boolean;
        /**
         * Sets the culling state (true to enable culling, false to disable)
         */
        set backFaceCulling(value: boolean);
        /**
         * Gets the culling state
         */
        get backFaceCulling(): boolean;
        protected _textureRepetitionMode: number;
        /**
         * Sets the texture repetition breaking mode.
         * Use one of the Constants.TEXTURE_REPETITION_* values to break visible texture tiling patterns.
         * Ordered by cost: NONE (1 fetch), NOISE_BLEND (3), HEX_TILING (3), TILE_RANDOMIZATION (4), VORONOI_BOMBING (9).
         * Not supported on WebGL1 — the mode will be forced to NONE.
         * @see https://iquilezles.org/articles/texturerepetition/
         * @see https://jcgt.org/published/0011/03/05/
         */
        set textureRepetitionMode(value: number);
        /**
         * Gets the texture repetition breaking mode.
         * @see https://iquilezles.org/articles/texturerepetition/
         */
        get textureRepetitionMode(): number;
        /**
         * Parameters for the hex tiling texture repetition mode (TEXTURE_REPETITION_HEX_TILING).
         * x = rotation strength (0..1, default 1.0) — how much each hex tile is rotated.
         * y = fall-off contrast (0..1, default 0.6) — how much luminance affects blending weight at tile borders.
         * z = exponent (1..20, default 7.0) — controls the sharpness of weight falloff between tiles.
         * w = contrast (0..1, default 0.5) — boost blending contrast via Gain3 (0.5 = neutral, &gt;0.5 = higher contrast).
         * @see https://jcgt.org/published/0011/03/05/
         */
        textureRepetitionHexTilingParams: number[];
        /**
         * Specifies if back or front faces should be culled (when culling is enabled)
         */
        protected _cullBackFaces: boolean;
        /**
         * Sets the type of faces that should be culled (true for back faces, false for front faces)
         */
        set cullBackFaces(value: boolean);
        /**
         * Gets the type of faces that should be culled
         */
        get cullBackFaces(): boolean;
        private _blockDirtyMechanism;
        /**
         * Block the dirty-mechanism for this specific material
         * When set to false after being true the material will be marked as dirty.
         */
        get blockDirtyMechanism(): boolean;
        set blockDirtyMechanism(value: boolean);
        /**
         * This allows you to modify the material without marking it as dirty after every change.
         * This function should be used if you need to make more than one dirty-enabling change to the material - adding a texture, setting a new fill mode and so on.
         * The callback will pass the material as an argument, so you can make your changes to it.
         * @param callback the callback to be executed that will update the material
         */
        atomicMaterialsUpdate(callback: (material: this) => void): void;
        /**
         * Stores the value for side orientation
         */
        sideOrientation: Nullable<number>;
        /**
         * Callback triggered when the material is compiled
         */
        onCompiled: Nullable<(effect: Effect) => void>;
        /**
         * Callback triggered when an error occurs
         */
        onError: Nullable<(effect: Effect, errors: string) => void>;
        /**
         * Callback triggered to get the render target textures
         */
        getRenderTargetTextures: Nullable<() => SmartArray<RenderTargetTexture>>;
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * Specifies if the material should be serialized
         */
        doNotSerialize: boolean;
        /**
         * @internal
         */
        _storeEffectOnSubMeshes: boolean;
        /**
         * Stores the animations for the material
         */
        animations: Nullable<Array<Animation>>;
        /**
         * An event triggered when the material is disposed
         */
        onDisposeObservable: Observable<Material>;
        /**
         * An observer which watches for dispose events
         */
        private _onDisposeObserver;
        private _onUnBindObservable;
        /**
         * Called during a dispose event
         */
        set onDispose(callback: () => void);
        private _onBindObservable;
        /**
         * An event triggered when the material is bound
         */
        get onBindObservable(): Observable<AbstractMesh>;
        /**
         * An observer which watches for bind events
         */
        private _onBindObserver;
        /**
         * Called during a bind event
         */
        set onBind(callback: (Mesh: AbstractMesh) => void);
        /**
         * An event triggered when the material is unbound
         */
        get onUnBindObservable(): Observable<Material>;
        protected _onEffectCreatedObservable: Nullable<Observable<{
            effect: Effect;
            subMesh: Nullable<SubMesh>;
        }>>;
        /**
         * An event triggered when the effect is (re)created
         */
        get onEffectCreatedObservable(): Observable<{
            effect: Effect;
            subMesh: Nullable<SubMesh>;
        }>;
        /**
         * Stores the value of the alpha mode
         */
        private _alphaMode;
        /**
         * Sets the value of the alpha mode.
         *
         * | Value | Type | Description |
         * | --- | --- | --- |
         * | 0 | ALPHA_DISABLE |  |
         * | 1 | ALPHA_ADD | Defines that alpha blending is COLOR=SRC_ALPHA * SRC + DEST, ALPHA=DEST_ALPHA |
         * | 2 | ALPHA_COMBINE | Defines that alpha blending is COLOR=SRC_ALPHA * SRC + (1 - SRC_ALPHA) * DEST, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 3 | ALPHA_SUBTRACT | Defines that alpha blending is COLOR=(1 - SRC) * DEST, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 4 | ALPHA_MULTIPLY | Defines that alpha blending is COLOR=DEST * SRC, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 5 | ALPHA_MAXIMIZED | Defines that alpha blending is COLOR=SRC_ALPHA * SRC + (1 - SRC) * DEST, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 6 | ALPHA_ONEONE | Defines that alpha blending is COLOR=SRC + DEST, ALPHA=DEST_ALPHA |
         * | 7 | ALPHA_PREMULTIPLIED | Defines that alpha blending is COLOR=SRC + (1 - SRC_ALPHA) * DEST, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 8 | ALPHA_PREMULTIPLIED_PORTERDUFF | Defines that alpha blending is COLOR=SRC + (1 - SRC_ALPHA) * DEST, ALPHA=SRC_ALPHA + (1 - SRC_ALPHA) * DEST_ALPHA |
         * | 9 | ALPHA_INTERPOLATE | Defines that alpha blending is COLOR=CST * SRC + (1 - CST) * DEST, ALPHA=CST_ALPHA * SRC + (1 - CST_ALPHA) * DEST_ALPHA |
         * | 10 | ALPHA_SCREENMODE | Defines that alpha blending is COLOR=SRC + (1 - SRC) * DEST, ALPHA=SRC_ALPHA + (1 - SRC_ALPHA) * DEST_ALPHA |
         * | 11 | ALPHA_ONEONE_ONEONE | Defines that alpha blending is COLOR=SRC + DST, ALPHA=SRC_ALPHA + DEST_ALPHA |
         * | 12 | ALPHA_ALPHATOCOLOR | Defines that alpha blending is COLOR=DEST_ALPHA * SRC + DST, ALPHA=0 |
         * | 13 | ALPHA_REVERSEONEMINUS | Defines that alpha blending is COLOR=(1 - DEST) * SRC + (1 - SRC) * DEST, ALPHA=(1 - DEST_ALPHA) * SRC_ALPHA + (1 - SRC_ALPHA) * DEST_ALPHA |
         * | 14 | ALPHA_SRC_DSTONEMINUSSRCALPHA | Defines that alpha blending is ALPHA=SRC + (1 - SRC ALPHA) * DEST, ALPHA=SRC_ALPHA + (1 - SRC ALPHA) * DEST_ALPHA |
         * | 15 | ALPHA_ONEONE_ONEZERO | Defines that alpha blending is COLOR=SRC + DST, ALPHA=SRC_ALPHA |
         * | 16 | ALPHA_EXCLUSION | Defines that alpha blending is COLOR=(1 - DEST) * SRC + (1 - SRC) * DEST, ALPHA=DEST_ALPHA |
         * | 17 | ALPHA_LAYER_ACCUMULATE | Defines that alpha blending is COLOR=SRC_ALPHA * SRC + (1 - SRC ALPHA) * DEST, ALPHA=SRC_ALPHA + (1 - SRC_ALPHA) * DEST_ALPHA |
         * | 18 | ALPHA_MIN | Defines that alpha blending is COLOR=MIN(SRC, DEST), ALPHA=MIN(SRC_ALPHA, DEST_ALPHA) |
         * | 19 | ALPHA_MAX | Defines that alpha blending is COLOR=MAX(SRC, DEST), ALPHA=MAX(SRC_ALPHA, DEST_ALPHA) |
         * | 20 | ALPHA_DUAL_SRC0_ADD_SRC1xDST | Defines that alpha blending uses dual source blending and is COLOR=SRC + SRC1 * DEST, ALPHA=DST_ALPHA |
         *
         */
        set alphaMode(value: number);
        /**
         * Gets the value of the alpha mode
         */
        get alphaMode(): number;
        /**
         * Gets the list of alpha modes (length greater than 1 for multi-targets)
         */
        get alphaModes(): Immutable<number[]>;
        /**
         * Sets the value of the alpha mode for a specific target index.
         * @param value The alpha mode value to set.
         * @param targetIndex The index of the target to set the alpha mode for. Defaults to 0.
         */
        setAlphaMode(value: number, targetIndex?: number): void;
        /**
         * Stores the state of the need depth pre-pass value
         */
        private _needDepthPrePass;
        /**
         * Sets the need depth pre-pass value
         */
        set needDepthPrePass(value: boolean);
        /**
         * Gets the depth pre-pass value
         */
        get needDepthPrePass(): boolean;
        /**
         * Can this material render to prepass
         */
        get isPrePassCapable(): boolean;
        /**
         * Specifies if depth writing should be disabled
         */
        disableDepthWrite: boolean;
        /**
         * Specifies if color writing should be disabled
         */
        disableColorWrite: boolean;
        /**
         * Specifies if depth writing should be forced
         */
        forceDepthWrite: boolean;
        /**
         * Specifies the depth function that should be used. 0 means the default engine function
         */
        depthFunction: number;
        /**
         * Specifies if there should be a separate pass for culling
         */
        separateCullingPass: boolean;
        /**
         * Stores the state specifying if fog should be enabled
         */
        private _fogEnabled;
        /**
         * Sets the state for enabling fog
         */
        set fogEnabled(value: boolean);
        /**
         * Gets the value of the fog enabled state
         */
        get fogEnabled(): boolean;
        /**
         * Stores the size of points
         */
        pointSize: number;
        /**
         * Stores the z offset Factor value
         */
        zOffset: number;
        /**
         * Stores the z offset Units value
         */
        zOffsetUnits: number;
        get wireframe(): boolean;
        /**
         * Sets the state of wireframe mode
         */
        set wireframe(value: boolean);
        /**
         * Gets the value specifying if point clouds are enabled
         */
        get pointsCloud(): boolean;
        /**
         * Sets the state of point cloud mode
         */
        set pointsCloud(value: boolean);
        /**
         * Gets the material fill mode
         */
        get fillMode(): number;
        /**
         * Sets the material fill mode
         */
        set fillMode(value: number);
        /**
         * Gets or sets the active clipplane 1
         */
        clipPlane: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 2
         */
        clipPlane2: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 3
         */
        clipPlane3: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 4
         */
        clipPlane4: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 5
         */
        clipPlane5: Nullable<Plane>;
        /**
         * Gets or sets the active clipplane 6
         */
        clipPlane6: Nullable<Plane>;
        /**
         * Gives access to the stencil properties of the material
         */
        readonly stencil: MaterialStencilState;
        protected _useLogarithmicDepth: boolean;
        /**
         * In case the depth buffer does not allow enough depth precision for your scene (might be the case in large scenes)
         * You can try switching to logarithmic depth.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/advanced/logarithmicDepthBuffer
         */
        get useLogarithmicDepth(): boolean;
        set useLogarithmicDepth(value: boolean);
        protected _isVertexOutputInvariant: boolean;
        /**
         * Gets or sets the vertex output invariant state
         * Setting this property to true will force the shader compiler to disable some optimization to make sure the vertex output is always calculated
         * the same way across different compilation units.
         * You may need to enable this option if you are seeing some depth artifacts when using a depth pre-pass, for e.g.
         * Note that this may have an impact on performance, so leave this option disabled if not needed.
         */
        get isVertexOutputInvariant(): boolean;
        set isVertexOutputInvariant(value: boolean);
        /**
         * @internal
         * Stores the effects for the material
         */
        _materialContext: IMaterialContext | undefined;
        protected _drawWrapper: DrawWrapper;
        /** @internal */
        _getDrawWrapper(): DrawWrapper;
        /**
         * @internal
         */
        _setDrawWrapper(drawWrapper: DrawWrapper): void;
        /**
         * Specifies if uniform buffers should be used
         */
        private _useUBO;
        /**
         * Stores a reference to the scene
         */
        private _scene;
        protected _needToBindSceneUbo: boolean;
        /**
         * Stores the fill mode state
         */
        private _fillMode;
        /**
         * Specifies if the depth write state should be cached
         */
        private _cachedDepthWriteState;
        /**
         * Specifies if the color write state should be cached
         */
        private _cachedColorWriteState;
        /**
         * Specifies if the depth function state should be cached
         */
        private _cachedDepthFunctionState;
        /**
         * Stores the uniform buffer
         * @internal
         */
        _uniformBuffer: UniformBuffer;
        /** @internal */
        _indexInSceneMaterialArray: number;
        /** @internal */
        meshMap: Nullable<{
            [id: string]: AbstractMesh | undefined;
        }>;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        /** @internal */
        _dirtyCallbacks: {
            [code: number]: () => void;
        };
        /** @internal */
        _uniformBufferLayoutBuilt: boolean;
        protected _eventInfo: MaterialPluginCreated & MaterialPluginDisposed & MaterialPluginHasTexture & MaterialPluginIsReadyForSubMesh & MaterialPluginGetDefineNames & MaterialPluginPrepareEffect & MaterialPluginPrepareDefines & MaterialPluginPrepareUniformBuffer & MaterialPluginBindForSubMesh & MaterialPluginGetAnimatables & MaterialPluginGetActiveTextures & MaterialPluginFillRenderTargetTextures & MaterialPluginHasRenderTargetTextures & MaterialPluginHardBindForSubMesh;
        /** @internal */
        _callbackPluginEventGeneric: (id: number, info: MaterialPluginGetActiveTextures | MaterialPluginGetAnimatables | MaterialPluginHasTexture | MaterialPluginDisposed | MaterialPluginGetDefineNames | MaterialPluginPrepareEffect | MaterialPluginPrepareUniformBuffer) => void;
        /** @internal */
        _callbackPluginEventIsReadyForSubMesh: (eventData: MaterialPluginIsReadyForSubMesh) => void;
        /** @internal */
        _callbackPluginEventPrepareDefines: (eventData: MaterialPluginPrepareDefines) => void;
        /** @internal */
        _callbackPluginEventPrepareDefinesBeforeAttributes: (eventData: MaterialPluginPrepareDefines) => void;
        /** @internal */
        _callbackPluginEventHardBindForSubMesh: (eventData: MaterialPluginHardBindForSubMesh) => void;
        /** @internal */
        _callbackPluginEventBindForSubMesh: (eventData: MaterialPluginBindForSubMesh) => void;
        /** @internal */
        _callbackPluginEventHasRenderTargetTextures: (eventData: MaterialPluginHasRenderTargetTextures) => void;
        /** @internal */
        _callbackPluginEventFillRenderTargetTextures: (eventData: MaterialPluginFillRenderTargetTextures) => void;
        /**
         * Creates a material instance
         * @param name defines the name of the material
         * @param scene defines the scene to reference
         * @param doNotAdd specifies if the material should be added to the scene
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Nullable<Scene>, doNotAdd?: boolean, forceGLSL?: boolean);
        /** @internal */
        _createUniformBuffer(): void;
        /**
         * Returns a string representation of the current material
         * @param fullDetails defines a boolean indicating which levels of logging is desired
         * @returns a string with material information
         */
        toString(fullDetails?: boolean): string;
        /**
         * Gets the class name of the material
         * @returns a string with the class name of the material
         */
        getClassName(): string;
        /** @internal */
        get _isMaterial(): boolean;
        /**
         * Specifies if updates for the material been locked
         */
        get isFrozen(): boolean;
        /**
         * Locks updates for the material.
         *
         * Note: while a material is frozen, the scene can still rebind it at least
         * once per camera render (and again whenever another material was bound in
         * between). What can be skipped while the frozen material stays cached are
         * per-mesh updates performed during a rebind.
         *
         * This includes per-mesh morph target influences. If the same frozen
         * material is shared across several meshes that each have different
         * per-mesh morph influences, only the mesh that triggers the rebind updates
         * those values. Other meshes rendered afterward with the same cached frozen
         * material may reuse stale influences and render with the wrong values.
         *
         * For that scenario either keep the material unfrozen, clone the material
         * per mesh and freeze each clone, or `unfreeze()` before changing
         * influences and `freeze()` again afterwards.
         */
        freeze(): void;
        /**
         * Unlocks updates for the material
         */
        unfreeze(): void;
        /**
         * Specifies if the material is ready to be used
         * @param mesh defines the mesh to check
         * @param useInstances specifies if instances should be used
         * @returns a boolean indicating if the material is ready to be used
         */
        isReady(mesh?: AbstractMesh, useInstances?: boolean): boolean;
        /**
         * Specifies that the submesh is ready to be used
         * @param mesh defines the mesh to check
         * @param subMesh defines which submesh to check
         * @param useInstances specifies that instances should be used
         * @returns a boolean indicating that the submesh is ready or not
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Returns the material effect
         * @returns the effect associated with the material
         */
        getEffect(): Nullable<Effect>;
        /**
         * Returns the current scene
         * @returns a Scene
         */
        getScene(): Scene;
        /** @internal */
        _getEffectiveOrientation(mesh: Mesh): number;
        /**
         * The transparency mode of the material.
         */
        protected _transparencyMode: Nullable<number>;
        /**
         * Gets the current transparency mode.
         */
        get transparencyMode(): Nullable<number>;
        /**
         * Sets the transparency mode of the material.
         *
         * | Value | Type                                | Description |
         * | ----- | ----------------------------------- | ----------- |
         * | 0     | OPAQUE                              |             |
         * | 1     | ALPHATEST                           |             |
         * | 2     | ALPHABLEND                          |             |
         * | 3     | ALPHATESTANDBLEND                   |             |
         *
         */
        set transparencyMode(value: Nullable<number>);
        protected get _hasTransparencyMode(): boolean;
        protected get _transparencyModeIsBlend(): boolean;
        protected get _transparencyModeIsTest(): boolean;
        /**
         * Returns true if alpha blending should be disabled.
         */
        protected get _disableAlphaBlending(): boolean;
        /**
         * Specifies whether or not this material should be rendered in alpha blend mode.
         * @returns a boolean specifying if alpha blending is needed
         * @deprecated Please use needAlphaBlendingForMesh instead
         */
        needAlphaBlending(): boolean;
        /**
         * Specifies if the mesh will require alpha blending
         * @param mesh defines the mesh to check
         * @returns a boolean specifying if alpha blending is needed for the mesh
         */
        needAlphaBlendingForMesh(mesh: AbstractMesh): boolean;
        /**
         * Specifies whether or not this material should be rendered in alpha test mode.
         * @returns a boolean specifying if an alpha test is needed.
         * @deprecated Please use needAlphaTestingForMesh instead
         */
        needAlphaTesting(): boolean;
        /**
         * Specifies if material alpha testing should be turned on for the mesh
         * @param mesh defines the mesh to check
         * @returns a boolean specifying if alpha testing should be turned on for the mesh
         */
        needAlphaTestingForMesh(mesh: AbstractMesh): boolean;
        /**
         * Gets the texture used for the alpha test
         * @returns the texture to use for alpha testing
         */
        getAlphaTestTexture(): Nullable<BaseTexture>;
        /**
         * Marks the material to indicate that it needs to be re-calculated
         * @param forceMaterialDirty - Forces the material to be marked as dirty for all components (same as this.markAsDirty(Material.AllDirtyFlag)). You should use this flag if the material is frozen and you want to force a recompilation.
         */
        markDirty(forceMaterialDirty?: boolean): void;
        /**
         * @internal
         */
        _preBind(effect?: Effect | DrawWrapper, overrideOrientation?: Nullable<number>): boolean;
        /**
         * Binds the material to the mesh
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh to bind the material to
         */
        bind(world: Matrix, mesh?: Mesh): void;
        /**
         * Initializes the uniform buffer layout for the shader.
         */
        buildUniformLayout(): void;
        /**
         * Binds the submesh to the material
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh containing the submesh
         * @param subMesh defines the submesh to bind the material to
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Binds the world matrix to the material
         * @param world defines the world transformation matrix
         */
        bindOnlyWorldMatrix(world: Matrix): void;
        /**
         * Binds the view matrix to the effect
         * @param effect defines the effect to bind the view matrix to
         */
        bindView(effect: Effect): void;
        /**
         * Binds the view projection and projection matrices to the effect
         * @param effect defines the effect to bind the view projection and projection matrices to
         */
        bindViewProjection(effect: Effect): void;
        /**
         * Binds the view matrix to the effect
         * @param effect defines the effect to bind the view matrix to
         * @param variableName name of the shader variable that will hold the eye position
         */
        bindEyePosition(effect: Effect, variableName?: string): void;
        /**
         * Processes to execute after binding the material to a mesh
         * @param mesh defines the rendered mesh
         * @param effect defines the effect used to bind the material
         * @param _subMesh defines the subMesh that the material has been bound for
         */
        protected _afterBind(mesh?: AbstractMesh, effect?: Nullable<Effect>, _subMesh?: SubMesh): void;
        /**
         * Unbinds the material from the mesh
         */
        unbind(): void;
        /**
         * Returns the animatable textures.
         * @returns - Array of animatable textures.
         */
        getAnimatables(): IAnimatable[];
        /**
         * Gets the active textures from the material
         * @returns an array of textures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Specifies if the material uses a texture
         * @param texture defines the texture to check against the material
         * @returns a boolean specifying if the material uses the texture
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Makes a duplicate of the material, and gives it a new name
         * @param name defines the new name for the duplicated material
         * @returns the cloned material
         */
        clone(name: string): Nullable<Material>;
        protected _clonePlugins(targetMaterial: Material, rootUrl: string): void;
        /**
         * Gets the meshes bound to the material
         * @returns an array of meshes bound to the material
         */
        getBindedMeshes(): AbstractMesh[];
        /**
         * Force shader compilation
         * @param mesh defines the mesh associated with this material
         * @param onCompiled defines a function to execute once the material is compiled
         * @param options defines the options to configure the compilation
         * @param onError defines a function to execute if the material fails compiling
         */
        forceCompilation(mesh: AbstractMesh, onCompiled?: (material: Material) => void, options?: Partial<IMaterialCompilationOptions>, onError?: (reason: string) => void): void;
        /**
         * Force shader compilation
         * @param mesh defines the mesh that will use this material
         * @param options defines additional options for compiling the shaders
         * @returns a promise that resolves when the compilation completes
         */
        forceCompilationAsync(mesh: AbstractMesh, options?: Partial<IMaterialCompilationOptions>): Promise<void>;
        private static readonly _AllDirtyCallBack;
        private static readonly _ImageProcessingDirtyCallBack;
        private static readonly _TextureDirtyCallBack;
        private static readonly _FresnelDirtyCallBack;
        private static readonly _MiscDirtyCallBack;
        private static readonly _PrePassDirtyCallBack;
        private static readonly _LightsDirtyCallBack;
        private static readonly _AttributeDirtyCallBack;
        private static _FresnelAndMiscDirtyCallBack;
        private static _TextureAndMiscDirtyCallBack;
        private static readonly _DirtyCallbackArray;
        private static readonly _RunDirtyCallBacks;
        /**
         * Marks a define in the material to indicate that it needs to be re-computed
         * @param flag defines a flag used to determine which parts of the material have to be marked as dirty
         */
        markAsDirty(flag: number): void;
        /**
         * Resets the draw wrappers cache for all submeshes that are using this material
         */
        resetDrawCache(): void;
        /**
         * Marks all submeshes of a material to indicate that their material defines need to be re-calculated
         * @param func defines a function which checks material defines against the submeshes
         */
        protected _markAllSubMeshesAsDirty(func: (defines: MaterialDefines) => void): void;
        /**
         * Indicates that the scene should check if the rendering now needs a prepass
         */
        protected _markScenePrePassDirty(): void;
        /**
         * Indicates that we need to re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsAllDirty(): void;
        /**
         * Indicates that image processing needs to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsImageProcessingDirty(): void;
        /**
         * Indicates that textures need to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Indicates that fresnel needs to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsFresnelDirty(): void;
        /**
         * Indicates that fresnel and misc need to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsFresnelAndMiscDirty(): void;
        /**
         * Indicates that lights need to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsLightsDirty(): void;
        /**
         * Indicates that attributes need to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsAttributesDirty(): void;
        /**
         * Indicates that misc needs to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsMiscDirty(): void;
        /**
         * Indicates that prepass needs to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsPrePassDirty(): void;
        /**
         * Indicates that textures and misc need to be re-calculated for all submeshes
         */
        protected _markAllSubMeshesAsTexturesAndMiscDirty(): void;
        protected _checkScenePerformancePriority(): void;
        /**
         * Sets the required values to the prepass renderer.
         * @param prePassRenderer defines the prepass renderer to setup.
         * @returns true if the pre pass is needed.
         */
        setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean;
        /**
         * Disposes the material
         * @param _forceDisposeEffect kept for backward compat. We reference count the effect now.
         * @param forceDisposeTextures specifies if textures should be forcefully disposed
         * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh
         */
        dispose(_forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void;
        private _disposeMeshResources;
        /**
         * Serializes this material
         * @returns the serialized material object
         */
        serialize(): any;
        protected _serializePlugins(serializationObject: any): void;
        /**
         * Parses the alpha mode from the material data to parse
         * @param parsedMaterial defines the material data to parse
         * @param material defines the material to update
         */
        static ParseAlphaMode(parsedMaterial: any, material: Material): void;
        /**
         * Creates a material from parsed material data
         * @param parsedMaterial defines parsed material data
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures
         * @returns a new material
         */
        static Parse(parsedMaterial: any, scene: Scene, rootUrl: string): Nullable<Material>;
        protected static _ParsePlugins(serializationObject: any, material: Material, scene: Scene, rootUrl: string): void;
    }


    /**
     * @internal
     */
    export class MaterialDetailMapDefines extends MaterialDefines {
        DETAIL: boolean;
        DETAILDIRECTUV: number;
        DETAIL_NORMALBLENDMETHOD: number;
    }
    /**
     * Plugin that implements the detail map component of a material
     *
     * Inspired from:
     *   Unity: https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@9.0/manual/Mask-Map-and-Detail-Map.html and https://docs.unity3d.com/Manual/StandardShaderMaterialParameterDetail.html
     *   Unreal: https://docs.unrealengine.com/en-US/Engine/Rendering/Materials/HowTo/DetailTexturing/index.html
     *   Cryengine: https://docs.cryengine.com/display/SDKDOC2/Detail+Maps
     */
    export class DetailMapConfiguration extends MaterialPluginBase {
        private _texture;
        /**
         * The detail texture of the material.
         */
        texture: Nullable<BaseTexture>;
        /**
         * Defines how strongly the detail diffuse/albedo channel is blended with the regular diffuse/albedo texture
         * Bigger values mean stronger blending
         */
        diffuseBlendLevel: number;
        /**
         * Defines how strongly the detail roughness channel is blended with the regular roughness value
         * Bigger values mean stronger blending. Only used with PBR materials
         */
        roughnessBlendLevel: number;
        /**
         * Defines how strong the bump effect from the detail map is
         * Bigger values mean stronger effect
         */
        bumpLevel: number;
        private _normalBlendMethod;
        /**
         * The method used to blend the bump and detail normals together
         */
        normalBlendMethod: number;
        private _isEnabled;
        /**
         * Enable or disable the detail map on this material
         */
        isEnabled: boolean;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial | StandardMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the detail map textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @param engine defines the engine to use for readiness checks
         * @returns true if the detail map is ready
         */
        isReadyForSubMesh(defines: MaterialDetailMapDefines, scene: Scene, engine: AbstractEngine): boolean;
        /**
         * Updates the material defines for the detail map.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         */
        prepareDefines(defines: MaterialDetailMapDefines, scene: Scene): void;
        /**
         * Binds the detail map data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene): void;
        /**
         * Checks whether the detail map uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by the detail map
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Adds the active detail map textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable detail map textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the detail map textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        /**
         * Adds the detail map sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }


    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     */
    export class DecalMapDefines extends MaterialDefines {
        DECAL: boolean;
        DECALDIRECTUV: number;
        DECAL_SMOOTHALPHA: boolean;
        GAMMADECAL: boolean;
    }
    /**
     * Plugin that implements the decal map component of a material
     * @since 5.49.1
     */
    export class DecalMapConfiguration extends MaterialPluginBase {
        private _isEnabled;
        /**
         * Enables or disables the decal map on this material
         */
        isEnabled: boolean;
        private _smoothAlpha;
        /**
         * Enables or disables the smooth alpha mode on this material. Default: false.
         * When enabled, the alpha value used to blend the decal map will be the squared value and will produce a smoother result.
         */
        smoothAlpha: boolean;
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        /**
         * Creates a new DecalMapConfiguration
         * @param material The material to attach the decal map plugin to
         * @param addToPluginList If the plugin should be added to the material plugin list
         */
        constructor(material: PBRBaseMaterial | StandardMaterial, addToPluginList?: boolean);
        /**
         * Checks if the sub mesh is ready to be used
         * @param defines the list of defines
         * @param scene the current scene
         * @param engine the current engine
         * @param subMesh the sub mesh to check
         * @returns true if the sub mesh is ready
         */
        isReadyForSubMesh(defines: DecalMapDefines, scene: Scene, engine: Engine, subMesh: SubMesh): boolean;
        /**
         * Prepares the defines before attributes are set
         * @param defines the list of defines
         * @param scene the current scene
         * @param mesh the current mesh
         */
        prepareDefinesBeforeAttributes(defines: DecalMapDefines, scene: Scene, mesh: AbstractMesh): void;
        /**
         * Binds the material data for a sub mesh
         * @param uniformBuffer the uniform buffer to update
         * @param scene the current scene
         * @param _engine the current engine
         * @param subMesh the sub mesh to bind
         */
        hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, _engine: Engine, subMesh: SubMesh): void;
        /**
         * Gets the class name of this plugin
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the samplers used by the plugin
         * @param samplers the list of samplers to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }
    /**
     * Register side effects for materialDecalMapConfiguration.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialDecalMapConfiguration(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import material.decalMapConfiguration.pure for tree-shakeable, side-effect-free usage.
     */








    type ImageProcessingConfigurationParseType = typeof ImageProcessingConfigurationParse;
        export namespace ImageProcessingConfiguration {
            let Parse: ImageProcessingConfigurationParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * This groups together the common properties used for image processing either in direct forward pass
     * or through post processing effect depending on the use of the image processing pipeline in your scene
     * or not.
     */
    export class ImageProcessingConfiguration {
        /**
         * Default tone mapping applied in BabylonJS.
         */
        static readonly TONEMAPPING_STANDARD = 0;
        /**
         * ACES Tone mapping (used by default in unreal and unity). This can help getting closer
         * to other engines rendering to increase portability.
         */
        static readonly TONEMAPPING_ACES = 1;
        /**
         * Neutral Tone mapping developped by the Khronos group in order to constrain
         * values between 0 and 1 without shifting Hue.
         */
        static readonly TONEMAPPING_KHR_PBR_NEUTRAL = 2;
        /**
         * Color curves setup used in the effect if colorCurvesEnabled is set to true
         */
        colorCurves: Nullable<ColorCurves>;
        private _colorCurvesEnabled;
        /**
         * Gets whether the color curves effect is enabled.
         */
        get colorCurvesEnabled(): boolean;
        /**
         * Sets whether the color curves effect is enabled.
         */
        set colorCurvesEnabled(value: boolean);
        private _colorGradingTexture;
        /**
         * Color grading LUT texture used in the effect if colorGradingEnabled is set to true
         */
        get colorGradingTexture(): Nullable<BaseTexture>;
        /**
         * Color grading LUT texture used in the effect if colorGradingEnabled is set to true
         */
        set colorGradingTexture(value: Nullable<BaseTexture>);
        private _colorGradingEnabled;
        /**
         * Gets whether the color grading effect is enabled.
         */
        get colorGradingEnabled(): boolean;
        /**
         * Sets whether the color grading effect is enabled.
         */
        set colorGradingEnabled(value: boolean);
        private _colorGradingWithGreenDepth;
        /**
         * Gets whether the color grading effect is using a green depth for the 3d Texture.
         */
        get colorGradingWithGreenDepth(): boolean;
        /**
         * Sets whether the color grading effect is using a green depth for the 3d Texture.
         */
        set colorGradingWithGreenDepth(value: boolean);
        private _colorGradingBGR;
        /**
         * Gets whether the color grading texture contains BGR values.
         */
        get colorGradingBGR(): boolean;
        /**
         * Sets whether the color grading texture contains BGR values.
         */
        set colorGradingBGR(value: boolean);
        /** @internal */
        _exposure: number;
        /**
         * Gets the Exposure used in the effect.
         */
        get exposure(): number;
        /**
         * Sets the Exposure used in the effect.
         */
        set exposure(value: number);
        private _toneMappingEnabled;
        /**
         * Gets whether the tone mapping effect is enabled.
         */
        get toneMappingEnabled(): boolean;
        /**
         * Sets whether the tone mapping effect is enabled.
         */
        set toneMappingEnabled(value: boolean);
        private _toneMappingType;
        /**
         * Gets the type of tone mapping effect.
         */
        get toneMappingType(): number;
        /**
         * Sets the type of tone mapping effect used in BabylonJS.
         */
        set toneMappingType(value: number);
        protected _contrast: number;
        /**
         * Gets the contrast used in the effect.
         */
        get contrast(): number;
        /**
         * Sets the contrast used in the effect.
         */
        set contrast(value: number);
        /**
         * Vignette stretch size.
         */
        vignetteStretch: number;
        /**
         * Vignette center X Offset.
         */
        vignetteCenterX: number;
        /**
         * Vignette center Y Offset.
         */
        vignetteCenterY: number;
        /**
         * Back Compat: Vignette center Y Offset.
         * @deprecated use vignetteCenterY instead
         */
        get vignetteCentreY(): number;
        set vignetteCentreY(value: number);
        /**
         * Back Compat: Vignette center X Offset.
         * @deprecated use vignetteCenterX instead
         */
        get vignetteCentreX(): number;
        set vignetteCentreX(value: number);
        /**
         * Vignette weight or intensity of the vignette effect.
         */
        vignetteWeight: number;
        /**
         * Color of the vignette applied on the screen through the chosen blend mode (vignetteBlendMode)
         * if vignetteEnabled is set to true.
         */
        vignetteColor: Color4;
        /**
         * Camera field of view used by the Vignette effect.
         */
        vignetteCameraFov: number;
        private _vignetteBlendMode;
        /**
         * Gets the vignette blend mode allowing different kind of effect.
         */
        get vignetteBlendMode(): number;
        /**
         * Sets the vignette blend mode allowing different kind of effect.
         */
        set vignetteBlendMode(value: number);
        private _vignetteEnabled;
        /**
         * Gets whether the vignette effect is enabled.
         */
        get vignetteEnabled(): boolean;
        /**
         * Sets whether the vignette effect is enabled.
         */
        set vignetteEnabled(value: boolean);
        private _ditheringEnabled;
        /**
         * Gets whether the dithering effect is enabled.
         * The dithering effect can be used to reduce banding.
         */
        get ditheringEnabled(): boolean;
        /**
         * Sets whether the dithering effect is enabled.
         * The dithering effect can be used to reduce banding.
         */
        set ditheringEnabled(value: boolean);
        private _ditheringIntensity;
        /**
         * Gets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.
         */
        get ditheringIntensity(): number;
        /**
         * Sets the dithering intensity. 0 is no dithering. Default is 1.0 / 255.0.
         */
        set ditheringIntensity(value: number);
        /** @internal */
        _skipFinalColorClamp: boolean;
        /**
         * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader
         * Applies to PBR materials.
         */
        get skipFinalColorClamp(): boolean;
        /**
         * If apply by post process is set to true, setting this to true will skip the final color clamp step in the fragment shader
         * Applies to PBR materials.
         */
        set skipFinalColorClamp(value: boolean);
        /** @internal */
        _applyByPostProcess: boolean;
        /**
         * Gets whether the image processing is applied through a post process or not.
         */
        get applyByPostProcess(): boolean;
        /**
         * Sets whether the image processing is applied through a post process or not.
         */
        set applyByPostProcess(value: boolean);
        private _isEnabled;
        /**
         * Gets whether the image processing is enabled or not.
         */
        get isEnabled(): boolean;
        /**
         * Sets whether the image processing is enabled or not.
         */
        set isEnabled(value: boolean);
        /**
         * Width of the output texture used in the post process. If not provided, uses the width of the screen.
         */
        outputTextureWidth: number;
        /**
         * Height of the output texture used in the post process. If not provided, uses the height of the screen.
         */
        outputTextureHeight: number;
        /**
         * An event triggered when the configuration changes and requires Shader to Update some parameters.
         */
        onUpdateParameters: Observable<ImageProcessingConfiguration>;
        /**
         * Method called each time the image processing information changes requires to recompile the effect.
         */
        protected _updateParameters(): void;
        /**
         * Gets the current class name.
         * @returns "ImageProcessingConfiguration"
         */
        getClassName(): string;
        /**
         * Prepare the list of uniforms associated with the Image Processing effects.
         * @param uniforms The list of uniforms used in the effect
         * @param defines the list of defines currently in use
         */
        static PrepareUniforms: (uniforms: string[], defines: IImageProcessingConfigurationDefines) => void;
        /**
         * Prepare the list of samplers associated with the Image Processing effects.
         * @param samplersList The list of uniforms used in the effect
         * @param defines the list of defines currently in use
         */
        static PrepareSamplers: (samplersList: string[], defines: IImageProcessingConfigurationDefines) => void;
        /**
         * Prepare the list of defines associated to the shader.
         * @param defines the list of defines to complete
         * @param forPostProcess Define if we are currently in post process mode or not
         */
        prepareDefines(defines: IImageProcessingConfigurationDefines, forPostProcess?: boolean): void;
        /**
         * Returns true if all the image processing information are ready.
         * @returns True if ready, otherwise, false
         */
        isReady(): boolean;
        /**
         * Binds the image processing to the shader.
         * @param effect The effect to bind to
         * @param overrideAspectRatio Override the aspect ratio of the effect
         */
        bind(effect: Effect, overrideAspectRatio?: number): void;
        /**
         * Clones the current image processing instance.
         * @returns The cloned image processing
         */
        clone(): ImageProcessingConfiguration;
        /**
         * Serializes the current image processing instance to a json representation.
         * @returns a JSON representation
         */
        serialize(): any;
        private static _VIGNETTEMODE_MULTIPLY;
        private static _VIGNETTEMODE_OPAQUE;
        /**
         * Used to apply the vignette as a mix with the pixel color.
         */
        static get VIGNETTEMODE_MULTIPLY(): number;
        /**
         * Used to apply the vignette as a replacement of the pixel color.
         */
        static get VIGNETTEMODE_OPAQUE(): number;
    }
    /**
     * Parses the image processing from a json representation.
     * @param source the JSON source to parse
     * @returns The parsed image processing
     */
    export function ImageProcessingConfigurationParse(source: any): ImageProcessingConfiguration;
    /**
     * Register side effects for imageProcessingConfiguration.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterImageProcessingConfiguration(): void;


    /**
     * Prepare the list of uniforms associated with the Image Processing effects.
     * @param uniforms The list of uniforms used in the effect
     * @param defines the list of defines currently in use
     */
    export function PrepareUniformsForImageProcessing(uniforms: string[], defines: IImageProcessingConfigurationDefines): void;
    /**
     * Prepare the list of samplers associated with the Image Processing effects.
     * @param samplersList The list of uniforms used in the effect
     * @param defines the list of defines currently in use
     */
    export function PrepareSamplersForImageProcessing(samplersList: string[], defines: IImageProcessingConfigurationDefines): void;


    /**
     * Interface to follow in your material defines to integrate easily the
     * Image processing functions.
     * @internal
     */
    export interface IImageProcessingConfigurationDefines {
        IMAGEPROCESSING: boolean;
        VIGNETTE: boolean;
        VIGNETTEBLENDMODEMULTIPLY: boolean;
        VIGNETTEBLENDMODEOPAQUE: boolean;
        TONEMAPPING: number;
        CONTRAST: boolean;
        EXPOSURE: boolean;
        COLORCURVES: boolean;
        COLORGRADING: boolean;
        COLORGRADING3D: boolean;
        SAMPLER3DGREENDEPTH: boolean;
        SAMPLER3DBGRMAP: boolean;
        DITHER: boolean;
        IMAGEPROCESSINGPOSTPROCESS: boolean;
        SKIPFINALCOLORCLAMP: boolean;
    }
    type ImageProcessingDefinesMixinConstructor<T = {}> = new (...args: any[]) => T;
    /**
     * Mixin to add Image processing defines to your material defines
     * @internal
     */
    export function ImageProcessingDefinesMixin<Tbase extends ImageProcessingDefinesMixinConstructor>(base: Tbase): {
        new (...args: any[]): {
            IMAGEPROCESSING: boolean;
            VIGNETTE: boolean;
            VIGNETTEBLENDMODEMULTIPLY: boolean;
            VIGNETTEBLENDMODEOPAQUE: boolean;
            TONEMAPPING: number;
            CONTRAST: boolean;
            COLORCURVES: boolean;
            COLORGRADING: boolean;
            COLORGRADING3D: boolean;
            SAMPLER3DGREENDEPTH: boolean;
            SAMPLER3DBGRMAP: boolean;
            DITHER: boolean;
            IMAGEPROCESSINGPOSTPROCESS: boolean;
            SKIPFINALCOLORCLAMP: boolean;
            EXPOSURE: boolean;
        };
    } & Tbase;
    /**
     * @internal
     */
    export class ImageProcessingConfigurationDefines extends MaterialDefines implements IImageProcessingConfigurationDefines {
        IMAGEPROCESSING: boolean;
        VIGNETTE: boolean;
        VIGNETTEBLENDMODEMULTIPLY: boolean;
        VIGNETTEBLENDMODEOPAQUE: boolean;
        TONEMAPPING: number;
        CONTRAST: boolean;
        COLORCURVES: boolean;
        COLORGRADING: boolean;
        COLORGRADING3D: boolean;
        SAMPLER3DGREENDEPTH: boolean;
        SAMPLER3DBGRMAP: boolean;
        DITHER: boolean;
        IMAGEPROCESSINGPOSTPROCESS: boolean;
        EXPOSURE: boolean;
        SKIPFINALCOLORCLAMP: boolean;
        constructor();
    }


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import imageProcessingConfiguration.pure for tree-shakeable, side-effect-free usage.
     */


    type ImageProcessingMixinConstructor<T = {}> = new (...args: any[]) => T;
    /**
     * Mixin to add Image processing defines to your material defines
     * @internal
     */
    export function ImageProcessingMixin<Tbase extends ImageProcessingMixinConstructor>(base: Tbase): {
        new (...args: any[]): {
            /**
             * Default configuration related to image processing available in the standard Material.
             */
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            /**
             * Gets the image processing configuration used either in this material.
             */
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            /**
             * Sets the Default image processing configuration used either in the this material.
             *
             * If sets to null, the scene one is in use.
             */
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            /**
             * Keep track of the image processing observer to allow dispose and replace.
             */
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            /**
             * Attaches a new image processing configuration to the Standard Material.
             * @param configuration
             */
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            /**
             * Gets whether the color curves effect is enabled.
             */
            get cameraColorCurvesEnabled(): boolean;
            /**
             * Sets whether the color curves effect is enabled.
             */
            set cameraColorCurvesEnabled(value: boolean);
            /**
             * Gets whether the color grading effect is enabled.
             */
            get cameraColorGradingEnabled(): boolean;
            /**
             * Gets whether the color grading effect is enabled.
             */
            set cameraColorGradingEnabled(value: boolean);
            /**
             * Gets whether tonemapping is enabled or not.
             */
            get cameraToneMappingEnabled(): boolean;
            /**
             * Sets whether tonemapping is enabled or not
             */
            set cameraToneMappingEnabled(value: boolean);
            /**
             * The camera exposure used on this material.
             * This property is here and not in the camera to allow controlling exposure without full screen post process.
             * This corresponds to a photographic exposure.
             */
            get cameraExposure(): number;
            /**
             * The camera exposure used on this material.
             * This property is here and not in the camera to allow controlling exposure without full screen post process.
             * This corresponds to a photographic exposure.
             */
            set cameraExposure(value: number);
            /**
             * Gets The camera contrast used on this material.
             */
            get cameraContrast(): number;
            /**
             * Sets The camera contrast used on this material.
             */
            set cameraContrast(value: number);
            /**
             * Gets the Color Grading 2D Lookup Texture.
             */
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            /**
             * Sets the Color Grading 2D Lookup Texture.
             */
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            /**
             * The color grading curves provide additional color adjustmnent that is applied after any color grading transform (3D LUT).
             * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.
             * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;
             * corresponding to low luminance, medium luminance, and high luminance areas respectively.
             */
            get cameraColorCurves(): Nullable<ColorCurves>;
            /**
             * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).
             * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.
             * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;
             * corresponding to low luminance, medium luminance, and high luminance areas respectively.
             */
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & Tbase;


    /**
     * Interface used to define common properties for effect fallbacks
     */
    export interface IEffectFallbacks {
        /**
         * Removes the defines that should be removed when falling back.
         * @param currentDefines defines the current define statements for the shader.
         * @param effect defines the current effect we try to compile
         * @returns The resulting defines with defines of the current rank removed.
         */
        reduce(currentDefines: string, effect: Effect): string;
        /**
         * Removes the fallback from the bound mesh.
         */
        unBindMesh(): void;
        /**
         * Checks to see if more fallbacks are still available.
         */
        hasMoreFallbacks: boolean;
    }


    type FresnelParametersParseType = typeof FresnelParametersParse;
        export namespace FresnelParameters {
            let Parse: FresnelParametersParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Options to be used when creating a FresnelParameters.
     */
    export type IFresnelParametersCreationOptions = {
        /**
         * Define the color used on edges (grazing angle)
         */
        leftColor?: Color3;
        /**
         * Define the color used on center
         */
        rightColor?: Color3;
        /**
         * Define bias applied to computed fresnel term
         */
        bias?: number;
        /**
         * Defined the power exponent applied to fresnel term
         */
        power?: number;
        /**
         * Define if the fresnel effect is enable or not.
         */
        isEnabled?: boolean;
    };
    /**
     * Serialized format for FresnelParameters.
     */
    export type IFresnelParametersSerialized = {
        /**
         * Define the color used on edges (grazing angle) [as an array]
         */
        leftColor: number[];
        /**
         * Define the color used on center [as an array]
         */
        rightColor: number[];
        /**
         * Define bias applied to computed fresnel term
         */
        bias: number;
        /**
         * Defined the power exponent applied to fresnel term
         */
        power?: number;
        /**
         * Define if the fresnel effect is enable or not.
         */
        isEnabled: boolean;
    };
    /**
     * This represents all the required information to add a fresnel effect on a material:
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/fresnelParameters
     */
    export class FresnelParameters {
        private _isEnabled;
        /**
         * Define if the fresnel effect is enable or not.
         */
        get isEnabled(): boolean;
        set isEnabled(value: boolean);
        /**
         * Define the color used on edges (grazing angle)
         */
        leftColor: Color3;
        /**
         * Define the color used on center
         */
        rightColor: Color3;
        /**
         * Define bias applied to computed fresnel term
         */
        bias: number;
        /**
         * Defined the power exponent applied to fresnel term
         */
        power: number;
        /**
         * Creates a new FresnelParameters object.
         *
         * @param options provide your own settings to optionally to override defaults
         */
        constructor(options?: IFresnelParametersCreationOptions);
        /**
         * Clones the current fresnel and its values
         * @returns a clone fresnel configuration
         */
        clone(): FresnelParameters;
        /**
         * Determines equality between FresnelParameters objects
         * @param otherFresnelParameters defines the second operand
         * @returns true if the power, bias, leftColor, rightColor and isEnabled values are equal to the given ones
         */
        equals(otherFresnelParameters: DeepImmutable<FresnelParameters>): boolean;
        /**
         * Serializes the current fresnel parameters to a JSON representation.
         * @returns the JSON serialization
         */
        serialize(): IFresnelParametersSerialized;
    }
    /**
     * Parse a JSON object and deserialize it to a new Fresnel parameter object.
     * @param parsedFresnelParameters Define the JSON representation
     * @returns the parsed parameters
     */
    export function FresnelParametersParse(parsedFresnelParameters: IFresnelParametersSerialized): FresnelParameters;
    /**
     * Register side effects for fresnelParameters.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFresnelParameters(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fresnelParameters.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions
     */
    export var FloatingOriginCurrentScene: {
        getScene: () => Scene | undefined;
        eyeAtCamera: boolean;
    };
    export function OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike>;
    export function OffsetClipPlaneToRef(offset: Vector3, plane: Plane, ref: Plane): Plane;
    export function GetOffsetTransformMatrices(offset: IVector3Like, viewMatrices: Array<Matrix>, projectionMatrices: Array<Matrix>, length: number, resultArray: Float32Array): Float32Array;
    export function GetFullOffsetViewProjectionToRef(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, projectionMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike): DeepImmutable<IMatrixLike>;
    export function ResetMatrixFunctions(): void;
    export function OverrideMatrixFunctions(): void;


    type EnvironmentLightingDefinesMixinConstructor<T = {}> = new (...args: any[]) => T;
    /**
     * Mixin to add UV defines to your material defines
     * @internal
     */
    export function EnvironmentLightingDefinesMixin<Tbase extends EnvironmentLightingDefinesMixinConstructor>(base: Tbase): {
        new (...args: any[]): {
            REFLECTION: boolean;
            REFLECTIONMAP_3D: boolean;
            REFLECTIONMAP_SPHERICAL: boolean;
            REFLECTIONMAP_PLANAR: boolean;
            REFLECTIONMAP_CUBIC: boolean;
            USE_LOCAL_REFLECTIONMAP_CUBIC: boolean;
            REFLECTIONMAP_PROJECTION: boolean;
            REFLECTIONMAP_SKYBOX: boolean;
            REFLECTIONMAP_EXPLICIT: boolean;
            REFLECTIONMAP_EQUIRECTANGULAR: boolean;
            REFLECTIONMAP_EQUIRECTANGULAR_FIXED: boolean;
            REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED: boolean;
            INVERTCUBICMAP: boolean;
            USESPHERICALFROMREFLECTIONMAP: boolean;
            USEIRRADIANCEMAP: boolean;
            USE_IRRADIANCE_DOMINANT_DIRECTION: boolean;
            USESPHERICALINVERTEX: boolean;
            REFLECTIONMAP_OPPOSITEZ: boolean;
            LODINREFLECTIONALPHA: boolean;
            GAMMAREFLECTION: boolean;
            RGBDREFLECTION: boolean;
        };
    } & Tbase;


    /** This file must only contain pure code and pure imports */
    /**
     * Effect Render Options
     */
    export interface IEffectRendererOptions {
        /**
         * Defines the vertices positions.
         */
        positions?: number[];
        /**
         * Defines the indices.
         */
        indices?: number[];
    }
    /**
     * Helper class to render one or more effects.
     * You can access the previous rendering in your shader by declaring a sampler named textureSampler
     */
    export class EffectRenderer {
        /**
         * The engine the effect renderer has been created for.
         */
        readonly engine: AbstractEngine;
        private _vertexBuffers;
        private _indexBuffer;
        private _indexBufferLength;
        private _fullscreenViewport;
        private _onContextRestoredObserver;
        private _savedStateDepthTest;
        private _savedStateStencilTest;
        /**
         * Creates an effect renderer
         * @param engine the engine to use for rendering
         * @param options defines the options of the effect renderer
         */
        constructor(engine: AbstractEngine, options?: IEffectRendererOptions);
        /**
         * Sets the current viewport in normalized coordinates 0-1
         * @param viewport Defines the viewport to set (defaults to 0 0 1 1)
         */
        setViewport(viewport?: Viewport): void;
        /**
         * Binds the embedded attributes buffer to the effect.
         * @param effect Defines the effect to bind the attributes for
         */
        bindBuffers(effect: Effect): void;
        /**
         * Sets the current effect wrapper to use during draw.
         * The effect needs to be ready before calling this api.
         * This also sets the default full screen position attribute.
         * @param effectWrapper Defines the effect to draw with
         * @param depthTest Whether to enable depth testing (default: false)
         * @param stencilTest Whether to enable stencil testing (default: false)
         */
        applyEffectWrapper(effectWrapper: EffectWrapper, depthTest?: boolean, stencilTest?: boolean): void;
        /**
         * Saves engine states
         */
        saveStates(): void;
        /**
         * Restores engine states
         */
        restoreStates(): void;
        /**
         * Draws a full screen quad.
         */
        draw(): void;
        private _isRenderTargetTexture;
        /**
         * renders one or more effects to a specified texture
         * @param effectWrapper the effect to renderer
         * @param outputTexture texture to draw to, if null it will render to the currently bound frame buffer
         */
        render(effectWrapper: EffectWrapper, outputTexture?: Nullable<RenderTargetWrapper | IRenderTargetTexture>): void;
        /**
         * Disposes of the effect renderer
         */
        dispose(): void;
    }
    /**
     * Allows for custom processing of the shader code used by an effect wrapper
     */
    export type EffectWrapperCustomShaderCodeProcessing = {
        /**
         * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed
         */
        processCodeAfterIncludes?: (postProcessName: string, shaderType: string, code: string) => string;
        /**
         * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU
         */
        processFinalCode?: (postProcessName: string, shaderType: string, code: string) => string;
        /**
         * If provided, will be called before creating the effect to collect additional custom bindings (defines, uniforms, samplers)
         */
        defineCustomBindings?: (postProcessName: string, defines: Nullable<string>, uniforms: string[], samplers: string[]) => Nullable<string>;
        /**
         * If provided, will be called when binding inputs to the shader code to allow the user to add custom bindings
         */
        bindCustomBindings?: (postProcessName: string, effect: Effect) => void;
    };
    /**
     * Options to create an EffectWrapper
     */
    export interface EffectWrapperCreationOptions {
        /**
         * Engine to use to create the effect
         */
        engine?: AbstractEngine;
        /**
         * Fragment shader for the effect
         */
        fragmentShader?: string;
        /**
         * Use the shader store instead of direct source code
         */
        useShaderStore?: boolean;
        /**
         * Vertex shader for the effect (default: "postprocess")
         */
        vertexShader?: string;
        /**
         * Alias for vertexShader
         */
        vertexUrl?: string;
        /**
         * Attributes to use in the shader (default: ["position"])
         */
        attributeNames?: Array<string>;
        /**
         * Uniforms to use in the shader
         */
        uniformNames?: Array<string>;
        /**
         * Alias for uniformNames. Note that if it is provided, it takes precedence over uniformNames.
         */
        uniforms?: Nullable<string[]>;
        /**
         * Texture sampler names to use in the shader
         */
        samplerNames?: Array<string>;
        /**
         * Alias for samplerNames. Note that if it is provided, it takes precedence over samplerNames.
         */
        samplers?: Nullable<string[]>;
        /**
         * The list of uniform buffers used in the shader (if any)
         */
        uniformBuffers?: Nullable<string[]>;
        /**
         * Defines to use in the shader
         */
        defines?: Nullable<string | Array<string>>;
        /**
         * The index parameters to be used for babylons include syntax "#include<kernelBlurVaryingDeclaration>[0..varyingCount]". (default: undefined)
         * See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx
         */
        indexParameters?: any;
        /**
         * If the shader should not be compiled immediately. (default: false)
         */
        blockCompilation?: boolean;
        /**
         * Callback when effect is compiled
         */
        onCompiled?: Nullable<(effect: Effect) => void>;
        /**
         * The friendly name of the effect (default: "effectWrapper")
         */
        name?: string;
        /**
         * The language the shader is written in (default: GLSL)
         */
        shaderLanguage?: ShaderLanguage;
        /**
         * Defines additional code to call to prepare the shader code
         */
        extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void;
        /**
         * Additional async code to run before preparing the effect
         */
        extraInitializationsAsync?: () => Promise<void>;
        /**
         * If the effect should be used as a post process (default: false). If true, the effect will be created with a "scale" uniform and a "textureSampler" sampler
         */
        useAsPostProcess?: boolean;
        /**
         * Sets this property to true if the fragment shader doesn't use a textureSampler texture (default: false).
         */
        allowEmptySourceTexture?: boolean;
    }
    /**
     * Wraps an effect to be used for rendering
     */
    export class EffectWrapper {
        /**
         * Force code to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        private static _CustomShaderCodeProcessing;
        /**
         * Registers a shader code processing with an effect wrapper name.
         * @param effectWrapperName name of the effect wrapper. Use null for the fallback shader code processing. This is the shader code processing that will be used in case no specific shader code processing has been associated to an effect wrapper name
         * @param customShaderCodeProcessing shader code processing to associate to the effect wrapper name
         */
        static RegisterShaderCodeProcessing(effectWrapperName: Nullable<string>, customShaderCodeProcessing?: EffectWrapperCustomShaderCodeProcessing): void;
        private static _GetShaderCodeProcessing;
        /**
         * Gets or sets the name of the effect wrapper
         */
        get name(): string;
        set name(value: string);
        /**
         * Type of alpha mode to use when applying the effect (default: Engine.ALPHA_DISABLE). Used only if useAsPostProcess is true.
         */
        alphaMode: number;
        /**
         * Executed when the effect is created
         * @returns effect that was created for this effect wrapper
         */
        onEffectCreatedObservable: Observable<Effect>;
        /**
         * Options used to create the effect wrapper
         */
        readonly options: Required<NonNullableFields<EffectWrapperCreationOptions>>;
        /**
         * Get a value indicating if the effect is ready to be used
         * @returns true if the post-process is ready (shader is compiled)
         */
        isReady(): boolean;
        /**
         * Get the draw wrapper associated with the effect wrapper
         * @returns the draw wrapper associated with the effect wrapper
         */
        get drawWrapper(): DrawWrapper;
        /**
         * Event that is fired (only when the EffectWrapper is used with an EffectRenderer) right before the effect is drawn (should be used to update uniforms)
         */
        onApplyObservable: Observable<{}>;
        /**
         * The underlying effect
         */
        get effect(): Effect;
        set effect(effect: Effect);
        protected readonly _drawWrapper: DrawWrapper;
        protected _shadersLoaded: boolean;
        protected readonly _shaderPath: IShaderPath;
        /** @internal */
        _webGPUReady: boolean;
        private _onContextRestoredObserver;
        /**
         * Creates an effect to be rendered
         * @param creationOptions options to create the effect
         */
        constructor(creationOptions: EffectWrapperCreationOptions);
        protected _gatherImports(_useWebGPU: boolean | undefined, _list: Promise<any>[]): void;
        private _importPromises;
        /** @internal */
        _postConstructor(blockCompilation: boolean, defines?: Nullable<string>, extraInitializations?: (useWebGPU: boolean, list: Promise<any>[]) => void, importPromises?: Array<Promise<any>>): void;
        /**
         * Updates the effect with the current effect wrapper compile time values and recompiles the shader.
         * @param defines Define statements that should be added at the beginning of the shader. (default: null)
         * @param uniforms Set of uniform variables that will be passed to the shader. (default: null)
         * @param samplers Set of Texture2D variables that will be passed to the shader. (default: null)
         * @param indexParameters The index parameters to be used for babylons include syntax "#include<kernelBlurVaryingDeclaration>[0..varyingCount]". (default: undefined) See usage in babylon.blurPostProcess.ts and kernelBlur.vertex.fx
         * @param onCompiled Called when the shader has been compiled.
         * @param onError Called if there is an error when compiling a shader.
         * @param vertexUrl The url of the vertex shader to be used (default: the one given at construction time)
         * @param fragmentUrl The url of the fragment shader to be used (default: the one given at construction time)
         */
        updateEffect(defines?: Nullable<string>, uniforms?: Nullable<string[]>, samplers?: Nullable<string[]>, indexParameters?: any, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void, vertexUrl?: string, fragmentUrl?: string): void;
        /**
         * Binds the data to the effect.
         * @param noDefaultBindings if true, the default bindings (scale and alpha mode) will not be set.
         */
        bind(noDefaultBindings?: boolean): void;
        /**
         * Disposes of the effect wrapper
         * @param _ignored kept for backward compatibility
         */
        dispose(_ignored?: boolean): void;
    }




    /**
     * EffectFallbacks can be used to add fallbacks (properties to disable) to certain properties when desired to improve performance.
     * (Eg. Start at high quality with reflection and fog, if fps is low, remove reflection, if still low remove fog)
     */
    export class EffectFallbacks implements IEffectFallbacks {
        private _defines;
        private _currentRank;
        private _maxRank;
        private _mesh;
        /**
         * Removes the fallback from the bound mesh.
         */
        unBindMesh(): void;
        /**
         * Adds a fallback on the specified property.
         * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)
         * @param define The name of the define in the shader
         */
        addFallback(rank: number, define: string): void;
        /**
         * Sets the mesh to use CPU skinning when needing to fallback.
         * @param rank The rank of the fallback (Lower ranks will be fallbacked to first)
         * @param mesh The mesh to use the fallbacks.
         */
        addCPUSkinningFallback(rank: number, mesh: AbstractMesh): void;
        /**
         * Checks to see if more fallbacks are still available.
         */
        get hasMoreFallbacks(): boolean;
        /**
         * Removes the defines that should be removed when falling back.
         * @param currentDefines defines the current define statements for the shader.
         * @param effect defines the current effect we try to compile
         * @returns The resulting defines with defines of the current rank removed.
         */
        reduce(currentDefines: string, effect: Effect): string;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Generate a pipeline context from the provided options
     * Note - at the moment only WebGL is supported
     * @param options the options to be used when generating the pipeline
     * @param context the context to be used when creating the pipeline
     * @param createPipelineContextInjection the function to create the pipeline context
     * @param _preparePipelineContextInjection the function to prepare the pipeline context
     * @returns a promise that resolves to the pipeline context
     */
    export function generatePipelineContext(options: IPipelineGenerationOptions, context: WebGL2RenderingContext | WebGLRenderingContext, createPipelineContextInjection?: typeof AbstractEngine.prototype.createPipelineContext, _preparePipelineContextInjection?: typeof AbstractEngine.prototype._preparePipelineContextAsync): Promise<IPipelineContext>;




    /** This file must only contain pure code and pure imports */
    /**
     * Defines the route to the shader code. The priority is as follows:
     *  * object: `{ vertexSource: "vertex shader code string", fragmentSource: "fragment shader code string" }` for directly passing the shader code
     *  * object: `{ vertexElement: "vertexShaderCode", fragmentElement: "fragmentShaderCode" }`, used with shader code in script tags
     *  * object: `{ vertex: "custom", fragment: "custom" }`, used with `Effect.ShadersStore["customVertexShader"]` and `Effect.ShadersStore["customFragmentShader"]`
     *  * string: `"./COMMON_NAME"`, used with external files COMMON_NAME.vertex.fx and COMMON_NAME.fragment.fx in index.html folder.
     */
    export type IShaderPath = {
        /**
         * Directly pass the shader code
         */
        vertexSource?: string;
        /**
         * Directly pass the shader code
         */
        fragmentSource?: string;
        /**
         * Used with Effect.ShadersStore. If the `vertex` is set to `"custom`, then
         * Babylon.js will read from Effect.ShadersStore["customVertexShader"]
         */
        vertex?: string;
        /**
         * Used with Effect.ShadersStore. If the `fragment` is set to `"custom`, then
         * Babylon.js will read from Effect.ShadersStore["customFragmentShader"]
         */
        fragment?: string;
        /**
         * Used with shader code in script tags
         */
        vertexElement?: string;
        /**
         * Used with shader code in script tags
         */
        fragmentElement?: string;
        /**
         * Defines the name appearing in spector when framgent/vertex...source are being used
         */
        spectorName?: string;
    };
    /**
     * Options to be used when creating an effect.
     */
    export interface IEffectCreationOptions {
        /**
         * Attributes that will be used in the shader.
         */
        attributes: string[];
        /**
         * Uniform variable names that will be set in the shader.
         */
        uniformsNames: string[];
        /**
         * Uniform buffer variable names that will be set in the shader.
         */
        uniformBuffersNames?: string[];
        /**
         * Sampler texture variable names that will be set in the shader.
         */
        samplers: string[];
        /**
         * Define statements that will be set in the shader.
         */
        defines: any;
        /**
         * Possible fallbacks for this effect to improve performance when needed.
         */
        fallbacks: Nullable<IEffectFallbacks>;
        /**
         * Callback that will be called when the shader is compiled.
         */
        onCompiled: Nullable<(effect: Effect) => void>;
        /**
         * Callback that will be called if an error occurs during shader compilation.
         */
        onError: Nullable<(effect: Effect, errors: string) => void>;
        /**
         * Parameters to be used with Babylons include syntax to iterate over an array (eg. \{lights: 10\})
         */
        indexParameters?: any;
        /**
         * Max number of lights that can be used in the shader.
         */
        maxSimultaneousLights?: number;
        /**
         * See https://developer.mozilla.org/en-US/docs/Web/API/WebGL2RenderingContext/transformFeedbackVaryings
         */
        transformFeedbackVaryings?: Nullable<string[]>;
        /**
         * If provided, will be called two times with the vertex and fragment code so that this code can be updated before it is compiled by the GPU
         */
        processFinalCode?: Nullable<ShaderCustomProcessingFunction>;
        /**
         * If provided, will be called two times with the vertex and fragment code so that this code can be updated after the #include have been processed
         */
        processCodeAfterIncludes?: Nullable<ShaderCustomProcessingFunction>;
        /**
         * Is this effect rendering to several color attachments ?
         */
        multiTarget?: boolean;
        /**
         * The language the shader is written in (default: GLSL)
         */
        shaderLanguage?: ShaderLanguage;
        /**
         * Provide an existing pipeline context to avoid creating a new one
         */
        existingPipelineContext?: IPipelineContext;
        /**
         * Additional async code to run before preparing the effect
         */
        extraInitializationsAsync?: () => Promise<void>;
        /**
         * If set to true the shader will not be compiles asynchronously, even if the engine allows it.
         */
        disableParallelShaderCompilation?: boolean;
    }
    /**
     * Effect containing vertex and fragment shader that can be executed on an object.
     */
    export class Effect implements IDisposable {
        /**
         * Gets or sets the relative url used to load shaders if using the engine in non-minified mode
         */
        static get ShadersRepository(): string;
        static set ShadersRepository(repo: string);
        /**
         * Enable logging of the shader code when a compilation error occurs
         */
        static LogShaderCodeOnCompilationError: boolean;
        /**
         * Gets or sets a boolean indicating that effect ref counting is disabled
         * If true, the effect will persist in memory until engine is disposed
         */
        static PersistentMode: boolean;
        /**
         * Use this with caution
         * See ClearCodeCache function comments
         */
        static AutomaticallyClearCodeCache: boolean;
        /**
         * Name of the effect.
         */
        name: IShaderPath | string;
        /**
         * String container all the define statements that should be set on the shader.
         */
        defines: string;
        /**
         * Callback that will be called when the shader is compiled.
         */
        onCompiled: Nullable<(effect: Effect) => void>;
        /**
         * Callback that will be called if an error occurs during shader compilation.
         */
        onError: Nullable<(effect: Effect, errors: string) => void>;
        /**
         * Callback that will be called when effect is bound.
         */
        onBind: Nullable<(effect: Effect) => void>;
        /**
         * Unique ID of the effect.
         */
        uniqueId: number;
        /**
         * Observable that will be called when the shader is compiled.
         * It is recommended to use executeWhenCompile() or to make sure that scene.isReady() is called to get this observable raised.
         */
        onCompileObservable: Observable<Effect>;
        /**
         * Observable that will be called if an error occurs during shader compilation.
         */
        onErrorObservable: Observable<Effect>;
        /** @internal */
        _onBindObservable: Nullable<Observable<Effect>>;
        private _isDisposed;
        /**
         * Gets a boolean indicating that the effect was already disposed
         */
        get isDisposed(): boolean;
        /** @internal */
        _refCount: number;
        /**
         * Observable that will be called when effect is bound.
         */
        get onBindObservable(): Observable<Effect>;
        /** @internal */
        _bonesComputationForcedToCPU: boolean;
        /** @internal */
        _uniformBuffersNames: {
            [key: string]: number;
        };
        /** @internal */
        _samplerList: string[];
        /** @internal */
        _multiTarget: boolean;
        private static _UniqueIdSeed;
        /** @internal */
        _engine: AbstractEngine;
        private _uniformBuffersNamesList;
        private _uniformsNames;
        /** @internal */
        _samplers: {
            [key: string]: number;
        };
        private _isReady;
        private _compilationError;
        private _allFallbacksProcessed;
        private _attributesNames;
        private _attributes;
        private _attributeLocationByName;
        /** @internal */
        _uniforms: {
            [key: string]: Nullable<WebGLUniformLocation>;
        };
        /**
         * Key for the effect.
         * @internal
         */
        _key: string;
        private _indexParameters;
        private _fallbacks;
        private _vertexSourceCodeOverride;
        private _fragmentSourceCodeOverride;
        private _transformFeedbackVaryings;
        private _shaderLanguage;
        private _disableParallelShaderCompilation;
        /**
         * Compiled shader to webGL program.
         * @internal
         */
        _pipelineContext: Nullable<IPipelineContext>;
        /** @internal */
        _vertexSourceCode: string;
        /** @internal */
        _fragmentSourceCode: string;
        /** @internal */
        _vertexSourceCodeBeforeMigration: string;
        /** @internal */
        _fragmentSourceCodeBeforeMigration: string;
        /** @internal */
        _rawVertexSourceCode: string;
        /** @internal */
        _rawFragmentSourceCode: string;
        private static _BaseCache;
        private _processingContext;
        private _processCodeAfterIncludes;
        private _processFinalCode;
        private _onReleaseEffectsObserver;
        /**
         * Gets the shader language type used to write vertex and fragment source code.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Instantiates an effect.
         * An effect can be used to create/manage/execute vertex and fragment shaders.
         * @param baseName Name of the effect.
         * @param attributesNamesOrOptions List of attribute names that will be passed to the shader or set of all options to create the effect.
         * @param uniformsNamesOrEngine List of uniform variable names that will be passed to the shader or the engine that will be used to render effect.
         * @param samplers List of sampler variables that will be passed to the shader.
         * @param engine Engine to be used to render the effect
         * @param defines Define statements to be added to the shader.
         * @param fallbacks Possible fallbacks for this effect to improve performance when needed.
         * @param onCompiled Callback that will be called when the shader is compiled.
         * @param onError Callback that will be called if an error occurs during shader compilation.
         * @param indexParameters Parameters to be used with Babylons include syntax to iterate over an array (eg. \{lights: 10\})
         * @param key Effect Key identifying uniquely compiled shader variants
         * @param shaderLanguage the language the shader is written in (default: GLSL)
         * @param extraInitializationsAsync additional async code to run before preparing the effect
         */
        constructor(baseName: IShaderPath | string, attributesNamesOrOptions: string[] | IEffectCreationOptions, uniformsNamesOrEngine: string[] | AbstractEngine, samplers?: Nullable<string[]>, engine?: AbstractEngine, defines?: Nullable<string>, fallbacks?: Nullable<IEffectFallbacks>, onCompiled?: Nullable<(effect: Effect) => void>, onError?: Nullable<(effect: Effect, errors: string) => void>, indexParameters?: any, key?: string, shaderLanguage?: ShaderLanguage, extraInitializationsAsync?: () => Promise<void>);
        /** @internal */
        _processShaderCodeAsync(shaderProcessor?: Nullable<IShaderProcessor>, keepExistingPipelineContext?: boolean, shaderProcessingContext?: Nullable<_IShaderProcessingContext>, extraInitializationsAsync?: () => Promise<void>): Promise<void>;
        /**
         * Unique key for this effect
         */
        get key(): string;
        /**
         * If the effect has been compiled and prepared.
         * @returns if the effect is compiled and prepared.
         */
        isReady(): boolean;
        private _isReadyInternal;
        /**
         * The engine the effect was initialized with.
         * @returns the engine.
         */
        getEngine(): AbstractEngine;
        /**
         * The pipeline context for this effect
         * @returns the associated pipeline context
         */
        getPipelineContext(): Nullable<IPipelineContext>;
        /**
         * The set of names of attribute variables for the shader.
         * @returns An array of attribute names.
         */
        getAttributesNames(): string[];
        /**
         * Returns the attribute at the given index.
         * @param index The index of the attribute.
         * @returns The location of the attribute.
         */
        getAttributeLocation(index: number): number;
        /**
         * Returns the attribute based on the name of the variable.
         * @param name of the attribute to look up.
         * @returns the attribute location.
         */
        getAttributeLocationByName(name: string): number;
        /**
         * The number of attributes.
         * @returns the number of attributes.
         */
        getAttributesCount(): number;
        /**
         * Gets the index of a uniform variable.
         * @param uniformName of the uniform to look up.
         * @returns the index.
         */
        getUniformIndex(uniformName: string): number;
        /**
         * Returns the attribute based on the name of the variable.
         * @param uniformName of the uniform to look up.
         * @returns the location of the uniform.
         */
        getUniform(uniformName: string): Nullable<WebGLUniformLocation>;
        /**
         * Returns an array of sampler variable names
         * @returns The array of sampler variable names.
         */
        getSamplers(): string[];
        /**
         * Returns an array of uniform variable names
         * @returns The array of uniform variable names.
         */
        getUniformNames(): string[];
        /**
         * Returns an array of uniform buffer variable names
         * @returns The array of uniform buffer variable names.
         */
        getUniformBuffersNames(): string[];
        /**
         * Returns the index parameters used to create the effect
         * @returns The index parameters object
         */
        getIndexParameters(): any;
        /**
         * The error from the last compilation.
         * @returns the error string.
         */
        getCompilationError(): string;
        /**
         * Gets a boolean indicating that all fallbacks were used during compilation
         * @returns true if all fallbacks were used
         */
        allFallbacksProcessed(): boolean;
        /**
         * Wait until compilation before fulfilling.
         * @returns a promise to wait for completion.
         */
        whenCompiledAsync(): Promise<Effect>;
        /**
         * Adds a callback to the onCompiled observable and call the callback immediately if already ready.
         * @param func The callback to be used.
         */
        executeWhenCompiled(func: (effect: Effect) => void): void;
        private _checkIsReady;
        /**
         * Gets the vertex shader source code of this effect
         * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)
         */
        get vertexSourceCode(): string;
        /**
         * Gets the fragment shader source code of this effect
         * This is the final source code that will be compiled, after all the processing has been done (pre-processing applied, code injection/replacement, etc)
         */
        get fragmentSourceCode(): string;
        /**
         * Gets the vertex shader source code before migration.
         * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.
         * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).
         */
        get vertexSourceCodeBeforeMigration(): string;
        /**
         * Gets the fragment shader source code before migration.
         * This is the source code after the include directives have been replaced by their contents but before the code is migrated, i.e. before ShaderProcess._ProcessShaderConversion is executed.
         * This method is, among other things, responsible for parsing #if/#define directives as well as converting GLES2 syntax to GLES3 (in the case of WebGL).
         */
        get fragmentSourceCodeBeforeMigration(): string;
        /**
         * Gets the vertex shader source code before it has been modified by any processing
         */
        get rawVertexSourceCode(): string;
        /**
         * Gets the fragment shader source code before it has been modified by any processing
         */
        get rawFragmentSourceCode(): string;
        /**
         * Gets the pipeline generation options for this effect.
         * @returns the pipeline generation options for this effect
         */
        getPipelineGenerationOptions(): IPipelineGenerationOptions;
        /**
         * Recompiles the webGL program
         * @param vertexSourceCode The source code for the vertex shader.
         * @param fragmentSourceCode The source code for the fragment shader.
         * @param onCompiled Callback called when completed.
         * @param onError Callback called on error.
         * @internal
         */
        _rebuildProgram(vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void): void;
        private _onRenderingStateCompiled;
        /**
         * Prepares the effect
         * @internal
         */
        _prepareEffect(keepExistingPipelineContext?: boolean): void;
        private _getShaderCodeAndErrorLine;
        private _processCompilationErrors;
        /**
         * Checks if the effect is supported. (Must be called after compilation)
         */
        get isSupported(): boolean;
        /**
         * Binds a texture to the engine to be used as output of the shader.
         * @param channel Name of the output variable.
         * @param texture Texture to bind.
         * @internal
         */
        _bindTexture(channel: string, texture: Nullable<InternalTexture>): void;
        /**
         * Sets a texture on the engine to be used in the shader.
         * @param channel Name of the sampler variable.
         * @param texture Texture to set.
         */
        setTexture(channel: string, texture: Nullable<ThinTexture>): void;
        /**
         * Sets an array of textures on the engine to be used in the shader.
         * @param channel Name of the variable.
         * @param textures Textures to set.
         */
        setTextureArray(channel: string, textures: ThinTexture[]): void;
        /**
         * Binds a buffer to a uniform.
         * @param buffer Buffer to bind.
         * @param name Name of the uniform variable to bind to.
         */
        bindUniformBuffer(buffer: DataBuffer, name: string): void;
        /**
         * Binds block to a uniform.
         * @param blockName Name of the block to bind.
         * @param index Index to bind.
         */
        bindUniformBlock(blockName: string, index: number): void;
        /**
         * Sets an integer value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param value Value to be set.
         * @returns this effect.
         */
        setInt(uniformName: string, value: number): Effect;
        /**
         * Sets an int2 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First int in int2.
         * @param y Second int in int2.
         * @returns this effect.
         */
        setInt2(uniformName: string, x: number, y: number): Effect;
        /**
         * Sets an int3 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First int in int3.
         * @param y Second int in int3.
         * @param z Third int in int3.
         * @returns this effect.
         */
        setInt3(uniformName: string, x: number, y: number, z: number): Effect;
        /**
         * Sets an int4 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First int in int4.
         * @param y Second int in int4.
         * @param z Third int in int4.
         * @param w Fourth int in int4.
         * @returns this effect.
         */
        setInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect;
        /**
         * Sets an int array on a uniform variable.
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setIntArray(uniformName: string, array: Int32Array): Effect;
        /**
         * Sets an int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setIntArray2(uniformName: string, array: Int32Array): Effect;
        /**
         * Sets an int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setIntArray3(uniformName: string, array: Int32Array): Effect;
        /**
         * Sets an int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setIntArray4(uniformName: string, array: Int32Array): Effect;
        /**
         * Sets an unsigned integer value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param value Value to be set.
         * @returns this effect.
         */
        setUInt(uniformName: string, value: number): Effect;
        /**
         * Sets an unsigned int2 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First unsigned int in uint2.
         * @param y Second unsigned int in uint2.
         * @returns this effect.
         */
        setUInt2(uniformName: string, x: number, y: number): Effect;
        /**
         * Sets an unsigned int3 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First unsigned int in uint3.
         * @param y Second unsigned int in uint3.
         * @param z Third unsigned int in uint3.
         * @returns this effect.
         */
        setUInt3(uniformName: string, x: number, y: number, z: number): Effect;
        /**
         * Sets an unsigned int4 value on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First unsigned int in uint4.
         * @param y Second unsigned int in uint4.
         * @param z Third unsigned int in uint4.
         * @param w Fourth unsigned int in uint4.
         * @returns this effect.
         */
        setUInt4(uniformName: string, x: number, y: number, z: number, w: number): Effect;
        /**
         * Sets an unsigned int array on a uniform variable.
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setUIntArray(uniformName: string, array: Uint32Array): Effect;
        /**
         * Sets an unsigned int array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setUIntArray2(uniformName: string, array: Uint32Array): Effect;
        /**
         * Sets an unsigned int array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setUIntArray3(uniformName: string, array: Uint32Array): Effect;
        /**
         * Sets an unsigned int array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setUIntArray4(uniformName: string, array: Uint32Array): Effect;
        /**
         * Sets an float array on a uniform variable.
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setFloatArray(uniformName: string, array: FloatArray): Effect;
        /**
         * Sets an float array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setFloatArray2(uniformName: string, array: FloatArray): Effect;
        /**
         * Sets an float array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setFloatArray3(uniformName: string, array: FloatArray): Effect;
        /**
         * Sets an float array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setFloatArray4(uniformName: string, array: FloatArray): Effect;
        /**
         * Sets an array on a uniform variable.
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setArray(uniformName: string, array: number[]): Effect;
        /**
         * Sets an array 2 on a uniform variable. (Array is specified as single array eg. [1,2,3,4] will result in [[1,2],[3,4]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setArray2(uniformName: string, array: number[]): Effect;
        /**
         * Sets an array 3 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6] will result in [[1,2,3],[4,5,6]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setArray3(uniformName: string, array: number[]): Effect;
        /**
         * Sets an array 4 on a uniform variable. (Array is specified as single array eg. [1,2,3,4,5,6,7,8] will result in [[1,2,3,4],[5,6,7,8]] in the shader)
         * @param uniformName Name of the variable.
         * @param array array to be set.
         * @returns this effect.
         */
        setArray4(uniformName: string, array: number[]): Effect;
        /**
         * Sets matrices on a uniform variable.
         * @param uniformName Name of the variable.
         * @param matrices matrices to be set.
         * @returns this effect.
         */
        setMatrices(uniformName: string, matrices: Float32Array | Array<number>): Effect;
        /**
         * Sets matrix on a uniform variable.
         * @param uniformName Name of the variable.
         * @param matrix matrix to be set.
         * @returns this effect.
         */
        setMatrix(uniformName: string, matrix: IMatrixLike): Effect;
        /**
         * Sets a 3x3 matrix on a uniform variable. (Specified as [1,2,3,4,5,6,7,8,9] will result in [1,2,3][4,5,6][7,8,9] matrix)
         * @param uniformName Name of the variable.
         * @param matrix matrix to be set.
         * @returns this effect.
         */
        setMatrix3x3(uniformName: string, matrix: Float32Array | Array<number>): Effect;
        /**
         * Sets a 2x2 matrix on a uniform variable. (Specified as [1,2,3,4] will result in [1,2][3,4] matrix)
         * @param uniformName Name of the variable.
         * @param matrix matrix to be set.
         * @returns this effect.
         */
        setMatrix2x2(uniformName: string, matrix: Float32Array | Array<number>): Effect;
        /**
         * Sets a float on a uniform variable.
         * @param uniformName Name of the variable.
         * @param value value to be set.
         * @returns this effect.
         */
        setFloat(uniformName: string, value: number): Effect;
        /**
         * Sets a boolean on a uniform variable.
         * @param uniformName Name of the variable.
         * @param bool value to be set.
         * @returns this effect.
         */
        setBool(uniformName: string, bool: boolean): Effect;
        /**
         * Sets a Vector2 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param vector2 vector2 to be set.
         * @returns this effect.
         */
        setVector2(uniformName: string, vector2: IVector2Like): Effect;
        /**
         * Sets a float2 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First float in float2.
         * @param y Second float in float2.
         * @returns this effect.
         */
        setFloat2(uniformName: string, x: number, y: number): Effect;
        /**
         * Sets a Vector3 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param vector3 Value to be set.
         * @returns this effect.
         */
        setVector3(uniformName: string, vector3: IVector3Like): Effect;
        /**
         * Sets a float3 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First float in float3.
         * @param y Second float in float3.
         * @param z Third float in float3.
         * @returns this effect.
         */
        setFloat3(uniformName: string, x: number, y: number, z: number): Effect;
        /**
         * Sets a Vector4 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param vector4 Value to be set.
         * @returns this effect.
         */
        setVector4(uniformName: string, vector4: IVector4Like): Effect;
        /**
         * Sets a Quaternion on a uniform variable.
         * @param uniformName Name of the variable.
         * @param quaternion Value to be set.
         * @returns this effect.
         */
        setQuaternion(uniformName: string, quaternion: IQuaternionLike): Effect;
        /**
         * Sets a float4 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param x First float in float4.
         * @param y Second float in float4.
         * @param z Third float in float4.
         * @param w Fourth float in float4.
         * @returns this effect.
         */
        setFloat4(uniformName: string, x: number, y: number, z: number, w: number): Effect;
        /**
         * Sets a Color3 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param color3 Value to be set.
         * @returns this effect.
         */
        setColor3(uniformName: string, color3: IColor3Like): Effect;
        /**
         * Sets a Color4 on a uniform variable.
         * @param uniformName Name of the variable.
         * @param color3 Value to be set.
         * @param alpha Alpha value to be set.
         * @returns this effect.
         */
        setColor4(uniformName: string, color3: IColor3Like, alpha: number): Effect;
        /**
         * Sets a Color4 on a uniform variable
         * @param uniformName defines the name of the variable
         * @param color4 defines the value to be set
         * @returns this effect.
         */
        setDirectColor4(uniformName: string, color4: IColor4Like): Effect;
        /**
         * Use this wisely: It will remove the cached code from this effect
         * It is probably ok to call it if you are not using ShadowDepthWrapper or if everything is already up and running
         * DO NOT CALL IT if you want to have support for context lost recovery
         */
        clearCodeCache(): void;
        /**
         * Release all associated resources.
         * @param force specifies if the effect must be released no matter what
         **/
        dispose(force?: boolean): void;
        /**
         * This function will add a new shader to the shader store
         * @param name the name of the shader
         * @param pixelShader optional pixel shader content
         * @param vertexShader optional vertex shader content
         * @param shaderLanguage the language the shader is written in (default: GLSL)
         */
        static RegisterShader(name: string, pixelShader?: string, vertexShader?: string, shaderLanguage?: ShaderLanguage): void;
        /**
         * Store of each shader (The can be looked up using effect.key)
         */
        static ShadersStore: {
            [key: string]: string;
        };
        /**
         * Store of each included file for a shader (The can be looked up using effect.key)
         */
        static IncludesShadersStore: {
            [key: string]: string;
        };
        /**
         * Resets the cache of effects.
         */
        static ResetCache(): void;
    }


    /**
     * Options to be used when creating a pipeline
     */
    export interface IPipelineGenerationOptions {
        /**
         * The definition of the shader content.
         * Can be either a unified name, name per vertex and frament or the shader code content itself
         */
        shaderNameOrContent: string | IShaderPath;
        /**
         * Unique key to identify the pipeline.
         * Note that though not mandatory, it's recommended to provide a key to be able to use the automated pipeline loading system.
         */
        key?: string;
        /**
         * The list of defines to be used in the shader
         */
        defines?: string[];
        /**
         * If true, the global defines will be added to the defines array
         */
        addGlobalDefines?: boolean;
        /**
         * The shader language.
         * Defaults to the language suiting the platform name (GLSL for WEBGL2, WGSL for WEBGPU)
         */
        shaderLanguage?: ShaderLanguage;
        /**
         * The name of the platform to be used when processing the shader
         * defaults to WEBGL2
         */
        platformName?: string;
        /**
         * extend the processing options when running code processing
         */
        extendedProcessingOptions?: Partial<_IProcessingOptions>;
        /**
         * extend the pipeline generation options
         */
        extendedCreatePipelineOptions?: Partial<ICreateAndPreparePipelineContextOptions>;
        /**
         * If true, generating a new pipeline will return when the pipeline is ready to be used
         */
        waitForIsReady?: boolean;
        /**
         * If true, the pipeline will be created synchronously, even if parallel shader compilation is available
         */
        disableParallelCompilation?: boolean;
    }
    /**
     * @internal
     */
    export interface ICreateAndPreparePipelineContextOptions {
        parallelShaderCompile?: {
            COMPLETION_STATUS_KHR: number;
        };
        shaderProcessingContext: Nullable<_IShaderProcessingContext>;
        existingPipelineContext?: Nullable<IPipelineContext>;
        name?: string;
        rebuildRebind?: (vertexSourceCode: string, fragmentSourceCode: string, onCompiled: (pipelineContext: IPipelineContext) => void, onError: (message: string) => void) => void;
        onRenderingStateCompiled?: (pipelineContext?: IPipelineContext) => void;
        context?: WebGL2RenderingContext | WebGLRenderingContext;
        createAsRaw?: boolean;
        vertex: string;
        fragment: string;
        defines: Nullable<string>;
        transformFeedbackVaryings: Nullable<string[]>;
        disableParallelCompilation?: boolean;
    }
    /**
     * Get a cached pipeline context
     * @param name the pipeline name
     * @param context the context to be used when creating the pipeline
     * @returns the cached pipeline context if it exists
     * @internal
     */
    export function getCachedPipeline(name: string, context: WebGLContext): IPipelineContext | undefined;
    /**
     * @internal
     */
    export function resetCachedPipeline(pipeline: IPipelineContext): void;
    /** @internal */
    export function _ProcessShaderCode(processorOptions: _IProcessingOptions, baseName: any, processFinalCode?: Nullable<ShaderCustomProcessingFunction>, onFinalCodeReady?: (vertexCode: string, fragmentCode: string) => void, shaderLanguage?: ShaderLanguage, engine?: AbstractEngine, effectContext?: Effect): void;
    /**
     * Creates and prepares a pipeline context
     * @internal
     */
    export const createAndPreparePipelineContext: (options: ICreateAndPreparePipelineContextOptions, createPipelineContext: typeof AbstractEngine.prototype.createPipelineContext, _preparePipelineContext: typeof AbstractEngine.prototype._preparePipelineContextAsync, _executeWhenRenderingStateIsCompiled: typeof AbstractEngine.prototype._executeWhenRenderingStateIsCompiled) => IPipelineContext;




    /**
     * Detect if the effect is a DrawWrapper
     * @param effect defines the entity to test
     * @returns if the entity is a DrawWrapper
     */
    export function IsWrapper(effect: Effect | DrawWrapper): effect is DrawWrapper;


    /**
     * Wrapper for an effect and its associated material context and draw context.
     * This class is meant to encapsulate the effect and its related contexts, allowing for easier management of rendering states.
     */
    export class DrawWrapper {
        /**
         * The effect associated with this wrapper.
         */
        effect: Nullable<Effect>;
        /**
         * The defines associated with this wrapper.
         */
        defines: Nullable<string | MaterialDefines>;
        /**
         * The material context associated with this wrapper.
         */
        materialContext?: IMaterialContext;
        /**
         * The draw context associated with this wrapper.
         */
        drawContext?: IDrawContext;
        /**
         * @internal
         * Specifies if the effect was previously ready
         */
        _wasPreviouslyReady: boolean;
        /**
         * @internal
         * Forces the code from bindForSubMesh to be fully run the next time it is called
         */
        _forceRebindOnNextCall: boolean;
        /**
         * @internal
         * Specifies if the effect was previously using instances
         */
        _wasPreviouslyUsingInstances: Nullable<boolean>;
        /**
         * Retrieves the effect from a DrawWrapper or Effect instance.
         * @param effect The effect or DrawWrapper instance to retrieve the effect from.
         * @returns The effect associated with the given instance, or null if not found.
         */
        static GetEffect(effect: Effect | DrawWrapper): Nullable<Effect>;
        /**
         * Creates a new DrawWrapper instance.
         * Note that drawContext is always created (but may end up being undefined if the engine doesn't need draw contexts), but materialContext is optional.
         * @param engine The engine to create the draw wrapper for.
         * @param createMaterialContext If true, creates a material context for this wrapper (default is true).
         */
        constructor(engine: AbstractEngine, createMaterialContext?: boolean);
        /**
         * Sets the effect and its associated defines for this wrapper.
         * @param effect The effect to associate with this wrapper.
         * @param defines The defines to associate with this wrapper.
         * @param resetContext If true, resets the draw context (default is true).
         */
        setEffect(effect: Nullable<Effect>, defines?: Nullable<string | MaterialDefines>, resetContext?: boolean): void;
        /**
         * Disposes the effect wrapper and its resources
         * @param immediate if the effect should be disposed immediately or on the next frame.
         * If dispose() is not called during a scene or engine dispose, we want to delay the dispose of the underlying effect. Mostly to give a chance to user code to reuse the effect in some way.
         */
        dispose(immediate?: boolean): void;
    }


    type ColorCurvesBindType = typeof ColorCurvesBind;
    type ColorCurvesParseType = typeof ColorCurvesParse;
        export namespace ColorCurves {
            let Bind: ColorCurvesBindType;
            let Parse: ColorCurvesParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * The color grading curves provide additional color adjustment that is applied after any color grading transform (3D LUT).
     * They allow basic adjustment of saturation and small exposure adjustments, along with color filter tinting to provide white balance adjustment or more stylistic effects.
     * These are similar to controls found in many professional imaging or colorist software. The global controls are applied to the entire image. For advanced tuning, extra controls are provided to adjust the shadow, midtone and highlight areas of the image;
     * corresponding to low luminance, medium luminance, and high luminance areas respectively.
     */
    export class ColorCurves {
        private _dirty;
        private _tempColor;
        private _globalCurve;
        private _highlightsCurve;
        private _midtonesCurve;
        private _shadowsCurve;
        private _positiveCurve;
        private _negativeCurve;
        private _globalHue;
        private _globalDensity;
        private _globalSaturation;
        private _globalExposure;
        /**
         * Gets the global Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        get globalHue(): number;
        /**
         * Sets the global Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        set globalHue(value: number);
        /**
         * Gets the global Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        get globalDensity(): number;
        /**
         * Sets the global Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        set globalDensity(value: number);
        /**
         * Gets the global Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        get globalSaturation(): number;
        /**
         * Sets the global Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        set globalSaturation(value: number);
        /**
         * Gets the global Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        get globalExposure(): number;
        /**
         * Sets the global Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        set globalExposure(value: number);
        private _highlightsHue;
        private _highlightsDensity;
        private _highlightsSaturation;
        private _highlightsExposure;
        /**
         * Gets the highlights Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        get highlightsHue(): number;
        /**
         * Sets the highlights Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        set highlightsHue(value: number);
        /**
         * Gets the highlights Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        get highlightsDensity(): number;
        /**
         * Sets the highlights Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        set highlightsDensity(value: number);
        /**
         * Gets the highlights Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        get highlightsSaturation(): number;
        /**
         * Sets the highlights Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        set highlightsSaturation(value: number);
        /**
         * Gets the highlights Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        get highlightsExposure(): number;
        /**
         * Sets the highlights Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        set highlightsExposure(value: number);
        private _midtonesHue;
        private _midtonesDensity;
        private _midtonesSaturation;
        private _midtonesExposure;
        /**
         * Gets the midtones Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        get midtonesHue(): number;
        /**
         * Sets the midtones Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        set midtonesHue(value: number);
        /**
         * Gets the midtones Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        get midtonesDensity(): number;
        /**
         * Sets the midtones Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        set midtonesDensity(value: number);
        /**
         * Gets the midtones Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        get midtonesSaturation(): number;
        /**
         * Sets the midtones Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        set midtonesSaturation(value: number);
        /**
         * Gets the midtones Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        get midtonesExposure(): number;
        /**
         * Sets the midtones Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        set midtonesExposure(value: number);
        private _shadowsHue;
        private _shadowsDensity;
        private _shadowsSaturation;
        private _shadowsExposure;
        /**
         * Gets the shadows Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        get shadowsHue(): number;
        /**
         * Sets the shadows Hue value.
         * The hue value is a standard HSB hue in the range [0,360] where 0=red, 120=green and 240=blue. The default value is 30 degrees (orange).
         */
        set shadowsHue(value: number);
        /**
         * Gets the shadows Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        get shadowsDensity(): number;
        /**
         * Sets the shadows Density value.
         * The density value is in range [-100,+100] where 0 means the color filter has no effect and +100 means the color filter has maximum effect.
         * Values less than zero provide a filter of opposite hue.
         */
        set shadowsDensity(value: number);
        /**
         * Gets the shadows Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        get shadowsSaturation(): number;
        /**
         * Sets the shadows Saturation value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase saturation and negative values decrease saturation.
         */
        set shadowsSaturation(value: number);
        /**
         * Gets the shadows Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        get shadowsExposure(): number;
        /**
         * Sets the shadows Exposure value.
         * This is an adjustment value in the range [-100,+100], where the default value of 0.0 makes no adjustment, positive values increase exposure and negative values decrease exposure.
         */
        set shadowsExposure(value: number);
        /**
         * Returns the class name
         * @returns The class name
         */
        getClassName(): string;
        /**
         * Prepare the list of uniforms associated with the ColorCurves effects.
         * @param uniformsList The list of uniforms used in the effect
         */
        static PrepareUniforms: (uniformsList: string[]) => void;
        /**
         * Returns color grading data based on a hue, density, saturation and exposure value.
         * @param hue
         * @param density
         * @param saturation The saturation.
         * @param exposure The exposure.
         * @param result The result data container.
         */
        private _getColorGradingDataToRef;
        /**
         * Takes an input slider value and returns an adjusted value that provides extra control near the centre.
         * @param value The input slider value in range [-100,100].
         * @returns Adjusted value.
         */
        private static _ApplyColorGradingSliderNonlinear;
        /**
         * Returns an RGBA Color4 based on Hue, Saturation and Brightness (also referred to as value, HSV).
         * @param hue The hue (H) input.
         * @param saturation The saturation (S) input.
         * @param brightness The brightness (B) input.
         * @param result An RGBA color represented as Vector4.
         */
        private static _FromHSBToRef;
        /**
         * Returns a value clamped between min and max
         * @param value The value to clamp
         * @param min The minimum of value
         * @param max The maximum of value
         * @returns The clamped value.
         */
        private static _Clamp;
        /**
         * Clones the current color curve instance.
         * @returns The cloned curves
         */
        clone(): ColorCurves;
        /**
         * Serializes the current color curve instance to a json representation.
         * @returns a JSON representation
         */
        serialize(): any;
        /** @internal */
        _bind(effect: Effect, positiveUniform?: string, neutralUniform?: string, negativeUniform?: string): void;
    }
    /**
     * Parses the color curve from a json representation.
     * @param source the JSON source to parse
     * @returns The parsed curves
     */
    export function ColorCurvesParse(source: any): ColorCurves;
    /**
     * Binds the color curves to the shader.
     * @param colorCurves The color curve to bind
     * @param effect The effect to bind to
     * @param positiveUniform The positive uniform shader parameter
     * @param neutralUniform The neutral uniform shader parameter
     * @param negativeUniform The negative uniform shader parameter
     */
    export function ColorCurvesBind(colorCurves: ColorCurves, effect: Effect, positiveUniform?: string, neutralUniform?: string, negativeUniform?: string): void;
    /**
     * Register side effects for colorCurves.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorCurves(): void;


    /**
     * Prepare the list of uniforms associated with the ColorCurves effects.
     * @param uniformsList The list of uniforms used in the effect
     */
    export function PrepareUniformsForColorCurves(uniformsList: string[]): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorCurves.pure for tree-shakeable, side-effect-free usage.
     */


    /** @internal */
    export function AddClipPlaneUniforms(uniforms: string[]): void;
    /** @internal */
    export function PrepareStringDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: string[]): void;
    /** @internal */
    export function PrepareDefinesForClipPlanes(primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder, defines: Record<string, any>): boolean;
    /** @internal */
    export function BindClipPlane(effect: Effect, primaryHolder: IClipPlanesHolder, secondaryHolder: IClipPlanesHolder): void;


    /** This file must only contain pure code and pure imports */
    /**
     * Settings for finer control over video usage
     */
    export interface VideoTextureSettings {
        /**
         * Applies `autoplay` to video, if specified
         */
        autoPlay?: boolean;
        /**
         * Applies `muted` to video, if specified
         */
        muted?: boolean;
        /**
         * Applies `loop` to video, if specified
         */
        loop?: boolean;
        /**
         * Automatically updates internal texture from video at every frame in the render loop
         */
        autoUpdateTexture: boolean;
        /**
         * Image src displayed during the video loading or until the user interacts with the video.
         */
        poster?: string;
        /**
         * Defines the associated texture format.
         */
        format?: number;
        /**
         * Notify babylon to not modify any video settings and not control the video's playback.
         * Set this to true if you are controlling the way the video is being played, stopped and paused.
         */
        independentVideoSource?: boolean;
    }
    /**
     * If you want to display a video in your scene, this is the special texture for that.
     * This special texture works similar to other textures, with the exception of a few parameters.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/videoTexture
     */
    export class VideoTexture extends Texture {
        /**
         * Tells whether textures will be updated automatically or user is required to call `updateTexture` manually
         */
        readonly autoUpdateTexture: boolean;
        /**
         * The video instance used by the texture internally
         */
        readonly video: HTMLVideoElement;
        private _externalTexture;
        private _onUserActionRequestedObservable;
        /**
         * Event triggered when a dom action is required by the user to play the video.
         * This happens due to recent changes in browser policies preventing video to auto start.
         */
        get onUserActionRequestedObservable(): Observable<Texture>;
        private _generateMipMaps;
        private _stillImageCaptured;
        private _displayingPosterTexture;
        private _settings;
        private _createInternalTextureOnEvent;
        private _frameId;
        private _currentSrc;
        private _onError?;
        private _errorFound;
        /**
         * Serialize the flag to define this texture as a video texture
         */
        readonly isVideo = true;
        private _processError;
        private _handlePlay;
        /**
         * Creates a video texture.
         * If you want to display a video in your scene, this is the special texture for that.
         * This special texture works similar to other textures, with the exception of a few parameters.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/videoTexture
         * @param name optional name, will detect from video source, if not defined
         * @param src can be used to provide an url, array of urls or an already setup HTML video element.
         * @param scene is obviously the current scene.
         * @param generateMipMaps can be used to turn on mipmaps (Can be expensive for videoTextures because they are often updated).
         * @param invertY is false by default but can be used to invert video on Y axis
         * @param samplingMode controls the sampling method and is set to TRILINEAR_SAMPLINGMODE by default
         * @param settings allows finer control over video usage
         * @param onError defines a callback triggered when an error occurred during the loading session
         * @param format defines the texture format to use (Engine.TEXTUREFORMAT_RGBA by default)
         */
        constructor(name: Nullable<string>, src: string | string[] | HTMLVideoElement, scene: Nullable<Scene>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, settings?: Partial<VideoTextureSettings>, onError?: Nullable<(message?: string, exception?: any) => void>, format?: number);
        /**
         * Get the current class name of the video texture useful for serialization or dynamic coding.
         * @returns "VideoTexture"
         */
        getClassName(): string;
        private _getName;
        private _getVideo;
        private _resizeInternalTexture;
        private _createInternalTexture;
        private _reset;
        /**
         * @internal Internal method to initiate `update`.
         */
        _rebuild(): void;
        /**
         * Update Texture in the `auto` mode. Does not do anything if `settings.autoUpdateTexture` is false.
         */
        update(): void;
        /**
         * Update Texture in `manual` mode. Does not do anything if not visible or paused.
         * @param isVisible Visibility state, detected by user using `scene.getActiveMeshes()` or otherwise.
         */
        updateTexture(isVisible: boolean): void;
        protected _updateInternalTexture: () => void;
        /**
         * Get the underlying external texture (if supported by the current engine, else null)
         */
        get externalTexture(): Nullable<ExternalTexture>;
        /**
         * Change video content. Changing video instance or setting multiple urls (as in constructor) is not supported.
         * @param url New url.
         */
        updateURL(url: string): void;
        /**
         * Clones the texture.
         * @returns the cloned texture
         */
        clone(): VideoTexture;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
        /**
         * Creates a video texture straight from a stream.
         * @param scene Define the scene the texture should be created in
         * @param stream Define the stream the texture should be created from
         * @param constraints video constraints
         * @param invertY Defines if the video should be stored with invert Y set to true (true by default)
         * @returns The created video texture as a promise
         */
        static CreateFromStreamAsync(scene: Scene, stream: MediaStream, constraints: any, invertY?: boolean): Promise<VideoTexture>;
        /**
         * Creates a video texture straight from your WebCam video feed.
         * @param scene Define the scene the texture should be created in
         * @param constraints Define the constraints to use to create the web cam feed from WebRTC
         * @param audioConstaints Define the audio constraints to use to create the web cam feed from WebRTC
         * @param invertY Defines if the video should be stored with invert Y set to true (true by default)
         * @returns The created video texture as a promise
         */
        static CreateFromWebCamAsync(scene: Scene, constraints: {
            minWidth: number;
            maxWidth: number;
            minHeight: number;
            maxHeight: number;
            deviceId: string;
        } & MediaTrackConstraints, audioConstaints?: boolean | MediaTrackConstraints, invertY?: boolean): Promise<VideoTexture>;
        /**
         * Creates a video texture straight from your WebCam video feed.
         * @param scene Defines the scene the texture should be created in
         * @param onReady Defines a callback to triggered once the texture will be ready
         * @param constraints Defines the constraints to use to create the web cam feed from WebRTC
         * @param audioConstaints Defines the audio constraints to use to create the web cam feed from WebRTC
         * @param invertY Defines if the video should be stored with invert Y set to true (true by default)
         */
        static CreateFromWebCam(scene: Scene, onReady: (videoTexture: VideoTexture) => void, constraints: {
            minWidth: number;
            maxWidth: number;
            minHeight: number;
            maxHeight: number;
            deviceId: string;
        } & MediaTrackConstraints, audioConstaints?: boolean | MediaTrackConstraints, invertY?: boolean): void;
    }
    /**
     * Register side effects for videoTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVideoTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import videoTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Base class of all the textures in babylon.
     * It groups all the common properties required to work with Thin Engine.
     */
    export class ThinTexture {
        protected _wrapU: number;
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapU(): number;
        set wrapU(value: number);
        protected _wrapV: number;
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapV(): number;
        set wrapV(value: number);
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        wrapR: number;
        /**
         * With compliant hardware and browser (supporting anisotropic filtering)
         * this defines the level of anisotropic filtering in the texture.
         * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.
         */
        anisotropicFilteringLevel: number;
        /**
         * Define the current state of the loading sequence when in delayed load mode.
         */
        delayLoadState: number;
        /**
         * How a texture is mapped.
         * Unused in thin texture mode.
         */
        get coordinatesMode(): number;
        /**
         * Define if the texture is a cube texture or if false a 2d texture.
         */
        get isCube(): boolean;
        protected set isCube(value: boolean);
        /**
         * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.
         */
        get is3D(): boolean;
        protected set is3D(value: boolean);
        /**
         * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.
         */
        get is2DArray(): boolean;
        protected set is2DArray(value: boolean);
        /**
         * Get the class name of the texture.
         * @returns "ThinTexture"
         */
        getClassName(): string;
        /** @internal */
        _texture: Nullable<InternalTexture>;
        protected _engine: Nullable<AbstractEngine>;
        private _cachedSize;
        private _cachedBaseSize;
        private static _IsRenderTargetWrapper;
        /**
         * Instantiates a new ThinTexture.
         * Base class of all the textures in babylon.
         * This can be used as an internal texture wrapper in AbstractEngine to benefit from the cache
         * @param internalTexture Define the internalTexture to wrap. You can also pass a RenderTargetWrapper, in which case the texture will be the render target's texture
         */
        constructor(internalTexture: Nullable<InternalTexture | RenderTargetWrapper>);
        /**
         * Get if the texture is ready to be used (downloaded, converted, mip mapped...).
         * @returns true if fully ready
         */
        isReady(): boolean;
        /**
         * Triggers the load sequence in delayed load mode.
         */
        delayLoad(): void;
        /**
         * Get the underlying lower level texture from Babylon.
         * @returns the internal texture
         */
        getInternalTexture(): Nullable<InternalTexture>;
        /**
         * Get the size of the texture.
         * @returns the texture size.
         */
        getSize(): ISize;
        /**
         * Get the base size of the texture.
         * It can be different from the size if the texture has been resized for POT for instance
         * @returns the base size
         */
        getBaseSize(): ISize;
        /** @internal */
        protected _initialSamplingMode: number;
        /**
         * Get the current sampling mode associated with the texture.
         */
        get samplingMode(): number;
        /**
         * Update the sampling mode of the texture.
         * Default is Trilinear mode.
         *
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 1     | NEAREST_SAMPLINGMODE or NEAREST_NEAREST_MIPLINEAR  | Nearest is: mag = nearest, min = nearest, mip = linear |
         * | 2     | BILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPNEAREST | Bilinear is: mag = linear, min = linear, mip = nearest |
         * | 3     | TRILINEAR_SAMPLINGMODE or LINEAR_LINEAR_MIPLINEAR | Trilinear is: mag = linear, min = linear, mip = linear |
         * | 4     | NEAREST_NEAREST_MIPNEAREST |             |
         * | 5    | NEAREST_LINEAR_MIPNEAREST |             |
         * | 6    | NEAREST_LINEAR_MIPLINEAR |             |
         * | 7    | NEAREST_LINEAR |             |
         * | 8    | NEAREST_NEAREST |             |
         * | 9   | LINEAR_NEAREST_MIPNEAREST |             |
         * | 10   | LINEAR_NEAREST_MIPLINEAR |             |
         * | 11   | LINEAR_LINEAR |             |
         * | 12   | LINEAR_NEAREST |             |
         *
         *    > _mag_: magnification filter (close to the viewer)
         *    > _min_: minification filter (far from the viewer)
         *    > _mip_: filter used between mip map levels
         *@param samplingMode Define the new sampling mode of the texture
         *@param generateMipMaps Define if the texture should generate mip maps or not. Default is false.
         */
        updateSamplingMode(samplingMode: number, generateMipMaps?: boolean): void;
        /**
         * Release and destroy the underlying lower level texture aka internalTexture.
         */
        releaseInternalTexture(): void;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
    }


    /**
     * This is a tiny helper class to wrap a RenderTargetWrapper in a texture
     * usable as the input of an effect.
     */
    export class ThinRenderTargetTexture extends ThinTexture implements IRenderTargetTexture {
        private readonly _renderTargetOptions;
        private _renderTarget;
        private _size;
        /**
         * Gets the render target wrapper associated with this render target
         */
        get renderTarget(): Nullable<RenderTargetWrapper>;
        /**
         * Instantiates a new ThinRenderTargetTexture.
         * Tiny helper class to wrap a RenderTargetWrapper in a texture.
         * This can be used as an internal texture wrapper in ThinEngine to benefit from the cache and to hold on the associated RTT
         * @param engine Define the internalTexture to wrap
         * @param size Define the size of the RTT to create
         * @param options Define rendertarget options
         */
        constructor(engine: ThinEngine, size: TextureSize, options: RenderTargetCreationOptions);
        /**
         * Resize the texture to a new desired size.
         * Be careful as it will recreate all the data in the new texture.
         * @param size Define the new size. It can be:
         *   - a number for squared texture,
         *   - an object containing { width: number, height: number }
         */
        resize(size: TextureSize): void;
        /**
         * Get the underlying lower level texture from Babylon.
         * @returns the internal texture
         */
        getInternalTexture(): Nullable<InternalTexture>;
        /**
         * Get the class name of the texture.
         * @returns "ThinRenderTargetTexture"
         */
        getClassName(): string;
        /**
         * Dispose the texture and release its associated resources.
         * @param disposeOnlyFramebuffers if set to true it will dispose only the frame buffers (default: false)
         */
        dispose(disposeOnlyFramebuffers?: boolean): void;
    }


    /**
     * Class used to store a texture sampler data
     */
    export class TextureSampler {
        /**
         * Gets the sampling mode of the texture
         */
        samplingMode: number;
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapU(): Nullable<number>;
        set wrapU(value: Nullable<number>);
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapV(): Nullable<number>;
        set wrapV(value: Nullable<number>);
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapR(): Nullable<number>;
        set wrapR(value: Nullable<number>);
        /**
         * With compliant hardware and browser (supporting anisotropic filtering)
         * this defines the level of anisotropic filtering in the texture.
         * The higher the better but the slower.
         */
        get anisotropicFilteringLevel(): Nullable<number>;
        set anisotropicFilteringLevel(value: Nullable<number>);
        /**
         * Gets or sets the comparison function (Constants.LESS, Constants.EQUAL, etc). Set 0 to not use a comparison function
         */
        get comparisonFunction(): number;
        set comparisonFunction(value: number);
        protected _useMipMaps: Nullable<boolean>;
        /**
         * Indicates to use the mip maps (if available on the texture).
         * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)
         */
        get useMipMaps(): Nullable<boolean>;
        set useMipMaps(value: Nullable<boolean>);
        /** @internal */
        _cachedWrapU: Nullable<number>;
        /** @internal */
        _cachedWrapV: Nullable<number>;
        /** @internal */
        _cachedWrapR: Nullable<number>;
        /** @internal */
        _cachedAnisotropicFilteringLevel: Nullable<number>;
        /** @internal */
        _comparisonFunction: number;
        /**
         * General label used for debugging or storing a name.
         */
        label?: string;
        /**
         * Creates a Sampler instance
         */
        constructor();
        /**
         * Sets all the parameters of the sampler
         * @param wrapU u address mode (default: TEXTURE_WRAP_ADDRESSMODE)
         * @param wrapV v address mode (default: TEXTURE_WRAP_ADDRESSMODE)
         * @param wrapR r address mode (default: TEXTURE_WRAP_ADDRESSMODE)
         * @param anisotropicFilteringLevel anisotropic level (default: 1)
         * @param samplingMode sampling mode (default: Constants.TEXTURE_BILINEAR_SAMPLINGMODE)
         * @param comparisonFunction comparison function (default: 0 - no comparison function)
         * @returns the current sampler instance
         */
        setParameters(wrapU?: number, wrapV?: number, wrapR?: number, anisotropicFilteringLevel?: number, samplingMode?: number, comparisonFunction?: number): TextureSampler;
        /**
         * Compares this sampler with another one
         * @param other sampler to compare with
         * @returns true if the samplers have the same parametres, else false
         */
        compareSampler(other: TextureSampler): boolean;
    }


    /**
     * Specifies the color space of a texture operand.
     * When `sRGB` is set the sampled RGB values are converted to linear space before any channel
     * swizzle, factor multiplication, or arithmetic operation. Alpha is always treated as linear.
     */
    export enum TextureColorSpace {
        /** Texture data is already in linear space (default). No conversion applied. */
        Linear = 0,
        /** Texture data is in sRGB (gamma) space. RGB channels are linearized (IEC 61966-2-1) before use. */
        SRGB = 1
    }
    /**
     * Bitmask controlling which channels are written to the output texture by a processing operation.
     * Channels excluded from the mask receive a sensible default: `0.0` for RGB channels, `1.0` for alpha.
     * Use `ChannelMask.RGBA` (or omit the parameter) to pass all channels through unchanged.
     *
     * | Flag | Channels written | Excluded channels |
     * |------|-----------------|-------------------|
     * | R    | red             | G=0, B=0, A=1     |
     * | G    | green           | R=0, B=0, A=1     |
     * | B    | blue            | R=0, G=0, A=1     |
     * | A    | alpha           | R=0, G=0, B=0     |
     * | RGB  | red, green, blue | A=1              |
     * | RGBA | all four        | (none)            |
     */
    export enum ChannelMask {
        /** Pass only the red channel; G=0, B=0, A=1. */
        R = 1,
        /** Pass only the green channel; R=0, B=0, A=1. */
        G = 2,
        /** Pass only the blue channel; R=0, G=0, A=1. */
        B = 4,
        /** Pass only the alpha channel; R=0, G=0, B=0. */
        A = 8,
        /** Pass red, green, and blue; alpha is forced to 1.0. */
        RGB = 7,
        /** Pass all four channels unchanged (default — no masking). */
        RGBA = 15
    }
    /**
     * Specifies which channel of a texture to read for an operation.
     * When a single channel is selected its scalar value is broadcast to RGB; alpha
     * is either preserved from the original sample or replicated when `A` is chosen.
     *
     * | Value | Swizzle |
     * |-------|---------|
     * | RGBA  | (r, g, b, a) — no swizzle (default) |
     * | R     | (r, r, r, a) |
     * | G     | (g, g, g, a) |
     * | B     | (b, b, b, a) |
     * | A     | (a, a, a, a) |
     */
    export enum TextureChannel {
        /** Use all four channels as sampled (default). */
        RGBA = 0,
        /** Broadcast the red channel to RGB; preserve alpha: RRRA. */
        R = 1,
        /** Broadcast the green channel to RGB; preserve alpha: GGGA. */
        G = 2,
        /** Broadcast the blue channel to RGB; preserve alpha: BBBA. */
        B = 3,
        /** Broadcast the alpha channel to all four components: AAAA. */
        A = 4
    }
    /**
     * Represents an operand for a texture processing operation, or the result of one.
     *
     * As an operand, the value evaluates to a vec4 per texel:
     * - `texture` only → `sample(texture)`
     * - `factor` only → `factor` (constant)
     * - both → `sample(texture) * factor`
     *
     * As a result returned by a processing function:
     * - `texture` holds the GPU-processed output; `dispose()` releases it when no longer needed.
     * - `factor` holds a CPU-folded constant when all inputs were texture-free; no `dispose` is set.
     *
     * Results are directly usable as operands to subsequent operations. When a result with a
     * `dispose` function is passed as an operand, the next operation automatically calls `dispose`
     * after consuming it, so intermediate textures are cleaned up without manual tracking.
     *
     * At least one of `texture` or `factor` must be provided when used as an operand.
     */
    export interface ITextureProcessOperand {
        /**
         * Texture to sample. When combined with `factor`, the sampled value is multiplied
         * component-wise by the factor. Null when the operand or result is a constant.
         */
        texture: Nullable<BaseTexture>;
        /**
         * Optional constant RGBA factor. If `texture` is also set, the sampled value is
         * multiplied by this factor. If `texture` is not set, this becomes the constant output.
         * When omitted and `texture` is set, defaults to (1, 1, 1, 1) — no scaling.
         */
        factor?: Color4;
        /**
         * Optional channel selection applied to the sampled texture value before any factor
         * multiplication. When omitted or set to `TextureChannel.RGBA`, the sample is used
         * as-is. When set to a single channel, that channel's scalar is broadcast to RGB
         * (or all four components for `TextureChannel.A`). Only meaningful when `texture` is set.
         */
        channel?: TextureChannel;
        /**
         * Color space of the texture data. When set to `TextureColorSpace.SRGB`, the sampled
         * RGB channels are converted from sRGB to linear space (IEC 61966-2-1) before the channel
         * swizzle, factor multiplication, and any arithmetic operation. Alpha is always linear.
         * Defaults to `TextureColorSpace.Linear` (no conversion). Only meaningful when `texture` is set.
         */
        colorSpace?: TextureColorSpace;
        /**
         * Disposes the texture produced by a processing operation. Only present on results
         * returned by the texture processing functions. When a result is passed as an operand
         * to the next operation in a chain, its `dispose` is called automatically after the
         * GPU pass completes. Call `dispose` explicitly on the final result when the texture
         * is no longer needed (or skip it if transferring ownership to a material).
         */
        dispose?: () => void;
    }
    /**
     * Create an operand from a texture alone (no constant factor scaling).
     * @param texture - The texture to sample, or null to produce an identity (1,1,1,1) constant operand
     * @param channel - Optional channel selection. When set, the sampled value is swizzled before use
     *   (e.g. `TextureChannel.R` → RRRA). Defaults to `TextureChannel.RGBA` (no swizzle).
     * @param colorSpace - Optional color space. When `TextureColorSpace.SRGB`, the sampled RGB channels
     *   are linearized before use. Defaults to `TextureColorSpace.Linear`.
     * @returns An operand that evaluates to the sampled texture value
     */
    export function CreateTextureOperand(texture: Nullable<BaseTexture>, channel?: TextureChannel, colorSpace?: TextureColorSpace): ITextureProcessOperand;
    /**
     * Create an operand from a constant RGBA factor with no texture.
     * @param factor - The constant RGBA value
     * @returns An operand that evaluates to the constant factor
     */
    export function CreateFactorOperand(factor: Color4): ITextureProcessOperand;
    /**
     * Create an operand from a texture multiplied by a constant RGBA factor.
     * This is the standard glTF pattern (e.g. baseColorTexture * baseColorFactor).
     * If `texture` is null, returns a factor-only operand.
     * @param texture - The texture to sample, or null to use the factor alone
     * @param factor - The constant factor to multiply by
     * @param channel - Optional channel selection. When set, the sampled value is swizzled before
     *   factor multiplication (e.g. `TextureChannel.G` → GGGA, then multiplied by factor).
     *   Defaults to `TextureChannel.RGBA` (no swizzle).
     * @param colorSpace - Optional color space. When `TextureColorSpace.SRGB`, the sampled RGB channels
     *   are linearized before factor multiplication. Defaults to `TextureColorSpace.Linear`.
     * @returns An operand that evaluates to `sample(texture) * factor`, or `factor` if texture is null
     */
    export function CreateTextureWithFactorOperand(texture: Nullable<BaseTexture>, factor: Color4, channel?: TextureChannel, colorSpace?: TextureColorSpace): ITextureProcessOperand;
    /**
     * Multiply two texture operands together, component-wise: `result = a * b`.
     *
     * Each operand can be a texture, a constant factor, or a texture scaled by a factor.
     * This is useful for applying glTF-style factors to textures (e.g. `baseColorTexture * baseColorFactor`),
     * or for modulating one texture by another.
     *
     * If both operands are constant (no textures), the multiplication is performed on the CPU and
     * the result is returned as a factor-only operand with no texture allocated.
     *
     * When operands are results of previous operations (i.e. they carry a `dispose` function),
     * their intermediate textures are automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param a - First operand
     * @param b - Second operand
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function MultiplyTexturesAsync(name: string, a: ITextureProcessOperand, b: ITextureProcessOperand, scene: Scene, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;
    /**
     * Take the component-wise maximum of two texture operands: `result = max(a, b)`.
     *
     * Each operand can be a texture, a constant factor, or a texture scaled by a factor.
     * Useful for operations such as combining ambient occlusion maps or taking the
     * brightest contribution from two sources.
     *
     * If both operands are constant (no textures), the operation is performed on the CPU and
     * the result is returned as a factor-only operand with no texture allocated.
     *
     * When operands are results of previous operations (i.e. they carry a `dispose` function),
     * their intermediate textures are automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param a - First operand
     * @param b - Second operand
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function MaxTexturesAsync(name: string, a: ITextureProcessOperand, b: ITextureProcessOperand, scene: Scene, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;
    /**
     * Linearly interpolate between two texture operands: `result = mix(a, b, t)`.
     *
     * Each operand can be a texture, a constant factor, or a texture scaled by a factor.
     * The `t` operand controls the blend weight per texel, per channel — a value of 0 returns `a`,
     * a value of 1 returns `b`. Use a grayscale texture or a scalar `Color4(v, v, v, v)` for
     * uniform blending across all channels.
     *
     * If all three operands are constant (no textures), the interpolation is performed on the CPU and
     * the result is returned as a factor-only operand with no texture allocated.
     *
     * When operands are results of previous operations (i.e. they carry a `dispose` function),
     * their intermediate textures are automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param a - Start value operand (returned when t = 0)
     * @param b - End value operand (returned when t = 1)
     * @param t - Blend weight operand. Each channel independently controls the blend for the corresponding output channel.
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function LerpTexturesAsync(name: string, a: ITextureProcessOperand, b: ITextureProcessOperand, t: ITextureProcessOperand, scene: Scene, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;
    /**
     * Invert selected channels of a texture operand: `result[ch] = 1 - input[ch]`.
     *
     * The `channels` bitmask selects which channels are inverted; unselected channels pass through
     * unchanged. Use `ChannelMask.RGB` for the common roughness↔smoothness conversion, or
     * `ChannelMask.RGBA` (the default) to invert the entire texture.
     *
     * This is a unary operation — only operand A is used. Any `colorSpace` or `channel` properties
     * on the input operand are honoured (sRGB linearization and channel swizzle applied before
     * the invert).
     *
     * If the input is constant (no texture), the invert is performed on the CPU.
     *
     * When the input is the result of a previous operation (i.e. it carries a `dispose` function),
     * its intermediate texture is automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param input - Operand to invert
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param channels - Bitmask of channels to invert. Defaults to `ChannelMask.RGBA`.
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function InvertTextureAsync(name: string, input: ITextureProcessOperand, scene: Scene, channels?: ChannelMask, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;
    /**
     * Extract the per-texel maximum channel value from a texture and broadcast it to all output
     * channels, producing a single-value (greyscale) texture in a single GPU pass.
     *
     * For each texel, computes `max(r, g, b)` — or `max(r, g, b, a)` when `includeAlpha` is true —
     * and writes that scalar to the output:
     * - `includeAlpha = false` (default): output is `(m, m, m, a)` where `m = max(r, g, b)`
     * - `includeAlpha = true`:            output is `(m, m, m, m)` where `m = max(r, g, b, a)`
     *
     * This is more efficient than chaining `ExtractChannelAsync` calls through `MaxTexturesAsync`,
     * which would require multiple intermediate textures and GPU passes.
     *
     * Any `colorSpace` or `channel` properties on the input operand are honoured (sRGB linearization
     * and channel swizzle applied before the max reduction).
     *
     * If the input is constant (no texture), the reduction is performed on the CPU.
     *
     * When the input is the result of a previous operation (i.e. it carries a `dispose` function),
     * its intermediate texture is automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param input - Operand to reduce
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param includeAlpha - When true, alpha participates in the max and is also set to the result.
     *   Defaults to false (alpha is preserved from the input).
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function ExtractMaxChannelAsync(name: string, input: ITextureProcessOperand, scene: Scene, includeAlpha?: boolean, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;
    /**
     * Extract a single channel from a texture and broadcast it to RGB (or all four components for
     * `TextureChannel.A`), producing a new texture. This is a convenience wrapper over
     * `MultiplyTexturesAsync` with a `(1,1,1,1)` factor and the requested channel swizzle applied
     * to the input.
     *
     * Swizzle results per channel:
     * - `TextureChannel.R` → (r, r, r, a)
     * - `TextureChannel.G` → (g, g, g, a)
     * - `TextureChannel.B` → (b, b, b, a)
     * - `TextureChannel.A` → (a, a, a, a)
     *
     * If the input is constant (no texture), the swizzle is applied on the CPU.
     *
     * Any `colorSpace` property on the input operand is honoured (sRGB linearization applied before
     * the swizzle). Any existing `channel` on the input is replaced by the `channel` argument.
     *
     * When the input is the result of a previous operation (i.e. it carries a `dispose` function),
     * its intermediate texture is automatically released after the GPU pass completes.
     *
     * @param name - Name for the resulting procedural texture (used only when a GPU pass is needed)
     * @param input - Operand to extract the channel from
     * @param channel - The channel to extract and broadcast
     * @param scene - Scene to create the texture in (used only when a GPU pass is needed)
     * @param outputColorSpace - Optional output color space. When `TextureColorSpace.SRGB`, the linear
     *   result is converted to sRGB (IEC 61966-2-1) before being written. Defaults to `TextureColorSpace.Linear`.
     * @param outputChannelMask - Optional bitmask of channels to write. Excluded color channels are set to
     *   `0.0`; excluded alpha is set to `1.0`. Defaults to `ChannelMask.RGBA` (all channels written).
     * @returns An operand whose `texture` holds the GPU result, or whose `factor` holds the CPU-folded constant
     */
    export function ExtractChannelAsync(name: string, input: ITextureProcessOperand, channel: TextureChannel, scene: Scene, outputColorSpace?: TextureColorSpace, outputChannelMask?: ChannelMask): Promise<ITextureProcessOperand>;


    /**
     * Configuration for a texture input source
     */
    export interface ITextureChannelInput {
        /** The texture to use as input */
        texture: BaseTexture;
        /** Source channel to read from (0=R, 1=G, 2=B, 3=A) */
        sourceChannel: number;
    }
    /**
     * Configuration for a constant value input source
     */
    export interface IConstantChannelInput {
        /** Constant value between 0.0 and 1.0 */
        value: number;
    }
    /**
     * Union type for channel input sources
     */
    export type ChannelInput = ITextureChannelInput | IConstantChannelInput;
    /**
     * Configuration for texture merging operation
     */
    export interface ITextureMergeConfiguration {
        /** Configuration for red output channel */
        red: ChannelInput;
        /** Configuration for green output channel (optional, defaults to 0) */
        green?: ChannelInput;
        /** Configuration for blue output channel (optional, defaults to 0) */
        blue?: ChannelInput;
        /** Configuration for alpha output channel (optional, defaults to 1) */
        alpha?: ChannelInput;
        /** Output texture size. If not specified, uses the largest input texture size */
        outputSize?: TextureSize;
        /** Whether to generate mipmaps for the output texture */
        generateMipMaps?: boolean;
    }
    /**
     * @internal
     * Merge multiple texture channels into a single texture
     * @param name Name for the resulting texture
     * @param config Merge configuration
     * @param scene Scene to create the texture in
     * @returns The merged texture
     */
    export function MergeTexturesAsync(name: string, config: ITextureMergeConfiguration, scene: Scene): Promise<ProceduralTexture>;
    /**
     * @internal
     * Create a texture input configuration
     * @param texture The texture to read from
     * @param sourceChannel The channel to read (0=R, 1=G, 2=B, 3=A)
     * @returns Texture channel input configuration
     */
    export function CreateTextureInput(texture: BaseTexture, sourceChannel: number): ITextureChannelInput;
    /**
     * @internal
     * Create a constant value input configuration
     * @param value The constant value (0.0-1.0)
     * @returns Constant channel input configuration
     */
    export function CreateConstantInput(value: number): IConstantChannelInput;
    /**
     * @internal
     * Create a simple RGBA channel packing configuration
     * @param red Input for red channel
     * @param green Input for green channel (optional, defaults to 0)
     * @param blue Input for blue channel (optional, defaults to 0)
     * @param alpha Input for alpha channel (optional, defaults to 1)
     * @returns Texture merge configuration
     */
    export function CreateRGBAConfiguration(red: ChannelInput, green?: ChannelInput, blue?: ChannelInput, alpha?: ChannelInput): ITextureMergeConfiguration;


    /**
     * Checks if a given format is a depth texture format
     * @param format Format to check
     * @returns True if the format is a depth texture format
     */
    export function IsDepthTexture(format: number): boolean;
    /**
     * Gets the type of a depth texture for a given format
     * @param format Format of the texture
     * @returns The type of the depth texture
     */
    export function GetTypeForDepthTexture(format: number): number;
    /**
     * Checks if a given format has a stencil aspect
     * @param format Format to check
     * @returns True if the format has a stencil aspect
     */
    export function HasStencilAspect(format: number): boolean;


    /**
     * Define options used to create an internal texture
     */
    export interface InternalTextureCreationOptions {
        /** Specifies if mipmaps must be created. If undefined, the value from generateMipMaps is taken instead */
        createMipMaps?: boolean;
        /** Specifies if mipmaps must be generated */
        generateMipMaps?: boolean;
        /** Defines texture type (unsigned byte by default) */
        type?: number;
        /** Defines sampling mode (trilinear by default) */
        samplingMode?: number;
        /** Defines format (RGBA by default) */
        format?: number;
        /** Defines sample count (1 by default) */
        samples?: number;
        /** Texture creation flags */
        creationFlags?: number;
        /** Creates the RTT in sRGB space */
        useSRGBBuffer?: boolean;
        /** Label of the texture (used for debugging only) */
        label?: string;
        /** If the MSAA texture must be created right away (default: false) */
        createMSAATexture?: boolean;
        /** Comparison function. Used only for depth textures (default: 0) */
        comparisonFunction?: number;
        /** If the created texture is a cube texture */
        isCube?: boolean;
    }
    /**
     * Define options used to create a render target texture
     */
    export interface RenderTargetCreationOptions extends InternalTextureCreationOptions {
        /** Specifies whether or not a depth should be allocated in the texture (true by default) */
        generateDepthBuffer?: boolean;
        /** Specifies whether or not a stencil should be allocated in the texture (false by default)*/
        generateStencilBuffer?: boolean;
        /** Specifies that no color target should be bound to the render target (useful if you only want to write to the depth buffer, for eg) */
        noColorAttachment?: boolean;
        /** Specifies the internal texture to use directly instead of creating one (ignores `noColorAttachment` flag when set) **/
        colorAttachment?: InternalTexture;
    }
    /**
     * Define options used to create a depth texture
     */
    export interface DepthTextureCreationOptions {
        /** Specifies whether or not a stencil should be allocated in the texture. Not used if depthTextureFormat is supplied, in which case stencil creation will depend on this value. */
        generateStencil?: boolean;
        /** Specifies whether or not bilinear filtering is enable on the texture */
        bilinearFiltering?: boolean;
        /** Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode */
        comparisonFunction?: number;
        /** Specifies if the created texture is a cube texture */
        isCube?: boolean;
        /** Specifies the sample count of the depth/stencil texture texture */
        samples?: number;
        /** Specifies the depth texture format to use */
        depthTextureFormat?: number;
        /** Label of the texture (used for debugging only) */
        label?: string;
    }
    /**
     * Type used to define a texture size (either with a number or with a rect width and height)
     */
    export type TextureSize = number | {
        width: number;
        height: number;
        depth?: number;
        layers?: number;
    };
    /**
     * Check if a TextureSize is an object
     * @param size The TextureSize to check
     * @returns True if the TextureSize is an object
     */
    export function textureSizeIsObject(size: TextureSize): size is {
        width: number;
        height: number;
    };
    /**
     * Get the width/height dimensions from a TextureSize
     * @param size The TextureSize to get the dimensions from
     * @returns The width and height as an object
     */
    export function getDimensionsFromTextureSize(size: TextureSize): {
        width: number;
        height: number;
    };


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the available options when creating a texture
     */
    export interface ITextureCreationOptions {
        /** Defines if the texture will require mip maps or not (default: false) */
        noMipmap?: boolean;
        /** Defines if the texture needs to be inverted on the y axis during loading (default: true) */
        invertY?: boolean;
        /** Defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...) (default: Texture.TRILINEAR_SAMPLINGMODE) */
        samplingMode?: number;
        /** Defines a callback triggered when the texture has been loaded (default: null) */
        onLoad?: Nullable<() => void>;
        /** Defines a callback triggered when an error occurred during the loading session (default: null) */
        onError?: Nullable<(message?: string, exception?: any) => void>;
        /** Defines the buffer to load the texture from in case the texture is loaded from a buffer representation (default: null) */
        buffer?: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>;
        /** Defines if the buffer we are loading the texture from should be deleted after load (default: false) */
        deleteBuffer?: boolean;
        /** Defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...) (default: ) */
        format?: number;
        /** Defines an optional mime type information (default: undefined) */
        mimeType?: string;
        /** Options to be passed to the loader (default: undefined) */
        loaderOptions?: any;
        /** Specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg) (default: undefined) */
        creationFlags?: number;
        /** Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false) */
        useSRGBBuffer?: boolean;
        /** Defines the underlying texture from an already existing one */
        internalTexture?: InternalTexture;
        /** Defines the underlying texture texture space */
        gammaSpace?: boolean;
        /** Defines the extension to use to pick the right loader */
        forcedExtension?: string;
    }
    /**
     * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture
     */
    export class Texture extends BaseTexture {
        /**
         * Gets or sets a general boolean used to indicate that textures containing direct data (buffers) must be saved as part of the serialization process
         */
        static SerializeBuffers: boolean;
        /**
         * Gets or sets a general boolean used to indicate that texture buffers must be saved as part of the serialization process.
         * If no buffer exists, one will be created as base64 string from the internal webgl data.
         */
        static ForceSerializeBuffers: boolean;
        /**
         * This observable will notify when any texture had a loading error
         */
        static OnTextureLoadErrorObservable: Observable<BaseTexture>;
        /** @internal */
        static _SerializeInternalTextureUniqueId: boolean;
        /**
         * @internal
         */
        static _CubeTextureParser: (jsonTexture: any, scene: Scene, rootUrl: string) => CubeTexture;
        /**
         * @internal
         */
        static _CreateMirror: (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean) => MirrorTexture;
        /**
         * @internal
         */
        static _CreateRenderTargetTexture: (name: string, renderTargetSize: number, scene: Scene, generateMipMaps: boolean, creationFlags?: number) => RenderTargetTexture;
        /**
         * @internal
         */
        static _CreateVideoTexture(name: Nullable<string>, src: string | string[] | HTMLVideoElement, scene: Nullable<Scene>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, settings?: Partial<VideoTextureSettings>, onError?: Nullable<(message?: string, exception?: any) => void>, format?: number): VideoTexture;
        /** nearest is mag = nearest and min = nearest and no mip */
        static readonly NEAREST_SAMPLINGMODE = 1;
        /** nearest is mag = nearest and min = nearest and mip = linear */
        static readonly NEAREST_NEAREST_MIPLINEAR = 8;
        /** Bilinear is mag = linear and min = linear and no mip */
        static readonly BILINEAR_SAMPLINGMODE = 2;
        /** Bilinear is mag = linear and min = linear and mip = nearest */
        static readonly LINEAR_LINEAR_MIPNEAREST = 11;
        /** Trilinear is mag = linear and min = linear and mip = linear */
        static readonly TRILINEAR_SAMPLINGMODE = 3;
        /** Trilinear is mag = linear and min = linear and mip = linear */
        static readonly LINEAR_LINEAR_MIPLINEAR = 3;
        /** mag = nearest and min = nearest and mip = nearest */
        static readonly NEAREST_NEAREST_MIPNEAREST = 4;
        /** mag = nearest and min = linear and mip = nearest */
        static readonly NEAREST_LINEAR_MIPNEAREST = 5;
        /** mag = nearest and min = linear and mip = linear */
        static readonly NEAREST_LINEAR_MIPLINEAR = 6;
        /** mag = nearest and min = linear and mip = none */
        static readonly NEAREST_LINEAR = 7;
        /** mag = nearest and min = nearest and mip = none */
        static readonly NEAREST_NEAREST = 1;
        /** mag = linear and min = nearest and mip = nearest */
        static readonly LINEAR_NEAREST_MIPNEAREST = 9;
        /** mag = linear and min = nearest and mip = linear */
        static readonly LINEAR_NEAREST_MIPLINEAR = 10;
        /** mag = linear and min = linear and mip = none */
        static readonly LINEAR_LINEAR = 2;
        /** mag = linear and min = nearest and mip = none */
        static readonly LINEAR_NEAREST = 12;
        /** Explicit coordinates mode */
        static readonly EXPLICIT_MODE = 0;
        /** Spherical coordinates mode */
        static readonly SPHERICAL_MODE = 1;
        /** Planar coordinates mode */
        static readonly PLANAR_MODE = 2;
        /** Cubic coordinates mode */
        static readonly CUBIC_MODE = 3;
        /** Projection coordinates mode */
        static readonly PROJECTION_MODE = 4;
        /** Inverse Cubic coordinates mode */
        static readonly SKYBOX_MODE = 5;
        /** Inverse Cubic coordinates mode */
        static readonly INVCUBIC_MODE = 6;
        /** Equirectangular coordinates mode */
        static readonly EQUIRECTANGULAR_MODE = 7;
        /** Equirectangular Fixed coordinates mode */
        static readonly FIXED_EQUIRECTANGULAR_MODE = 8;
        /** Equirectangular Fixed Mirrored coordinates mode */
        static readonly FIXED_EQUIRECTANGULAR_MIRRORED_MODE = 9;
        /** Texture is not repeating outside of 0..1 UVs */
        static readonly CLAMP_ADDRESSMODE = 0;
        /** Texture is repeating outside of 0..1 UVs */
        static readonly WRAP_ADDRESSMODE = 1;
        /** Texture is repeating and mirrored */
        static readonly MIRROR_ADDRESSMODE = 2;
        /**
         * Gets or sets a boolean which defines if the texture url must be build from the serialized URL instead of just using the name and loading them side by side with the scene file
         */
        static UseSerializedUrlIfAny: boolean;
        /**
         * Define the url of the texture.
         */
        url: Nullable<string>;
        /**
         * Define an offset on the texture to offset the u coordinates of the UVs
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting
         */
        uOffset: number;
        /**
         * Define an offset on the texture to offset the v coordinates of the UVs
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#offsetting
         */
        vOffset: number;
        /**
         * Define an offset on the texture to scale the u coordinates of the UVs
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling
         */
        uScale: number;
        /**
         * Define an offset on the texture to scale the v coordinates of the UVs
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials#tiling
         */
        vScale: number;
        /**
         * Define an offset on the texture to rotate around the u coordinates of the UVs
         * The angle is defined in radians.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials
         */
        uAng: number;
        /**
         * Define an offset on the texture to rotate around the v coordinates of the UVs
         * The angle is defined in radians.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials
         */
        vAng: number;
        /**
         * Define an offset on the texture to rotate around the w coordinates of the UVs (in case of 3d texture)
         * The angle is defined in radians.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/moreMaterials
         */
        wAng: number;
        /**
         * Defines the center of rotation (U)
         */
        uRotationCenter: number;
        /**
         * Defines the center of rotation (V)
         */
        vRotationCenter: number;
        /**
         * Defines the center of rotation (W)
         */
        wRotationCenter: number;
        /**
         * Sets this property to true to avoid deformations when rotating the texture with non-uniform scaling
         */
        homogeneousRotationInUVTransform: boolean;
        /**
         * Are mip maps generated for this texture or not.
         */
        get noMipmap(): boolean;
        /**
         * List of inspectable custom properties (used by the Inspector)
         * @see https://doc.babylonjs.com/toolsAndResources/inspector#extensibility
         */
        inspectableCustomProperties: Nullable<IInspectable[]>;
        /** @internal */
        _noMipmap: boolean;
        /** @internal */
        _invertY: boolean;
        private _rowGenerationMatrix;
        private _cachedTextureMatrix;
        private _projectionModeMatrix;
        private _t0;
        private _t1;
        private _t2;
        private _cachedUOffset;
        private _cachedVOffset;
        private _cachedUScale;
        private _cachedVScale;
        private _cachedUAng;
        private _cachedVAng;
        private _cachedWAng;
        private _cachedReflectionProjectionMatrixId;
        private _cachedURotationCenter;
        private _cachedVRotationCenter;
        private _cachedWRotationCenter;
        private _cachedHomogeneousRotationInUVTransform;
        private _cachedIdentity3x2;
        private _cachedReflectionTextureMatrix;
        private _cachedReflectionUOffset;
        private _cachedReflectionVOffset;
        private _cachedReflectionUScale;
        private _cachedReflectionVScale;
        private _cachedReflectionCoordinatesMode;
        /** @internal */
        _buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>;
        private _deleteBuffer;
        protected _format: Nullable<number>;
        private _delayedOnLoad;
        private _delayedOnError;
        private _mimeType?;
        private _loaderOptions?;
        private _creationFlags?;
        /** @internal */
        _useSRGBBuffer?: boolean;
        private _forcedExtension?;
        /** Returns the texture mime type if it was defined by a loader (undefined else) */
        get mimeType(): string | undefined;
        /**
         * Observable triggered once the texture has been loaded.
         */
        onLoadObservable: Observable<Texture>;
        protected _isBlocking: boolean;
        /**
         * Is the texture preventing material to render while loading.
         * If false, a default texture will be used instead of the loading one during the preparation step.
         */
        set isBlocking(value: boolean);
        get isBlocking(): boolean;
        /**
         * Gets a boolean indicating if the texture needs to be inverted on the y axis during loading
         */
        get invertY(): boolean;
        /**
         * Instantiates a new texture.
         * This represents a texture in babylon. It can be easily loaded from a network, base64 or html input.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction#texture
         * @param url defines the url of the picture to load as a texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture
         * @param invertY defines if the texture needs to be inverted on the y axis during loading
         * @param samplingMode defines the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)
         * @param onLoad defines a callback triggered when the texture has been loaded
         * @param onError defines a callback triggered when an error occurred during the loading session
         * @param buffer defines the buffer to load the texture from in case the texture is loaded from a buffer representation
         * @param deleteBuffer defines if the buffer we are loading the texture from should be deleted after load
         * @param format defines the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)
         * @param mimeType defines an optional mime type information
         * @param loaderOptions options to be passed to the loader
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param forcedExtension defines the extension to use to pick the right loader
         */
        constructor(url: Nullable<string>, sceneOrEngine?: Nullable<Scene | AbstractEngine>, noMipmapOrOptions?: boolean | ITextureCreationOptions, invertY?: boolean, samplingMode?: number, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, buffer?: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>, deleteBuffer?: boolean, format?: number, mimeType?: string, loaderOptions?: any, creationFlags?: number, forcedExtension?: string);
        /**
         * Update the url (and optional buffer) of this texture if url was null during construction.
         * @param url the url of the texture
         * @param buffer the buffer of the texture (defaults to null)
         * @param onLoad callback called when the texture is loaded  (defaults to null)
         * @param forcedExtension defines the extension to use to pick the right loader
         */
        updateURL(url: string, buffer?: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>, onLoad?: () => void, forcedExtension?: string): void;
        /**
         * Finish the loading sequence of a texture flagged as delayed load.
         * @internal
         */
        delayLoad(): void;
        private _prepareRowForTextureGeneration;
        /**
         * Get the current texture matrix which includes the requested offsetting, tiling and rotation components.
         * @param uBase The horizontal base offset multiplier (1 by default)
         * @returns the transform matrix of the texture.
         */
        getTextureMatrix(uBase?: number): Matrix;
        /**
         * Get the current matrix used to apply reflection. This is useful to rotate an environment texture for instance.
         * @returns The reflection texture transform
         */
        getReflectionTextureMatrix(): Matrix;
        /**
         * Clones the texture.
         * @returns the cloned texture
         */
        clone(): Texture;
        /**
         * Serialize the texture to a JSON representation we can easily use in the respective Parse function.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "Texture"
         */
        getClassName(): string;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
        /**
         * Parse the JSON representation of a texture in order to recreate the texture in the given scene.
         * @param parsedTexture Define the JSON representation of the texture
         * @param scene Define the scene the parsed texture should be instantiated in
         * @param rootUrl Define the root url of the parsing sequence in the case of relative dependencies
         * @returns The parsed texture if successful
         */
        static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable<BaseTexture>;
        /**
         * Creates a texture from its base 64 representation.
         * @param data Define the base64 payload without the data: prefix
         * @param name Define the name of the texture in the scene useful fo caching purpose for instance
         * @param scene Define the scene the texture should belong to
         * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture
         * @param invertY define if the texture needs to be inverted on the y axis during loading
         * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)
         * @param onLoad define a callback triggered when the texture has been loaded
         * @param onError define a callback triggered when an error occurred during the loading session
         * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param forcedExtension defines the extension to use to pick the right loader
         * @returns the created texture
         */
        static CreateFromBase64String(data: string, name: string, scene: Scene, noMipmapOrOptions?: boolean | ITextureCreationOptions, invertY?: boolean, samplingMode?: number, onLoad?: Nullable<() => void>, onError?: Nullable<() => void>, format?: number, creationFlags?: number, forcedExtension?: string): Texture;
        /**
         * Creates a texture from its data: representation. (data: will be added in case only the payload has been passed in)
         * @param name Define the name of the texture in the scene useful fo caching purpose for instance
         * @param buffer define the buffer to load the texture from in case the texture is loaded from a buffer representation
         * @param scene Define the scene the texture should belong to
         * @param deleteBuffer define if the buffer we are loading the texture from should be deleted after load
         * @param noMipmapOrOptions defines if the texture will require mip maps or not or set of all options to create the texture
         * @param invertY define if the texture needs to be inverted on the y axis during loading
         * @param samplingMode define the sampling mode we want for the texture while fetching from it (Texture.NEAREST_SAMPLINGMODE...)
         * @param onLoad define a callback triggered when the texture has been loaded
         * @param onError define a callback triggered when an error occurred during the loading session
         * @param format define the format of the texture we are trying to load (Engine.TEXTUREFORMAT_RGBA...)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param forcedExtension defines the extension to use to pick the right loader
         * @returns the created texture
         */
        static LoadFromDataString(name: string, buffer: any, scene: Scene, deleteBuffer?: boolean, noMipmapOrOptions?: boolean | ITextureCreationOptions, invertY?: boolean, samplingMode?: number, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, format?: number, creationFlags?: number, forcedExtension?: string): Texture;
    }
    /**
     * Register side effects for texture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import texture.pure for tree-shakeable, side-effect-free usage.
     */


        interface Effect {
            /**
             * Sets a depth stencil texture from a render target on the engine to be used in the shader.
             * @param channel Name of the sampler variable.
             * @param texture Texture to set.
             */
            setDepthStencilTexture(channel: string, texture: Nullable<RenderTargetTexture>): void;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Options for the RenderTargetTexture constructor
     */
    export interface RenderTargetTextureOptions {
        /** True (default: false) if mipmaps need to be generated after render */
        generateMipMaps?: boolean;
        /** True (default) to not change the aspect ratio of the scene in the RTT */
        doNotChangeAspectRatio?: boolean;
        /** The type of the buffer in the RTT (byte (default), half float, float...) */
        type?: number;
        /** True (default: false) if a cube texture needs to be created */
        isCube?: boolean;
        /** The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...) */
        samplingMode?: number;
        /** True (default) to generate a depth buffer */
        generateDepthBuffer?: boolean;
        /** True (default: false) to generate a stencil buffer */
        generateStencilBuffer?: boolean;
        /** True (default: false) if multiple textures need to be created (Draw Buffers) */
        isMulti?: boolean;
        /** The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) */
        format?: number;
        /** True (default: false) if the texture allocation should be delayed */
        delayAllocation?: boolean;
        /** Sample count to use when creating the RTT */
        samples?: number;
        /** specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures) */
        creationFlags?: number;
        /** True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer) */
        noColorAttachment?: boolean;
        /** Specifies the internal texture to use directly instead of creating one (ignores `noColorAttachment` flag when set) **/
        colorAttachment?: InternalTexture;
        /** True (default: false) to create a SRGB texture */
        useSRGBBuffer?: boolean;
        /** Defines the underlying texture texture space */
        gammaSpace?: boolean;
        /** If not provided (default), a new object renderer instance will be created */
        existingObjectRenderer?: ObjectRenderer;
        /** True to enable clustered lights (default: false) */
        enableClusteredLights?: boolean;
    }
    /**
     * This Helps creating a texture that will be created from a camera in your scene.
     * It is basically a dynamic texture that could be used to create special effects for instance.
     * Actually, It is the base of lot of effects in the framework like post process, shadows, effect layers and rendering pipelines...
     */
    export class RenderTargetTexture extends Texture implements IRenderTargetTexture {
        /**
         * The texture will only be rendered once which can be useful to improve performance if everything in your render is static for instance.
         */
        static readonly REFRESHRATE_RENDER_ONCE: number;
        /**
         * The texture will be rendered every frame and is recommended for dynamic contents.
         */
        static readonly REFRESHRATE_RENDER_ONEVERYFRAME: number;
        /**
         * The texture will be rendered every 2 frames which could be enough if your dynamic objects are not
         * the central point of your effect and can save a lot of performances.
         */
        static readonly REFRESHRATE_RENDER_ONEVERYTWOFRAMES: number;
        /**
         * Use this predicate to dynamically define the list of mesh you want to render.
         * If set, the renderList property will be overwritten.
         */
        get renderListPredicate(): (AbstractMesh: AbstractMesh) => boolean;
        set renderListPredicate(value: (AbstractMesh: AbstractMesh) => boolean);
        /**
         * Use this list to define the list of mesh you want to render.
         */
        get renderList(): Nullable<Array<AbstractMesh>>;
        set renderList(value: Nullable<Array<AbstractMesh>>);
        /**
         * Define the list of particle systems to render in the texture. If not provided, will render all the particle systems of the scene.
         * Note that the particle systems are rendered only if renderParticles is set to true.
         */
        get particleSystemList(): Nullable<Array<IParticleSystem>>;
        set particleSystemList(value: Nullable<Array<IParticleSystem>>);
        /**
         * Use this function to overload the renderList array at rendering time.
         * Return null to render with the current renderList, else return the list of meshes to use for rendering.
         * For 2DArray RTT, layerOrFace is the index of the layer that is going to be rendered, else it is the faceIndex of
         * the cube (if the RTT is a cube, else layerOrFace=0).
         * The renderList passed to the function is the current render list (the one that will be used if the function returns null).
         * The length of this list is passed through renderListLength: don't use renderList.length directly because the array can
         * hold dummy elements!
         */
        get getCustomRenderList(): Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>>;
        set getCustomRenderList(value: Nullable<(layerOrFace: number, renderList: Nullable<Immutable<Array<AbstractMesh>>>, renderListLength: number) => Nullable<Array<AbstractMesh>>>);
        /**
         * Define if particles should be rendered in your texture (default: true).
         */
        get renderParticles(): boolean;
        set renderParticles(value: boolean);
        /**
         * Define if sprites should be rendered in your texture (default: false).
         */
        get renderSprites(): boolean;
        set renderSprites(value: boolean);
        /**
         * Define if bounding box rendering should be enabled (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). (Default: false).
         */
        get enableBoundingBoxRendering(): boolean;
        set enableBoundingBoxRendering(value: boolean);
        /**
         * Define if outline/overlay rendering should be enabled (still subject to Mesh.renderOutline/Mesh.renderOverlay). (Default: true).
         */
        get enableOutlineRendering(): boolean;
        set enableOutlineRendering(value: boolean);
        /**
         * Force checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined) (default: false).
         */
        get forceLayerMaskCheck(): boolean;
        set forceLayerMaskCheck(value: boolean);
        /**
         * Define the camera used to render the texture.
         */
        get activeCamera(): Nullable<Camera>;
        set activeCamera(value: Nullable<Camera>);
        /**
         * Define the camera used to calculate the LOD of the objects.
         * If not defined, activeCamera will be used. If not defined nor activeCamera, scene's active camera will be used.
         */
        get cameraForLOD(): Nullable<Camera>;
        set cameraForLOD(value: Nullable<Camera>);
        /**
         * If true, the renderer will render all objects without any image processing applied.
         * If false (default value), the renderer will use the current setting of the scene's image processing configuration.
         */
        get disableImageProcessing(): boolean;
        set disableImageProcessing(value: boolean);
        /**
         * Override the mesh isReady function with your own one.
         */
        get customIsReadyFunction(): (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean;
        set customIsReadyFunction(value: (mesh: AbstractMesh, refreshRate: number, preWarm?: boolean) => boolean);
        /**
         * Override the render function of the texture with your own one.
         */
        get customRenderFunction(): (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void;
        set customRenderFunction(value: (opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>, beforeTransparents?: () => void) => void);
        /**
         * Define if camera post processes should be use while rendering the texture.
         */
        useCameraPostProcesses: boolean;
        /**
         * Define if the camera viewport should be respected while rendering the texture or if the render should be done to the entire texture.
         */
        ignoreCameraViewport: boolean;
        private _postProcessManager;
        /**
         * Post-processes for this render target
         */
        get postProcesses(): PostProcess[];
        private _postProcesses;
        private _resizeObserver;
        private get _prePassEnabled();
        /**
         * An event triggered before the texture is bound to the output.
         */
        onBeforeBindObservable: Observable<RenderTargetTexture>;
        /**
         * An event triggered after the texture is unbound.
         */
        onAfterUnbindObservable: Observable<RenderTargetTexture>;
        private _onAfterUnbindObserver;
        /**
         * Set a after unbind callback in the texture.
         * This has been kept for backward compatibility and use of onAfterUnbindObservable is recommended.
         */
        set onAfterUnbind(callback: () => void);
        /**
         * An event triggered before rendering the texture
         */
        get onBeforeRenderObservable(): Observable<number>;
        private _onBeforeRenderObserver;
        /**
         * Set a before render callback in the texture.
         * This has been kept for backward compatibility and use of onBeforeRenderObservable is recommended.
         */
        set onBeforeRender(callback: (faceIndex: number) => void);
        /**
         * An event triggered after rendering the texture
         */
        get onAfterRenderObservable(): Observable<number>;
        private _onAfterRenderObserver;
        /**
         * Set a after render callback in the texture.
         * This has been kept for backward compatibility and use of onAfterRenderObservable is recommended.
         */
        set onAfterRender(callback: (faceIndex: number) => void);
        /**
         * An event triggered after the texture clear
         */
        onClearObservable: Observable<AbstractEngine>;
        private _onClearObserver;
        /**
         * Set a clear callback in the texture.
         * This has been kept for backward compatibility and use of onClearObservable is recommended.
         */
        set onClear(callback: (Engine: AbstractEngine) => void);
        /**
         * An event triggered when the texture is resized.
         */
        onResizeObservable: Observable<RenderTargetTexture>;
        /**
         * Define the clear color of the Render Target if it should be different from the scene.
         */
        clearColor: Color4;
        /** @internal */
        _size: TextureSize;
        protected _initialSizeParameter: TextureSize | {
            ratio: number;
        };
        protected _sizeRatio: Nullable<number>;
        /** @internal */
        _generateMipMaps: boolean;
        /** @internal */
        _cleared: boolean;
        /**
         * Skip the initial clear of the rtt at the beginning of the frame render loop
         */
        skipInitialClear: boolean;
        /** @internal */
        get _waitingRenderList(): string[] | undefined;
        /** @internal */
        set _waitingRenderList(value: string[] | undefined);
        protected _objectRenderer: ObjectRenderer;
        protected _doNotChangeAspectRatio: boolean;
        protected _textureMatrix: Matrix;
        protected _samples: number;
        protected _renderTargetOptions: RenderTargetCreationOptions;
        private _canRescale;
        protected _renderTarget: Nullable<RenderTargetWrapper>;
        private _currentFaceIndex;
        private _currentLayer;
        private _currentUseCameraPostProcess;
        private _currentDumpForDebug;
        private _dontDisposeObjectRenderer;
        /**
         * Current render pass id of the render target texture. Note it can change over the rendering as there's a separate id for each face of a cube / each layer of an array layer!
         */
        get renderPassId(): number;
        /**
         * Gets the render pass ids used by the render target texture. For a single render target the array length will be 1, for a cube texture it will be 6 and for
         * a 2D texture array it will return an array of ids the size of the 2D texture array
         */
        get renderPassIds(): readonly number[];
        /**
         * Gets the current value of the refreshId counter
         */
        get currentRefreshId(): number;
        /**
         * Sets a specific material to be used to render a mesh/a list of meshes in this render target texture
         * @param mesh mesh or array of meshes
         * @param material material or array of materials to use for this render pass. If undefined is passed, no specific material will be used but the regular material instead (mesh.material). It's possible to provide an array of materials to use a different material for each rendering in the case of a cube texture (6 rendering) and a 2D texture array (as many rendering as the length of the array)
         */
        setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material | Material[]): void;
        /**
         * Define if the texture has multiple draw buffers or if false a single draw buffer.
         */
        get isMulti(): boolean;
        /**
         * Gets render target creation options that were used.
         */
        get renderTargetOptions(): RenderTargetCreationOptions;
        /**
         * Gets the render target wrapper associated with this render target
         */
        get renderTarget(): Nullable<RenderTargetWrapper>;
        protected _onRatioRescale(): void;
        /**
         * Gets or sets the center of the bounding box associated with the texture (when in cube mode)
         * It must define where the camera used to render the texture is set
         */
        boundingBoxPosition: Vector3;
        private _boundingBoxSize;
        /**
         * Gets or sets the size of the bounding box associated with the texture (when in cube mode)
         * When defined, the cubemap will switch to local mode
         * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity
         * @example https://www.babylonjs-playground.com/#RNASML
         */
        set boundingBoxSize(value: Vector3);
        get boundingBoxSize(): Vector3;
        /**
         * In case the RTT has been created with a depth texture, get the associated
         * depth texture.
         * Otherwise, return null.
         */
        get depthStencilTexture(): Nullable<InternalTexture>;
        /** @internal */
        _disableEngineStages: boolean;
        private readonly _onBeforeRenderingManagerRenderObserver;
        private readonly _onAfterRenderingManagerRenderObserver;
        private readonly _onFastPathRenderObserver;
        /**
         * Instantiate a render target texture. This is mainly used to render the scene off screen, to apply (for instance) post processing effects
         * or use a shadow or depth texture...
         * @param name The friendly name of the texture
         * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)
         * @param scene The scene the RTT belongs to. Default is the last created scene.
         * @param options The options for creating the render target texture.
         */
        constructor(name: string, size: TextureSize | {
            ratio: number;
        }, scene?: Nullable<Scene>, options?: RenderTargetTextureOptions);
        /**
         * Instantiate a render target texture. This is mainly used to render the scene off screen, to apply (for instance) post processing effects
         * or use a shadow or depth texture...
         * @param name The friendly name of the texture
         * @param size The size of the RTT (number if square, or {width: number, height:number} or {ratio:} to define a ratio from the main scene)
         * @param scene The scene the RTT belongs to. Default is the last created scene
         * @param generateMipMaps True (default: false) if mipmaps need to be generated after render
         * @param doNotChangeAspectRatio True (default) to not change the aspect ratio of the scene in the RTT
         * @param type The type of the buffer in the RTT (byte (default), half float, float...)
         * @param isCube True (default: false) if a cube texture needs to be created
         * @param samplingMode The sampling mode to be used with the render target (Trilinear (default), Linear, Nearest...)
         * @param generateDepthBuffer True (default) to generate a depth buffer
         * @param generateStencilBuffer True (default: false) to generate a stencil buffer
         * @param isMulti True (default: false) if multiple textures need to be created (Draw Buffers)
         * @param format The internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...)
         * @param delayAllocation True (default: false) if the texture allocation should be delayed
         * @param samples Sample count to use when creating the RTT
         * @param creationFlags specific flags to use when creating the texture (e.g., Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures)
         * @param noColorAttachment True (default: false) to indicate that no color target should be created. (e.g., if you only want to write to the depth buffer)
         * @param useSRGBBuffer True (default: false) to create a SRGB texture
         */
        constructor(name: string, size: TextureSize | {
            ratio: number;
        }, scene?: Nullable<Scene>, generateMipMaps?: boolean, doNotChangeAspectRatio?: boolean, type?: number, isCube?: boolean, samplingMode?: number, generateDepthBuffer?: boolean, generateStencilBuffer?: boolean, isMulti?: boolean, format?: number, delayAllocation?: boolean, samples?: number, creationFlags?: number, noColorAttachment?: boolean, useSRGBBuffer?: boolean);
        /**
         * Creates a depth stencil texture.
         * This is only available in WebGL 2 or with the depth texture extension available.
         * @param comparisonFunction Specifies the comparison function to set on the texture. If 0 or undefined, the texture is not in comparison mode (default: 0)
         * @param bilinearFiltering Specifies whether or not bilinear filtering is enable on the texture (default: true)
         * @param generateStencil Specifies whether or not a stencil should be allocated in the texture (default: false)
         * @param samples sample count of the depth/stencil texture (default: 1)
         * @param format format of the depth texture (default: Constants.TEXTUREFORMAT_DEPTH32_FLOAT)
         * @param label defines the label of the texture (for debugging purpose)
         */
        createDepthStencilTexture(comparisonFunction?: number, bilinearFiltering?: boolean, generateStencil?: boolean, samples?: number, format?: number, label?: string): void;
        protected _processSizeParameter(size: TextureSize | {
            ratio: number;
        }): void;
        /**
         * Define the number of samples to use in case of MSAA.
         * It defaults to one meaning no MSAA has been enabled.
         */
        get samples(): number;
        set samples(value: number);
        /**
         * Adds a post process to the render target rendering passes.
         * @param postProcess define the post process to add
         */
        addPostProcess(postProcess: PostProcess): void;
        /**
         * Clear all the post processes attached to the render target
         * @param dispose define if the cleared post processes should also be disposed (false by default)
         */
        clearPostProcesses(dispose?: boolean): void;
        /**
         * Remove one of the post process from the list of attached post processes to the texture
         * @param postProcess define the post process to remove from the list
         */
        removePostProcess(postProcess: PostProcess): void;
        /**
         * Resets the refresh counter of the texture and start bak from scratch.
         * Could be useful to regenerate the texture if it is setup to render only once.
         */
        resetRefreshCounter(): void;
        /**
         * Define the refresh rate of the texture or the rendering frequency.
         * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...
         */
        get refreshRate(): number;
        set refreshRate(value: number);
        /** @internal */
        _shouldRender(): boolean;
        /**
         * Gets the actual render size of the texture.
         * @returns the width of the render size
         */
        getRenderSize(): number;
        /**
         * Gets the actual render width of the texture.
         * @returns the width of the render size
         */
        getRenderWidth(): number;
        /**
         * Gets the actual render height of the texture.
         * @returns the height of the render size
         */
        getRenderHeight(): number;
        /**
         * Gets the actual number of layers of the texture or, in the case of a 3D texture, return the depth.
         * @returns the number of layers
         */
        getRenderLayers(): number;
        /**
         * Don't allow this render target texture to rescale. Mainly used to prevent rescaling by the scene optimizer.
         */
        disableRescaling(): void;
        /**
         * Get if the texture can be rescaled or not.
         */
        get canRescale(): boolean;
        /**
         * Resize the texture using a ratio.
         * @param ratio the ratio to apply to the texture size in order to compute the new target size
         */
        scale(ratio: number): void;
        /**
         * Get the texture reflection matrix used to rotate/transform the reflection.
         * @returns the reflection matrix
         */
        getReflectionTextureMatrix(): Matrix;
        /**
         * Resize the texture to a new desired size.
         * Be careful as it will recreate all the data in the new texture.
         * @param size Define the new size. It can be:
         *   - a number for squared texture,
         *   - an object containing { width: number, height: number }
         *   - or an object containing a ratio { ratio: number }
         */
        resize(size: TextureSize | {
            ratio: number;
        }): void;
        /**
         * Renders all the objects from the render list into the texture.
         * @param useCameraPostProcess Define if camera post processes should be used during the rendering
         * @param dumpForDebug Define if the rendering result should be dumped (copied) for debugging purpose
         */
        render(useCameraPostProcess?: boolean, dumpForDebug?: boolean): void;
        private _dumpToolsLoading;
        private _dumpTools;
        /**
         * This function will check if the render target texture can be rendered (textures are loaded, shaders are compiled)
         * @returns true if all required resources are ready
         */
        isReadyForRendering(): boolean;
        private _render;
        private _bestReflectionRenderTargetDimension;
        /**
         * @internal
         * @param faceIndex face index to bind to if this is a cubetexture
         * @param layer defines the index of the texture to bind in the array
         */
        _bindFrameBuffer(faceIndex?: number, layer?: number): void;
        protected _unbindFrameBuffer(engine: AbstractEngine, faceIndex: number): void;
        /**
         * @internal
         */
        _prepareFrame(scene: Scene, faceIndex?: number, layer?: number, useCameraPostProcess?: boolean): void;
        private _renderToTarget;
        /**
         * Overrides the default sort function applied in the rendering group to prepare the meshes.
         * This allowed control for front to back rendering or reversely depending of the special needs.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param opaqueSortCompareFn The opaque queue comparison function use to sort.
         * @param alphaTestSortCompareFn The alpha test queue comparison function use to sort.
         * @param transparentSortCompareFn The transparent queue comparison function use to sort.
         */
        setRenderingOrder(renderingGroupId: number, opaqueSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, alphaTestSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>, transparentSortCompareFn?: Nullable<(a: SubMesh, b: SubMesh) => number>): void;
        /**
         * Specifies whether or not the stencil and depth buffer are cleared between two rendering groups.
         *
         * @param renderingGroupId The rendering group id corresponding to its index
         * @param autoClearDepthStencil Automatically clears depth and stencil between groups if true.
         */
        setRenderingAutoClearDepthStencil(renderingGroupId: number, autoClearDepthStencil: boolean): void;
        /**
         * Clones the texture.
         * @returns the cloned texture
         */
        clone(): RenderTargetTexture;
        /**
         * Serialize the texture to a JSON representation we can easily use in the respective Parse function.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
        /**
         *  This will remove the attached framebuffer objects. The texture will not be able to be used as render target anymore
         */
        disposeFramebufferObjects(): void;
        /**
         * Release and destroy the underlying lower level texture aka internalTexture.
         */
        releaseInternalTexture(): void;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
        /** @internal */
        _rebuild(): void;
        /**
         * Clear the info related to rendering groups preventing retention point in material dispose.
         */
        freeRenderingGroups(): void;
        /**
         * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)
         * @returns the view count
         */
        getViewCount(): number;
    }
    /**
     * Register side effects for renderTargetTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRenderTargetTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import renderTargetTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Creates a refraction texture used by refraction channel of the standard material.
     * It is like a mirror but to see through a material.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#refractiontexture
     */
    export class RefractionTexture extends RenderTargetTexture {
        /**
         * Define the reflection plane we want to use. The refractionPlane is usually set to the constructed refractor.
         * It is possible to directly set the refractionPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the refractionPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the refractor as stated in the doc.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#refraction
         */
        refractionPlane: Plane;
        /**
         * Define how deep under the surface we should see.
         */
        depth: number;
        /**
         * Creates a refraction texture used by refraction channel of the standard material.
         * It is like a mirror but to see through a material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#refraction
         * @param name Define the texture name
         * @param size Define the size of the underlying texture
         * @param scene Define the scene the refraction belongs to
         * @param generateMipMaps Define if we need to generate mips level for the refraction
         */
        constructor(name: string, size: number, scene?: Scene, generateMipMaps?: boolean);
        /**
         * Clone the refraction texture.
         * @returns the cloned texture
         */
        clone(): RefractionTexture;
        /**
         * Serialize the texture to a JSON representation you could use in Parse later on
         * @returns the serialized JSON representation
         */
        serialize(): any;
    }


    /**
     * Class used to store 3D textures containing user data
     */
    export class RawTexture3D extends Texture {
        /** Gets or sets the texture format to use */
        format: number;
        /**
         * Gets the width of the texture
         */
        get width(): number;
        /**
         * Gets the height of the texture
         */
        get height(): number;
        /**
         * Gets the depth of the texture
         */
        get depth(): number;
        /**
         * Create a new RawTexture3D
         * @param data defines the data of the texture
         * @param width defines the width of the texture
         * @param height defines the height of the texture
         * @param depth defines the depth of the texture
         * @param format defines the texture format to use
         * @param scene defines the hosting scene
         * @param generateMipMaps defines a boolean indicating if mip levels should be generated (true by default)
         * @param invertY defines if texture must be stored with Y axis inverted
         * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)
         * @param textureType defines the texture Type (Engine.TEXTURETYPE_UNSIGNED_BYTE, Engine.TEXTURETYPE_FLOAT...)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         */
        constructor(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, 
        /** Gets or sets the texture format to use */
        format: number, scene: Scene, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, textureType?: number, creationFlags?: number);
        /**
         * Update the texture with new data
         * @param data defines the data to store in the texture
         */
        update(data: ArrayBufferView): void;
    }


    /**
     * Class used to store 2D array textures containing user data
     */
    export class RawTexture2DArray extends Texture {
        /** Gets or sets the texture format to use */
        format: number;
        private _depth;
        /**
         * Gets the number of layers of the texture
         */
        get depth(): number;
        /**
         * Create a new RawTexture2DArray
         * @param data defines the data of the texture
         * @param width defines the width of the texture
         * @param height defines the height of the texture
         * @param depth defines the number of layers of the texture
         * @param format defines the texture format to use
         * @param scene defines the hosting scene
         * @param generateMipMaps defines a boolean indicating if mip levels should be generated (true by default)
         * @param invertY defines if texture must be stored with Y axis inverted
         * @param samplingMode defines the sampling mode to use (Texture.TRILINEAR_SAMPLINGMODE by default)
         * @param textureType defines the texture Type (Engine.TEXTURETYPE_UNSIGNED_BYTE, Engine.TEXTURETYPE_FLOAT...)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param mipLevelCount defines the number of mip levels to allocate for the texture
         */
        constructor(data: Nullable<ArrayBufferView>, width: number, height: number, depth: number, 
        /** Gets or sets the texture format to use */
        format: number, scene: Scene, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, textureType?: number, creationFlags?: number, mipLevelCount?: number);
        /**
         * Update the texture with new data
         * @param data defines the data to store in the texture
         */
        update(data: ArrayBufferView): void;
        /**
         * Updates a specific mip level of the texture.
         * @param data The new data for the mip level
         * @param mipLevel The mip level to update (0 is the base level)
         */
        updateMipLevel(data: ArrayBufferView, mipLevel: number): void;
        /**
         * Creates a RGBA texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param depth defines the number of layers of the texture
         * @param scene defines the scene the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @returns the RGBA texture
         */
        static CreateRGBATexture(data: ArrayBufferView, width: number, height: number, depth: number, scene: Scene, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number): RawTexture2DArray;
    }


    /**
     * Raw texture can help creating a texture directly from an array of data.
     * This can be super useful if you either get the data from an uncompressed source or
     * if you wish to create your texture pixel by pixel.
     */
    export class RawTexture extends Texture {
        /**
         * Define the format of the data (RGB, RGBA... Engine.TEXTUREFORMAT_xxx)
         */
        format: number;
        private _waitingForData;
        /**
         * Instantiates a new RawTexture.
         * Raw texture can help creating a texture directly from an array of data.
         * This can be super useful if you either get the data from an uncompressed source or
         * if you wish to create your texture pixel by pixel.
         * @param data define the array of data to use to create the texture (null to create an empty texture)
         * @param width define the width of the texture
         * @param height define the height of the texture
         * @param format define the format of the data (RGB, RGBA... Engine.TEXTUREFORMAT_xxx)
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps define whether mip maps should be generated or not
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).
         * @param waitDataToBeReady If set to true Rawtexture will wait data to be set in order to be flaged as ready.
         * @param mipLevelCount defines the number of mip levels to allocate for the texture
         */
        constructor(data: Nullable<ArrayBufferView>, width: number, height: number, 
        /**
         * Define the format of the data (RGB, RGBA... Engine.TEXTUREFORMAT_xxx)
         */
        format: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number, creationFlags?: number, useSRGBBuffer?: boolean, waitDataToBeReady?: boolean, mipLevelCount?: number);
        /**
         * Updates the texture underlying data.
         * @param data Define the new data of the texture
         */
        update(data: ArrayBufferView): void;
        /**
         * Updates a specific mip level of the texture.
         * @param data The new data for the mip level
         * @param mipLevel The mip level to update (0 is the base level)
         */
        updateMipLevel(data: ArrayBufferView, mipLevel: number): void;
        /**
         * Clones the texture.
         * @returns the cloned texture
         */
        clone(): Texture;
        isReady(): boolean;
        /**
         * Creates a luminance texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @returns the luminance texture
         */
        static CreateLuminanceTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number): RawTexture;
        /**
         * Creates a luminance alpha texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @returns the luminance alpha texture
         */
        static CreateLuminanceAlphaTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number): RawTexture;
        /**
         * Creates an alpha texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @returns the alpha texture
         */
        static CreateAlphaTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number): RawTexture;
        /**
         * Creates a RGB texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).
         * @returns the RGB alpha texture
         */
        static CreateRGBTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number, creationFlags?: number, useSRGBBuffer?: boolean): RawTexture;
        /**
         * Creates a RGBA texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @param creationFlags specific flags to use when creating the texture (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).
         * @param waitDataToBeReady if set to true this will force texture to wait for data to be set before it is considered ready.
         * @returns the RGBA texture
         */
        static CreateRGBATexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number, creationFlags?: number, useSRGBBuffer?: boolean, waitDataToBeReady?: boolean): RawTexture;
        /**
         * Creates a RGBA storage texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @param useSRGBBuffer defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU).
         * @returns the RGBA texture
         */
        static CreateRGBAStorageTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number, useSRGBBuffer?: boolean): RawTexture;
        /**
         * Creates a R texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @returns the R texture
         */
        static CreateRTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number): RawTexture;
        /**
         * Creates a R storage texture from some data.
         * @param data Define the texture data
         * @param width Define the width of the texture
         * @param height Define the height of the texture
         * @param sceneOrEngine defines the scene or engine the texture will belong to
         * @param generateMipMaps Define whether or not to create mip maps for the texture
         * @param invertY define if the data should be flipped on Y when uploaded to the GPU
         * @param samplingMode define the texture sampling mode (Texture.xxx_SAMPLINGMODE)
         * @param type define the format of the data (int, float... Engine.TEXTURETYPE_xxx)
         * @returns the R texture
         */
        static CreateRStorageTexture(data: Nullable<ArrayBufferView>, width: number, height: number, sceneOrEngine: Nullable<Scene | AbstractEngine>, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, type?: number): RawTexture;
    }


    /**
     * Raw cube texture where the raw buffers are passed in
     */
    export class RawCubeTexture extends CubeTexture {
        /**
         * Creates a cube texture where the raw buffers are passed in.
         * @param scene defines the scene the texture is attached to
         * @param data defines the array of data to use to create each face
         * @param size defines the size of the textures
         * @param format defines the format of the data
         * @param type defines the type of the data (like Engine.TEXTURETYPE_UNSIGNED_BYTE)
         * @param generateMipMaps  defines if the engine should generate the mip levels
         * @param invertY defines if data must be stored with Y axis inverted
         * @param samplingMode defines the required sampling mode (like Texture.NEAREST_SAMPLINGMODE)
         * @param compression defines the compression used (null by default)
         */
        constructor(scene: Scene, data: Nullable<ArrayBufferView[]>, size: number, format?: number, type?: number, generateMipMaps?: boolean, invertY?: boolean, samplingMode?: number, compression?: Nullable<string>);
        /**
         * Updates the raw cube texture.
         * @param data defines the data to store
         * @param format defines the data format
         * @param type defines the type fo the data (Engine.TEXTURETYPE_UNSIGNED_BYTE by default)
         * @param invertY defines if data must be stored with Y axis inverted
         * @param compression defines the compression used (null by default)
         */
        update(data: ArrayBufferView[], format: number, type: number, invertY: boolean, compression?: Nullable<string>): void;
        /**
         * Updates a raw cube texture with RGBD encoded data.
         * @param data defines the array of data [mipmap][face] to use to create each face
         * @param sphericalPolynomial defines the spherical polynomial for irradiance
         * @param lodScale defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness
         * @param lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness
         * @returns a promise that resolves when the operation is complete
         */
        updateRGBDAsync(data: ArrayBufferView[][], sphericalPolynomial?: Nullable<SphericalPolynomial>, lodScale?: number, lodOffset?: number): Promise<void>;
        /**
         * Clones the raw cube texture.
         * @returns a new cube texture
         */
        clone(): CubeTexture;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * A multi render target designed to render the prepass.
     * Prepass is a scene component used to render information in multiple textures
     * alongside with the scene materials rendering.
     * Note : This is an internal class, and you should NOT need to instanciate this.
     * Only the `PrePassRenderer` should instanciate this class.
     * It is more likely that you need a regular `MultiRenderTarget`
     * @internal
     */
    export class PrePassRenderTarget extends MultiRenderTarget {
        /**
         * @internal
         */
        _beforeCompositionPostProcesses: PostProcess[];
        /**
         * Image processing post process for composition
         */
        imageProcessingPostProcess: ImageProcessingPostProcess;
        /**
         * @internal
         */
        _engine: Engine;
        /**
         * @internal
         */
        _scene: Scene;
        /**
         * @internal
         */
        _outputPostProcess: Nullable<PostProcess>;
        /**
         * @internal
         */
        _internalTextureDirty: boolean;
        /**
         * Is this render target enabled for prepass rendering
         */
        enabled: boolean;
        /**
         * Render target associated with this prePassRenderTarget
         * If this is `null`, it means this prePassRenderTarget is associated with the scene
         */
        renderTargetTexture: Nullable<RenderTargetTexture>;
        constructor(name: string, renderTargetTexture: Nullable<RenderTargetTexture>, size: any, count: number, scene?: Scene, options?: IMultiRenderTargetOptions);
        /**
         * Creates a composition effect for this RT
         * @internal
         */
        _createCompositionEffect(): void;
        /**
         * Checks that the size of this RT is still adapted to the desired render size.
         * @internal
         */
        _checkSize(): void;
        /**
         * Changes the number of render targets in this MRT
         * Be careful as it will recreate all the data in the new texture.
         * @param count new texture count
         * @param options Specifies texture types and sampling modes for new textures
         * @param textureNames Specifies the names of the textures (optional)
         */
        updateCount(count: number, options?: IMultiRenderTargetOptions, textureNames?: string[]): void;
        /**
         * Resets the post processes chains applied to this RT.
         * @internal
         */
        _resetPostProcessChain(): void;
        /**
         * Diposes this render target
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Creation options of the multi render target texture.
     */
    export interface IMultiRenderTargetOptions {
        /**
         * Specifies if mipmaps must be created. If undefined, the value from generateMipMaps is taken instead
         */
        createMipMaps?: boolean;
        /**
         * Define if the texture needs to create mip maps after render (default: false).
         */
        generateMipMaps?: boolean;
        /**
         * Define the types of all the draw buffers (render textures) we want to create
         */
        types?: number[];
        /**
         * Define the sampling modes of all the draw buffers (render textures) we want to create
         */
        samplingModes?: number[];
        /**
         * Define if sRGB format should be used for each of the draw buffers (render textures) we want to create
         */
        useSRGBBuffers?: boolean[];
        /**
         * Define if a depth buffer is required (default: true)
         */
        generateDepthBuffer?: boolean;
        /**
         * Define if a stencil buffer is required (default: false)
         */
        generateStencilBuffer?: boolean;
        /**
         * Define if a depth texture is required instead of a depth buffer (default: false)
         */
        generateDepthTexture?: boolean;
        /**
         * Define the internal format of the buffer in the RTT (RED, RG, RGB, RGBA (default), ALPHA...) of all the draw buffers (render textures) we want to create
         */
        formats?: number[];
        /**
         * Define depth texture format to use
         */
        depthTextureFormat?: number;
        /**
         * Define the number of desired draw buffers (render textures). You can set it to 0 if you don't need any color attachment. (default: 1)
         */
        textureCount?: number;
        /**
         * Define if aspect ratio should be adapted to the texture or stay the scene one (default: true)
         */
        doNotChangeAspectRatio?: boolean;
        /**
         * Define the default type of the buffers we are creating (default: Constants.TEXTURETYPE_UNSIGNED_BYTE). types[] is prioritized over defaultType if provided.
         */
        defaultType?: number;
        /**
         * Defines sample count (1 by default)
         */
        samples?: number;
        /**
         * Defines if we should draw into all attachments or the first one only by default (default: false)
         */
        drawOnlyOnFirstAttachmentByDefault?: boolean;
        /**
         * Define the type of texture at each attahment index (of Constants.TEXTURE_2D, .TEXTURE_2D_ARRAY, .TEXTURE_CUBE_MAP, .TEXTURE_CUBE_MAP_ARRAY, .TEXTURE_3D).
         * You can also use the -1 value to indicate that no texture should be created but that you will assign a texture to that attachment index later.
         * Can be useful when you want to attach several layers of the same 2DArrayTexture / 3DTexture or several faces of the same CubeMapTexture: Use the setInternalTexture
         * method for that purpose, after the MultiRenderTarget has been created.
         */
        targetTypes?: number[];
        /**
         * Define the face index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_CUBE_MAP and .TEXTURE_CUBE_MAP_ARRAY).
         * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex
         */
        faceIndex?: number[];
        /**
         * Define the layer index of each texture in the textures array (if applicable, given the corresponding targetType) at creation time (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY).
         * Can be changed at any time by calling setLayerAndFaceIndices or setLayerAndFaceIndex
         */
        layerIndex?: number[];
        /**
         * Define the number of layer of each texture in the textures array (if applicable, given the corresponding targetType) (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY)
         */
        layerCounts?: number[];
        /**
         * Define the creation flags of the textures (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg)
         */
        creationFlags?: number[];
        /**
         * Define the names of the textures (used for debugging purpose)
         */
        labels?: string[];
        /**
         * Label of the RenderTargetWrapper (used for debugging only)
         */
        label?: string;
        /**
         * Define if the textures should not be created by the MultiRenderTarget (default: false)
         * If true, you will need to set the textures yourself by calling setTexture on the MultiRenderTarget.
         */
        dontCreateTextures?: boolean;
    }
    /**
     * A multi render target, like a render target provides the ability to render to a texture.
     * Unlike the render target, it can render to several draw buffers (render textures) in one draw.
     * This is specially interesting in deferred rendering or for any effects requiring more than
     * just one color from a single pass.
     */
    export class MultiRenderTarget extends RenderTargetTexture {
        private _textures;
        private _multiRenderTargetOptions;
        private _count;
        private _drawOnlyOnFirstAttachmentByDefault;
        private _textureNames?;
        /**
         * Get if draw buffers (render textures) are currently supported by the used hardware and browser.
         */
        get isSupported(): boolean;
        /**
         * Get the list of textures generated by the multi render target.
         */
        get textures(): Texture[];
        /**
         * Gets the number of textures in this MRT. This number can be different from `_textures.length` in case a depth texture is generated.
         */
        get count(): number;
        /**
         * Get the depth texture generated by the multi render target if options.generateDepthTexture has been set
         */
        get depthTexture(): Texture;
        /**
         * Set the wrapping mode on U of all the textures we are rendering to.
         * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)
         */
        set wrapU(wrap: number);
        /**
         * Set the wrapping mode on V of all the textures we are rendering to.
         * Can be any of the Texture. (CLAMP_ADDRESSMODE, MIRROR_ADDRESSMODE or WRAP_ADDRESSMODE)
         */
        set wrapV(wrap: number);
        /**
         * Instantiate a new multi render target texture.
         * A multi render target, like a render target provides the ability to render to a texture.
         * Unlike the render target, it can render to several draw buffers (render textures) in one draw.
         * This is specially interesting in deferred rendering or for any effects requiring more than
         * just one color from a single pass.
         * @param name Define the name of the texture
         * @param size Define the size of the buffers to render to
         * @param count Define the number of target we are rendering into
         * @param scene Define the scene the texture belongs to
         * @param options Define the options used to create the multi render target
         * @param textureNames Define the names to set to the textures (if count \> 0 - optional)
         */
        constructor(name: string, size: any, count: number, scene?: Scene, options?: IMultiRenderTargetOptions, textureNames?: string[]);
        private _initTypes;
        private _createInternaTextureIndexMapping;
        /**
         * @internal
         */
        _rebuild(fromContextLost?: boolean, forceFullRebuild?: boolean, textureNames?: string[]): void;
        private _createInternalTextures;
        private _releaseTextures;
        private _createTextures;
        /**
         * Replaces an internal texture within the MRT. Useful to share textures between MultiRenderTarget.
         * @param texture The new texture to set in the MRT
         * @param index The index of the texture to replace
         * @param disposePrevious Set to true if the previous internal texture should be disposed
         */
        setInternalTexture(texture: InternalTexture, index: number, disposePrevious?: boolean): void;
        /**
         * Changes an attached texture's face index or layer.
         * @param index The index of the texture to modify the attachment of
         * @param layerIndex The layer index of the texture to be attached to the framebuffer
         * @param faceIndex The face index of the texture to be attached to the framebuffer
         */
        setLayerAndFaceIndex(index: number, layerIndex?: number, faceIndex?: number): void;
        /**
         * Changes every attached texture's face index or layer.
         * @param layerIndices The layer indices of the texture to be attached to the framebuffer
         * @param faceIndices The face indices of the texture to be attached to the framebuffer
         */
        setLayerAndFaceIndices(layerIndices: number[], faceIndices: number[]): void;
        /**
         * Define the number of samples used if MSAA is enabled.
         */
        get samples(): number;
        set samples(value: number);
        /**
         * Resize all the textures in the multi render target.
         * Be careful as it will recreate all the data in the new texture.
         * @param size Define the new size
         */
        resize(size: any): void;
        /**
         * Changes the number of render targets in this MRT
         * Be careful as it will recreate all the data in the new texture.
         * @param count new texture count
         * @param options Specifies texture types and sampling modes for new textures
         * @param textureNames Specifies the names of the textures (optional)
         */
        updateCount(count: number, options?: IMultiRenderTargetOptions, textureNames?: string[]): void;
        protected _unbindFrameBuffer(engine: Engine, faceIndex: number): void;
        /**
         * Dispose the render targets and their associated resources
         * @param doNotDisposeInternalTextures if set to true, internal textures won't be disposed (default: false).
         */
        dispose(doNotDisposeInternalTextures?: boolean): void;
        /**
         * Release all the underlying texture used as draw buffers (render textures).
         */
        releaseInternalTextures(): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * Mirror texture can be used to simulate the view from a mirror in a scene.
     * It will dynamically be rendered every frame to adapt to the camera point of view.
     * You can then easily use it as a reflectionTexture on a flat surface.
     * In case the surface is not a plane, please consider relying on reflection probes.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrortexture
     */
    export class MirrorTexture extends RenderTargetTexture {
        /**
         * Define the reflection plane we want to use. The mirrorPlane is usually set to the constructed reflector.
         * It is possible to directly set the mirrorPlane by directly using a Plane(a, b, c, d) where a, b and c give the plane normal vector (a, b, c) and d is a scalar displacement from the mirrorPlane to the origin. However in all but the very simplest of situations it is more straight forward to set it to the reflector as stated in the doc.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors
         */
        mirrorPlane: Plane;
        /**
         * Define the blur ratio used to blur the reflection if needed.
         */
        set blurRatio(value: number);
        get blurRatio(): number;
        /**
         * Define the adaptive blur kernel used to blur the reflection if needed.
         * This will autocompute the closest best match for the `blurKernel`
         */
        set adaptiveBlurKernel(value: number);
        /**
         * Define the blur kernel used to blur the reflection if needed.
         * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.
         */
        set blurKernel(value: number);
        /**
         * Define the blur kernel on the X Axis used to blur the reflection if needed.
         * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.
         */
        set blurKernelX(value: number);
        get blurKernelX(): number;
        /**
         * Define the blur kernel on the Y Axis used to blur the reflection if needed.
         * Please consider using `adaptiveBlurKernel` as it could find the closest best value for you.
         */
        set blurKernelY(value: number);
        get blurKernelY(): number;
        private _autoComputeBlurKernel;
        resize(size: TextureSize | {
            ratio: number;
        }): void;
        protected _onRatioRescale(): void;
        private _updateGammaSpace;
        private _imageProcessingConfigChangeObserver;
        private _transformMatrix;
        private _mirrorMatrix;
        private _blurX;
        private _blurY;
        private _adaptiveBlurKernel;
        private _blurKernelX;
        private _blurKernelY;
        private _blurRatio;
        private _sceneUBO;
        private _currentSceneUBO;
        /**
         * Instantiates a Mirror Texture.
         * Mirror texture can be used to simulate the view from a mirror in a scene.
         * It will dynamically be rendered every frame to adapt to the camera point of view.
         * You can then easily use it as a reflectionTexture on a flat surface.
         * In case the surface is not a plane, please consider relying on reflection probes.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#mirrors
         * @param name
         * @param size
         * @param scene
         * @param generateMipMaps
         * @param type
         * @param samplingMode
         * @param generateDepthBuffer
         */
        constructor(name: string, size: number | {
            width: number;
            height: number;
        } | {
            ratio: number;
        }, scene?: Scene, generateMipMaps?: boolean, type?: number, samplingMode?: number, generateDepthBuffer?: boolean);
        private _preparePostProcesses;
        /**
         * Clone the mirror texture.
         * @returns the cloned texture
         */
        clone(): MirrorTexture;
        /**
         * Serialize the texture to a JSON representation you could use in Parse later on
         * @returns the serialized JSON representation
         */
        serialize(): any;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
    }
    /**
     * Register side effects for mirrorTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMirrorTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import mirrorTexture.pure for tree-shakeable, side-effect-free usage.
     */


    export enum SourceTextureFormat {
        ETC1S = 0,
        UASTC4x4 = 1
    }
    export enum TranscodeTarget {
        ASTC_4X4_RGBA = 0,
        ASTC_4x4_RGBA = 0,
        BC7_RGBA = 1,
        BC3_RGBA = 2,
        BC1_RGB = 3,
        PVRTC1_4_RGBA = 4,
        PVRTC1_4_RGB = 5,
        ETC2_RGBA = 6,
        ETC1_RGB = 7,
        RGBA32 = 8,
        R8 = 9,
        RG8 = 10
    }
    export enum EngineFormat {
        COMPRESSED_RGBA_BPTC_UNORM_EXT = 36492,
        COMPRESSED_RGBA_ASTC_4X4_KHR = 37808,
        COMPRESSED_RGB_S3TC_DXT1_EXT = 33776,
        COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779,
        COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842,
        COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840,
        COMPRESSED_RGBA8_ETC2_EAC = 37496,
        COMPRESSED_RGB8_ETC2 = 37492,
        COMPRESSED_RGB_ETC1_WEBGL = 36196,
        RGBA8Format = 32856,
        R8Format = 33321,
        RG8Format = 33323
    }
    /**
     * Leaf node of a decision tree
     * It defines the transcoding format to use to transcode the texture as well as the corresponding format to use at the engine level when creating the texture
     */
    export interface ILeaf {
        /**
         * The format to transcode to
         */
        transcodeFormat: TranscodeTarget;
        /**
         * The format to use when creating the texture at the engine level after it has been transcoded to transcodeFormat
         */
        engineFormat: EngineFormat;
        /**
         * Whether the texture must be rounded to a multiple of 4 (should normally be the case for all compressed formats). Default: true
         */
        roundToMultiple4?: boolean;
    }
    /**
     * Regular node of a decision tree
     *
     * Each property (except for "yes" and "no"), if not empty, will be checked in order to determine the next node to select.
     * If all checks are successful, the "yes" node will be selected, else the "no" node will be selected.
     */
    export interface INode {
        /**
         * The name of the capability to check. Can be one of the following:
         *      astc
         *      bptc
         *      s3tc
         *      pvrtc
         *      etc2
         *      etc1
         */
        cap?: string;
        /**
         * The name of the option to check from the options object passed to the KTX2 decode function. {@link IKTX2DecoderOptions}
         */
        option?: string;
        /**
         * Checks if alpha is present in the texture
         */
        alpha?: boolean;
        /**
         * Checks the currently selected transcoding format.
         */
        transcodeFormat?: TranscodeTarget | TranscodeTarget[];
        /**
         * Checks that the texture is a power of two
         */
        needsPowerOfTwo?: boolean;
        /**
         * The node to select if all checks are successful
         */
        yes?: INode | ILeaf;
        /**
         * The node to select if at least one check is not successful
         */
        no?: INode | ILeaf;
    }
    /**
     * Decision tree used to determine the transcoding format to use for a given source texture format
     */
    export interface IDecisionTree {
        /**
         * textureFormat can be either UASTC or ETC1S
         */
        [textureFormat: string]: INode;
    }
    /**
     * Result of the KTX2 decode function
     */
    export interface IDecodedData {
        /**
         * Width of the texture
         */
        width: number;
        /**
         * Height of the texture
         */
        height: number;
        /**
         * The format to use when creating the texture at the engine level
         * This corresponds to the engineFormat property of the leaf node of the decision tree
         */
        transcodedFormat: number;
        /**
         * List of mipmap levels.
         * The first element is the base level, the last element is the smallest mipmap level (if more than one mipmap level is present)
         */
        mipmaps: Array<IMipmap>;
        /**
         * Whether the texture data is in gamma space or not
         */
        isInGammaSpace: boolean;
        /**
         * Whether the texture has an alpha channel or not
         */
        hasAlpha: boolean;
        /**
         * The name of the transcoder used to transcode the texture
         */
        transcoderName: string;
        /**
         * The errors (if any) encountered during the decoding process
         */
        errors?: string;
    }
    /**
     * Defines a mipmap level
     */
    export interface IMipmap {
        /**
         * The data of the mipmap level
         */
        data: Uint8Array | null;
        /**
         * The width of the mipmap level
         */
        width: number;
        /**
         * The height of the mipmap level
         */
        height: number;
    }
    /**
     * The compressed texture formats supported by the browser
     */
    export interface ICompressedFormatCapabilities {
        /**
         * Whether the browser supports ASTC
         */
        astc?: boolean;
        /**
         * Whether the browser supports BPTC
         */
        bptc?: boolean;
        /**
         * Whether the browser supports S3TC
         */
        s3tc?: boolean;
        /**
         * Whether the browser supports PVRTC
         */
        pvrtc?: boolean;
        /**
         * Whether the browser supports ETC2
         */
        etc2?: boolean;
        /**
         * Whether the browser supports ETC1
         */
        etc1?: boolean;
    }
    /**
     * Options passed to the KTX2 decode function
     */
    export interface IKTX2DecoderOptions {
        /** use RGBA format if ASTC and BC7 are not available as transcoded format */
        useRGBAIfASTCBC7NotAvailableWhenUASTC?: boolean;
        /** force to always use (uncompressed) RGBA for transcoded format */
        forceRGBA?: boolean;
        /** force to always use (uncompressed) R8 for transcoded format */
        forceR8?: boolean;
        /** force to always use (uncompressed) RG8 for transcoded format */
        forceRG8?: boolean;
        /**
         * list of transcoders to bypass when looking for a suitable transcoder. The available transcoders are:
         *      UniversalTranscoder_UASTC_ASTC
         *      UniversalTranscoder_UASTC_BC7
         *      UniversalTranscoder_UASTC_RGBA_UNORM
         *      UniversalTranscoder_UASTC_RGBA_SRGB
         *      UniversalTranscoder_UASTC_R8_UNORM
         *      UniversalTranscoder_UASTC_RG8_UNORM
         *      MSCTranscoder
         */
        bypassTranscoders?: string[];
        /**
         * Custom decision tree to apply after the default decision tree has selected a transcoding format.
         * Allows the user to override the default decision tree selection.
         * The decision tree can use the INode.transcodeFormat property to base its decision on the transcoding format selected by the default decision tree.
         */
        transcodeFormatDecisionTree?: IDecisionTree;
    }


    /**
     * Defines the source of the internal texture
     */
    export enum InternalTextureSource {
        /**
         * The source of the texture data is unknown
         */
        Unknown = 0,
        /**
         * Texture data comes from an URL
         */
        Url = 1,
        /**
         * Texture data is only used for temporary storage
         */
        Temp = 2,
        /**
         * Texture data comes from raw data (ArrayBuffer)
         */
        Raw = 3,
        /**
         * Texture content is dynamic (video or dynamic texture)
         */
        Dynamic = 4,
        /**
         * Texture content is generated by rendering to it
         */
        RenderTarget = 5,
        /**
         * Texture content is part of a multi render target process
         */
        MultiRenderTarget = 6,
        /**
         * Texture data comes from a cube data file
         */
        Cube = 7,
        /**
         * Texture data comes from a raw cube data
         */
        CubeRaw = 8,
        /**
         * Texture data come from a prefiltered cube data file
         */
        CubePrefiltered = 9,
        /**
         * Texture content is raw 3D data
         */
        Raw3D = 10,
        /**
         * Texture content is raw 2D array data
         */
        Raw2DArray = 11,
        /**
         * Texture content is a depth/stencil texture
         */
        DepthStencil = 12,
        /**
         * Texture data comes from a raw cube data encoded with RGBD
         */
        CubeRawRGBD = 13,
        /**
         * Texture content is a depth texture
         */
        Depth = 14,
        /**
         * Texture wraps an externally created graphics resource (WebGL handle, GPUTexture,
         * native handle, etc.) supplied via wrap{WebGL,Native,WebGPU}Texture. On dispose,
         * the wrapped resource is released along with the InternalTexture just like any
         * other source. Consumers can repoint the wrapper at a fresh external handle
         * (e.g., after context-loss / device-loss restore) via
         * updateWrapped{WebGL,Native,WebGPU}Texture without losing references held by
         * materials, render-target wrappers, particle systems, etc.
         */
        External = 15
    }
    /**
     * Class used to store data associated with WebGL texture data for the engine
     * This class should not be used directly
     */
    export class InternalTexture extends TextureSampler {
        /**
         * Defines if the texture is ready
         */
        isReady: boolean;
        /**
         * Defines if the texture is a cube texture
         */
        isCube: boolean;
        /**
         * Defines if the texture contains 3D data
         */
        is3D: boolean;
        /**
         * Defines if the texture contains 2D array data
         */
        is2DArray: boolean;
        /**
         * Defines if the texture contains multiview data
         */
        isMultiview: boolean;
        /**
         * Gets the URL used to load this texture
         */
        url: string;
        /** @internal */
        _originalUrl: string;
        /**
         * Gets a boolean indicating if the texture needs mipmaps generation
         */
        generateMipMaps: boolean;
        protected _useMipMaps: Nullable<boolean>;
        /**
         * Indicates to use the mip maps (if available on the texture).
         * Thanks to this flag, you can instruct the sampler to not sample the mipmaps even if they exist (and if the sampling mode is set to a value that normally samples the mipmaps!)
         * If useMipMaps is null, the value of generateMipMaps is returned by the getter (for backward compatibility)
         */
        get useMipMaps(): Nullable<boolean>;
        set useMipMaps(value: Nullable<boolean>);
        /**
         * Gets the number of mip levels for this texture.
         * Note: This property has the correct value only if the texture was created through
         * `createRawTexture` or `createRawTexture2DArray`.
         */
        mipLevelCount: number;
        /**
         * Gets the number of samples used by the texture (WebGL2+ only)
         */
        samples: number;
        /**
         * Gets the type of the texture (int, float...)
         */
        type: number;
        /**
         * Gets the format of the texture (RGB, RGBA...)
         */
        format: number;
        /**
         * Observable called when the texture is loaded
         */
        onLoadedObservable: Observable<InternalTexture>;
        /**
         * Observable called when the texture load is raising an error
         */
        onErrorObservable: Observable<Partial<{
            message: string;
            exception: any;
        }>>;
        /**
         * If this callback is defined it will be called instead of the default _rebuild function
         */
        onRebuildCallback: Nullable<(internalTexture: InternalTexture) => {
            proxy: Nullable<InternalTexture | Promise<InternalTexture>>;
            isReady: boolean;
            isAsync: boolean;
        }>;
        /**
         * Gets the width of the texture
         */
        width: number;
        /**
         * Gets the height of the texture
         */
        height: number;
        /**
         * Gets the depth of the texture
         */
        depth: number;
        /**
         * Gets the initial width of the texture (It could be rescaled if the current system does not support non power of two textures)
         */
        baseWidth: number;
        /**
         * Gets the initial height of the texture (It could be rescaled if the current system does not support non power of two textures)
         */
        baseHeight: number;
        /**
         * Gets the initial depth of the texture (It could be rescaled if the current system does not support non power of two textures)
         */
        baseDepth: number;
        /**
         * Gets a boolean indicating if the texture is inverted on Y axis
         */
        invertY: boolean;
        /** @internal */
        _invertVScale: boolean;
        /** @internal */
        _associatedChannel: number;
        /** @internal */
        _source: InternalTextureSource;
        /** @internal */
        _buffer: Nullable<string | ArrayBuffer | ArrayBufferView | HTMLImageElement | Blob | ImageBitmap>;
        /** @internal */
        _bufferView: Nullable<ArrayBufferView>;
        /** @internal */
        _bufferViewArray: Nullable<ArrayBufferView[]>;
        /** @internal */
        _bufferViewArrayArray: Nullable<ArrayBufferView[][]>;
        /** @internal */
        _size: number;
        /** @internal */
        _extension: string;
        /** @internal */
        _files: Nullable<string[]>;
        /** @internal */
        _workingCanvas: Nullable<ICanvas>;
        /** @internal */
        _workingContext: Nullable<ICanvasRenderingContext>;
        /** @internal */
        _cachedCoordinatesMode: Nullable<number>;
        /** @internal */
        _isDisabled: boolean;
        /** @internal */
        _compression: Nullable<string>;
        /** @internal */
        _sphericalPolynomial: Nullable<SphericalPolynomial>;
        /** @internal */
        _sphericalPolynomialPromise: Nullable<Promise<SphericalPolynomial>>;
        /** @internal */
        _sphericalPolynomialComputed: boolean;
        /** @internal */
        _lodGenerationScale: number;
        /** @internal */
        _lodGenerationOffset: number;
        /** @internal */
        _useSRGBBuffer: boolean;
        /** @internal */
        _creationFlags: number;
        /** @internal */
        _originalFormat?: number;
        /** @internal */
        _lodTextureHigh: Nullable<BaseTexture>;
        /** @internal */
        _lodTextureMid: Nullable<BaseTexture>;
        /** @internal */
        _lodTextureLow: Nullable<BaseTexture>;
        /** @internal */
        _isRGBD: boolean;
        /** @internal */
        _linearSpecularLOD: boolean;
        /** @internal */
        _irradianceTexture: Nullable<BaseTexture>;
        /** @internal */
        _hardwareTexture: Nullable<IHardwareTextureWrapper>;
        /** @internal */
        _maxLodLevel: Nullable<number>;
        /** @internal */
        _references: number;
        /** @internal */
        _gammaSpace: Nullable<boolean>;
        /** @internal */
        _premulAlpha: boolean;
        /** @internal */
        _dynamicTextureSource: Nullable<ImageSource>;
        /** @internal */
        _autoMSAAManagement: boolean;
        private _engine;
        private _uniqueId;
        /** @internal */
        static _Counter: number;
        /** Gets the unique id of the internal texture */
        get uniqueId(): number;
        /** @internal */
        _setUniqueId(id: number): void;
        /**
         * Gets the Engine the texture belongs to.
         * @returns The babylon engine
         */
        getEngine(): AbstractEngine;
        /**
         * Gets the data source type of the texture
         */
        get source(): InternalTextureSource;
        /**
         * Creates a new InternalTexture
         * @param engine defines the engine to use
         * @param source defines the type of data that will be used
         * @param delayAllocation if the texture allocation should be delayed (default: false)
         */
        constructor(engine: AbstractEngine, source: InternalTextureSource, delayAllocation?: boolean);
        /**
         * Increments the number of references (ie. the number of Texture that point to it)
         */
        incrementReferences(): void;
        /**
         * Change the size of the texture (not the size of the content)
         * @param width defines the new width
         * @param height defines the new height
         * @param depth defines the new depth (1 by default)
         */
        updateSize(width: int, height: int, depth?: int): void;
        /** @internal */
        _rebuild(): void;
        /**
         * @internal
         */
        _swapAndDie(target: InternalTexture, swapAll?: boolean): void;
        /**
         * Dispose the current allocated resources
         */
        dispose(): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * Defines the options related to the creation of an HtmlElementTexture
     */
    export interface IHtmlElementTextureOptions {
        /**
         * Defines whether mip maps should be created or not.
         */
        generateMipMaps?: boolean;
        /**
         * Defines the sampling mode of the texture.
         */
        samplingMode?: number;
        /**
         * Defines the associated texture format.
         */
        format?: number;
        /**
         * Defines the engine instance to use the texture with. It is not mandatory if you define a scene.
         */
        engine: Nullable<AbstractEngine>;
        /**
         * Defines the scene the texture belongs to. It is not mandatory if you define an engine.
         */
        scene: Nullable<Scene>;
    }
    /**
     * This represents the smallest workload to use an already existing element (Canvas or Video) as a texture.
     * To be as efficient as possible depending on your constraints nothing aside the first upload
     * is automatically managed.
     * It is a cheap VideoTexture or DynamicTexture if you prefer to keep full control of the elements
     * in your application.
     *
     * As the update is not automatic, you need to call them manually.
     */
    export class HtmlElementTexture extends BaseTexture {
        /**
         * The texture URL.
         */
        element: HTMLVideoElement | HTMLCanvasElement;
        /**
         * Observable triggered once the texture has been loaded.
         */
        onLoadObservable: Observable<HtmlElementTexture>;
        private static readonly _DefaultOptions;
        private readonly _format;
        private _textureMatrix;
        private _isVideo;
        private _generateMipMaps;
        private _samplingMode;
        private _externalTexture;
        /**
         * Instantiates a HtmlElementTexture from the following parameters.
         *
         * @param name Defines the name of the texture
         * @param element Defines the video or canvas the texture is filled with
         * @param options Defines the other none mandatory texture creation options
         */
        constructor(name: string, element: HTMLVideoElement | HTMLCanvasElement, options: IHtmlElementTextureOptions);
        private _createInternalTexture;
        /**
         * @returns the texture matrix used in most of the material.
         */
        getTextureMatrix(): Matrix;
        /**
         * Updates the content of the texture.
         * @param invertY Defines whether the texture should be inverted on Y (false by default on video and true on canvas)
         */
        update(invertY?: Nullable<boolean>): void;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * This represents a texture coming from an HDR input.
     *
     * The supported format is currently panorama picture stored in RGBE format.
     * Example of such files can be found on Poly Haven: https://polyhaven.com/hdris
     */
    export class HDRCubeTexture extends EnvCubeTexture {
        /**
         * Instantiates an HDRTexture from the following parameters.
         *
         * @param url The location of the HDR raw data (Panorama stored in RGBE format)
         * @param sceneOrEngine The scene or engine the texture will be used in
         * @param size The cubemap desired size (the more it increases the longer the generation will be)
         * @param noMipmap Forces to not generate the mipmap if true
         * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process
         * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)
         * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.
         * @param onLoad on success callback function
         * @param onError on error callback function
         * @param supersample Defines if texture must be supersampled (default: false)
         * @param prefilterIrradianceOnLoad Prefilters HDR texture to allow use of this texture for irradiance lighting.
         * @param prefilterUsingCdf Defines if the prefiltering should be done using a CDF instead of the default approach.
         * @param sphericalPolynomialTargetSize Target face size for spherical polynomial computation. 0 = full resolution (default).
         */
        constructor(url: string, sceneOrEngine: Scene | AbstractEngine, size: number, noMipmap?: boolean, generateHarmonics?: boolean, gammaSpace?: boolean, prefilterOnLoad?: boolean, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, supersample?: boolean, prefilterIrradianceOnLoad?: boolean, prefilterUsingCdf?: boolean, sphericalPolynomialTargetSize?: number);
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "HDRCubeTexture"
         */
        getClassName(): string;
        /**
         * Convert the raw data from the server into cubemap faces
         * @param buffer The buffer containing the texture data
         * @param size The cubemap face size
         * @param supersample Defines if texture must be supersampled
         * @returns The cube map data
         */
        protected _getCubeMapTextureDataAsync(buffer: ArrayBuffer, size: number, supersample: boolean): Promise<CubeMapInfo>;
        protected _instantiateClone(): this;
        /**
         * Serialize the texture to a JSON representation.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
        /**
         * Parses a JSON representation of an HDR Texture in order to create the texture
         * @param parsedTexture Define the JSON representation
         * @param scene Define the scene the texture should be created in
         * @param rootUrl Define the root url in case we need to load relative dependencies
         * @returns the newly created texture after parsing
         */
        static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable<HDRCubeTexture>;
    }
    /**
     * Register side effects for hdrCubeTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterHdrCubeTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import hdrCubeTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /** @internal */
    export interface IHardwareTextureWrapper {
        underlyingResource: any;
        set(hardwareTexture: any): void;
        setUsage(textureSource: number, generateMipMaps: boolean, is2DArray: boolean, isCube: boolean, is3D: boolean, width: number, height: number, depth: number): void;
        reset(): void;
        release(): void;
    }


    /**
     * Class used to store an external texture (like GPUExternalTexture in WebGPU)
     */
    export class ExternalTexture {
        /**
         * Checks if a texture is an external or internal texture
         * @param texture the external or internal texture
         * @returns true if the texture is an external texture, else false
         */
        static IsExternalTexture(texture: ExternalTexture | InternalTexture): texture is ExternalTexture;
        private _video;
        /**
         * Get the class name of the texture.
         * @returns "ExternalTexture"
         */
        getClassName(): string;
        /**
         * Gets the underlying texture object
         */
        get underlyingResource(): any;
        /**
         * Gets a boolean indicating if the texture uses mipmaps
         */
        useMipMaps: boolean;
        /**
         * The type of the underlying texture is implementation dependent, so return "UNDEFINED" for the type
         */
        readonly type = 16;
        /**
         * The format of the underlying texture is implementation dependent, so return "UNDEFINED" for the format
         */
        readonly format = 4294967295;
        /**
         * Gets the unique id of this texture
         */
        readonly uniqueId: number;
        /**
         * Constructs the texture
         * @param video The video the texture should be wrapped around
         */
        constructor(video: HTMLVideoElement);
        /**
         * Get if the texture is ready to be used (downloaded, converted, mip mapped...).
         * @returns true if fully ready
         */
        isReady(): boolean;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a texture coming from an EXR input.
     */
    export class EXRCubeTexture extends EnvCubeTexture {
        /**
         * Instantiates an HDRTexture from the following parameters.
         *
         * @param url The location of the HDR raw data (Panorama stored in RGBE format)
         * @param sceneOrEngine The scene or engine the texture will be used in
         * @param size The cubemap desired size (the more it increases the longer the generation will be)
         * @param noMipmap Forces to not generate the mipmap if true
         * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process
         * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)
         * @param prefilterOnLoad Prefilters HDR texture to allow use of this texture as a PBR reflection texture.
         * @param onLoad on success callback function
         * @param onError on error callback function
         * @param supersample Defines if texture must be supersampled (default: false)
         * @param prefilterIrradianceOnLoad Prefilters HDR texture to allow use of this texture for irradiance lighting.
         * @param prefilterUsingCdf Defines if the prefiltering should be done using a CDF instead of the default approach.
         */
        constructor(url: string, sceneOrEngine: Scene | AbstractEngine, size: number, noMipmap?: boolean, generateHarmonics?: boolean, gammaSpace?: boolean, prefilterOnLoad?: boolean, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, supersample?: boolean, prefilterIrradianceOnLoad?: boolean, prefilterUsingCdf?: boolean);
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "EXRCubeTexture"
         */
        getClassName(): string;
        /**
         * Convert the raw data from the server into cubemap faces
         * @param buffer The buffer containing the texture data
         * @param size The cubemap face size
         * @param supersample Defines if texture must be supersampled
         * @returns The cube map data
         */
        protected _getCubeMapTextureDataAsync(buffer: ArrayBuffer, size: number, supersample: boolean): Promise<CubeMapInfo>;
        protected _instantiateClone(): this;
        /**
         * Serialize the texture to a JSON representation.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
        /**
         * Parses a JSON representation of an EXR Texture in order to create the texture
         * @param parsedTexture Define the JSON representation
         * @param scene Define the scene the texture should be created in
         * @param rootUrl Define the root url in case we need to load relative dependencies
         * @returns the newly created texture after parsing
         */
        static Parse(parsedTexture: any, scene: Scene, rootUrl: string): Nullable<EXRCubeTexture>;
    }
    /**
     * Register side effects for exrCubeTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterExrCubeTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import exrCubeTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a texture coming from an equirectangular image supported by the web browser canvas.
     */
    export class EquiRectangularCubeTexture extends BaseTexture {
        /** The six faces of the cube. */
        private static _FacesMapping;
        private _noMipmap;
        private _onLoad;
        private _onError;
        /** The size of the cubemap. */
        private _size;
        /** Whether to supersample the input image */
        private _supersample;
        /** The buffer of the image. */
        private _buffer;
        /** The width of the input image. */
        private _width;
        /** The height of the input image. */
        private _height;
        /** The URL to the image. */
        url: string;
        /**
         * Instantiates an EquiRectangularCubeTexture from the following parameters.
         * @param url The location of the image
         * @param scene The scene the texture will be used in
         * @param size The cubemap desired size (the more it increases the longer the generation will be)
         * @param noMipmap Forces to not generate the mipmap if true
         * @param gammaSpace Specifies if the texture will be used in gamma or linear space
         * (the PBR material requires those textures in linear space, but the standard material would require them in Gamma space)
         * @param onLoad — defines a callback called when texture is loaded
         * @param onError — defines a callback called if there is an error
         * @param supersample — defines if texture must be supersampled (default: false)
         * @param sphericalPolynomialTargetSize — target face size for spherical polynomial computation. 0 = full resolution (default).
         */
        constructor(url: string, scene: Scene, size: number, noMipmap?: boolean, gammaSpace?: boolean, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, supersample?: boolean, sphericalPolynomialTargetSize?: number);
        /**
         * Load the image data, by putting the image on a canvas and extracting its buffer.
         * @param loadTextureCallback
         * @param onError
         */
        private _loadImage;
        /**
         * Convert the image buffer into a cubemap and create a CubeTexture.
         */
        private _loadTexture;
        /**
         * Convert the ArrayBuffer into a Float32Array and drop the transparency channel.
         * @param buffer The ArrayBuffer that should be converted.
         * @returns The buffer as Float32Array.
         */
        private _getFloat32ArrayFromArrayBuffer;
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "EquiRectangularCubeTexture"
         */
        getClassName(): string;
        /**
         * Create a clone of the current EquiRectangularCubeTexture and return it.
         * @returns A clone of the current EquiRectangularCubeTexture.
         */
        clone(): EquiRectangularCubeTexture;
        /**
         * Finish the loading sequence of a texture flagged as delayed load.
         * @internal
         */
        delayLoad(): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * This represents an environment base texture which could for instance be from HDR or EXR files.
     */
    export abstract class EnvCubeTexture extends BaseTexture {
        private static _FacesMapping;
        protected _generateHarmonics: boolean;
        protected _noMipmap: boolean;
        protected _size: number;
        private _prefilterOnLoad;
        private _prefilterIrradianceOnLoad;
        private _prefilterUsingCdf;
        private _textureMatrix;
        private _supersample;
        private _onLoad;
        private _onError;
        /**
         * The texture URL.
         */
        url: string;
        protected _isBlocking: boolean;
        /**
         * Sets whether or not the texture is blocking during loading.
         */
        set isBlocking(value: boolean);
        /**
         * Gets whether or not the texture is blocking during loading.
         */
        get isBlocking(): boolean;
        protected _rotationY: number;
        /**
         * Sets texture matrix rotation angle around Y axis in radians.
         */
        set rotationY(value: number);
        /**
         * Gets texture matrix rotation angle around Y axis radians.
         */
        get rotationY(): number;
        /**
         * Gets or sets the center of the bounding box associated with the cube texture
         * It must define where the camera used to render the texture was set
         */
        boundingBoxPosition: Vector3;
        private _boundingBoxSize;
        /**
         * Gets or sets the size of the bounding box associated with the cube texture
         * When defined, the cubemap will switch to local mode
         * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity
         * @example https://www.babylonjs-playground.com/#RNASML
         */
        set boundingBoxSize(value: Vector3);
        get boundingBoxSize(): Vector3;
        /**
         * Observable triggered once the texture has been loaded.
         */
        onLoadObservable: Observable<EnvCubeTexture>;
        /**
         * Instantiates an EnvCubeTexture from the following parameters.
         *
         * @param url The location of the raw data (Panorama stored in RGBE format)
         * @param sceneOrEngine The scene or engine the texture will be used in
         * @param size The cubemap desired size (the more it increases the longer the generation will be)
         * @param noMipmap Forces to not generate the mipmap if true
         * @param generateHarmonics Specifies whether you want to extract the polynomial harmonics during the generation process
         * @param gammaSpace Specifies if the texture will be use in gamma or linear space (the PBR material requires those texture in linear space, but the standard material would require them in Gamma space)
         * @param prefilterOnLoad Prefilters texture to allow use of this texture as a PBR reflection texture.
         * @param onLoad on success callback function
         * @param onError on error callback function
         * @param supersample Defines if texture must be supersampled (default: false)
         * @param prefilterIrradianceOnLoad Prefilters texture to allow use of this texture for irradiance lighting.
         * @param prefilterUsingCdf Defines if the prefiltering should be done using a CDF instead of the default approach.
         * @param sphericalPolynomialTargetSize Target face size for spherical polynomial computation. 0 = full resolution (default).
         */
        constructor(url: string, sceneOrEngine: Scene | AbstractEngine, size: number, noMipmap?: boolean, generateHarmonics?: boolean, gammaSpace?: boolean, prefilterOnLoad?: boolean, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, supersample?: boolean, prefilterIrradianceOnLoad?: boolean, prefilterUsingCdf?: boolean, sphericalPolynomialTargetSize?: number);
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "EnvCubeTexture"
         */
        getClassName(): string;
        /**
         * Convert the raw data from the server into cubemap faces
         * @param buffer The buffer containing the texture data
         * @param size The cubemap face size
         * @param supersample Defines if texture must be supersampled
         * @returns The cube map data
         */
        protected abstract _getCubeMapTextureDataAsync(buffer: ArrayBuffer, size: number, supersample: boolean): Promise<CubeMapInfo>;
        /**
         * Occurs when the file has been loaded.
         */
        private _loadTexture;
        delayLoad(): void;
        /**
         * Get the texture reflection matrix used to rotate/transform the reflection.
         * @returns the reflection matrix
         */
        getReflectionTextureMatrix(): Matrix;
        /**
         * Set the texture reflection matrix used to rotate/transform the reflection.
         * @param value Define the reflection matrix to set
         */
        setReflectionTextureMatrix(value: Matrix): void;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
        /**
         * Serializes the texture to a JSON representation.
         * @returns the JSON representation
         */
        serialize(): any;
        protected abstract _instantiateClone(): this;
        /**
         * Clones the current texture.
         * @returns the cloned texture
         */
        clone(): this;
        protected static _Parse(parsedTexture: any, texture: EnvCubeTexture): void;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * Interface defining options used to create a dynamic texture
     */
    export interface IDynamicTextureOptions extends ITextureCreationOptions {
        /** defines the width of the texture (default: 0) */
        width?: number;
        /** defines the height of the texture (default: 0) */
        height?: number;
        /** defines the hosting scene (default: null) */
        scene?: Nullable<Scene>;
    }
    /**
     * A class extending Texture allowing drawing on a texture
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/dynamicTexture
     */
    export class DynamicTexture extends Texture {
        private _generateMipMaps;
        private _canvas;
        private _ownCanvas;
        private _context;
        /**
         * Creates a DynamicTexture
         * @param name defines the name of the texture
         * @param canvasOrSize provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height
         * @param options The options to be used when constructing the dynamic texture
         */
        constructor(name: string, canvasOrSize: ICanvas | {
            width: number;
            height: number;
        } | number, options?: IDynamicTextureOptions);
        /**
         * Creates a DynamicTexture
         * @param name defines the name of the texture
         * @param options provides 3 alternatives for width and height of texture, a canvas, object with width and height properties, number for both width and height
         * @param scene defines the scene where you want the texture
         * @param generateMipMaps defines the use of MipMaps or not (default is false)
         * @param samplingMode defines the sampling mode to use (default is Texture.TRILINEAR_SAMPLINGMODE)
         * @param format defines the texture format to use (default is Engine.TEXTUREFORMAT_RGBA)
         * @param invertY defines if the texture needs to be inverted on the y axis during loading
         */
        constructor(name: string, options: ICanvas | {
            width: number;
            height: number;
        } | number, scene?: Nullable<Scene>, generateMipMaps?: boolean, samplingMode?: number, format?: number, invertY?: boolean);
        /** @internal */
        constructor(name: string, canvasOrSize: ICanvas | {
            width: number;
            height: number;
        } | number, sceneOrOptions?: Nullable<Scene> | IDynamicTextureOptions, generateMipMaps?: boolean, samplingMode?: number, format?: number, invertY?: boolean);
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "DynamicTexture"
         */
        getClassName(): string;
        /**
         * Gets the current state of canRescale
         */
        get canRescale(): boolean;
        private _recreate;
        /**
         * Scales the texture
         * @param ratio the scale factor to apply to both width and height
         */
        scale(ratio: number): void;
        /**
         * Resizes the texture
         * @param width the new width
         * @param height the new height
         */
        scaleTo(width: number, height: number): void;
        /**
         * Gets the context of the canvas used by the texture
         * @returns the canvas context of the dynamic texture
         */
        getContext(): ICanvasRenderingContext;
        /**
         * Clears the texture
         * @param clearColor Defines the clear color to use
         */
        clear(clearColor?: string): void;
        /**
         * Updates the texture
         * @param invertY defines the direction for the Y axis (default is true - y increases downwards)
         * @param premulAlpha defines if alpha is stored as premultiplied (default is false)
         * @param allowGPUOptimization true to allow some specific GPU optimizations (subject to engine feature "allowGPUOptimizationsForGUI" being true)
         */
        update(invertY?: boolean, premulAlpha?: boolean, allowGPUOptimization?: boolean): void;
        /**
         * Draws text onto the texture
         * @param text defines the text to be drawn
         * @param x defines the placement of the text from the left
         * @param y defines the placement of the text from the top when invertY is true and from the bottom when false
         * @param font defines the font to be used with font-style, font-size, font-name
         * @param color defines the color used for the text
         * @param fillColor defines the color for the canvas, use null to not overwrite canvas (this blends with the background to replace, use the clear function)
         * @param invertY defines the direction for the Y axis (default is true - y increases downwards)
         * @param update defines whether texture is immediately update (default is true)
         */
        drawText(text: string, x: number | null | undefined, y: number | null | undefined, font: string, color: string | null, fillColor: string | null, invertY?: boolean, update?: boolean): void;
        /**
         * Disposes the dynamic texture.
         */
        dispose(): void;
        /**
         * Clones the texture
         * @returns the clone of the texture.
         */
        clone(): DynamicTexture;
        /**
         * Serializes the dynamic texture.  The scene should be ready before the dynamic texture is serialized
         * @returns a serialized dynamic texture object
         */
        serialize(): any;
        private static _IsCanvasElement;
        /** @internal */
        _rebuild(): void;
    }




    type CubeTextureCreateFromImagesType = typeof CubeTextureCreateFromImages;
    type CubeTextureCreateFromPrefilteredDataType = typeof CubeTextureCreateFromPrefilteredData;
    type CubeTextureParseType = typeof CubeTextureParse;
        export namespace CubeTexture {
            let CreateFromImages: CubeTextureCreateFromImagesType;
            let CreateFromPrefilteredData: CubeTextureCreateFromPrefilteredDataType;
            let Parse: CubeTextureParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the available options when creating a cube texture
     */
    export interface ICubeTextureCreationOptions {
        /** Defines the suffixes add to the picture name in case six images are in use like _px.jpg */
        extensions?: string[];
        /** noMipmap defines if mipmaps should be created or not */
        noMipmap?: boolean;
        /** files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz */
        files?: string[];
        /** buffer to load instead of loading the data from the url */
        buffer?: ArrayBufferView;
        /** onLoad defines a callback triggered at the end of the file load if no errors occurred */
        onLoad?: () => void;
        /** onError defines a callback triggered in case of error during load */
        onError?: (message?: string, exception?: any) => void;
        /** format defines the internal format to use for the texture once loaded */
        format?: number;
        /** prefiltered defines whether or not the texture is created from prefiltered data */
        prefiltered?: boolean;
        /** forcedExtension defines the extensions to use (force a special type of file to load) in case it is different from the file name */
        forcedExtension?: any;
        /** createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary */
        createPolynomials?: boolean;
        /** lodScale defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness */
        lodScale?: number;
        /** lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness */
        lodOffset?: number;
        /** loaderOptions options to be passed to the loader */
        loaderOptions?: any;
        /** useSRGBBuffer Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false) */
        useSRGBBuffer?: boolean;
        /** Target face size for spherical polynomial computation. 0 = full resolution (default). */
        sphericalPolynomialTargetSize?: number;
    }
    /**
     * Class for creating a cube texture
     */
    export class CubeTexture extends BaseTexture {
        private _delayedOnLoad;
        private _delayedOnError;
        private _lodScale;
        private _lodOffset;
        /**
         * Observable triggered once the texture has been loaded.
         */
        onLoadObservable: Observable<CubeTexture>;
        /**
         * The url of the texture
         */
        url: string;
        /**
         * Gets or sets the center of the bounding box associated with the cube texture.
         * It must define where the camera used to render the texture was set
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#using-local-cubemap-mode
         */
        boundingBoxPosition: Vector3;
        private _boundingBoxSize;
        /**
         * Gets or sets the size of the bounding box associated with the cube texture
         * When defined, the cubemap will switch to local mode
         * @see https://community.arm.com/graphics/b/blog/posts/reflections-based-on-local-cubemaps-in-unity
         * @example https://www.babylonjs-playground.com/#RNASML
         */
        set boundingBoxSize(value: Vector3);
        /**
         * Returns the bounding box size
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/reflectionTexture#using-local-cubemap-mode
         */
        get boundingBoxSize(): Vector3;
        protected _rotationY: number;
        /**
         * Sets texture matrix rotation angle around Y axis in radians.
         */
        set rotationY(value: number);
        /**
         * Gets texture matrix rotation angle around Y axis radians.
         */
        get rotationY(): number;
        /**
         * Are mip maps generated for this texture or not.
         */
        get noMipmap(): boolean;
        private _noMipmap;
        /** @internal */
        _files: Nullable<string[]>;
        protected _forcedExtension: Nullable<string>;
        /**
         * Gets the forced extension (if any)
         */
        get forcedExtension(): Nullable<string>;
        private _extensions;
        private _textureMatrix;
        private _textureMatrixRefraction;
        private _format;
        private _createPolynomials;
        private _loaderOptions;
        private _useSRGBBuffer?;
        private _buffer;
        /**
         * Creates a cube texture to use with reflection for instance. It can be based upon dds or six images as well
         * as prefiltered data.
         * @param rootUrl defines the url of the texture or the root name of the six images
         * @param sceneOrEngine defines the scene or engine the texture is attached to
         * @param extensionsOrOptions defines the suffixes add to the picture name in case six images are in use like _px.jpg or set of all options to create the cube texture
         * @param noMipmap defines if mipmaps should be created or not
         * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz
         * @param onLoad defines a callback triggered at the end of the file load if no errors occurred
         * @param onError defines a callback triggered in case of error during load
         * @param format defines the internal format to use for the texture once loaded
         * @param prefiltered defines whether or not the texture is created from prefiltered data
         * @param forcedExtension defines the extensions to use (force a special type of file to load) in case it is different from the file name
         * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary
         * @param lodScale defines the scale applied to environment texture. This manages the range of LOD level used for IBL according to the roughness
         * @param lodOffset defines the offset applied to environment texture. This manages first LOD level used for IBL according to the roughness
         * @param loaderOptions options to be passed to the loader
         * @param useSRGBBuffer Defines if the texture must be loaded in a sRGB GPU buffer (if supported by the GPU) (default: false)
         * @returns the cube texture
         */
        constructor(rootUrl: string, sceneOrEngine: Scene | AbstractEngine, extensionsOrOptions?: Nullable<string[] | ICubeTextureCreationOptions>, noMipmap?: boolean, files?: Nullable<string[]>, onLoad?: Nullable<() => void>, onError?: Nullable<(message?: string, exception?: any) => void>, format?: number, prefiltered?: boolean, forcedExtension?: any, createPolynomials?: boolean, lodScale?: number, lodOffset?: number, loaderOptions?: any, useSRGBBuffer?: boolean);
        /**
         * Get the current class name of the texture useful for serialization or dynamic coding.
         * @returns "CubeTexture"
         */
        getClassName(): string;
        /**
         * Update the url (and optional buffer) of this texture if url was null during construction.
         * @param url the url of the texture
         * @param forcedExtension defines the extension to use
         * @param onLoad callback called when the texture is loaded  (defaults to null)
         * @param prefiltered Defines whether the updated texture is prefiltered or not
         * @param onError callback called if there was an error during the loading process (defaults to null)
         * @param extensions defines the suffixes add to the picture name in case six images are in use like _px.jpg...
         * @param delayLoad defines if the texture should be loaded now (false by default)
         * @param files defines the six files to load for the different faces in that order: px, py, pz, nx, ny, nz
         * @param buffer the buffer to use instead of loading from the url
         */
        updateURL(url: string, forcedExtension?: Nullable<string>, onLoad?: Nullable<() => void>, prefiltered?: boolean, onError?: Nullable<(message?: string, exception?: any) => void>, extensions?: Nullable<string[]>, delayLoad?: boolean, files?: Nullable<string[]>, buffer?: Nullable<ArrayBufferView>): void;
        /**
         * Delays loading of the cube texture
         * @param forcedExtension defines the extension to use
         */
        delayLoad(forcedExtension?: string): void;
        /**
         * Returns the reflection texture matrix
         * @returns the reflection texture matrix
         */
        getReflectionTextureMatrix(): Matrix;
        /**
         * Sets the reflection texture matrix
         * @param value Reflection texture matrix
         */
        setReflectionTextureMatrix(value: Matrix): void;
        /**
         * Gets a suitable rotate/transform matrix when the texture is used for refraction.
         * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.
         * @returns The refraction matrix
         */
        getRefractionTextureMatrix(): Matrix;
        private _loadTexture;
        /**
         * Makes a clone, or deep copy, of the cube texture
         * @returns a new cube texture
         */
        clone(): CubeTexture;
    }
    /**
     * Creates a cube texture from an array of image urls
     * @param files defines an array of image urls
     * @param scene defines the hosting scene
     * @param noMipmap specifies if mip maps are not used
     * @returns a cube texture
     */
    export function CubeTextureCreateFromImages(files: string[], scene: Scene, noMipmap?: boolean): CubeTexture;
    /**
     * Creates and return a texture created from prefilterd data by tools like IBL Baker or Lys.
     * @param url defines the url of the prefiltered texture
     * @param scene defines the scene the texture is attached to
     * @param forcedExtension defines the extension of the file if different from the url
     * @param createPolynomials defines whether or not to create polynomial harmonics from the texture data if necessary
     * @returns the prefiltered texture
     */
    export function CubeTextureCreateFromPrefilteredData(url: string, scene: Scene, forcedExtension?: any, createPolynomials?: boolean): CubeTexture;
    /**
     * Parses text to create a cube texture
     * @param parsedTexture define the serialized text to read from
     * @param scene defines the hosting scene
     * @param rootUrl defines the root url of the cube texture
     * @returns a cube texture
     */
    export function CubeTextureParse(parsedTexture: any, scene: Scene, rootUrl: string): CubeTexture;
    /**
     * Register side effects for cubeTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCubeTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cubeTexture.pure for tree-shakeable, side-effect-free usage.
     */


    type ColorGradingTextureParseType = typeof ColorGradingTextureParse;
        export namespace ColorGradingTexture {
            let Parse: ColorGradingTextureParseType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * This represents a color grading texture. This acts as a lookup table LUT, useful during post process
     * It can help converting any input color in a desired output one. This can then be used to create effects
     * from sepia, black and white to sixties or futuristic rendering...
     *
     * The only supported format is currently 3dl.
     * More information on LUT: https://en.wikipedia.org/wiki/3D_lookup_table
     */
    export class ColorGradingTexture extends BaseTexture {
        /**
         * The texture URL.
         */
        url: string;
        /**
         * Empty line regex stored for GC.
         */
        private static _NoneEmptyLineRegex;
        private _textureMatrix;
        private _onLoad;
        /**
         * Instantiates a ColorGradingTexture from the following parameters.
         *
         * @param url The location of the color grading data (currently only supporting 3dl)
         * @param sceneOrEngine The scene or engine the texture will be used in
         * @param onLoad defines a callback triggered when the texture has been loaded
         */
        constructor(url: string, sceneOrEngine: Scene | AbstractEngine, onLoad?: Nullable<() => void>);
        /**
         * Fires the onload event from the constructor if requested.
         */
        private _triggerOnLoad;
        /**
         * @returns the texture matrix used in most of the material.
         * This is not used in color grading but keep for troubleshooting purpose (easily swap diffuse by colorgrading to look in).
         */
        getTextureMatrix(): Matrix;
        /**
         * Occurs when the file being loaded is a .3dl LUT file.
         * @returns the 3D LUT texture
         */
        private _load3dlTexture;
        /**
         * Starts the loading process of the texture.
         */
        private _loadTexture;
        /**
         * Clones the color grading texture.
         * @returns the cloned texture
         */
        clone(): ColorGradingTexture;
        /**
         * Called during delayed load for textures.
         */
        delayLoad(): void;
        /**
         * Serializes the LUT texture to json format.
         * @returns The JSON representation of the texture
         */
        serialize(): any;
    }
    /**
     * Parses a color grading texture serialized by Babylon.
     * @param parsedTexture The texture information being parsedTexture
     * @param scene The scene to load the texture in
     * @returns A color grading texture
     */
    export function ColorGradingTextureParse(parsedTexture: any, scene: Scene): Nullable<ColorGradingTexture>;
    /**
     * Register side effects for colorGradingTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorGradingTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorGradingTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Base class of all the textures in babylon.
     * It groups all the common properties the materials, post process, lights... might need
     * in order to make a correct use of the texture.
     */
    export class BaseTexture extends ThinTexture implements IAnimatable {
        /**
         * Default anisotropic filtering level for the application.
         * It is set to 4 as a good tradeoff between perf and quality.
         */
        static DEFAULT_ANISOTROPIC_FILTERING_LEVEL: number;
        /**
         * Gets or sets the unique id of the texture
         */
        uniqueId: number;
        /**
         * Define the name of the texture.
         */
        name: string;
        /**
         * Define the display name of the texture, which is used as tree item name of the dedicated node in the inspector
         */
        displayName: string;
        /**
         * Gets or sets an object used to store user defined information.
         */
        metadata: any;
        /** @internal */
        _internalMetadata: any;
        /**
         * For internal use only. Please do not use.
         */
        reservedDataStore: any;
        private _hasAlpha;
        /**
         * Define if the texture is having a usable alpha value (can be use for transparency or glossiness for instance).
         */
        set hasAlpha(value: boolean);
        get hasAlpha(): boolean;
        private _getAlphaFromRGB;
        /**
         * Defines if the alpha value should be determined via the rgb values.
         * If true the luminance of the pixel might be used to find the corresponding alpha value.
         */
        set getAlphaFromRGB(value: boolean);
        get getAlphaFromRGB(): boolean;
        /**
         * Intensity or strength of the texture.
         * It is commonly used by materials to fine tune the intensity of the texture
         */
        level: number;
        protected _coordinatesIndex: number;
        /**
         * Gets or sets a boolean indicating that the texture should try to reduce shader code if there is no UV manipulation.
         * (ie. when texture.getTextureMatrix().isIdentityAs3x2() returns true)
         */
        optimizeUVAllocation: boolean;
        /**
         * Define the UV channel to use starting from 0 and defaulting to 0.
         * This is part of the texture as textures usually maps to one uv set.
         */
        set coordinatesIndex(value: number);
        get coordinatesIndex(): number;
        protected _coordinatesMode: number;
        /**
         * How a texture is mapped.
         *
         * | Value | Type                                | Description |
         * | ----- | ----------------------------------- | ----------- |
         * | 0     | EXPLICIT_MODE                       |             |
         * | 1     | SPHERICAL_MODE                      |             |
         * | 2     | PLANAR_MODE                         |             |
         * | 3     | CUBIC_MODE                          |             |
         * | 4     | PROJECTION_MODE                     |             |
         * | 5     | SKYBOX_MODE                         |             |
         * | 6     | INVCUBIC_MODE                       |             |
         * | 7     | EQUIRECTANGULAR_MODE                |             |
         * | 8     | FIXED_EQUIRECTANGULAR_MODE          |             |
         * | 9     | FIXED_EQUIRECTANGULAR_MIRRORED_MODE |             |
         */
        set coordinatesMode(value: number);
        get coordinatesMode(): number;
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapU(): number;
        set wrapU(value: number);
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        get wrapV(): number;
        set wrapV(value: number);
        /**
         * | Value | Type               | Description |
         * | ----- | ------------------ | ----------- |
         * | 0     | CLAMP_ADDRESSMODE  |             |
         * | 1     | WRAP_ADDRESSMODE   |             |
         * | 2     | MIRROR_ADDRESSMODE |             |
         */
        wrapR: number;
        /**
         * With compliant hardware and browser (supporting anisotropic filtering)
         * this defines the level of anisotropic filtering in the texture.
         * The higher the better but the slower. This defaults to 4 as it seems to be the best tradeoff.
         */
        anisotropicFilteringLevel: number;
        /** @internal */
        _isCube: boolean;
        /**
         * Define if the texture is a cube texture or if false a 2d texture.
         */
        get isCube(): boolean;
        protected set isCube(value: boolean);
        /**
         * Define if the texture is a 3d texture (webgl 2) or if false a 2d texture.
         */
        get is3D(): boolean;
        protected set is3D(value: boolean);
        /**
         * Define if the texture is a 2d array texture (webgl 2) or if false a 2d texture.
         */
        get is2DArray(): boolean;
        protected set is2DArray(value: boolean);
        /** @internal */
        protected _gammaSpace: boolean;
        /**
         * Define if the texture contains data in gamma space (most of the png/jpg aside bump).
         * HDR texture are usually stored in linear space.
         * This only impacts the PBR and Background materials
         */
        get gammaSpace(): boolean;
        set gammaSpace(gamma: boolean);
        /**
         * Gets or sets whether or not the texture contains RGBD data.
         */
        get isRGBD(): boolean;
        set isRGBD(value: boolean);
        /**
         * Is Z inverted in the texture (useful in a cube texture).
         */
        invertZ: boolean;
        /**
         * Are mip maps generated for this texture or not.
         */
        get noMipmap(): boolean;
        /**
         * @internal
         */
        lodLevelInAlpha: boolean;
        /**
         * With prefiltered texture, defined the offset used during the prefiltering steps.
         */
        get lodGenerationOffset(): number;
        set lodGenerationOffset(value: number);
        /**
         * With prefiltered texture, defined the scale used during the prefiltering steps.
         */
        get lodGenerationScale(): number;
        set lodGenerationScale(value: number);
        /**
         * With prefiltered texture, defined if the specular generation is based on a linear ramp.
         * By default we are using a log2 of the linear roughness helping to keep a better resolution for
         * average roughness values.
         */
        get linearSpecularLOD(): boolean;
        set linearSpecularLOD(value: boolean);
        /**
         * In case a better definition than spherical harmonics is required for the diffuse part of the environment.
         * You can set the irradiance texture to rely on a texture instead of the spherical approach.
         * This texture need to have the same characteristics than its parent (Cube vs 2d, coordinates mode, Gamma/Linear, RGBD).
         */
        get irradianceTexture(): Nullable<BaseTexture>;
        set irradianceTexture(value: Nullable<BaseTexture>);
        /**
         * Indicates the average direction of light in an environment map. This
         * can be treated as the most dominant direction but it's magnitude also
         * tells you something about how dominant that direction is.
         */
        /** @internal */
        _dominantDirection: Nullable<Vector3>;
        /**
         * Define if the texture is a render target.
         */
        isRenderTarget: boolean;
        /**
         * Define the unique id of the texture in the scene.
         */
        get uid(): string;
        /** @internal */
        _prefiltered: boolean;
        /** @internal */
        _forceSerialize: boolean;
        /**
         * Return a string representation of the texture.
         * @returns the texture as a string
         */
        toString(): string;
        /**
         * Get the class name of the texture.
         * @returns "BaseTexture"
         */
        getClassName(): string;
        /**
         * Define the list of animation attached to the texture.
         */
        animations: Animation[];
        /**
         * An event triggered when the texture is disposed.
         */
        onDisposeObservable: Observable<BaseTexture>;
        private _onDisposeObserver;
        /**
         * Callback triggered when the texture has been disposed.
         * Kept for back compatibility, you can use the onDisposeObservable instead.
         */
        set onDispose(callback: () => void);
        protected _scene: Nullable<Scene>;
        /** @internal */
        private _uid;
        /**
         * Define if the texture is preventing a material to render or not.
         * If not and the texture is not ready, the engine will use a default black texture instead.
         */
        get isBlocking(): boolean;
        /** @internal */
        _parentContainer: Nullable<IAssetContainer>;
        protected _loadingError: boolean;
        protected _errorObject?: {
            message?: string;
            exception?: any;
        };
        /**
         * Was there any loading error?
         */
        get loadingError(): boolean;
        /**
         * If a loading error occurred this object will be populated with information about the error.
         */
        get errorObject(): {
            message?: string;
            exception?: any;
        } | undefined;
        /**
         * Instantiates a new BaseTexture.
         * Base class of all the textures in babylon.
         * It groups all the common properties the materials, post process, lights... might need
         * in order to make a correct use of the texture.
         * @param sceneOrEngine Define the scene or engine the texture belongs to
         * @param internalTexture Define the internal texture associated with the texture
         */
        constructor(sceneOrEngine?: Nullable<Scene | AbstractEngine>, internalTexture?: Nullable<InternalTexture>);
        /**
         * Get the scene the texture belongs to.
         * @returns the scene or null if undefined
         */
        getScene(): Nullable<Scene>;
        /** @internal */
        protected _getEngine(): Nullable<AbstractEngine>;
        /**
         * Get the texture transform matrix used to offset tile the texture for instance.
         * @returns the transformation matrix
         */
        getTextureMatrix(): Matrix;
        /**
         * Get the texture reflection matrix used to rotate/transform the reflection.
         * @returns the reflection matrix
         */
        getReflectionTextureMatrix(): Matrix;
        /**
         * Gets a suitable rotate/transform matrix when the texture is used for refraction.
         * There's a separate function from getReflectionTextureMatrix because refraction requires a special configuration of the matrix in right-handed mode.
         * @returns The refraction matrix
         */
        getRefractionTextureMatrix(): Matrix;
        /**
         * Get if the texture is ready to be consumed (either it is ready or it is not blocking)
         * @returns true if ready, not blocking or if there was an error loading the texture
         */
        isReadyOrNotBlocking(): boolean;
        /**
         * Scales the texture if is `canRescale()`
         * @param ratio the resize factor we want to use to rescale
         */
        scale(ratio: number): void;
        /**
         * Get if the texture can rescale.
         */
        get canRescale(): boolean;
        /**
         * @internal
         */
        _getFromCache(url: Nullable<string>, noMipmap: boolean, sampling?: number, invertY?: boolean, useSRGBBuffer?: boolean, isCube?: boolean): Nullable<InternalTexture>;
        /** @internal */
        _rebuild(_fromContextLost?: boolean): void;
        /**
         * Clones the texture.
         * @returns the cloned texture
         */
        clone(): Nullable<BaseTexture>;
        /**
         * Get the texture underlying type (INT, FLOAT...)
         */
        get textureType(): number;
        /**
         * Get the texture underlying format (RGB, RGBA...)
         */
        get textureFormat(): number;
        /**
         * Indicates that textures need to be re-calculated for all materials
         */
        protected _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Reads the pixels stored in the webgl texture and returns them as an ArrayBuffer.
         * This will returns an RGBA array buffer containing either in values (0-255) or
         * float values (0-1) depending of the underlying buffer type.
         * Note that you can use {@link GetTextureDataAsync} instead, which will also support reading from a compressed texture (by rendering it to an intermediate RGBA texture and retrieving the bytes from it).
         * @param faceIndex defines the face of the texture to read (in case of cube texture)
         * @param level defines the LOD level of the texture to read (in case of Mip Maps)
         * @param buffer defines a user defined buffer to fill with data (can be null)
         * @param flushRenderer true to flush the renderer from the pending commands before reading the pixels
         * @param noDataConversion false to convert the data to Uint8Array (if texture type is UNSIGNED_BYTE) or to Float32Array (if texture type is anything but UNSIGNED_BYTE). If true, the type of the generated buffer (if buffer==null) will depend on the type of the texture
         * @param x defines the region x coordinates to start reading from (default to 0)
         * @param y defines the region y coordinates to start reading from (default to 0)
         * @param width defines the region width to read from (default to the texture size at level)
         * @param height defines the region width to read from (default to the texture size at level)
         * @returns The Array buffer promise containing the pixels data.
         */
        readPixels(faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number, width?: number, height?: number): Nullable<Promise<ArrayBufferView>>;
        /**
         * @internal
         */
        _readPixelsSync(faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean): Nullable<ArrayBufferView>;
        /** @internal */
        get _lodTextureHigh(): Nullable<BaseTexture>;
        /** @internal */
        get _lodTextureMid(): Nullable<BaseTexture>;
        /** @internal */
        get _lodTextureLow(): Nullable<BaseTexture>;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
        /**
         * Serialize the texture into a JSON representation that can be parsed later on.
         * @param allowEmptyName True to force serialization even if name is empty. Default: false
         * @returns the JSON representation of the texture
         */
        serialize(allowEmptyName?: boolean): any;
        /**
         * Helper function to be called back once a list of texture contains only ready textures.
         * @param textures Define the list of textures to wait for
         * @param callback Define the callback triggered once the entire list will be ready
         */
        static WhenAllReady(textures: BaseTexture[], callback: () => void): void;
        private static _IsScene;
    }


        interface BaseTexture {
            /**
             * Get the polynomial representation of the texture data.
             * This is mainly use as a fast way to recover IBL Diffuse irradiance data.
             * @see https://learnopengl.com/PBR/IBL/Diffuse-irradiance
             */
            sphericalPolynomial: Nullable<SphericalPolynomial>;
            /**
             * Force recomputation of spherical polynomials.
             * Can be useful if you generate a cubemap multiple times (from a probe for eg) and you need the proper polynomials each time
             */
            forceSphericalPolynomialsRecompute(): void;
            /** @internal */
            _sphericalPolynomialTargetSize: number;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for baseTexturePolynomial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBaseTexturePolynomial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import baseTexture.polynomial.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Renders to multiple views with a single draw call
     * Only for WebGL backends
     * @see https://www.khronos.org/registry/webgl/extensions/OVR_multiview2/
     */
    export class MultiviewRenderTarget extends RenderTargetTexture {
        set samples(value: number);
        get samples(): number;
        /**
         * Creates a multiview render target
         * @param scene scene used with the render target
         * @param size the size of the render target (used for each view)
         */
        constructor(scene?: Scene, size?: number | {
            width: number;
            height: number;
        } | {
            ratio: number;
        });
        /**
         * @internal
         */
        _bindFrameBuffer(): void;
        /**
         * Gets the number of views the corresponding to the texture (eg. a MultiviewRenderTarget will have > 1)
         * @returns the view count
         */
        getViewCount(): number;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Defines the Procedural Texture scene component responsible to manage any Procedural Texture
     * in a given scene.
     */
    export class ProceduralTextureSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "ProceduralTexture";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        private _beforeClear;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Options to create a procedural texture
     */
    export interface IProceduralTextureCreationOptions extends RenderTargetTextureOptions {
        /**
         * Defines a fallback texture in case there were issues to create the custom texture
         */
        fallbackTexture?: Nullable<Texture>;
        /**
         * The shader language of the shader. (default: GLSL)
         */
        shaderLanguage?: ShaderLanguage;
        /**
         * Additional async code to run before preparing the effect
         */
        extraInitializationsAsync?: () => Promise<void>;
        /**
         * When true the texture will not be pushed onto scene.proceduralTextures and will
         * therefore never be rendered automatically by the scene render loop. Use this for
         * one-shot or manually-driven textures that manage their own render lifecycle.
         */
        skipSceneRegistration?: boolean;
    }
    /**
     * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes calmpler' images.
     * This is the base class of any Procedural texture and contains most of the shareable code.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures
     */
    export class ProceduralTexture extends Texture {
        /**
         * Define if the texture is enabled or not (disabled texture will not render)
         */
        isEnabled: boolean;
        /**
         * Define if the texture must be cleared before rendering (default is true)
         */
        autoClear: boolean;
        /**
         * Callback called when the texture is generated
         */
        onGenerated: () => void;
        /**
         * Event raised when the texture is generated
         */
        onGeneratedObservable: Observable<ProceduralTexture>;
        /**
         * Event raised before the texture is generated
         */
        onBeforeGenerationObservable: Observable<ProceduralTexture>;
        /**
         * Gets or sets the node material used to create this texture (null if the texture was manually created)
         */
        nodeMaterialSource: Nullable<NodeMaterial>;
        /**
         * Define the list of custom preprocessor defines used in the shader
         */
        defines: string;
        /** @internal */
        _generateMipMaps: boolean;
        private _drawWrapper;
        /** @internal */
        _textures: {
            [key: string]: ThinTexture;
        };
        /** @internal */
        protected _fallbackTexture: Nullable<Texture>;
        /** @internal */
        private _shaderLanguage;
        /**
         * Gets the shader language type used to generate vertex and fragment source code.
         */
        get shaderLanguage(): ShaderLanguage;
        private _size;
        private _textureType;
        private _currentRefreshId;
        private _frameId;
        private _refreshRate;
        private _vertexBuffers;
        private _indexBuffer;
        private _uniforms;
        private _samplers;
        private _fragment;
        private _floats;
        private _ints;
        private _floatsArrays;
        private _colors3;
        private _colors4;
        private _vectors2;
        private _vectors3;
        private _vectors4;
        private _matrices;
        private _fallbackTextureUsed;
        private _fullEngine;
        private _cachedDefines;
        private _contentUpdateId;
        private _contentData;
        private _rtWrapper;
        private _options;
        /**
         * Instantiates a new procedural texture.
         * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.
         * This is the base class of any Procedural texture and contains most of the shareable code.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures
         * @param name  Define the name of the texture
         * @param size Define the size of the texture to create
         * @param fragment Define the fragment shader to use to generate the texture or null if it is defined later:
         *  * object: \{ fragmentElement: "fragmentShaderCode" \}, used with shader code in script tags
         *  * object: \{ fragmentSource: "fragment shader code string" \}, the string contains the shader code
         *  * string: the string contains a name "XXX" to lookup in Effect.ShadersStore["XXXFragmentShader"]
         * @param scene Define the scene the texture belongs to
         * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture
         * @param generateMipMaps Define if the texture should creates mip maps or not
         * @param isCube Define if the texture is a cube texture or not (this will render each faces of the cube)
         * @param textureType The FBO internal texture type
         */
        constructor(name: string, size: TextureSize, fragment: any, scene: Nullable<Scene>, fallbackTexture?: Nullable<Texture> | IProceduralTextureCreationOptions, generateMipMaps?: boolean, isCube?: boolean, textureType?: number);
        private _createRtWrapper;
        /**
         * The effect that is created when initializing the post process.
         * @returns The created effect corresponding the postprocess.
         */
        getEffect(): Effect;
        /**
         * @internal
         */
        _setEffect(effect: Effect): void;
        /**
         * Gets texture content (Use this function wisely as reading from a texture can be slow)
         * @returns an ArrayBufferView promise (Uint8Array or Float32Array)
         */
        getContent(): Nullable<Promise<ArrayBufferView>>;
        private _createIndexBuffer;
        /** @internal */
        _rebuild(): void;
        /**
         * Resets the texture in order to recreate its associated resources.
         * This can be called in case of context loss or if you change the shader code and need to regenerate the texture with the new code
         */
        reset(): void;
        protected _getDefines(): string;
        /**
         * Executes a function when the texture will be ready to be drawn.
         * @param func The callback to be used.
         */
        executeWhenReady(func: (texture: ProceduralTexture) => void): void;
        /**
         * Is the texture ready to be used ? (rendered at least once)
         * @returns true if ready, otherwise, false.
         */
        isReady(): boolean;
        /**
         * Resets the refresh counter of the texture and start bak from scratch.
         * Could be useful to regenerate the texture if it is setup to render only once.
         */
        resetRefreshCounter(): void;
        /**
         * Set the fragment shader to use in order to render the texture.
         * @param fragment This can be set to a path (into the shader store) or to a json object containing a fragmentElement property.
         */
        setFragment(fragment: any): void;
        /**
         * Define the refresh rate of the texture or the rendering frequency.
         * Use 0 to render just once, 1 to render on every frame, 2 to render every two frames and so on...
         */
        get refreshRate(): number;
        set refreshRate(value: number);
        /** @internal */
        _shouldRender(): boolean;
        /**
         * Get the size the texture is rendering at.
         * @returns the size (on cube texture it is always squared)
         */
        getRenderSize(): TextureSize;
        /**
         * Resize the texture to new value.
         * @param size Define the new size the texture should have
         * @param generateMipMaps Define whether the new texture should create mip maps
         */
        resize(size: TextureSize, generateMipMaps: boolean): void;
        private _checkUniform;
        /**
         * Set a texture in the shader program used to render.
         * @param name Define the name of the uniform samplers as defined in the shader
         * @param texture Define the texture to bind to this sampler
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setTexture(name: string, texture: ThinTexture): ProceduralTexture;
        /**
         * Set a float in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setFloat(name: string, value: number): ProceduralTexture;
        /**
         * Set a int in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setInt(name: string, value: number): ProceduralTexture;
        /**
         * Set an array of floats in the shader.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setFloats(name: string, value: number[]): ProceduralTexture;
        /**
         * Set a vec3 in the shader from a Color3.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setColor3(name: string, value: Color3): ProceduralTexture;
        /**
         * Set a vec4 in the shader from a Color4.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setColor4(name: string, value: Color4): ProceduralTexture;
        /**
         * Set a vec2 in the shader from a Vector2.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setVector2(name: string, value: Vector2): ProceduralTexture;
        /**
         * Set a vec3 in the shader from a Vector3.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setVector3(name: string, value: Vector3): ProceduralTexture;
        /**
         * Set a vec4 in the shader from a Vector4.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setVector4(name: string, value: Vector4): ProceduralTexture;
        /**
         * Set a mat4 in the shader from a MAtrix.
         * @param name Define the name of the uniform as defined in the shader
         * @param value Define the value to give to the uniform
         * @returns the texture itself allowing "fluent" like uniform updates
         */
        setMatrix(name: string, value: Matrix): ProceduralTexture;
        /**
         * Render the texture to its associated render target.
         * @param useCameraPostProcess Define if camera post process should be applied to the texture
         */
        render(useCameraPostProcess?: boolean): void;
        /**
         * Clone the texture.
         * @returns the cloned texture
         */
        clone(): ProceduralTexture;
        /**
         * Dispose the texture and release its associated resources.
         */
        dispose(): void;
    }
    /**
     * Register side effects for proceduralTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterProceduralTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import proceduralTexture.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Class used to generate noise procedural textures
     */
    export class NoiseProceduralTexture extends ProceduralTexture {
        /** Gets or sets the start time (default is 0) */
        time: number;
        /** Gets or sets a value between 0 and 1 indicating the overall brightness of the texture (default is 0.2) */
        brightness: number;
        /** Defines the number of octaves to process */
        octaves: number;
        /** Defines the level of persistence (0.8 by default) */
        persistence: number;
        /** Gets or sets animation speed factor (default is 1) */
        animationSpeedFactor: number;
        /**
         * Creates a new NoiseProceduralTexture
         * @param name defines the name fo the texture
         * @param size defines the size of the texture (default is 256)
         * @param scene defines the hosting scene
         * @param fallbackTexture defines the texture to use if the NoiseProceduralTexture can't be created
         * @param generateMipMaps defines if mipmaps must be generated (true by default)
         */
        constructor(name: string, size?: number, scene?: Nullable<Scene>, fallbackTexture?: Texture, generateMipMaps?: boolean);
        private _updateShaderUniforms;
        protected _getDefines(): string;
        /**
         * Generate the current state of the procedural texture
         * @param useCameraPostProcess Define if camera post process should be applied to the texture
         */
        render(useCameraPostProcess?: boolean): void;
        /**
         * Serializes this noise procedural texture
         * @returns a serialized noise procedural texture object
         */
        serialize(): any;
        /**
         * Clone the texture.
         * @returns the cloned texture
         */
        clone(): NoiseProceduralTexture;
        /**
         * Creates a NoiseProceduralTexture from parsed noise procedural texture data
         * @param parsedTexture defines parsed texture data
         * @param scene defines the current scene
         * @returns a parsed NoiseProceduralTexture
         */
        static Parse(parsedTexture: any, scene: Scene): NoiseProceduralTexture;
    }
    /**
     * Register side effects for noiseProceduralTexture.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNoiseProceduralTexture(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import noiseProceduralTexture.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Options to create a Custom Procedural Texture.
     */
    export interface ICustomProceduralTextureCreationOptions extends IProceduralTextureCreationOptions {
        /**
         * Define a boolena indicating that there is no json config file to load
         */
        skipJson?: boolean;
    }
    /**
     * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.
     * Custom Procedural textures are the easiest way to create your own procedural in your application.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures#creating-custom-procedural-textures
     */
    export class CustomProceduralTexture extends ProceduralTexture {
        private _animate;
        private _time;
        private _config;
        private _texturePath;
        /**
         * Instantiates a new Custom Procedural Texture.
         * Procedural texturing is a way to programmatically create a texture. There are 2 types of procedural textures: code-only, and code that references some classic 2D images, sometimes called 'refMaps' or 'sampler' images.
         * Custom Procedural textures are the easiest way to create your own procedural in your application.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/proceduralTextures#creating-custom-procedural-textures
         * @param name Define the name of the texture
         * @param texturePath Define the folder path containing all the custom texture related files (config, shaders...)
         * @param size Define the size of the texture to create
         * @param scene Define the scene the texture belongs to
         * @param fallbackTexture Define a fallback texture in case there were issues to create the custom texture
         * @param generateMipMaps Define if the texture should creates mip maps or not
         * @param skipJson Define a boolena indicating that there is no json config file to load
         */
        constructor(name: string, texturePath: string, size: TextureSize, scene: Scene, fallbackTexture?: Texture | ICustomProceduralTextureCreationOptions, generateMipMaps?: boolean, skipJson?: boolean);
        private _loadJson;
        /**
         * Is the texture ready to be used ? (rendered at least once)
         * @returns true if ready, otherwise, false.
         */
        isReady(): boolean;
        /**
         * Render the texture to its associated render target.
         * @param useCameraPostProcess Define if camera post process should be applied to the texture
         */
        render(useCameraPostProcess?: boolean): void;
        /**
         * Update the list of dependant textures samplers in the shader.
         */
        updateTextures(): void;
        /**
         * Update the uniform values of the procedural texture in the shader.
         */
        updateShaderUniforms(): void;
        /**
         * Define if the texture animates or not.
         */
        get animate(): boolean;
        set animate(value: boolean);
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Defines the basic options interface of a TexturePacker
     */
    export interface ITexturePackerOptions {
        /**
         * Custom targets for the channels of a texture packer.  Default is all the channels of the Standard Material
         */
        map?: string[];
        /**
         * the UV input targets, as a single value for all meshes. Defaults to VertexBuffer.UVKind
         */
        uvsIn?: string;
        /**
         * the UV output targets, as a single value for all meshes.  Defaults to VertexBuffer.UVKind
         */
        uvsOut?: string;
        /**
         * number representing the layout style. Defaults to LAYOUT_STRIP
         */
        layout?: number;
        /**
         * number of columns if using custom column count layout(2).  This defaults to 4.
         */
        colnum?: number;
        /**
         * flag to update the input meshes to the new packed texture after compilation. Defaults to true.
         */
        updateInputMeshes?: boolean;
        /**
         * boolean flag to dispose all the source textures.  Defaults to true.
         */
        disposeSources?: boolean;
        /**
         * Fills the blank cells in a set to the customFillColor.  Defaults to true.
         */
        fillBlanks?: boolean;
        /**
         * string value representing the context fill style color.  Defaults to 'black'.
         */
        customFillColor?: string;
        /**
         * Width and Height Value of each Frame in the TexturePacker Sets
         */
        frameSize?: number;
        /**
         * Ratio of the value to add padding wise to each cell.  Defaults to 0.0115
         */
        paddingRatio?: number;
        /**
         * Number that declares the fill method for the padding gutter.
         */
        paddingMode?: number;
        /**
         * If in SUBUV_COLOR padding mode what color to use.
         */
        paddingColor?: Color3 | Color4;
    }
    /**
     * Defines the basic interface of a TexturePacker JSON File
     */
    export interface ITexturePackerJSON {
        /**
         * The frame ID
         */
        name: string;
        /**
         * The base64 channel data
         */
        sets: any;
        /**
         * The options of the Packer
         */
        options: ITexturePackerOptions;
        /**
         * The frame data of the Packer
         */
        frames: Array<number>;
    }
    /**
     * This is a support class that generates a series of packed texture sets.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/materials/using/materials_introduction
     */
    export class TexturePacker {
        /** Packer Layout Constant 0 */
        static readonly LAYOUT_STRIP = 0;
        /** Packer Layout Constant 1 */
        static readonly LAYOUT_POWER2 = 1;
        /** Packer Layout Constant 2 */
        static readonly LAYOUT_COLNUM = 2;
        /** Packer Layout Constant 0 */
        static readonly SUBUV_WRAP = 0;
        /** Packer Layout Constant 1 */
        static readonly SUBUV_EXTEND = 1;
        /** Packer Layout Constant 2 */
        static readonly SUBUV_COLOR = 2;
        /** The Name of the Texture Package */
        name: string;
        /** The scene scope of the TexturePacker */
        scene: Scene;
        /** The Meshes to target */
        meshes: AbstractMesh[];
        /** Arguments passed with the Constructor */
        options: ITexturePackerOptions;
        /** The promise that is started upon initialization */
        promise: Nullable<Promise<TexturePacker | string>>;
        /** The Container object for the channel sets that are generated */
        sets: object;
        /** The Container array for the frames that are generated */
        frames: TexturePackerFrame[];
        /** The expected number of textures the system is parsing. */
        private _expecting;
        /** The padding value from Math.ceil(frameSize * paddingRatio) */
        private _paddingValue;
        /**
         * Initializes a texture package series from an array of meshes or a single mesh.
         * @param name The name of the package
         * @param meshes The target meshes to compose the package from
         * @param options The arguments that texture packer should follow while building.
         * @param scene The scene which the textures are scoped to.
         * @returns TexturePacker
         */
        constructor(name: string, meshes: AbstractMesh[], options: ITexturePackerOptions, scene: Scene);
        /**
         * Starts the package process
         * @param resolve The promises resolution function
         */
        private _createFrames;
        /**
         * Calculates the Size of the Channel Sets
         * @returns Vector2
         */
        private _calculateSize;
        /**
         * Calculates the UV data for the frames.
         * @param baseSize the base frameSize
         * @param padding the base frame padding
         * @param dtSize size of the Dynamic Texture for that channel
         * @param dtUnits is 1/dtSize
         * @param update flag to update the input meshes
         */
        private _calculateMeshUVFrames;
        /**
         * Calculates the frames Offset.
         * @param index of the frame
         * @returns Vector2
         */
        private _getFrameOffset;
        /**
         * Updates a Mesh to the frame data
         * @param mesh that is the target
         * @param frameID or the frame index
         */
        private _updateMeshUV;
        /**
         * Updates a Meshes materials to use the texture packer channels
         * @param m is the mesh to target
         * @param force all channels on the packer to be set.
         */
        private _updateTextureReferences;
        /**
         * Public method to set a Mesh to a frame
         * @param m that is the target
         * @param frameID or the frame index
         * @param updateMaterial trigger for if the Meshes attached Material be updated?
         */
        setMeshToFrame(m: AbstractMesh, frameID: number, updateMaterial?: boolean): void;
        /**
         * Starts the async promise to compile the texture packer.
         * @returns Promise<void>
         */
        processAsync(): Promise<void>;
        /**
         * Disposes all textures associated with this packer
         */
        dispose(): void;
        /**
         * Starts the download process for all the channels converting them to base64 data and embedding it all in a JSON file.
         * @param imageType is the image type to use.
         * @param quality of the image if downloading as jpeg, Ranges from >0 to 1.
         */
        download(imageType?: string, quality?: number): void;
        /**
         * Public method to load a texturePacker JSON file.
         * @param data of the JSON file in string format.
         */
        updateFromJSON(data: string): void;
    }




    /**
     * Defines the basic options interface of a TexturePacker Frame
     */
    export interface ITexturePackerFrame {
        /**
         * The frame ID
         */
        id: number;
        /**
         * The frames Scale
         */
        scale: Vector2;
        /**
         * The Frames offset
         */
        offset: Vector2;
    }
    /**
     * This is a support class for frame Data on texture packer sets.
     */
    export class TexturePackerFrame implements ITexturePackerFrame {
        /**
         * The frame ID
         */
        id: number;
        /**
         * The frames Scale
         */
        scale: Vector2;
        /**
         * The Frames offset
         */
        offset: Vector2;
        /**
         * Initializes a texture package frame.
         * @param id The numerical frame identifier
         * @param scale Scalar Vector2 for UV frame
         * @param offset Vector2 for the frame position in UV units.
         * @returns TexturePackerFrame
         */
        constructor(id: number, scale: Vector2, offset: Vector2);
    }


    /**
     * Implementation of the TGA Texture Loader.
     * @internal
     */
    export class _TGATextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         */
        loadCubeData(): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void) => void): void;
    }


    /**
     * Registers a texture loader.
     * If a loader for the extension exists in the registry, it will be replaced.
     * @param extension The name of the loader extension.
     * @param loaderFactory The factory function that creates the loader extension.
     */
    export function registerTextureLoader(extension: string, loaderFactory: (mimeType?: string) => IInternalTextureLoader | Promise<IInternalTextureLoader>): void;
    /**
     * Unregisters a texture loader.
     * @param extension The name of the loader extension.
     * @returns A boolean indicating whether the extension has been unregistered
     */
    export function unregisterTextureLoader(extension: string): boolean;
    /**
     * Function used to get the correct texture loader for a specific extension.
     * @param extension defines the file extension of the file being loaded
     * @param mimeType defines the optional mime type of the file being loaded
     * @returns the IInternalTextureLoader or null if it wasn't found
     */
    export function _GetCompatibleTextureLoader(extension: string, mimeType?: string): Nullable<Promise<IInternalTextureLoader>>;


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Implementation of the KTX Texture Loader.
     * @internal
     */
    export class _KTXTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param createPolynomials will be true if polynomials have been requested
         * @param onLoad defines the callback to trigger once the texture is ready
         */
        loadCubeData(data: ArrayBufferView | ArrayBufferView[], texture: InternalTexture, createPolynomials: boolean, onLoad: Nullable<(data?: any) => void>): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         * @param options
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed: boolean) => void, options?: any): void;
    }


    /**
     * This represents the required contract to create a new type of texture loader.
     */
    export interface IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        supportCascades: boolean;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param createPolynomials will be true if polynomials have been requested
         * @param onLoad defines the callback to trigger once the texture is ready
         * @param onError defines the callback to trigger in case of error
         * @param options options to be passed to the loader
         */
        loadCubeData(data: ArrayBufferView | ArrayBufferView[], texture: InternalTexture, createPolynomials: boolean, onLoad: Nullable<(data?: any) => void>, onError: Nullable<(message?: string, exception?: any) => void>, options?: any): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         * @param options options to be passed to the loader
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, loadFailed?: boolean) => void, options?: any): void;
    }




    /**
     * Implementation of the IES Texture Loader.
     * @internal
     */
    export class _IESTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         */
        loadCubeData(): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void) => void): void;
    }


    /**
     * Implementation of the HDR Texture Loader.
     * @internal
     */
    export class _HDRTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * Cube texture are not supported by .hdr files
         */
        loadCubeData(): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void) => void): void;
    }


    /**
     * Inspired by https://github.com/sciecode/three.js/blob/dev/examples/jsm/loaders/EXRLoader.js
     * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita
     * implementation.
     */
    /**
     * Loader for .exr file format
     * @see [PIZ compression](https://playground.babylonjs.com/#4RN0VF#151)
     * @see [ZIP compression](https://playground.babylonjs.com/#4RN0VF#146)
     * @see [RLE compression](https://playground.babylonjs.com/#4RN0VF#149)
     * @see [PXR24 compression](https://playground.babylonjs.com/#4RN0VF#150)
     * @internal
     */
    export class _ExrTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param _data contains the texture data
         * @param _texture defines the BabylonJS internal texture
         * @param _createPolynomials will be true if polynomials have been requested
         * @param _onLoad defines the callback to trigger once the texture is ready
         * @param _onError defines the callback to trigger in case of error
         * Cube texture are not supported by .exr files
         */
        loadCubeData(_data: ArrayBufferView | ArrayBufferView[], _texture: InternalTexture, _createPolynomials: boolean, _onLoad: Nullable<(data?: any) => void>, _onError: Nullable<(message?: string, exception?: any) => void>): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, failedLoading?: boolean) => void): void;
    }
    /**
     * Read the EXR data from an ArrayBufferView asynchronously.
     * @param data ArrayBufferView containing the EXR data
     * @returns An object containing the width, height, and data of the EXR texture.
     */
    export function ReadExrDataAsync(data: ArrayBuffer): Promise<{
        width: number;
        height: number;
        data: Nullable<Float32Array>;
    }>;


    /**
     * Implementation of the ENV Texture Loader.
     * @internal
     */
    export class _ENVTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param createPolynomials will be true if polynomials have been requested
         * @param onLoad defines the callback to trigger once the texture is ready
         * @param onError defines the callback to trigger in case of error
         */
        loadCubeData(data: ArrayBufferView | ArrayBufferView[], texture: InternalTexture, createPolynomials: boolean, onLoad: Nullable<(data?: any) => void>, onError: Nullable<(message?: string, exception?: any) => void>): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         */
        loadData(): void;
    }


    /**
     * Implementation of the DDS Texture Loader.
     * @internal
     */
    export class _DDSTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = true;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param imgs contains the cube maps
         * @param texture defines the BabylonJS internal texture
         * @param createPolynomials will be true if polynomials have been requested
         * @param onLoad defines the callback to trigger once the texture is ready
         */
        loadCubeData(imgs: ArrayBufferView | ArrayBufferView[], texture: InternalTexture, createPolynomials: boolean, onLoad: Nullable<(data?: any) => void>): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void) => void): void;
    }


    /**
     * Loader for .basis file format
     * @internal
     */
    export class _BasisTextureLoader implements IInternalTextureLoader {
        /**
         * Defines whether the loader supports cascade loading the different faces.
         */
        readonly supportCascades = false;
        /**
         * Uploads the cube texture data to the WebGL texture. It has already been bound.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param createPolynomials will be true if polynomials have been requested
         * @param onLoad defines the callback to trigger once the texture is ready
         * @param onError defines the callback to trigger in case of error
         */
        loadCubeData(data: ArrayBufferView | ArrayBufferView[], texture: InternalTexture, createPolynomials: boolean, onLoad: Nullable<(data?: any) => void>, onError: Nullable<(message?: string, exception?: any) => void>): void;
        /**
         * Uploads the 2D texture data to the WebGL texture. It has already been bound once in the callback.
         * @param data contains the texture data
         * @param texture defines the BabylonJS internal texture
         * @param callback defines the method to call once ready to upload
         */
        loadData(data: ArrayBufferView, texture: InternalTexture, callback: (width: number, height: number, loadMipmap: boolean, isCompressed: boolean, done: () => void, failedLoading?: boolean) => void): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    export const INT32_SIZE = 4;
    export const FLOAT32_SIZE = 4;
    export const INT8_SIZE = 1;
    export const INT16_SIZE = 2;
    export const ULONG_SIZE = 8;
    export var USHORT_RANGE: number;
    export var BITMAP_SIZE: number;
    export const HUF_ENCBITS = 16;
    export const HUF_DECBITS = 14;
    export var HUF_ENCSIZE: number;
    export var HUF_DECSIZE: number;
    export var HUF_DECMASK: number;
    export const SHORT_ZEROCODE_RUN = 59;
    export const LONG_ZEROCODE_RUN = 63;
    export var SHORTEST_LONG_RUN: number;
    export interface IEXRCHannel {
        name: string;
        pixelType: number;
    }
    export interface IDecodeChannel {
        [name: string]: number;
    }
    /**
     * Interface used to define the EXR header
     */
    export interface IEXRHeader {
        /** Version */
        version: number;
        /** Specifications */
        spec: {
            singleTile: boolean;
            longName: boolean;
            deepFormat: boolean;
            multiPart: boolean;
        };
        /** Data window */
        dataWindow: {
            xMin: number;
            xMax: number;
            yMin: number;
            yMax: number;
        };
        /** Channels */
        channels: IEXRCHannel[];
        /** Extra data */
        [name: string]: any;
    }
    export interface IEXRDecoder {
        size: number;
        viewer: DataView;
        array: Uint8Array;
        byteArray: Nullable<Float32Array | Uint16Array>;
        offset: DataCursor;
        width: number;
        height: number;
        channels: number;
        channelLineOffsets: IDecodeChannel;
        scanOrder: (value: number) => number;
        bytesPerLine: number;
        outLineWidth: number;
        lines: number;
        scanlineBlockSize: number;
        inputSize: Nullable<number>;
        type: number;
        uncompress: Nullable<(decoder: IEXRDecoder) => DataView>;
        getter: (dataView: DataView, offset: DataCursor) => number;
        format: number;
        outputChannels: number;
        decodeChannels: IDecodeChannel;
        blockCount: Nullable<number>;
        linearSpace: boolean;
        textureType: number;
    }


    /**
     * Gets the EXR header
     * @param dataView defines the data view to read from
     * @param offset defines the offset to start reading from
     * @returns the header
     */
    export function GetExrHeader(dataView: DataView, offset: DataCursor): IEXRHeader;


    /**
     * Inspired by https://github.com/sciecode/three.js/blob/dev/examples/jsm/loaders/EXRLoader.js
     * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita
     * implementation.
     */
    /**
     * Create a decoder for the exr file
     * @param header header of the exr file
     * @param dataView dataview of the exr file
     * @param offset current offset
     * @param outputType expected output type (float or half float)
     * @returns a promise that resolves with the decoder
     */
    export function CreateDecoderAsync(header: IEXRHeader, dataView: DataView, offset: DataCursor, outputType: EXROutputType): Promise<IEXRDecoder>;
    /**
     * Scan the data of the exr file
     * @param decoder decoder to use
     * @param header header of the exr file
     * @param dataView dataview of the exr file
     * @param offset current offset
     */
    export function ScanData(decoder: IEXRDecoder, header: IEXRHeader, dataView: DataView, offset: DataCursor): void;


    /**
     * Inspired by https://github.com/sciecode/three.js/blob/dev/examples/jsm/loaders/EXRLoader.js
     * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita
     * implementation.
     */
    export enum CompressionCodes {
        NO_COMPRESSION = 0,
        RLE_COMPRESSION = 1,
        ZIPS_COMPRESSION = 2,
        ZIP_COMPRESSION = 3,
        PIZ_COMPRESSION = 4,
        PXR24_COMPRESSION = 5
    }
    /**
     * Interface used to define the cursor position in the data
     */
    export interface DataCursor {
        /** Curosr position */
        value: number;
    }
    /**
     * Parse a null terminated string from the buffer
     * @param buffer buffer to read from
     * @param offset current offset in the buffer
     * @returns a string
     */
    export function ParseNullTerminatedString(buffer: ArrayBufferLike, offset: DataCursor): string;
    /**
     * Parse an int32 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns an int32
     */
    export function ParseInt32(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse an uint32 from the buffer
     * @param dataView data view to read from
     * @param offset offset in the data view
     * @returns an uint32
     */
    export function ParseUint32(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse an uint8 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns an uint8
     */
    export function ParseUint8(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse an uint16 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns an uint16
     */
    export function ParseUint16(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse an uint8 from an array buffer
     * @param array array buffer
     * @param offset current offset in the data view
     * @returns an uint16
     */
    export function ParseUint8Array(array: Uint8Array, offset: DataCursor): number;
    /**
     * Parse an int64 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns an int64
     */
    export function ParseInt64(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse a float32 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns a float32
     */
    export function ParseFloat32(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse a float16 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns a float16
     */
    export function ParseFloat16(dataView: DataView, offset: DataCursor): number;
    /**
     * Decode a float32 from the buffer
     * @param dataView dataview on the data
     * @param offset current offset in the data view
     * @returns a float16
     */
    export function DecodeFloat32(dataView: DataView, offset: DataCursor): number;
    /**
     * Parse a value from the data view
     * @param dataView defines the data view to read from
     * @param offset defines the current offset in the data view
     * @param type defines the type of the value to read
     * @param size defines the size of the value to read
     * @returns the parsed value
     */
    export function ParseValue(dataView: DataView, offset: DataCursor, type: string, size: number): string | number | number[] | {
        name: string;
        pixelType: number;
        pLinear: number;
        xSampling: number;
        ySampling: number;
    }[] | {
        redX: number;
        redY: number;
        greenX: number;
        greenY: number;
        blueX: number;
        blueY: number;
        whiteX: number;
        whiteY: number;
    } | {
        xMin: number;
        yMin: number;
        xMax: number;
        yMax: number;
    } | undefined;
    /**
     * Revert the endianness of the data
     * @param source defines the source
     */
    export function Predictor(source: Uint8Array): void;
    /**
     * Interleave pixels
     * @param source defines the data source
     * @param out defines the output
     */
    export function InterleaveScalar(source: Uint8Array, out: Uint8Array): void;


    export enum EXROutputType {
        Float = 0,
        HalfFloat = 1
    }
    /**
     * Class used to store configuration of the exr loader
     */
    export class ExrLoaderGlobalConfiguration {
        /**
         * Defines the default output type to use (Half float by default)
         */
        static DefaultOutputType: EXROutputType;
        /**
         * Url to use to load the fflate library (for zip decompression)
         */
        static FFLATEUrl: string;
    }


    /**
     * Inspired by https://github.com/sciecode/three.js/blob/dev/examples/jsm/loaders/EXRLoader.js
     * Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita
     * implementation.
     */
    /** @internal */
    export function DecodeRunLength(source: ArrayBufferLike): number[];


    /** @internal */
    export function ReverseLutFromBitmap(bitmap: Uint8Array, lut: Uint16Array): number;
    /** @internal */
    export function HufUncompress(array: Uint8Array, dataView: DataView, offset: DataCursor, nCompressed: number, outBuffer: Uint16Array, nRaw: number): void;
    /** @internal */
    export function Wav2Decode(buffer: Uint16Array, j: number, nx: number, ox: number, ny: number, oy: number, mx: number): number | undefined;
    /** @internal */
    export function ApplyLut(lut: Uint16Array, data: Uint16Array, nData: number): void;


    /**
     * No compression
     * @param decoder defines the decoder to use
     * @returns a decompressed data view
     */
    export function UncompressRAW(decoder: IEXRDecoder): DataView;
    /**
     * RLE compression
     * @param decoder defines the decoder to use
     * @returns a decompressed data view
     */
    export function UncompressRLE(decoder: IEXRDecoder): DataView;
    /**
     * Zip compression
     * @param decoder defines the decoder to use
     * @returns a decompressed data view
     */
    export function UncompressZIP(decoder: IEXRDecoder): DataView;
    /**
     * PXR compression
     * @param decoder defines the decoder to use
     * @returns a decompressed data view
     */
    export function UncompressPXR(decoder: IEXRDecoder): DataView;
    /**
     * PIZ compression
     * @param decoder defines the decoder to use
     * @returns a decompressed data view
     */
    export function UncompressPIZ(decoder: IEXRDecoder): DataView;


    /**
     * Options for texture filtering
     */
    interface IHDRIrradianceFilteringOptions {
        /**
         * Scales pixel intensity for the input HDR map.
         */
        hdrScale?: number;
        /**
         * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering
         */
        quality?: number;
        /**
         * Use the Cumulative Distribution Function (CDF) for filtering
         */
        useCdf?: boolean;
    }
    /**
     * Filters HDR maps to get correct renderings of PBR reflections
     */
    export class HDRIrradianceFiltering {
        private _engine;
        private _effectRenderer;
        private _effectWrapper;
        private _cdfGenerator;
        /**
         * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless
         * you care about baking speed.
         */
        quality: number;
        /**
         * Scales pixel intensity for the input HDR map.
         */
        hdrScale: number;
        /**
         * Use the Cumulative Distribution Function (CDF) for filtering
         */
        useCdf: boolean;
        /**
         * Instantiates HDR filter for irradiance map
         *
         * @param engine Thin engine
         * @param options Options
         */
        constructor(engine: AbstractEngine, options?: IHDRIrradianceFilteringOptions);
        private _createRenderTarget;
        private _prefilterInternal;
        private _createEffect;
        /**
         * Get a value indicating if the filter is ready to be used
         * @param texture Texture to filter
         * @returns true if the filter is ready
         */
        isReady(texture: BaseTexture): boolean;
        /**
         * Prefilters a cube texture to contain IBL irradiance.
         * Prefiltering will be invoked at the end of next rendering pass.
         * This has to be done once the map is loaded, and has not been prefiltered by a third party software.
         * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
         * @param texture Texture to filter
         * @returns Promise called when prefiltering is done
         */
        prefilter(texture: BaseTexture): Promise<BaseTexture>;
    }


    /**
     * Options for texture filtering
     */
    interface IHDRFilteringOptions {
        /**
         * Scales pixel intensity for the input HDR map.
         */
        hdrScale?: number;
        /**
         * Quality of the filter. Should be `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` for prefiltering
         */
        quality?: number;
    }
    /**
     * Filters HDR maps to get correct renderings of PBR reflections
     */
    export class HDRFiltering {
        private _engine;
        private _effectRenderer;
        private _effectWrapper;
        private _lodGenerationOffset;
        private _lodGenerationScale;
        /**
         * Quality switch for prefiltering. Should be set to `Constants.TEXTURE_FILTERING_QUALITY_OFFLINE` unless
         * you care about baking speed.
         */
        quality: number;
        /**
         * Scales pixel intensity for the input HDR map.
         */
        hdrScale: number;
        /**
         * Instantiates HDR filter for reflection maps
         *
         * @param engine Thin engine
         * @param options Options
         */
        constructor(engine: AbstractEngine, options?: IHDRFilteringOptions);
        private _createRenderTarget;
        private _prefilterInternal;
        private _createEffect;
        /**
         * Get a value indicating if the filter is ready to be used
         * @param texture Texture to filter
         * @returns true if the filter is ready
         */
        isReady(texture: BaseTexture): boolean;
        /**
         * Prefilters a cube texture to have mipmap levels representing roughness values.
         * Prefiltering will be invoked at the end of next rendering pass.
         * This has to be done once the map is loaded, and has not been prefiltered by a third party software.
         * See http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf for more information
         * @param texture Texture to filter
         * @returns Promise called when prefiltering is done
         */
        prefilter(texture: BaseTexture): Promise<void>;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * @internal
     */
    export class MaterialSubSurfaceDefines extends MaterialDefines {
        SUBSURFACE: boolean;
        SS_REFRACTION: boolean;
        SS_REFRACTION_USE_INTENSITY_FROM_THICKNESS: boolean;
        SS_TRANSLUCENCY: boolean;
        SS_TRANSLUCENCY_USE_INTENSITY_FROM_THICKNESS: boolean;
        SS_SCATTERING: boolean;
        SS_DISPERSION: boolean;
        SS_THICKNESSANDMASK_TEXTURE: boolean;
        SS_THICKNESSANDMASK_TEXTUREDIRECTUV: number;
        SS_HAS_THICKNESS: boolean;
        SS_REFRACTIONINTENSITY_TEXTURE: boolean;
        SS_REFRACTIONINTENSITY_TEXTUREDIRECTUV: number;
        SS_TRANSLUCENCYINTENSITY_TEXTURE: boolean;
        SS_TRANSLUCENCYINTENSITY_TEXTUREDIRECTUV: number;
        SS_TRANSLUCENCYCOLOR_TEXTURE: boolean;
        SS_TRANSLUCENCYCOLOR_TEXTUREDIRECTUV: number;
        SS_TRANSLUCENCYCOLOR_TEXTURE_GAMMA: boolean;
        SS_REFRACTIONMAP_3D: boolean;
        SS_REFRACTIONMAP_OPPOSITEZ: boolean;
        SS_LODINREFRACTIONALPHA: boolean;
        SS_GAMMAREFRACTION: boolean;
        SS_RGBDREFRACTION: boolean;
        SS_LINEARSPECULARREFRACTION: boolean;
        SS_LINKREFRACTIONTOTRANSPARENCY: boolean;
        SS_ALBEDOFORREFRACTIONTINT: boolean;
        SS_ALBEDOFORTRANSLUCENCYTINT: boolean;
        SS_USE_LOCAL_REFRACTIONMAP_CUBIC: boolean;
        SS_USE_THICKNESS_AS_DEPTH: boolean;
        SS_USE_GLTF_TEXTURES: boolean;
        SS_APPLY_ALBEDO_AFTER_SUBSURFACE: boolean;
        SS_TRANSLUCENCY_LEGACY: boolean;
    }
    /**
     * Plugin that implements the sub surface component of the PBR material
     */
    export class PBRSubSurfaceConfiguration extends MaterialPluginBase {
        /**
         * Default value used for applyAlbedoAfterSubSurface.
         *
         * This property only exists for backward compatibility reasons.
         * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface properties (transmission, refraction, etc.). Default is false.
         * Note however that the PBR calculation is wrong when this property is set to true, so only use it if you want to mimic the 7.0 behavior.
         */
        static DEFAULT_APPLY_ALBEDO_AFTERSUBSURFACE: boolean;
        /**
         * Default value used for legacyTranslucency.
         *
         * This property only exists for backward compatibility reasons.
         * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface translucency. Default is false.
         */
        static DEFAULT_LEGACY_TRANSLUCENCY: boolean;
        protected _material: PBRBaseMaterial;
        private _isRefractionEnabled;
        /**
         * Defines if the refraction is enabled in the material.
         */
        isRefractionEnabled: boolean;
        private _isTranslucencyEnabled;
        /**
         * Defines if the translucency is enabled in the material.
         */
        isTranslucencyEnabled: boolean;
        private _isDispersionEnabled;
        /**
         * Defines if dispersion is enabled in the material.
         */
        isDispersionEnabled: boolean;
        private _isScatteringEnabled;
        /**
         * Defines if the sub surface scattering is enabled in the material.
         */
        isScatteringEnabled: boolean;
        private _scatteringDiffusionProfileIndex;
        /**
         * Diffusion profile for subsurface scattering.
         * Useful for better scattering in the skins or foliages.
         */
        get scatteringDiffusionProfile(): Nullable<Color3>;
        set scatteringDiffusionProfile(c: Nullable<Color3>);
        /**
         * Defines the refraction intensity of the material.
         * The refraction when enabled replaces the Diffuse part of the material.
         * The intensity helps transitioning between diffuse and refraction.
         */
        refractionIntensity: number;
        /**
         * Defines the translucency intensity of the material.
         * When translucency has been enabled, this defines how much of the "translucency"
         * is added to the diffuse part of the material.
         */
        translucencyIntensity: number;
        private _useAlbedoToTintRefraction;
        /**
         * When enabled, transparent surfaces will be tinted with the albedo colour (independent of thickness)
         */
        useAlbedoToTintRefraction: boolean;
        private _useAlbedoToTintTranslucency;
        /**
         * When enabled, translucent surfaces will be tinted with the albedo colour (independent of thickness)
         */
        useAlbedoToTintTranslucency: boolean;
        private _thicknessTexture;
        /**
         * Stores the average thickness of a mesh in a texture (The texture is holding the values linearly).
         * The red (or green if useGltfStyleTextures=true) channel of the texture should contain the thickness remapped between 0 and 1.
         * 0 would mean minimumThickness
         * 1 would mean maximumThickness
         * The other channels might be use as a mask to vary the different effects intensity.
         */
        thicknessTexture: Nullable<BaseTexture>;
        private _refractionTexture;
        /**
         * Defines the texture to use for refraction.
         */
        refractionTexture: Nullable<BaseTexture>;
        /** @internal */
        _indexOfRefraction: number;
        /**
         * Index of refraction of the material base layer.
         * https://en.wikipedia.org/wiki/List_of_refractive_indices
         *
         * This does not only impact refraction but also the Base F0 of Dielectric Materials.
         *
         * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))
         */
        indexOfRefraction: number;
        private _volumeIndexOfRefraction;
        /**
         * Index of refraction of the material's volume.
         * https://en.wikipedia.org/wiki/List_of_refractive_indices
         *
         * This ONLY impacts refraction. If not provided or given a non-valid value,
         * the volume will use the same IOR as the surface.
         */
        get volumeIndexOfRefraction(): number;
        set volumeIndexOfRefraction(value: number);
        private _invertRefractionY;
        /**
         * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.
         */
        invertRefractionY: boolean;
        /** @internal */
        _linkRefractionWithTransparency: boolean;
        /**
         * This parameters will make the material used its opacity to control how much it is refracting against not.
         * Materials half opaque for instance using refraction could benefit from this control.
         */
        linkRefractionWithTransparency: boolean;
        /**
         * Defines the minimum thickness stored in the thickness map.
         * If no thickness map is defined, this value will be used to simulate thickness.
         */
        minimumThickness: number;
        /**
         * Defines the maximum thickness stored in the thickness map.
         */
        maximumThickness: number;
        /**
         * Defines that the thickness should be used as a measure of the depth volume.
         */
        useThicknessAsDepth: boolean;
        /**
         * Defines the volume tint of the material.
         * This is used for both translucency and scattering.
         */
        tintColor: Color3;
        /**
         * Defines the distance at which the tint color should be found in the media.
         * This is used for refraction only.
         */
        tintColorAtDistance: number;
        /**
         * Defines the Abbe number for the volume.
         */
        dispersion: number;
        /**
         * Defines how far each channel transmit through the media.
         * It is defined as a color to simplify it selection.
         */
        diffusionDistance: Color3;
        private _useMaskFromThicknessTexture;
        /**
         * Stores the intensity of the different subsurface effects in the thickness texture.
         * Note that if refractionIntensityTexture and/or translucencyIntensityTexture is provided it takes precedence over thicknessTexture + useMaskFromThicknessTexture
         * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.
         * * the blue (alpha if useGltfStyleTextures = true) channel is the translucency intensity.
         */
        useMaskFromThicknessTexture: boolean;
        private _refractionIntensityTexture;
        /**
         * Stores the intensity of the refraction. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture
         * * the green (red if useGltfStyleTextures = true) channel is the refraction intensity.
         */
        refractionIntensityTexture: Nullable<BaseTexture>;
        private _translucencyIntensityTexture;
        /**
         * Stores the intensity of the translucency. If provided, it takes precedence over thicknessTexture + useMaskFromThicknessTexture
         * * the blue (alpha if useGltfStyleTextures = true) channel is the translucency intensity.
         */
        translucencyIntensityTexture: Nullable<BaseTexture>;
        /**
         * Defines the translucency tint of the material.
         * If not set, the tint color will be used instead.
         */
        translucencyColor: Nullable<Color3>;
        private _translucencyColorTexture;
        /**
         * Defines the translucency tint color of the material as a texture.
         * This is multiplied against the translucency color to add variety and realism to the material.
         * If translucencyColor is not set, the tint color will be used instead.
         */
        translucencyColorTexture: Nullable<BaseTexture>;
        private _useGltfStyleTextures;
        /**
         * Use channels layout used by glTF:
         * * thicknessTexture: the green (instead of red) channel is the thickness
         * * thicknessTexture/refractionIntensityTexture: the red (instead of green) channel is the refraction intensity
         * * thicknessTexture/translucencyIntensityTexture: the alpha (instead of blue) channel is the translucency intensity
         */
        useGltfStyleTextures: boolean;
        /**
         * This property only exists for backward compatibility reasons.
         * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface properties (transmission, refraction, etc.). Default is false.
         * Note however that the PBR calculation is wrong when this property is set to true, so only use it if you want to mimic the 7.0 behavior.
         */
        applyAlbedoAfterSubSurface: boolean;
        /**
         * This property only exists for backward compatibility reasons.
         * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface translucency. Default is false.
         */
        legacyTranslucency: boolean;
        /**
         * Keeping for backward compatibility... Should not be used anymore. It has been replaced by
         * the property with the correct spelling.
         * @see legacyTranslucency
         */
        get legacyTransluceny(): boolean;
        set legacyTransluceny(value: boolean);
        private _scene;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        private _internalMarkScenePrePassDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /** @internal */
        _markScenePrePassDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the subsurface textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @returns true if subsurface is ready
         */
        isReadyForSubMesh(defines: MaterialSubSurfaceDefines, scene: Scene): boolean;
        /**
         * Updates shader defines for subsurface rendering before attributes are processed.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         */
        prepareDefinesBeforeAttributes(defines: MaterialSubSurfaceDefines, scene: Scene): void;
        /**
         * Binds the material data (this function is called even if mustRebind() returns false)
         * @param uniformBuffer defines the Uniform buffer to fill in.
         * @param scene defines the scene the material belongs to.
         * @param engine defines the engine the material belongs to.
         * @param subMesh the submesh to bind data for
         */
        hardBindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void;
        /**
         * Binds subsurface data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         * @param engine defines the engine used for binding
         * @param subMesh defines the sub mesh being rendered
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void;
        /**
         * Returns the texture used for refraction or null if none is used.
         * @param scene defines the scene the material belongs to.
         * @returns - Refraction texture if present.  If no refraction texture and refraction
         * is linked with transparency, returns environment texture.  Otherwise, returns null.
         */
        private _getRefractionTexture;
        /**
         * Returns true if alpha blending should be disabled.
         */
        get disableAlphaBlending(): boolean;
        /**
         * Fills the list of render target textures.
         * @param renderTargets the list of render targets to update
         */
        fillRenderTargetTextures(renderTargets: SmartArray<RenderTargetTexture>): void;
        /**
         * Checks whether subsurface rendering uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by subsurface rendering
         */
        hasTexture(texture: BaseTexture): boolean;
        hasRenderTargetTextures(): boolean;
        /**
         * Adds the active subsurface textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable subsurface textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the subsurface textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        addFallbacks(defines: MaterialSubSurfaceDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Adds the subsurface sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The PBR material of BJS following the specular glossiness convention.
     *
     * This fits to the PBR convention in the GLTF definition:
     * https://github.com/KhronosGroup/glTF/tree/2.0/extensions/Khronos/KHR_materials_pbrSpecularGlossiness
     */
    export class PBRSpecularGlossinessMaterial extends PBRBaseSimpleMaterial {
        /**
         * Specifies the diffuse color of the material.
         */
        diffuseColor: Color3;
        /**
         * Specifies the diffuse texture of the material. This can also contains the opacity value in its alpha
         * channel.
         */
        diffuseTexture: Nullable<BaseTexture>;
        /**
         * Specifies the specular color of the material. This indicates how reflective is the material (none to mirror).
         */
        specularColor: Color3;
        /**
         * Specifies the glossiness of the material. This indicates "how sharp is the reflection".
         */
        glossiness: number;
        /**
         * Specifies both the specular color RGB and the glossiness A of the material per pixels.
         */
        specularGlossinessTexture: Nullable<BaseTexture>;
        /**
         * Specifies if the reflectivity texture contains the glossiness information in its alpha channel.
         */
        get useMicroSurfaceFromReflectivityMapAlpha(): boolean;
        /**
         * Instantiates a new PBRSpecularGlossinessMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         */
        constructor(name: string, scene?: Scene);
        /**
         * @returns the current class name of the material.
         */
        getClassName(): string;
        /**
         * Makes a duplicate of the current material.
         * @param name - name to use for the new material.
         * @returns cloned material instance
         */
        clone(name: string): PBRSpecularGlossinessMaterial;
        /**
         * Serialize the material to a parsable JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parses a JSON object corresponding to the serialize function.
         * @param source - JSON source object.
         * @param scene - the scene to parse to.
         * @param rootUrl - root url of the assets.
         * @returns a new PBRSpecularGlossinessMaterial.
         */
        static Parse(source: any, scene: Scene, rootUrl: string): PBRSpecularGlossinessMaterial;
    }
    /**
     * Register side effects for pbrSpecularGlossinessMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPbrSpecularGlossinessMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pbrSpecularGlossinessMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * @internal
     */
    export class MaterialSheenDefines extends MaterialDefines {
        SHEEN: boolean;
        SHEEN_TEXTURE: boolean;
        SHEEN_GAMMATEXTURE: boolean;
        SHEEN_TEXTURE_ROUGHNESS: boolean;
        SHEEN_TEXTUREDIRECTUV: number;
        SHEEN_TEXTURE_ROUGHNESSDIRECTUV: number;
        SHEEN_LINKWITHALBEDO: boolean;
        SHEEN_ROUGHNESS: boolean;
        SHEEN_ALBEDOSCALING: boolean;
        SHEEN_USE_ROUGHNESS_FROM_MAINTEXTURE: boolean;
    }
    /**
     * Plugin that implements the sheen component of the PBR material.
     */
    export class PBRSheenConfiguration extends MaterialPluginBase {
        private _isEnabled;
        /**
         * Defines if the material uses sheen.
         */
        isEnabled: boolean;
        private _linkSheenWithAlbedo;
        /**
         * Defines if the sheen is linked to the sheen color.
         */
        linkSheenWithAlbedo: boolean;
        /**
         * Defines the sheen intensity.
         */
        intensity: number;
        /**
         * Defines the sheen color.
         */
        color: Color3;
        private _texture;
        /**
         * Stores the sheen tint values in a texture.
         * rgb is tint
         * a is a intensity or roughness if the roughness property has been defined and useRoughnessFromTexture is true (in that case, textureRoughness won't be used)
         * If the roughness property has been defined and useRoughnessFromTexture is false then the alpha channel is not used to modulate roughness
         */
        texture: Nullable<BaseTexture>;
        private _useRoughnessFromMainTexture;
        /**
         * Indicates that the alpha channel of the texture property will be used for roughness.
         * Has no effect if the roughness (and texture!) property is not defined
         */
        useRoughnessFromMainTexture: boolean;
        private _roughness;
        /**
         * Defines the sheen roughness.
         * It is not taken into account if linkSheenWithAlbedo is true.
         * To stay backward compatible, material roughness is used instead if sheen roughness = null
         */
        roughness: Nullable<number>;
        private _textureRoughness;
        /**
         * Stores the sheen roughness in a texture.
         * alpha channel is the roughness. This texture won't be used if the texture property is not empty and useRoughnessFromTexture is true
         */
        textureRoughness: Nullable<BaseTexture>;
        private _albedoScaling;
        /**
         * If true, the sheen effect is layered above the base BRDF with the albedo-scaling technique.
         * It allows the strength of the sheen effect to not depend on the base color of the material,
         * making it easier to setup and tweak the effect
         */
        albedoScaling: boolean;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the sheen textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @returns true if sheen is ready
         */
        isReadyForSubMesh(defines: MaterialSheenDefines, scene: Scene): boolean;
        /**
         * Updates shader defines for sheen before attributes are processed.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         */
        prepareDefinesBeforeAttributes(defines: MaterialSheenDefines, scene: Scene): void;
        /**
         * Binds sheen data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         * @param engine defines the engine to use for capability checks
         * @param subMesh defines the sub mesh being rendered
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void;
        /**
         * Checks whether sheen uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by sheen
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Adds the active sheen textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable sheen textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the sheen textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        addFallbacks(defines: MaterialSheenDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Adds the sheen sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }


    /** This file must only contain pure code and pure imports */
    /**
     * The PBR material of BJS following the metal roughness convention.
     *
     * This fits to the PBR convention in the GLTF definition:
     * https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Archived/KHR_materials_pbrSpecularGlossiness/README.md
     */
    export class PBRMetallicRoughnessMaterial extends PBRBaseSimpleMaterial {
        /**
         * The base color has two different interpretations depending on the value of metalness.
         * When the material is a metal, the base color is the specific measured reflectance value
         * at normal incidence (F0). For a non-metal the base color represents the reflected diffuse color
         * of the material.
         */
        baseColor: Color3;
        /**
         * Base texture of the metallic workflow. It contains both the baseColor information in RGB as
         * well as opacity information in the alpha channel.
         */
        baseTexture: Nullable<BaseTexture>;
        /**
         * Specifies the metallic scalar value of the material.
         * Can also be used to scale the metalness values of the metallic texture.
         */
        metallic: number;
        /**
         * Specifies the roughness scalar value of the material.
         * Can also be used to scale the roughness values of the metallic texture.
         */
        roughness: number;
        /**
         * Texture containing both the metallic value in the B channel and the
         * roughness value in the G channel to keep better precision.
         */
        metallicRoughnessTexture: Nullable<BaseTexture>;
        /**
         * Instantiates a new PBRMetalRoughnessMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         */
        constructor(name: string, scene?: Scene);
        /**
         * @returns the current class name of the material.
         */
        getClassName(): string;
        /**
         * Makes a duplicate of the current material.
         * @param name - name to use for the new material.
         * @returns cloned material instance
         */
        clone(name: string): PBRMetallicRoughnessMaterial;
        /**
         * Serialize the material to a parsable JSON object.
         * @returns the JSON object
         */
        serialize(): any;
        /**
         * Parses a JSON object corresponding to the serialize function.
         * @param source - JSON source object.
         * @param scene - Defines the scene we are parsing for
         * @param rootUrl - Defines the rootUrl of this parsed object
         * @returns a new PBRMetalRoughnessMaterial
         */
        static Parse(source: any, scene: Scene, rootUrl: string): PBRMetallicRoughnessMaterial;
    }
    /**
     * Register side effects for pbrMetallicRoughnessMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPbrMetallicRoughnessMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pbrMetallicRoughnessMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * The Physically based material of BJS.
     *
     * This offers the main features of a standard PBR material.
     * For more information, please refer to the documentation :
     * https://doc.babylonjs.com/features/featuresDeepDive/materials/using/introToPBR
     */
    export class PBRMaterial extends PBRBaseMaterial {
        /**
         * PBRMaterialTransparencyMode: No transparency mode, Alpha channel is not use.
         */
        static readonly PBRMATERIAL_OPAQUE = 0;
        /**
         * PBRMaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.
         */
        static readonly PBRMATERIAL_ALPHATEST = 1;
        /**
         * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         */
        static readonly PBRMATERIAL_ALPHABLEND = 2;
        /**
         * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         * They are also discarded below the alpha cutoff threshold to improve performances.
         */
        static readonly PBRMATERIAL_ALPHATESTANDBLEND = 3;
        /**
         * Defines the default value of how much AO map is occluding the analytical lights
         * (point spot...).
         */
        static DEFAULT_AO_ON_ANALYTICAL_LIGHTS: number;
        /**
         * Intensity of the direct lights e.g. the four lights available in your scene.
         * This impacts both the direct diffuse and specular highlights.
         */
        directIntensity: number;
        /**
         * Intensity of the emissive part of the material.
         * This helps controlling the emissive effect without modifying the emissive color.
         */
        emissiveIntensity: number;
        /**
         * Intensity of the environment e.g. how much the environment will light the object
         * either through harmonics for rough material or through the reflection for shiny ones.
         */
        environmentIntensity: number;
        /**
         * This is a special control allowing the reduction of the specular highlights coming from the
         * four lights of the scene. Those highlights may not be needed in full environment lighting.
         */
        specularIntensity: number;
        /**
         * Debug Control allowing disabling the bump map on this material.
         */
        disableBumpMap: boolean;
        /**
         * AKA Diffuse Texture in standard nomenclature.
         */
        albedoTexture: Nullable<BaseTexture>;
        /**
         * OpenPBR Base Weight texture (multiplier to the diffuse and metal lobes).
         */
        baseWeightTexture: Nullable<BaseTexture>;
        /**
         * OpenPBR Base Diffuse Roughness texture (roughness of the diffuse lobe).
         */
        baseDiffuseRoughnessTexture: Nullable<BaseTexture>;
        /**
         * AKA Occlusion Texture in other nomenclature.
         */
        ambientTexture: Nullable<BaseTexture>;
        /**
         * AKA Occlusion Texture Intensity in other nomenclature.
         */
        ambientTextureStrength: number;
        /**
         * Defines how much the AO map is occluding the analytical lights (point spot...).
         * 1 means it completely occludes it
         * 0 mean it has no impact
         */
        ambientTextureImpactOnAnalyticalLights: number;
        /**
         * Stores the alpha values in a texture. Use luminance if texture.getAlphaFromRGB is true.
         */
        opacityTexture: Nullable<BaseTexture>;
        /**
         * Stores the reflection values in a texture.
         */
        reflectionTexture: Nullable<BaseTexture>;
        /**
         * Stores the emissive values in a texture.
         */
        emissiveTexture: Nullable<BaseTexture>;
        /**
         * AKA Specular texture in other nomenclature.
         */
        reflectivityTexture: Nullable<BaseTexture>;
        /**
         * Used to switch from specular/glossiness to metallic/roughness workflow.
         */
        metallicTexture: Nullable<BaseTexture>;
        /**
         * Specifies the metallic scalar of the metallic/roughness workflow.
         * Can also be used to scale the metalness values of the metallic texture.
         */
        metallic: Nullable<number>;
        /**
         * Specifies the roughness scalar of the metallic/roughness workflow.
         * Can also be used to scale the roughness values of the metallic texture.
         */
        roughness: Nullable<number>;
        /**
         * In metallic workflow, specifies an F0 factor to help configuring the material F0.
         * By default the indexOfrefraction is used to compute F0;
         *
         * This is used as a factor against the default reflectance at normal incidence to tweak it.
         *
         * F0 = defaultF0 * metallicF0Factor * metallicReflectanceColor;
         * F90 = metallicReflectanceColor;
         */
        metallicF0Factor: number;
        /**
         * In metallic workflow, specifies an F0 color.
         * By default the F90 is always 1;
         *
         * Please note that this factor is also used as a factor against the default reflectance at normal incidence.
         *
         * F0 = defaultF0_from_IOR * metallicF0Factor * metallicReflectanceColor
         * F90 = metallicF0Factor;
         */
        metallicReflectanceColor: Color3;
        /**
         * Specifies that only the A channel from metallicReflectanceTexture should be used.
         * If false, both RGB and A channels will be used
         */
        useOnlyMetallicFromMetallicReflectanceTexture: boolean;
        /**
         * Defines to store metallicReflectanceColor in RGB and metallicF0Factor in A
         * This is multiplied against the scalar values defined in the material.
         * If useOnlyMetallicFromMetallicReflectanceTexture is true, don't use the RGB channels, only A
         */
        metallicReflectanceTexture: Nullable<BaseTexture>;
        /**
         * Defines to store reflectanceColor in RGB
         * This is multiplied against the scalar values defined in the material.
         * If both reflectanceTexture and metallicReflectanceTexture textures are provided and useOnlyMetallicFromMetallicReflectanceTexture
         * is false, metallicReflectanceTexture takes priority and reflectanceTexture is not used
         */
        reflectanceTexture: Nullable<BaseTexture>;
        /**
         * Used to enable roughness/glossiness fetch from a separate channel depending on the current mode.
         * Gray Scale represents roughness in metallic mode and glossiness in specular mode.
         */
        microSurfaceTexture: Nullable<BaseTexture>;
        /**
         * Stores surface normal data used to displace a mesh in a texture.
         */
        bumpTexture: Nullable<BaseTexture>;
        /**
         * Stores the pre-calculated light information of a mesh in a texture.
         */
        lightmapTexture: Nullable<BaseTexture>;
        /**
         * Stores the refracted light information in a texture.
         */
        get refractionTexture(): Nullable<BaseTexture>;
        set refractionTexture(value: Nullable<BaseTexture>);
        /**
         * The color of a material in ambient lighting.
         */
        ambientColor: Color3;
        /**
         * AKA Diffuse Color in other nomenclature.
         */
        albedoColor: Color3;
        /**
         * OpenPBR Base Weight (multiplier to the diffuse and metal lobes).
         */
        baseWeight: number;
        /**
         * OpenPBR Base Diffuse Roughness (roughness of the diffuse lobe).
         */
        baseDiffuseRoughness: Nullable<number>;
        /**
         * AKA Specular Color in other nomenclature.
         */
        reflectivityColor: Color3;
        /**
         * The color reflected from the material.
         */
        reflectionColor: Color3;
        /**
         * The color emitted from the material.
         */
        emissiveColor: Color3;
        /**
         * AKA Glossiness in other nomenclature.
         */
        microSurface: number;
        /**
         * Index of refraction of the material base layer.
         * https://en.wikipedia.org/wiki/List_of_refractive_indices
         *
         * This does not only impact refraction but also the Base F0 of Dielectric Materials.
         *
         * From dielectric fresnel rules: F0 = square((iorT - iorI) / (iorT + iorI))
         */
        get indexOfRefraction(): number;
        set indexOfRefraction(value: number);
        /**
         * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.
         */
        get invertRefractionY(): boolean;
        set invertRefractionY(value: boolean);
        /**
         * This parameters will make the material used its opacity to control how much it is refracting against not.
         * Materials half opaque for instance using refraction could benefit from this control.
         */
        get linkRefractionWithTransparency(): boolean;
        set linkRefractionWithTransparency(value: boolean);
        /**
         * If true, the light map contains occlusion information instead of lighting info.
         */
        useLightmapAsShadowmap: boolean;
        /**
         * Specifies that the alpha is coming form the albedo channel alpha channel for alpha blending.
         */
        useAlphaFromAlbedoTexture: boolean;
        /**
         * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.
         */
        forceAlphaTest: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         */
        alphaCutOff: number;
        /**
         * Specifies that the material will keep the specular highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When sun reflects on it you can not see what is behind.
         */
        useSpecularOverAlpha: boolean;
        /**
         * Specifies if the reflectivity texture contains the glossiness information in its alpha channel.
         */
        useMicroSurfaceFromReflectivityMapAlpha: boolean;
        /**
         * Specifies if the metallic texture contains the roughness information in its alpha channel.
         */
        useRoughnessFromMetallicTextureAlpha: boolean;
        /**
         * Specifies if the metallic texture contains the roughness information in its green channel.
         * Needs useRoughnessFromMetallicTextureAlpha to be false.
         */
        useRoughnessFromMetallicTextureGreen: boolean;
        /**
         * Specifies if the metallic texture contains the metallness information in its blue channel.
         */
        useMetallnessFromMetallicTextureBlue: boolean;
        /**
         * Specifies if the metallic texture contains the ambient occlusion information in its red channel.
         */
        useAmbientOcclusionFromMetallicTextureRed: boolean;
        /**
         * Specifies if the ambient texture contains the ambient occlusion information in its red channel only.
         */
        useAmbientInGrayScale: boolean;
        /**
         * In case the reflectivity map does not contain the microsurface information in its alpha channel,
         * The material will try to infer what glossiness each pixel should be.
         */
        useAutoMicroSurfaceFromReflectivityMap: boolean;
        /**
         * BJS is using an hardcoded light falloff based on a manually sets up range.
         * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.
         * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.
         */
        get usePhysicalLightFalloff(): boolean;
        /**
         * BJS is using an hardcoded light falloff based on a manually sets up range.
         * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.
         * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.
         */
        set usePhysicalLightFalloff(value: boolean);
        /**
         * In order to support the falloff compatibility with gltf, a special mode has been added
         * to reproduce the gltf light falloff.
         */
        get useGLTFLightFalloff(): boolean;
        /**
         * In order to support the falloff compatibility with gltf, a special mode has been added
         * to reproduce the gltf light falloff.
         */
        set useGLTFLightFalloff(value: boolean);
        /**
         * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When the street lights reflects on it you can not see what is behind.
         */
        useRadianceOverAlpha: boolean;
        /**
         * Allows using an object space normal map (instead of tangent space).
         */
        useObjectSpaceNormalMap: boolean;
        /**
         * Allows using the bump map in parallax mode.
         */
        useParallax: boolean;
        /**
         * Allows using the bump map in parallax occlusion mode.
         */
        useParallaxOcclusion: boolean;
        /**
         * Controls the scale bias of the parallax mode.
         */
        parallaxScaleBias: number;
        /**
         * If sets to true, disables all the lights affecting the material.
         */
        disableLighting: boolean;
        /**
         * Force the shader to compute irradiance in the fragment shader in order to take bump in account.
         */
        forceIrradianceInFragment: boolean;
        /**
         * Number of Simultaneous lights allowed on the material.
         */
        maxSimultaneousLights: number;
        /**
         * If sets to true, x component of normal map value will invert (x = 1.0 - x).
         */
        invertNormalMapX: boolean;
        /**
         * If sets to true, y component of normal map value will invert (y = 1.0 - y).
         */
        invertNormalMapY: boolean;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         */
        twoSidedLighting: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)
         */
        useAlphaFresnel: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)
         */
        useLinearAlphaFresnel: boolean;
        /**
         * Let user defines the brdf lookup texture used for IBL.
         * A default 8bit version is embedded but you could point at :
         * * Default texture: https://assets.babylonjs.com/environments/correlatedMSBRDF_RGBD.png
         * * Default 16bit pixel depth texture: https://assets.babylonjs.com/environments/correlatedMSBRDF.dds
         * * LEGACY Default None correlated https://assets.babylonjs.com/environments/uncorrelatedBRDF_RGBD.png
         * * LEGACY Default None correlated 16bit pixel depth https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds
         */
        environmentBRDFTexture: Nullable<BaseTexture>;
        /**
         * Force normal to face away from face.
         */
        forceNormalForward: boolean;
        /**
         * Enables specular anti aliasing in the PBR shader.
         * It will both interacts on the Geometry for analytical and IBL lighting.
         * It also prefilter the roughness map based on the bump values.
         */
        enableSpecularAntiAliasing: boolean;
        /**
         * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal
         * makes the reflect vector face the model (under horizon).
         */
        useHorizonOcclusion: boolean;
        /**
         * This parameters will enable/disable radiance occlusion by preventing the radiance to lit
         * too much the area relying on ambient texture to define their ambient occlusion.
         */
        useRadianceOcclusion: boolean;
        /**
         * If set to true, no lighting calculations will be applied.
         */
        unlit: boolean;
        /**
         * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)
         */
        applyDecalMapAfterDetailMap: boolean;
        /**
         * Instantiates a new PBRMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean);
        /**
         * @returns the name of this material class.
         */
        getClassName(): string;
        /**
         * Makes a duplicate of the current material.
         * @param name - name to use for the new material.
         * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g diffuse and opacity), only clone it once and reuse it on the other channels. Default false.
         * @param rootUrl defines the root URL to use to load textures
         * @returns cloned material instance
         */
        clone(name: string, cloneTexturesOnlyOnce?: boolean, rootUrl?: string): PBRMaterial;
        /**
         * Serializes this PBR Material.
         * @returns - An object with the serialized material.
         */
        serialize(): any;
        /**
         * Parses a PBR Material from a serialized object.
         * @param source - Serialized object.
         * @param scene - BJS scene instance.
         * @param rootUrl - url for the scene object
         * @returns - PBRMaterial
         */
        static Parse(source: any, scene: Scene, rootUrl: string): PBRMaterial;
    }
    /**
     * Register side effects for pbrMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPbrMaterial(): void;
    /**
     * Register side effects for PBRMaterial.
     * Safe to call multiple times; only the first call has an effect.
     * Alias for {@link RegisterPbrMaterial}.
     */
    export function RegisterPBRMaterial(): void;


        interface PBRBaseMaterial {
            /** @internal */
            _decalMap: Nullable<DecalMapConfiguration>;
            /**
             * Defines the decal map parameters for the material.
             */
            decalMap: Nullable<DecalMapConfiguration>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Register side effects for pbrMaterialDecalMap.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPbrMaterialDecalMap(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pbrMaterial.decalMap.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pbrMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * @internal
     */
    export class MaterialIridescenceDefines extends MaterialDefines {
        IRIDESCENCE: boolean;
        IRIDESCENCE_TEXTURE: boolean;
        IRIDESCENCE_TEXTUREDIRECTUV: number;
        IRIDESCENCE_THICKNESS_TEXTURE: boolean;
        IRIDESCENCE_THICKNESS_TEXTUREDIRECTUV: number;
    }
    /**
     * Plugin that implements the iridescence (thin film) component of the PBR material
     */
    export class PBRIridescenceConfiguration extends MaterialPluginBase {
        protected _material: PBRBaseMaterial;
        /**
         * The default minimum thickness of the thin-film layer given in nanometers (nm).
         * Defaults to 100 nm.
         * @internal
         */
        static readonly _DefaultMinimumThickness = 100;
        /**
         * The default maximum thickness of the thin-film layer given in nanometers (nm).
         * Defaults to 400 nm.
         * @internal
         */
        static readonly _DefaultMaximumThickness = 400;
        /**
         * The default index of refraction of the thin-film layer.
         * Defaults to 1.3
         * @internal
         */
        static readonly _DefaultIndexOfRefraction = 1.3;
        private _isEnabled;
        /**
         * Defines if the iridescence is enabled in the material.
         */
        isEnabled: boolean;
        /**
         * Defines the iridescence layer strength (between 0 and 1) it defaults to 1.
         */
        intensity: number;
        /**
         * Defines the minimum thickness of the thin-film layer given in nanometers (nm).
         */
        minimumThickness: number;
        /**
         * Defines the maximum thickness of the thin-film layer given in nanometers (nm). This will be the thickness used if not thickness texture has been set.
         */
        maximumThickness: number;
        /**
         * Defines the maximum thickness of the thin-film layer given in nanometers (nm).
         */
        indexOfRefraction: number;
        private _texture;
        /**
         * Stores the iridescence intensity in a texture (red channel)
         */
        texture: Nullable<BaseTexture>;
        private _thicknessTexture;
        /**
         * Stores the iridescence thickness in a texture (green channel)
         */
        thicknessTexture: Nullable<BaseTexture>;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the iridescence textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @returns true if iridescence is ready
         */
        isReadyForSubMesh(defines: MaterialIridescenceDefines, scene: Scene): boolean;
        /**
         * Updates shader defines for iridescence before attributes are processed.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         */
        prepareDefinesBeforeAttributes(defines: MaterialIridescenceDefines, scene: Scene): void;
        /**
         * Binds iridescence data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene): void;
        /**
         * Checks whether iridescence uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by iridescence
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Adds the active iridescence textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable iridescence textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the iridescence textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        addFallbacks(defines: MaterialIridescenceDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Adds the iridescence sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }


    /**
     * @internal
     */
    export class MaterialClearCoatDefines extends MaterialDefines {
        CLEARCOAT: boolean;
        CLEARCOAT_DEFAULTIOR: boolean;
        CLEARCOAT_TEXTURE: boolean;
        CLEARCOAT_TEXTURE_ROUGHNESS: boolean;
        CLEARCOAT_TEXTUREDIRECTUV: number;
        CLEARCOAT_TEXTURE_ROUGHNESSDIRECTUV: number;
        CLEARCOAT_BUMP: boolean;
        CLEARCOAT_BUMPDIRECTUV: number;
        CLEARCOAT_USE_ROUGHNESS_FROM_MAINTEXTURE: boolean;
        CLEARCOAT_REMAP_F0: boolean;
        CLEARCOAT_TINT: boolean;
        CLEARCOAT_TINT_TEXTURE: boolean;
        CLEARCOAT_TINT_TEXTUREDIRECTUV: number;
        CLEARCOAT_TINT_GAMMATEXTURE: boolean;
    }
    /**
     * Plugin that implements the clear coat component of the PBR material
     */
    export class PBRClearCoatConfiguration extends MaterialPluginBase {
        protected _material: PBRBaseMaterial;
        /**
         * This defaults to 1.5 corresponding to a 0.04 f0 or a 4% reflectance at normal incidence
         * The default fits with a polyurethane material.
         * @internal
         */
        static readonly _DefaultIndexOfRefraction = 1.5;
        private _isEnabled;
        /**
         * Defines if the clear coat is enabled in the material.
         */
        isEnabled: boolean;
        /**
         * Defines the clear coat layer strength (between 0 and 1) it defaults to 1.
         */
        intensity: number;
        /**
         * Defines the clear coat layer roughness.
         */
        roughness: number;
        private _indexOfRefraction;
        /**
         * Defines the index of refraction of the clear coat.
         * This defaults to 1.5 corresponding to a 0.04 f0 or a 4% reflectance at normal incidence
         * The default fits with a polyurethane material.
         * Changing the default value is more performance intensive.
         */
        indexOfRefraction: number;
        private _texture;
        /**
         * Stores the clear coat values in a texture (red channel is intensity and green channel is roughness)
         * If useRoughnessFromMainTexture is false, the green channel of texture is not used and the green channel of textureRoughness is used instead
         * if textureRoughness is not empty, else no texture roughness is used
         */
        texture: Nullable<BaseTexture>;
        private _useRoughnessFromMainTexture;
        /**
         * Indicates that the green channel of the texture property will be used for roughness (default: true)
         * If false, the green channel from textureRoughness is used for roughness
         */
        useRoughnessFromMainTexture: boolean;
        private _textureRoughness;
        /**
         * Stores the clear coat roughness in a texture (green channel)
         * Not used if useRoughnessFromMainTexture is true
         */
        textureRoughness: Nullable<BaseTexture>;
        private _remapF0OnInterfaceChange;
        /**
         * Defines if the F0 value should be remapped to account for the interface change in the material.
         */
        remapF0OnInterfaceChange: boolean;
        private _bumpTexture;
        /**
         * Define the clear coat specific bump texture.
         */
        bumpTexture: Nullable<BaseTexture>;
        private _isTintEnabled;
        /**
         * Defines if the clear coat tint is enabled in the material.
         */
        isTintEnabled: boolean;
        /**
         * Defines the clear coat tint of the material.
         * This is only use if tint is enabled
         */
        tintColor: Color3;
        /**
         * Defines the distance at which the tint color should be found in the
         * clear coat media.
         * This is only use if tint is enabled
         */
        tintColorAtDistance: number;
        /**
         * Defines the clear coat layer thickness.
         * This is only use if tint is enabled
         */
        tintThickness: number;
        private _tintTexture;
        /**
         * Stores the clear tint values in a texture.
         * rgb is tint
         * a is a thickness factor
         */
        tintTexture: Nullable<BaseTexture>;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the clear coat textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @param engine defines the engine to use for readiness checks
         * @returns true if clear coat is ready
         */
        isReadyForSubMesh(defines: MaterialClearCoatDefines, scene: Scene, engine: Engine): boolean;
        /**
         * Updates shader defines for clear coat before attributes are processed.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         */
        prepareDefinesBeforeAttributes(defines: MaterialClearCoatDefines, scene: Scene): void;
        /**
         * Binds clear coat data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         * @param engine defines the engine to use for capability checks
         * @param subMesh defines the sub mesh being rendered
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void;
        /**
         * Checks whether clear coat uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by clear coat
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Adds the active clear coat textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable clear coat textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the clear coat textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        addFallbacks(defines: MaterialClearCoatDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Adds the clear coat sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
    }


    /**
     * The Physically based simple base material of BJS.
     *
     * This enables better naming and convention enforcements on top of the pbrMaterial.
     * It is used as the base class for both the specGloss and metalRough conventions.
     */
    export abstract class PBRBaseSimpleMaterial extends PBRBaseMaterial {
        /**
         * Number of Simultaneous lights allowed on the material.
         */
        maxSimultaneousLights: number;
        /**
         * If sets to true, disables all the lights affecting the material.
         */
        disableLighting: boolean;
        /**
         * Environment Texture used in the material (this is use for both reflection and environment lighting).
         */
        environmentTexture: Nullable<BaseTexture>;
        /**
         * If sets to true, x component of normal map value will invert (x = 1.0 - x).
         */
        invertNormalMapX: boolean;
        /**
         * If sets to true, y component of normal map value will invert (y = 1.0 - y).
         */
        invertNormalMapY: boolean;
        /**
         * Normal map used in the model.
         */
        normalTexture: Nullable<BaseTexture>;
        /**
         * Emissivie color used to self-illuminate the model.
         */
        emissiveColor: Color3;
        /**
         * Emissivie texture used to self-illuminate the model.
         */
        emissiveTexture: Nullable<BaseTexture>;
        /**
         * Occlusion Channel Strength.
         */
        occlusionStrength: number;
        /**
         * Occlusion Texture of the material (adding extra occlusion effects).
         */
        occlusionTexture: Nullable<BaseTexture>;
        /**
         * Defines the alpha limits in alpha test mode.
         */
        alphaCutOff: number;
        /**
         * Gets the current double sided mode.
         */
        get doubleSided(): boolean;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         */
        set doubleSided(value: boolean);
        /**
         * Stores the pre-calculated light information of a mesh in a texture.
         */
        lightmapTexture: Nullable<BaseTexture>;
        /**
         * If true, the light map contains occlusion information instead of lighting info.
         */
        useLightmapAsShadowmap: boolean;
        /**
         * Instantiates a new PBRMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         */
        constructor(name: string, scene?: Scene);
        getClassName(): string;
    }


    /** This file must only contain pure code and pure imports */
    var PBRMaterialDefinesBase_base: {
        new (...args: any[]): {
            PREPASS: boolean;
            PREPASS_COLOR: boolean;
            PREPASS_COLOR_INDEX: number;
            PREPASS_IRRADIANCE_LEGACY: boolean;
            PREPASS_IRRADIANCE_LEGACY_INDEX: number;
            PREPASS_IRRADIANCE: boolean;
            PREPASS_IRRADIANCE_INDEX: number;
            PREPASS_ALBEDO: boolean;
            PREPASS_ALBEDO_INDEX: number;
            PREPASS_ALBEDO_SQRT: boolean;
            PREPASS_ALBEDO_SQRT_INDEX: number;
            PREPASS_DEPTH: boolean;
            PREPASS_DEPTH_INDEX: number;
            PREPASS_SCREENSPACE_DEPTH: boolean;
            PREPASS_SCREENSPACE_DEPTH_INDEX: number;
            PREPASS_NORMALIZED_VIEW_DEPTH: boolean;
            PREPASS_NORMALIZED_VIEW_DEPTH_INDEX: number;
            PREPASS_NORMAL: boolean;
            PREPASS_NORMAL_INDEX: number;
            PREPASS_NORMAL_WORLDSPACE: boolean;
            PREPASS_WORLD_NORMAL: boolean;
            PREPASS_WORLD_NORMAL_INDEX: number;
            PREPASS_POSITION: boolean;
            PREPASS_POSITION_INDEX: number;
            PREPASS_LOCAL_POSITION: boolean;
            PREPASS_LOCAL_POSITION_INDEX: number;
            PREPASS_VELOCITY: boolean;
            PREPASS_VELOCITY_INDEX: number;
            PREPASS_VELOCITY_LINEAR: boolean;
            PREPASS_VELOCITY_LINEAR_INDEX: number;
            PREPASS_REFLECTIVITY: boolean;
            PREPASS_REFLECTIVITY_INDEX: number;
            SCENE_MRT_COUNT: number;
        };
    } & {
        new (...args: any[]): {
            MAINUV1: boolean;
            MAINUV2: boolean;
            MAINUV3: boolean;
            MAINUV4: boolean;
            MAINUV5: boolean;
            MAINUV6: boolean;
            UV1: boolean;
            UV2: boolean;
            UV3: boolean;
            UV4: boolean;
            UV5: boolean;
            UV6: boolean;
        };
    } & typeof MaterialDefines;
    class PBRMaterialDefinesBase extends PBRMaterialDefinesBase_base {
    }
    var PBRMaterialDefines_base: {
        new (...args: any[]): {
            IMAGEPROCESSING: boolean;
            VIGNETTE: boolean;
            VIGNETTEBLENDMODEMULTIPLY: boolean;
            VIGNETTEBLENDMODEOPAQUE: boolean;
            TONEMAPPING: number;
            CONTRAST: boolean;
            COLORCURVES: boolean;
            COLORGRADING: boolean;
            COLORGRADING3D: boolean;
            SAMPLER3DGREENDEPTH: boolean;
            SAMPLER3DBGRMAP: boolean;
            DITHER: boolean;
            IMAGEPROCESSINGPOSTPROCESS: boolean;
            SKIPFINALCOLORCLAMP: boolean;
            EXPOSURE: boolean;
        };
    } & typeof PBRMaterialDefinesBase;
    /**
     * Manages the defines for the PBR Material.
     * @internal
     */
    export class PBRMaterialDefines extends PBRMaterialDefines_base {
        PBR: boolean;
        NUM_SAMPLES: string;
        REALTIME_FILTERING: boolean;
        IBL_CDF_FILTERING: boolean;
        ALBEDO: boolean;
        GAMMAALBEDO: boolean;
        ALBEDODIRECTUV: number;
        VERTEXCOLOR: boolean;
        BASE_WEIGHT: boolean;
        BASE_WEIGHTDIRECTUV: number;
        BASE_DIFFUSE_ROUGHNESS: boolean;
        BASE_DIFFUSE_ROUGHNESSDIRECTUV: number;
        BAKED_VERTEX_ANIMATION_TEXTURE: boolean;
        AMBIENT: boolean;
        AMBIENTDIRECTUV: number;
        AMBIENTINGRAYSCALE: boolean;
        OPACITY: boolean;
        VERTEXALPHA: boolean;
        OPACITYDIRECTUV: number;
        OPACITYRGB: boolean;
        ALPHATEST: boolean;
        DEPTHPREPASS: boolean;
        ALPHABLEND: boolean;
        ALPHAFROMALBEDO: boolean;
        ALPHATESTVALUE: string;
        SPECULAROVERALPHA: boolean;
        RADIANCEOVERALPHA: boolean;
        ALPHAFRESNEL: boolean;
        LINEARALPHAFRESNEL: boolean;
        PREMULTIPLYALPHA: boolean;
        EMISSIVE: boolean;
        EMISSIVEDIRECTUV: number;
        GAMMAEMISSIVE: boolean;
        REFLECTIVITY: boolean;
        REFLECTIVITY_GAMMA: boolean;
        REFLECTIVITYDIRECTUV: number;
        SPECULARTERM: boolean;
        MICROSURFACEFROMREFLECTIVITYMAP: boolean;
        MICROSURFACEAUTOMATIC: boolean;
        LODBASEDMICROSFURACE: boolean;
        MICROSURFACEMAP: boolean;
        MICROSURFACEMAPDIRECTUV: number;
        METALLICWORKFLOW: boolean;
        ROUGHNESSSTOREINMETALMAPALPHA: boolean;
        ROUGHNESSSTOREINMETALMAPGREEN: boolean;
        METALLNESSSTOREINMETALMAPBLUE: boolean;
        AOSTOREINMETALMAPRED: boolean;
        METALLIC_REFLECTANCE: boolean;
        METALLIC_REFLECTANCE_GAMMA: boolean;
        METALLIC_REFLECTANCEDIRECTUV: number;
        METALLIC_REFLECTANCE_USE_ALPHA_ONLY: boolean;
        REFLECTANCE: boolean;
        REFLECTANCE_GAMMA: boolean;
        REFLECTANCEDIRECTUV: number;
        ENVIRONMENTBRDF: boolean;
        ENVIRONMENTBRDF_RGBD: boolean;
        NORMAL: boolean;
        TANGENT: boolean;
        BUMP: boolean;
        BUMPDIRECTUV: number;
        OBJECTSPACE_NORMALMAP: boolean;
        PARALLAX: boolean;
        PARALLAX_RHS: boolean;
        PARALLAXOCCLUSION: boolean;
        NORMALXYSCALE: boolean;
        LIGHTMAP: boolean;
        LIGHTMAPDIRECTUV: number;
        USELIGHTMAPASSHADOWMAP: boolean;
        GAMMALIGHTMAP: boolean;
        RGBDLIGHTMAP: boolean;
        REFLECTION: boolean;
        REFLECTIONMAP_3D: boolean;
        REFLECTIONMAP_SPHERICAL: boolean;
        REFLECTIONMAP_PLANAR: boolean;
        REFLECTIONMAP_CUBIC: boolean;
        USE_LOCAL_REFLECTIONMAP_CUBIC: boolean;
        REFLECTIONMAP_PROJECTION: boolean;
        REFLECTIONMAP_SKYBOX: boolean;
        REFLECTIONMAP_EXPLICIT: boolean;
        REFLECTIONMAP_EQUIRECTANGULAR: boolean;
        REFLECTIONMAP_EQUIRECTANGULAR_FIXED: boolean;
        REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED: boolean;
        INVERTCUBICMAP: boolean;
        USESPHERICALFROMREFLECTIONMAP: boolean;
        USEIRRADIANCEMAP: boolean;
        USE_IRRADIANCE_DOMINANT_DIRECTION: boolean;
        USESPHERICALINVERTEX: boolean;
        REFLECTIONMAP_OPPOSITEZ: boolean;
        LODINREFLECTIONALPHA: boolean;
        GAMMAREFLECTION: boolean;
        RGBDREFLECTION: boolean;
        LINEARSPECULARREFLECTION: boolean;
        RADIANCEOCCLUSION: boolean;
        HORIZONOCCLUSION: boolean;
        INSTANCES: boolean;
        THIN_INSTANCES: boolean;
        INSTANCESCOLOR: boolean;
        NUM_BONE_INFLUENCERS: number;
        BonesPerMesh: number;
        BONETEXTURE: boolean;
        BONES_VELOCITY_ENABLED: boolean;
        NONUNIFORMSCALING: boolean;
        MORPHTARGETS: boolean;
        MORPHTARGETS_POSITION: boolean;
        MORPHTARGETS_NORMAL: boolean;
        MORPHTARGETS_TANGENT: boolean;
        MORPHTARGETS_UV: boolean;
        MORPHTARGETS_UV2: boolean;
        MORPHTARGETS_COLOR: boolean;
        MORPHTARGETTEXTURE_HASPOSITIONS: boolean;
        MORPHTARGETTEXTURE_HASNORMALS: boolean;
        MORPHTARGETTEXTURE_HASTANGENTS: boolean;
        MORPHTARGETTEXTURE_HASUVS: boolean;
        MORPHTARGETTEXTURE_HASUV2S: boolean;
        MORPHTARGETTEXTURE_HASCOLORS: boolean;
        NUM_MORPH_INFLUENCERS: number;
        MORPHTARGETS_TEXTURE: boolean;
        MULTIVIEW: boolean;
        ORDER_INDEPENDENT_TRANSPARENCY: boolean;
        ORDER_INDEPENDENT_TRANSPARENCY_16BITS: boolean;
        USEPHYSICALLIGHTFALLOFF: boolean;
        USEGLTFLIGHTFALLOFF: boolean;
        TWOSIDEDLIGHTING: boolean;
        MIRRORED: boolean;
        SHADOWFLOAT: boolean;
        CLIPPLANE: boolean;
        CLIPPLANE2: boolean;
        CLIPPLANE3: boolean;
        CLIPPLANE4: boolean;
        CLIPPLANE5: boolean;
        CLIPPLANE6: boolean;
        POINTSIZE: boolean;
        FOG: boolean;
        LOGARITHMICDEPTH: boolean;
        CAMERA_ORTHOGRAPHIC: boolean;
        CAMERA_PERSPECTIVE: boolean;
        AREALIGHTSUPPORTED: boolean;
        FORCENORMALFORWARD: boolean;
        SPECULARAA: boolean;
        UNLIT: boolean;
        DECAL_AFTER_DETAIL: boolean;
        TEXTURE_REPETITION_MODE: number;
        DEBUGMODE: number;
        USE_VERTEX_PULLING: boolean;
        VERTEX_PULLING_USE_INDEX_BUFFER: boolean;
        VERTEX_PULLING_INDEX_BUFFER_32BITS: boolean;
        RIGHT_HANDED: boolean;
        CLUSTLIGHT_SLICES: number;
        CLUSTLIGHT_BATCH: number;
        /**
         * Initializes the PBR Material defines.
         * @param externalProperties The external properties
         */
        constructor(externalProperties?: {
            [name: string]: {
                type: string;
                default: any;
            };
        });
        /**
         * Resets the PBR Material defines.
         */
        reset(): void;
    }
    var PBRBaseMaterialBase_base: {
        new (...args: any[]): {
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            get cameraColorCurvesEnabled(): boolean;
            set cameraColorCurvesEnabled(value: boolean);
            get cameraColorGradingEnabled(): boolean;
            set cameraColorGradingEnabled(value: boolean);
            get cameraToneMappingEnabled(): boolean;
            set cameraToneMappingEnabled(value: boolean);
            get cameraExposure(): number;
            set cameraExposure(value: number);
            get cameraContrast(): number;
            set cameraContrast(value: number);
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            get cameraColorCurves(): Nullable<ColorCurves>;
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & typeof PushMaterial;
    class PBRBaseMaterialBase extends PBRBaseMaterialBase_base {
    }
    /**
     * The Physically based material base class of BJS.
     *
     * This offers the main features of a standard PBR material.
     * For more information, please refer to the documentation :
     * https://doc.babylonjs.com/features/featuresDeepDive/materials/using/introToPBR
     * @see [WebGL](https://playground.babylonjs.com/#CGHTSM#1)
     * @see [WebGPU](https://playground.babylonjs.com/#CGHTSM#2)
     */
    export abstract class PBRBaseMaterial extends PBRBaseMaterialBase {
        /**
         * PBRMaterialTransparencyMode: No transparency mode, Alpha channel is not use.
         */
        static readonly PBRMATERIAL_OPAQUE = 0;
        /**
         * PBRMaterialTransparencyMode: Alpha Test mode, pixel are discarded below a certain threshold defined by the alpha cutoff value.
         */
        static readonly PBRMATERIAL_ALPHATEST = 1;
        /**
         * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         */
        static readonly PBRMATERIAL_ALPHABLEND = 2;
        /**
         * PBRMaterialTransparencyMode: Pixels are blended (according to the alpha mode) with the already drawn pixels in the current frame buffer.
         * They are also discarded below the alpha cutoff threshold to improve performances.
         */
        static readonly PBRMATERIAL_ALPHATESTANDBLEND = 3;
        /**
         * Defines the default value of how much AO map is occluding the analytical lights
         * (point spot...).
         */
        static DEFAULT_AO_ON_ANALYTICAL_LIGHTS: number;
        /**
         * PBRMaterialLightFalloff Physical: light is falling off following the inverse squared distance law.
         */
        static readonly LIGHTFALLOFF_PHYSICAL = 0;
        /**
         * PBRMaterialLightFalloff gltf: light is falling off as described in the gltf moving to PBR document
         * to enhance interoperability with other engines.
         */
        static readonly LIGHTFALLOFF_GLTF = 1;
        /**
         * PBRMaterialLightFalloff Standard: light is falling off like in the standard material
         * to enhance interoperability with other materials.
         */
        static readonly LIGHTFALLOFF_STANDARD = 2;
        /**
         * Force all the PBR materials to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Intensity of the direct lights e.g. the four lights available in your scene.
         * This impacts both the direct diffuse and specular highlights.
         * @internal
         */
        _directIntensity: number;
        /**
         * Intensity of the emissive part of the material.
         * This helps controlling the emissive effect without modifying the emissive color.
         * @internal
         */
        _emissiveIntensity: number;
        /**
         * Intensity of the environment e.g. how much the environment will light the object
         * either through harmonics for rough material or through the reflection for shiny ones.
         * @internal
         */
        _environmentIntensity: number;
        /**
         * This is a special control allowing the reduction of the specular highlights coming from the
         * four lights of the scene. Those highlights may not be needed in full environment lighting.
         * @internal
         */
        _specularIntensity: number;
        /**
         * This stores the direct, emissive, environment, and specular light intensities into a Vector4.
         */
        private _lightingInfos;
        /**
         * Debug Control allowing disabling the bump map on this material.
         * @internal
         */
        _disableBumpMap: boolean;
        /**
         * AKA Diffuse Texture in standard nomenclature.
         * @internal
         */
        _albedoTexture: Nullable<BaseTexture>;
        /**
         * Base Weight texture (multiplier to the diffuse and metal lobes).
         * @internal
         */
        _baseWeightTexture: Nullable<BaseTexture>;
        /**
         * Base Diffuse Roughness texture (roughness of the diffuse lobe).
         * @internal
         */
        _baseDiffuseRoughnessTexture: Nullable<BaseTexture>;
        /**
         * AKA Occlusion Texture in other nomenclature.
         * @internal
         */
        _ambientTexture: Nullable<BaseTexture>;
        /**
         * AKA Occlusion Texture Intensity in other nomenclature.
         * @internal
         */
        _ambientTextureStrength: number;
        /**
         * Defines how much the AO map is occluding the analytical lights (point spot...).
         * 1 means it completely occludes it
         * 0 mean it has no impact
         * @internal
         */
        _ambientTextureImpactOnAnalyticalLights: number;
        /**
         * Stores the alpha values in a texture.
         * @internal
         */
        _opacityTexture: Nullable<BaseTexture>;
        /**
         * Stores the reflection values in a texture.
         * @internal
         */
        _reflectionTexture: Nullable<BaseTexture>;
        /**
         * Stores the emissive values in a texture.
         * @internal
         */
        _emissiveTexture: Nullable<BaseTexture>;
        /**
         * AKA Specular texture in other nomenclature.
         * @internal
         */
        _reflectivityTexture: Nullable<BaseTexture>;
        /**
         * Used to switch from specular/glossiness to metallic/roughness workflow.
         * @internal
         */
        _metallicTexture: Nullable<BaseTexture>;
        /**
         * Specifies the metallic scalar of the metallic/roughness workflow.
         * Can also be used to scale the metalness values of the metallic texture.
         * @internal
         */
        _metallic: Nullable<number>;
        /**
         * Specifies the roughness scalar of the metallic/roughness workflow.
         * Can also be used to scale the roughness values of the metallic texture.
         * @internal
         */
        _roughness: Nullable<number>;
        /**
         * In metallic workflow, specifies an F0 factor to help configuring the material F0.
         * By default the indexOfrefraction is used to compute F0;
         *
         * This is used as a factor against the default reflectance at normal incidence to tweak it.
         *
         * F0 = defaultF0 * metallicF0Factor * metallicReflectanceColor;
         * F90 = metallicReflectanceColor;
         * @internal
         */
        _metallicF0Factor: number;
        /**
         * In metallic workflow, specifies an F0 color.
         * By default the F90 is always 1;
         *
         * Please note that this factor is also used as a factor against the default reflectance at normal incidence.
         *
         * F0 = defaultF0_from_IOR * metallicF0Factor * metallicReflectanceColor
         * F90 = metallicF0Factor;
         * @internal
         */
        _metallicReflectanceColor: Color3;
        /**
         * Specifies that only the A channel from _metallicReflectanceTexture should be used.
         * If false, both RGB and A channels will be used
         * @internal
         */
        _useOnlyMetallicFromMetallicReflectanceTexture: boolean;
        /**
         * Defines to store metallicReflectanceColor in RGB and metallicF0Factor in A
         * This is multiply against the scalar values defined in the material.
         * @internal
         */
        _metallicReflectanceTexture: Nullable<BaseTexture>;
        /**
         * Defines to store reflectanceColor in RGB
         * This is multiplied against the scalar values defined in the material.
         * If both _reflectanceTexture and _metallicReflectanceTexture textures are provided and _useOnlyMetallicFromMetallicReflectanceTexture
         * is false, _metallicReflectanceTexture takes precedence and _reflectanceTexture is not used
         * @internal
         */
        _reflectanceTexture: Nullable<BaseTexture>;
        /**
         * Used to enable roughness/glossiness fetch from a separate channel depending on the current mode.
         * Gray Scale represents roughness in metallic mode and glossiness in specular mode.
         * @internal
         */
        _microSurfaceTexture: Nullable<BaseTexture>;
        /**
         * Stores surface normal data used to displace a mesh in a texture.
         * @internal
         */
        _bumpTexture: Nullable<BaseTexture>;
        /**
         * Stores the pre-calculated light information of a mesh in a texture.
         * @internal
         */
        _lightmapTexture: Nullable<BaseTexture>;
        /**
         * The color of a material in ambient lighting.
         * @internal
         */
        _ambientColor: Color3;
        /**
         * AKA Diffuse Color in other nomenclature.
         * @internal
         */
        _albedoColor: Color3;
        /**
         * Base Weight (multiplier to the diffuse and metal lobes).
         * @internal
         */
        _baseWeight: number;
        /**
         * Base Diffuse Roughness (roughness of the diffuse lobe).
         * Can also be used to scale the corresponding texture.
         * @internal
         */
        _baseDiffuseRoughness: Nullable<number>;
        /**
         * AKA Specular Color in other nomenclature.
         * @internal
         */
        _reflectivityColor: Color3;
        /**
         * The color applied when light is reflected from a material.
         * @internal
         */
        _reflectionColor: Color3;
        /**
         * The color applied when light is emitted from a material.
         * @internal
         */
        _emissiveColor: Color3;
        /**
         * AKA Glossiness in other nomenclature.
         * @internal
         */
        _microSurface: number;
        /**
         * Specifies that the material will use the light map as a show map.
         * @internal
         */
        _useLightmapAsShadowmap: boolean;
        /**
         * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal
         * makes the reflect vector face the model (under horizon).
         * @internal
         */
        _useHorizonOcclusion: boolean;
        /**
         * This parameters will enable/disable radiance occlusion by preventing the radiance to lit
         * too much the area relying on ambient texture to define their ambient occlusion.
         * @internal
         */
        _useRadianceOcclusion: boolean;
        /**
         * Specifies that the alpha is coming form the albedo channel alpha channel for alpha blending.
         * @internal
         */
        _useAlphaFromAlbedoTexture: boolean;
        /**
         * Specifies that the material will keeps the specular highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When sun reflects on it you can not see what is behind.
         * @internal
         */
        _useSpecularOverAlpha: boolean;
        /**
         * Specifies if the reflectivity texture contains the glossiness information in its alpha channel.
         * @internal
         */
        _useMicroSurfaceFromReflectivityMapAlpha: boolean;
        /**
         * Specifies if the metallic texture contains the roughness information in its alpha channel.
         * @internal
         */
        _useRoughnessFromMetallicTextureAlpha: boolean;
        /**
         * Specifies if the metallic texture contains the roughness information in its green channel.
         * @internal
         */
        _useRoughnessFromMetallicTextureGreen: boolean;
        /**
         * Specifies if the metallic texture contains the metallness information in its blue channel.
         * @internal
         */
        _useMetallnessFromMetallicTextureBlue: boolean;
        /**
         * Specifies if the metallic texture contains the ambient occlusion information in its red channel.
         * @internal
         */
        _useAmbientOcclusionFromMetallicTextureRed: boolean;
        /**
         * Specifies if the ambient texture contains the ambient occlusion information in its red channel only.
         * @internal
         */
        _useAmbientInGrayScale: boolean;
        /**
         * In case the reflectivity map does not contain the microsurface information in its alpha channel,
         * The material will try to infer what glossiness each pixel should be.
         * @internal
         */
        _useAutoMicroSurfaceFromReflectivityMap: boolean;
        /**
         * Defines the  falloff type used in this material.
         * It by default is Physical.
         * @internal
         */
        _lightFalloff: number;
        /**
         * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When the street lights reflects on it you can not see what is behind.
         * @internal
         */
        _useRadianceOverAlpha: boolean;
        /**
         * Allows using an object space normal map (instead of tangent space).
         * @internal
         */
        _useObjectSpaceNormalMap: boolean;
        /**
         * Allows using the bump map in parallax mode.
         * @internal
         */
        _useParallax: boolean;
        /**
         * Allows using the bump map in parallax occlusion mode.
         * @internal
         */
        _useParallaxOcclusion: boolean;
        /**
         * Controls the scale bias of the parallax mode.
         * @internal
         */
        _parallaxScaleBias: number;
        /**
         * If sets to true, disables all the lights affecting the material.
         * @internal
         */
        _disableLighting: boolean;
        /**
         * Number of Simultaneous lights allowed on the material.
         * @internal
         */
        _maxSimultaneousLights: number;
        /**
         * If sets to true, x component of normal map value will be inverted (x = 1.0 - x).
         * @internal
         */
        _invertNormalMapX: boolean;
        /**
         * If sets to true, y component of normal map value will be inverted (y = 1.0 - y).
         * @internal
         */
        _invertNormalMapY: boolean;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         * @internal
         */
        _twoSidedLighting: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         * @internal
         */
        _alphaCutOff: number;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)
         * @internal
         */
        _useAlphaFresnel: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)
         * @internal
         */
        _useLinearAlphaFresnel: boolean;
        /**
         * Specifies the environment BRDF texture used to compute the scale and offset roughness values
         * from cos theta and roughness:
         * http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
         * @internal
         */
        _environmentBRDFTexture: Nullable<BaseTexture>;
        /**
         * Force the shader to compute irradiance in the fragment shader in order to take bump in account.
         * @internal
         */
        _forceIrradianceInFragment: boolean;
        private _realTimeFiltering;
        /**
         * Enables realtime filtering on the texture.
         */
        get realTimeFiltering(): boolean;
        set realTimeFiltering(b: boolean);
        private _realTimeFilteringQuality;
        /**
         * Quality switch for realtime filtering
         */
        get realTimeFilteringQuality(): number;
        set realTimeFilteringQuality(n: number);
        /**
         * Can this material render to several textures at once
         */
        get canRenderToMRT(): boolean;
        /**
         * Force normal to face away from face.
         * @internal
         */
        _forceNormalForward: boolean;
        /**
         * Enables specular anti aliasing in the PBR shader.
         * It will both interacts on the Geometry for analytical and IBL lighting.
         * It also prefilter the roughness map based on the bump values.
         * @internal
         */
        _enableSpecularAntiAliasing: boolean;
        /**
         * Stores the available render targets.
         */
        private _renderTargets;
        /**
         * Sets the global ambient color for the material used in lighting calculations.
         */
        private _globalAmbientColor;
        /**
         * If set to true, no lighting calculations will be applied.
         * @internal
         */
        _unlit: boolean;
        /**
         * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)
         */
        private _applyDecalMapAfterDetailMap;
        private _debugMode;
        private _shadersLoaded;
        private _breakShaderLoadedCheck;
        private _vertexPullingMetadata;
        /**
         * @internal
         * This is reserved for the inspector.
         * Defines the material debug mode.
         * It helps seeing only some components of the material while troubleshooting.
         */
        debugMode: number;
        /**
         * @internal
         * This is reserved for the inspector.
         * Specify from where on screen the debug mode should start.
         * The value goes from -1 (full screen) to 1 (not visible)
         * It helps with side by side comparison against the final render
         * This defaults to -1
         */
        debugLimit: number;
        /**
         * @internal
         * This is reserved for the inspector.
         * As the default viewing range might not be enough (if the ambient is really small for instance)
         * You can use the factor to better multiply the final value.
         */
        debugFactor: number;
        /**
         * Defines the clear coat layer parameters for the material.
         */
        readonly clearCoat: PBRClearCoatConfiguration;
        /**
         * Defines the iridescence layer parameters for the material.
         */
        readonly iridescence: PBRIridescenceConfiguration;
        /**
         * Defines the anisotropic parameters for the material.
         */
        readonly anisotropy: PBRAnisotropicConfiguration;
        /**
         * Defines the BRDF parameters for the material.
         */
        readonly brdf: PBRBRDFConfiguration;
        /**
         * Defines the Sheen parameters for the material.
         */
        readonly sheen: PBRSheenConfiguration;
        /**
         * Defines the SubSurface parameters for the material.
         */
        readonly subSurface: PBRSubSurfaceConfiguration;
        /**
         * Defines additional PrePass parameters for the material.
         */
        readonly prePassConfiguration: PrePassConfiguration;
        /**
         * Defines the detail map parameters for the material.
         */
        readonly detailMap: DetailMapConfiguration;
        protected _cacheHasRenderTargetTextures: boolean;
        /**
         * Instantiates a new PBRMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean);
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * Can this material render to prepass
         */
        get isPrePassCapable(): boolean;
        /**
         * @returns the name of the material class.
         */
        getClassName(): string;
        /**
         * Returns true if alpha blending should be disabled.
         */
        protected get _disableAlphaBlending(): boolean;
        /**
         * @returns whether or not this material should be rendered in alpha blend mode.
         */
        needAlphaBlending(): boolean;
        /**
         * @returns whether or not this material should be rendered in alpha test mode.
         */
        needAlphaTesting(): boolean;
        /**
         * @returns whether or not the alpha value of the albedo texture should be used for alpha blending.
         */
        protected _shouldUseAlphaFromAlbedoTexture(): boolean;
        /**
         * @returns whether or not there is a usable alpha channel for transparency.
         */
        protected _hasAlphaChannel(): boolean;
        /**
         * @returns the texture used for the alpha test.
         */
        getAlphaTestTexture(): Nullable<BaseTexture>;
        /**
         * Specifies that the submesh is ready to be used.
         * @param mesh - BJS mesh.
         * @param subMesh - A submesh of the BJS mesh.  Used to check if it is ready.
         * @param useInstances - Specifies that instances should be used.
         * @returns - boolean indicating that the submesh is ready or not.
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Specifies if the material uses metallic roughness workflow.
         * @returns boolean specifying if the material uses metallic roughness workflow.
         */
        isMetallicWorkflow(): boolean;
        private _prepareEffect;
        private _prepareDefines;
        /**
         * Force shader compilation
         * @param mesh - Define the mesh we want to force the compilation for
         * @param onCompiled - Define a callback triggered when the compilation completes
         * @param options - Define the options used to create the compilation
         */
        forceCompilation(mesh: AbstractMesh, onCompiled?: (material: Material) => void, options?: Partial<IMaterialCompilationOptions>): void;
        /**
         * Initializes the uniform buffer layout for the shader.
         */
        buildUniformLayout(): void;
        /**
         * Binds the submesh data.
         * @param world - The world matrix.
         * @param mesh - The BJS mesh.
         * @param subMesh - A submesh of the BJS mesh.
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Returns the animatable textures.
         * If material have animatable metallic texture, then reflectivity texture will not be returned, even if it has animations.
         * @returns - Array of animatable textures.
         */
        getAnimatables(): IAnimatable[];
        /**
         * Returns the texture used for reflections.
         * @returns - Reflection texture if present.  Otherwise, returns the environment texture.
         */
        private _getReflectionTexture;
        /**
         * Returns an array of the actively used textures.
         * @returns - Array of BaseTextures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Checks to see if a texture is used in the material.
         * @param texture - Base texture to use.
         * @returns - Boolean specifying if a texture is used in the material.
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Sets the required values to the prepass renderer.
         * It can't be sets when subsurface scattering of this material is disabled.
         * When scene have ability to enable subsurface prepass effect, it will enable.
         * @returns - If prepass is enabled or not.
         */
        setPrePassRenderer(): boolean;
        /**
         * Disposes the resources of the material.
         * @param forceDisposeEffect - Forces the disposal of effects.
         * @param forceDisposeTextures - Forces the disposal of all textures.
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void;
    }




    /**
     * @internal
     */
    export class MaterialBRDFDefines extends MaterialDefines {
        BRDF_V_HEIGHT_CORRELATED: boolean;
        MS_BRDF_ENERGY_CONSERVATION: boolean;
        SPHERICAL_HARMONICS: boolean;
        SPECULAR_GLOSSINESS_ENERGY_CONSERVATION: boolean;
        MIX_IBL_RADIANCE_WITH_IRRADIANCE: boolean;
        LEGACY_SPECULAR_ENERGY_CONSERVATION: boolean;
        BASE_DIFFUSE_MODEL: number;
        DIELECTRIC_SPECULAR_MODEL: number;
        CONDUCTOR_SPECULAR_MODEL: number;
    }
    /**
     * Plugin that implements the BRDF component of the PBR material
     */
    export class PBRBRDFConfiguration extends MaterialPluginBase {
        /**
         * Default value used for the energy conservation.
         * This should only be changed to adapt to the type of texture in scene.environmentBRDFTexture.
         */
        static DEFAULT_USE_ENERGY_CONSERVATION: boolean;
        /**
         * Default value used for the Smith Visibility Height Correlated mode.
         * This should only be changed to adapt to the type of texture in scene.environmentBRDFTexture.
         */
        static DEFAULT_USE_SMITH_VISIBILITY_HEIGHT_CORRELATED: boolean;
        /**
         * Default value used for the IBL diffuse part.
         * This can help switching back to the polynomials mode globally which is a tiny bit
         * less GPU intensive at the drawback of a lower quality.
         */
        static DEFAULT_USE_SPHERICAL_HARMONICS: boolean;
        /**
         * Default value used for activating energy conservation for the specular workflow.
         * If activated, the albedo color is multiplied with (1. - maxChannel(specular color)).
         * If deactivated, a material is only physically plausible, when (albedo color + specular color) < 1.
         */
        static DEFAULT_USE_SPECULAR_GLOSSINESS_INPUT_ENERGY_CONSERVATION: boolean;
        /**
         * Default value for whether IBL irradiance is used to augment rough radiance.
         * If activated, irradiance is blended into the radiance contribution when the material is rough.
         * This better approximates raytracing results for rough surfaces.
         */
        static DEFAULT_MIX_IBL_RADIANCE_WITH_IRRADIANCE: boolean;
        /**
         * Default value for whether the legacy specular energy conservation is used.
         */
        static DEFAULT_USE_LEGACY_SPECULAR_ENERGY_CONSERVATION: boolean;
        /**
         * Defines the default diffuse model used by the material.
         */
        static DEFAULT_DIFFUSE_MODEL: number;
        /**
         * Defines the default dielectric specular model used by the material.
         */
        static DEFAULT_DIELECTRIC_SPECULAR_MODEL: number;
        /**
         * Defines the default conductor specular model used by the material.
         */
        static DEFAULT_CONDUCTOR_SPECULAR_MODEL: number;
        private _useEnergyConservation;
        /**
         * Defines if the material uses energy conservation.
         */
        useEnergyConservation: boolean;
        private _useSmithVisibilityHeightCorrelated;
        /**
         * LEGACY Mode set to false
         * Defines if the material uses height smith correlated visibility term.
         * If you intent to not use our default BRDF, you need to load a separate BRDF Texture for the PBR
         * You can either load https://assets.babylonjs.com/environments/uncorrelatedBRDF.png
         * or https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds to have more precision
         * Not relying on height correlated will also disable energy conservation.
         */
        useSmithVisibilityHeightCorrelated: boolean;
        private _useSphericalHarmonics;
        /**
         * LEGACY Mode set to false
         * Defines if the material uses spherical harmonics vs spherical polynomials for the
         * diffuse part of the IBL.
         * The harmonics despite a tiny bigger cost has been proven to provide closer results
         * to the ground truth.
         */
        useSphericalHarmonics: boolean;
        private _useSpecularGlossinessInputEnergyConservation;
        /**
         * Defines if the material uses energy conservation, when the specular workflow is active.
         * If activated, the albedo color is multiplied with (1. - maxChannel(specular color)).
         * If deactivated, a material is only physically plausible, when (albedo color + specular color) < 1.
         * In the deactivated case, the material author has to ensure energy conservation, for a physically plausible rendering.
         */
        useSpecularGlossinessInputEnergyConservation: boolean;
        private _mixIblRadianceWithIrradiance;
        /**
         * Defines if IBL irradiance is used to augment rough radiance.
         * If activated, irradiance is blended into the radiance contribution when the material is rough.
         * This better approximates raytracing results for rough surfaces.
         */
        mixIblRadianceWithIrradiance: boolean;
        private _useLegacySpecularEnergyConservation;
        /**
         * Defines if the legacy specular energy conservation is used.
         * If activated, the specular color is multiplied with (1. - maxChannel(albedo color)).
         */
        useLegacySpecularEnergyConservation: boolean;
        private _baseDiffuseModel;
        /**
         * Defines the base diffuse roughness model of the material.
         */
        baseDiffuseModel: number;
        private _dielectricSpecularModel;
        /**
         * The material model to use for specular lighting of dielectric materials.
         */
        dielectricSpecularModel: number;
        private _conductorSpecularModel;
        /**
         * The material model to use for specular lighting.
         */
        conductorSpecularModel: number;
        /** @internal */
        private _internalMarkAllSubMeshesAsMiscDirty;
        /** @internal */
        _markAllSubMeshesAsMiscDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Updates the material defines for BRDF settings.
         * @param defines defines the material defines to update
         */
        prepareDefines(defines: MaterialBRDFDefines): void;
        getClassName(): string;
    }


    /**
     * @internal
     */
    export class MaterialAnisotropicDefines extends MaterialDefines {
        ANISOTROPIC: boolean;
        ANISOTROPIC_TEXTURE: boolean;
        ANISOTROPIC_TEXTUREDIRECTUV: number;
        ANISOTROPIC_LEGACY: boolean;
        MAINUV1: boolean;
    }
    /**
     * Plugin that implements the anisotropic component of the PBR material
     */
    export class PBRAnisotropicConfiguration extends MaterialPluginBase {
        private _isEnabled;
        /**
         * Defines if the anisotropy is enabled in the material.
         */
        isEnabled: boolean;
        /**
         * Defines the anisotropy strength (between 0 and 1) it defaults to 1.
         */
        intensity: number;
        /**
         * Defines if the effect is along the tangents, bitangents or in between.
         * By default, the effect is "stretching" the highlights along the tangents.
         */
        direction: Vector2;
        /**
         * Sets the anisotropy direction as an angle.
         */
        set angle(value: number);
        /**
         * Gets the anisotropy angle value in radians.
         * @returns the anisotropy angle value in radians.
         */
        get angle(): number;
        private _texture;
        /**
         * Stores the anisotropy values in a texture.
         * rg is direction (like normal from -1 to 1)
         * b is a intensity
         */
        texture: Nullable<BaseTexture>;
        private _legacy;
        /**
         * Defines if the anisotropy is in legacy mode for backwards compatibility before 6.4.0.
         */
        legacy: boolean;
        /** @internal */
        private _internalMarkAllSubMeshesAsTexturesDirty;
        /** @internal */
        _markAllSubMeshesAsTexturesDirty(): void;
        /** @internal */
        private _internalMarkAllSubMeshesAsMiscDirty;
        /** @internal */
        _markAllSubMeshesAsMiscDirty(): void;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language.
         * @returns true if the plugin is compatible with the shader language
         */
        isCompatible(): boolean;
        constructor(material: PBRBaseMaterial, addToPluginList?: boolean);
        /**
         * Checks whether the anisotropy textures are ready for the sub mesh.
         * @param defines defines the material defines to inspect
         * @param scene defines the scene to use for readiness checks
         * @returns true if anisotropy is ready
         */
        isReadyForSubMesh(defines: MaterialAnisotropicDefines, scene: Scene): boolean;
        /**
         * Updates shader defines for anisotropy before attributes are processed.
         * @param defines defines the material defines to update
         * @param scene defines the scene to use for texture checks
         * @param mesh defines the mesh to inspect for tangent data
         */
        prepareDefinesBeforeAttributes(defines: MaterialAnisotropicDefines, scene: Scene, mesh: AbstractMesh): void;
        /**
         * Binds anisotropy data for a sub mesh.
         * @param uniformBuffer defines the uniform buffer to update
         * @param scene defines the scene to use for texture binding
         */
        bindForSubMesh(uniformBuffer: UniformBuffer, scene: Scene): void;
        /**
         * Checks whether anisotropy uses a texture.
         * @param texture defines the texture to check
         * @returns true if the texture is used by anisotropy
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Adds the active anisotropy textures.
         * @param activeTextures defines the list of active textures to update
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Adds the animatable anisotropy textures.
         * @param animatables defines the list of animatables to update
         */
        getAnimatables(animatables: IAnimatable[]): void;
        /**
         * Disposes the anisotropy textures.
         * @param forceDisposeTextures defines whether to dispose the textures
         */
        dispose(forceDisposeTextures?: boolean): void;
        getClassName(): string;
        addFallbacks(defines: MaterialAnisotropicDefines, fallbacks: EffectFallbacks, currentRank: number): number;
        /**
         * Adds the anisotropy sampler names.
         * @param samplers defines the list of sampler names to update
         */
        getSamplers(samplers: string[]): void;
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size: number;
                type: string;
            }>;
            vertex?: string;
            fragment?: string;
        };
        /**
         * Parses a anisotropy Configuration from a serialized object.
         * @param source - Serialized object.
         * @param scene Defines the scene we are parsing for
         * @param rootUrl Defines the rootUrl to load from
         */
        parse(source: any, scene: Scene, rootUrl: string): void;
    }


    /** This file must only contain pure code and pure imports */
    var OpenPBRMaterialDefinesBase_base: {
        new (...args: any[]): {
            PREPASS: boolean;
            PREPASS_COLOR: boolean;
            PREPASS_COLOR_INDEX: number;
            PREPASS_IRRADIANCE_LEGACY: boolean;
            PREPASS_IRRADIANCE_LEGACY_INDEX: number;
            PREPASS_IRRADIANCE: boolean;
            PREPASS_IRRADIANCE_INDEX: number;
            PREPASS_ALBEDO: boolean;
            PREPASS_ALBEDO_INDEX: number;
            PREPASS_ALBEDO_SQRT: boolean;
            PREPASS_ALBEDO_SQRT_INDEX: number;
            PREPASS_DEPTH: boolean;
            PREPASS_DEPTH_INDEX: number;
            PREPASS_SCREENSPACE_DEPTH: boolean;
            PREPASS_SCREENSPACE_DEPTH_INDEX: number;
            PREPASS_NORMALIZED_VIEW_DEPTH: boolean;
            PREPASS_NORMALIZED_VIEW_DEPTH_INDEX: number;
            PREPASS_NORMAL: boolean;
            PREPASS_NORMAL_INDEX: number;
            PREPASS_NORMAL_WORLDSPACE: boolean;
            PREPASS_WORLD_NORMAL: boolean;
            PREPASS_WORLD_NORMAL_INDEX: number;
            PREPASS_POSITION: boolean;
            PREPASS_POSITION_INDEX: number;
            PREPASS_LOCAL_POSITION: boolean;
            PREPASS_LOCAL_POSITION_INDEX: number;
            PREPASS_VELOCITY: boolean;
            PREPASS_VELOCITY_INDEX: number;
            PREPASS_VELOCITY_LINEAR: boolean;
            PREPASS_VELOCITY_LINEAR_INDEX: number;
            PREPASS_REFLECTIVITY: boolean;
            PREPASS_REFLECTIVITY_INDEX: number;
            SCENE_MRT_COUNT: number;
        };
    } & {
        new (...args: any[]): {
            MAINUV1: boolean;
            MAINUV2: boolean;
            MAINUV3: boolean;
            MAINUV4: boolean;
            MAINUV5: boolean;
            MAINUV6: boolean;
            UV1: boolean;
            UV2: boolean;
            UV3: boolean;
            UV4: boolean;
            UV5: boolean;
            UV6: boolean;
        };
    } & typeof MaterialDefines;
    class OpenPBRMaterialDefinesBase extends OpenPBRMaterialDefinesBase_base {
    }
    var OpenPBRMaterialDefinesWithEnvLighting_base: {
        new (...args: any[]): {
            REFLECTION: boolean;
            REFLECTIONMAP_3D: boolean;
            REFLECTIONMAP_SPHERICAL: boolean;
            REFLECTIONMAP_PLANAR: boolean;
            REFLECTIONMAP_CUBIC: boolean;
            USE_LOCAL_REFLECTIONMAP_CUBIC: boolean;
            REFLECTIONMAP_PROJECTION: boolean;
            REFLECTIONMAP_SKYBOX: boolean;
            REFLECTIONMAP_EXPLICIT: boolean;
            REFLECTIONMAP_EQUIRECTANGULAR: boolean;
            REFLECTIONMAP_EQUIRECTANGULAR_FIXED: boolean;
            REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED: boolean;
            INVERTCUBICMAP: boolean;
            USESPHERICALFROMREFLECTIONMAP: boolean;
            USEIRRADIANCEMAP: boolean;
            USE_IRRADIANCE_DOMINANT_DIRECTION: boolean;
            USESPHERICALINVERTEX: boolean;
            REFLECTIONMAP_OPPOSITEZ: boolean;
            LODINREFLECTIONALPHA: boolean;
            GAMMAREFLECTION: boolean;
            RGBDREFLECTION: boolean;
        };
    } & typeof OpenPBRMaterialDefinesBase;
    class OpenPBRMaterialDefinesWithEnvLighting extends OpenPBRMaterialDefinesWithEnvLighting_base {
    }
    var OpenPBRMaterialDefines_base: {
        new (...args: any[]): {
            IMAGEPROCESSING: boolean;
            VIGNETTE: boolean;
            VIGNETTEBLENDMODEMULTIPLY: boolean;
            VIGNETTEBLENDMODEOPAQUE: boolean;
            TONEMAPPING: number;
            CONTRAST: boolean;
            COLORCURVES: boolean;
            COLORGRADING: boolean;
            COLORGRADING3D: boolean;
            SAMPLER3DGREENDEPTH: boolean;
            SAMPLER3DBGRMAP: boolean;
            DITHER: boolean;
            IMAGEPROCESSINGPOSTPROCESS: boolean;
            SKIPFINALCOLORCLAMP: boolean;
            EXPOSURE: boolean;
        };
    } & typeof OpenPBRMaterialDefinesWithEnvLighting;
    /**
     * Manages the defines for the PBR Material.
     * @internal
     */
    export class OpenPBRMaterialDefines extends OpenPBRMaterialDefines_base {
        NUM_SAMPLES: string;
        REALTIME_FILTERING: boolean;
        IBL_CDF_FILTERING: boolean;
        LIGHTCOUNT: number;
        VERTEXCOLOR: boolean;
        BAKED_VERTEX_ANIMATION_TEXTURE: boolean;
        VERTEXALPHA: boolean;
        ALPHATEST: boolean;
        DEPTHPREPASS: boolean;
        ALPHABLEND: boolean;
        ALPHA_FROM_BASE_COLOR_TEXTURE: boolean;
        ALPHATESTVALUE: string;
        PREMULTIPLYALPHA: boolean;
        REFLECTIVITY_GAMMA: boolean;
        REFLECTIVITYDIRECTUV: number;
        SPECULARTERM: boolean;
        LODBASEDMICROSFURACE: boolean;
        SPECULAR_ROUGHNESS_FROM_METALNESS_TEXTURE_GREEN: boolean;
        BASE_METALNESS_FROM_METALNESS_TEXTURE_BLUE: boolean;
        AOSTOREINMETALMAPRED: boolean;
        SPECULAR_WEIGHT_IN_ALPHA: boolean;
        SPECULAR_WEIGHT_FROM_SPECULAR_COLOR_TEXTURE: boolean;
        SPECULAR_ROUGHNESS_ANISOTROPY_FROM_TANGENT_TEXTURE: boolean;
        COAT_ROUGHNESS_FROM_GREEN_CHANNEL: boolean;
        COAT_ROUGHNESS_ANISOTROPY_FROM_TANGENT_TEXTURE: boolean;
        USE_GLTF_STYLE_ANISOTROPY: boolean;
        THIN_FILM_THICKNESS_FROM_THIN_FILM_TEXTURE: boolean;
        FUZZ_ROUGHNESS_FROM_TEXTURE_ALPHA: boolean;
        SUBSURFACE_WEIGHT_FROM_TEXTURE_ALPHA: boolean;
        GEOMETRY_THICKNESS_FROM_GREEN_CHANNEL: boolean;
        ENVIRONMENTBRDF: boolean;
        ENVIRONMENTBRDF_RGBD: boolean;
        FUZZENVIRONMENTBRDF: boolean;
        NORMAL: boolean;
        TANGENT: boolean;
        OBJECTSPACE_NORMALMAP: boolean;
        PARALLAX: boolean;
        PARALLAX_RHS: boolean;
        PARALLAXOCCLUSION: boolean;
        NORMALXYSCALE: boolean;
        /**
         * Enables anisotropic logic. Still needed because it's used in pbrHelperFunctions
         */
        ANISOTROPIC: boolean;
        /**
         * Tells the shader to use OpenPBR's anisotropic roughness remapping
         */
        ANISOTROPIC_OPENPBR: boolean;
        /**
         * Tells the shader to apply anisotropy to the base layer
         */
        ANISOTROPIC_BASE: boolean;
        /**
         * Tells the shader to apply anisotropy to the coat layer
         */
        ANISOTROPIC_COAT: boolean;
        /**
         * Number of samples to use for the fuzz IBL lighting calculations
         */
        FUZZ_IBL_SAMPLES: number;
        /**
         * Enables the 4-tap rotated-grid kernel for refractive background blur.
         * When false, a single dithered sample is used instead.
         */
        REFRACTION_HIGH_QUALITY_BLUR: boolean;
        /**
         * Tells the shader to enable the fuzz layer
         */
        FUZZ: boolean;
        /**
         * Tells the shader to enable the thin film layer
         */
        THIN_FILM: boolean;
        /**
         * Tells the shader to enable the legacy iridescence code
         * Iridescence is the name of thin film interference in the PBR material.
         */
        IRIDESCENCE: boolean;
        /**
         * Tells the shader to enable dispersion in refraction
         */
        DISPERSION: boolean;
        /**
         * Enables subsurface scattering
         */
        SCATTERING: boolean;
        /**
         * Enables the use of screen-space irradiance texture for scattering
         */
        USE_IRRADIANCE_TEXTURE_FOR_SCATTERING: boolean;
        /**
         * Number of samples used by the screen-space SSS convolution kernel.
         */
        SSS_SAMPLE_COUNT: number;
        /**
         * Indicates that the irradiance texture is from the legacy GeometryBufferRenderer.
         * We use this to handle direct lights which don't render in the legacy GBuffer irradiance.
         */
        USE_IRRADIANCE_TEXTURE_FOR_SCATTERING_GBUFFER: boolean;
        /**
         * Enables transmission slab
         */
        TRANSMISSION_SLAB: boolean;
        /**
         * Enables transmission slab with volume
         */
        TRANSMISSION_SLAB_VOLUME: boolean;
        /**
         * Enables subsurface slab
         */
        SUBSURFACE_SLAB: boolean;
        /**
         * Enables thin-walled geometry
         */
        GEOMETRY_THIN_WALLED: boolean;
        /**
         * Refraction of the 2D background texture. Might include the rest of the scene or just the background.
         */
        REFRACTED_BACKGROUND: boolean;
        /**
         * Refraction of direct lights.
         */
        REFRACTED_LIGHTS: boolean;
        /**
         * Refraction of the environment texture (IBL).
         */
        REFRACTED_ENVIRONMENT: boolean;
        REFRACTED_ENVIRONMENT_OPPOSITEZ: boolean;
        REFRACTED_ENVIRONMENT_LOCAL_CUBE: boolean;
        RADIANCEOCCLUSION: boolean;
        HORIZONOCCLUSION: boolean;
        INSTANCES: boolean;
        THIN_INSTANCES: boolean;
        INSTANCESCOLOR: boolean;
        NUM_BONE_INFLUENCERS: number;
        BonesPerMesh: number;
        BONETEXTURE: boolean;
        BONES_VELOCITY_ENABLED: boolean;
        NONUNIFORMSCALING: boolean;
        MORPHTARGETS: boolean;
        MORPHTARGETS_POSITION: boolean;
        MORPHTARGETS_NORMAL: boolean;
        MORPHTARGETS_TANGENT: boolean;
        MORPHTARGETS_UV: boolean;
        MORPHTARGETS_UV2: boolean;
        MORPHTARGETS_COLOR: boolean;
        MORPHTARGETTEXTURE_HASPOSITIONS: boolean;
        MORPHTARGETTEXTURE_HASNORMALS: boolean;
        MORPHTARGETTEXTURE_HASTANGENTS: boolean;
        MORPHTARGETTEXTURE_HASUVS: boolean;
        MORPHTARGETTEXTURE_HASUV2S: boolean;
        MORPHTARGETTEXTURE_HASCOLORS: boolean;
        NUM_MORPH_INFLUENCERS: number;
        MORPHTARGETS_TEXTURE: boolean;
        USEPHYSICALLIGHTFALLOFF: boolean;
        USEGLTFLIGHTFALLOFF: boolean;
        TWOSIDEDLIGHTING: boolean;
        MIRRORED: boolean;
        SHADOWFLOAT: boolean;
        CLIPPLANE: boolean;
        CLIPPLANE2: boolean;
        CLIPPLANE3: boolean;
        CLIPPLANE4: boolean;
        CLIPPLANE5: boolean;
        CLIPPLANE6: boolean;
        POINTSIZE: boolean;
        FOG: boolean;
        LOGARITHMICDEPTH: boolean;
        CAMERA_ORTHOGRAPHIC: boolean;
        CAMERA_PERSPECTIVE: boolean;
        AREALIGHTSUPPORTED: boolean;
        FORCENORMALFORWARD: boolean;
        SPECULARAA: boolean;
        UNLIT: boolean;
        DECAL_AFTER_DETAIL: boolean;
        TEXTURE_REPETITION_MODE: number;
        DEBUGMODE: number;
        USE_VERTEX_PULLING: boolean;
        VERTEX_PULLING_USE_INDEX_BUFFER: boolean;
        VERTEX_PULLING_INDEX_BUFFER_32BITS: boolean;
        RIGHT_HANDED: boolean;
        CLUSTLIGHT_SLICES: number;
        CLUSTLIGHT_BATCH: number;
        BRDF_V_HEIGHT_CORRELATED: boolean;
        MS_BRDF_ENERGY_CONSERVATION: boolean;
        SPHERICAL_HARMONICS: boolean;
        SPECULAR_GLOSSINESS_ENERGY_CONSERVATION: boolean;
        MIX_IBL_RADIANCE_WITH_IRRADIANCE: boolean;
        LEGACY_SPECULAR_ENERGY_CONSERVATION: boolean;
        BASE_DIFFUSE_MODEL: number;
        DIELECTRIC_SPECULAR_MODEL: number;
        CONDUCTOR_SPECULAR_MODEL: number;
        /**
         * Initializes the PBR Material defines.
         * @param externalProperties The external properties
         */
        constructor(externalProperties?: {
            [name: string]: {
                type: string;
                default: any;
            };
        });
        /**
         * Resets the PBR Material defines.
         */
        reset(): void;
    }
    var OpenPBRMaterialBase_base: {
        new (...args: any[]): {
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            get cameraColorCurvesEnabled(): boolean;
            set cameraColorCurvesEnabled(value: boolean);
            get cameraColorGradingEnabled(): boolean;
            set cameraColorGradingEnabled(value: boolean);
            get cameraToneMappingEnabled(): boolean;
            set cameraToneMappingEnabled(value: boolean);
            get cameraExposure(): number;
            set cameraExposure(value: number);
            get cameraContrast(): number;
            set cameraContrast(value: number);
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            get cameraColorCurves(): Nullable<ColorCurves>;
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & typeof PushMaterial;
    class OpenPBRMaterialBase extends OpenPBRMaterialBase_base {
    }
    /**
     * A Physically based material that follows the specification of OpenPBR.
     *
     * For more information, please refer to the documentation :
     * https://academysoftwarefoundation.github.io/OpenPBR/index.html
     */
    export class OpenPBRMaterial extends OpenPBRMaterialBase {
        /**
         * Base Weight is a multiplier on the diffuse and metal lobes.
         * See OpenPBR's specs for base_weight
         */
        baseWeight: number;
        private _baseWeight;
        /**
         * Base Weight is a multiplier on the diffuse and metal lobes.
         * See OpenPBR's specs for base_weight
         */
        baseWeightTexture: Nullable<BaseTexture>;
        private _baseWeightTexture;
        /**
         * Color of the base diffuse lobe.
         * See OpenPBR's specs for base_color
         */
        baseColor: Color3;
        private _baseColor;
        /**
         * Base Color Texture property.
         * See OpenPBR's specs for base_color
         */
        baseColorTexture: Nullable<BaseTexture>;
        private _baseColorTexture;
        /**
         * Roughness of the diffuse lobe.
         * See OpenPBR's specs for base_diffuse_roughness
         */
        baseDiffuseRoughness: number;
        private _baseDiffuseRoughness;
        /**
         * Roughness texture of the diffuse lobe.
         * See OpenPBR's specs for base_diffuse_roughness
         */
        baseDiffuseRoughnessTexture: Nullable<BaseTexture>;
        private _baseDiffuseRoughnessTexture;
        /**
         * Metalness of the base lobe.
         * See OpenPBR's specs for base_metalness
         */
        baseMetalness: number;
        private _baseMetalness;
        /**
         * Metalness texture.
         * See OpenPBR's specs for base_metalness
         */
        baseMetalnessTexture: Nullable<BaseTexture>;
        private _baseMetalnessTexture;
        /**
         * Weight of the specular lobe.
         * See OpenPBR's specs for specular_weight
         */
        specularWeight: number;
        private _specularWeight;
        /**
         * Weight texture of the specular lobe.
         * See OpenPBR's specs for specular_weight
         */
        specularWeightTexture: Nullable<BaseTexture>;
        private _specularWeightTexture;
        /**
         * Color of the specular lobe.
         * See OpenPBR's specs for specular_color
         */
        specularColor: Color3;
        private _specularColor;
        /**
         * Specular Color Texture property.
         * See OpenPBR's specs for specular_color
         */
        specularColorTexture: Nullable<BaseTexture>;
        private _specularColorTexture;
        /**
         * Roughness of the specular lobe.
         * See OpenPBR's specs for specular_roughness
         */
        specularRoughness: number;
        private _specularRoughness;
        /**
         * Roughness texture of the specular lobe.
         * See OpenPBR's specs for specular_roughness
         */
        specularRoughnessTexture: Nullable<BaseTexture>;
        private _specularRoughnessTexture;
        /**
         * Anisotropic roughness of the specular lobe.
         * See OpenPBR's specs for specular_roughness_anisotropy
         */
        specularRoughnessAnisotropy: number;
        private _specularRoughnessAnisotropy;
        /**
         * Anisotropic Roughness texture.
         * See OpenPBR's specs for specular_roughness
         */
        specularRoughnessAnisotropyTexture: Nullable<BaseTexture>;
        private _specularRoughnessAnisotropyTexture;
        /**
         * IOR of the specular lobe.
         * See OpenPBR's specs for specular_ior
         */
        specularIor: number;
        private _specularIor;
        /**
         * Transmission weight of the surface.
         * See OpenPBR's specs for transmission_weight
         */
        transmissionWeight: number;
        private _transmissionWeight;
        /**
         * Transmission weight texture.
         * See OpenPBR's specs for transmission_weight
         */
        transmissionWeightTexture: Nullable<BaseTexture>;
        private _transmissionWeightTexture;
        /**
         * Transmission color of the surface.
         * See OpenPBR's specs for transmission_color
         */
        transmissionColor: Color3;
        private _transmissionColor;
        /**
         * Transmission color texture.
         * See OpenPBR's specs for transmission_color
         */
        transmissionColorTexture: Nullable<BaseTexture>;
        private _transmissionColorTexture;
        /**
         * Transmission depth of the volume
         * See OpenPBR's specs for transmission_depth
         */
        transmissionDepth: number;
        private _transmissionDepth;
        /**
         * Transmission depth texture.
         * See OpenPBR's specs for transmission_depth
         */
        transmissionDepthTexture: Nullable<BaseTexture>;
        private _transmissionDepthTexture;
        /**
         * Transmission scatter of the surface.
         * See OpenPBR's specs for transmission_scatter
         */
        transmissionScatter: Color3;
        private _transmissionScatter;
        /**
         * Transmission scatter texture.
         * See OpenPBR's specs for transmission_scatter
         */
        transmissionScatterTexture: Nullable<BaseTexture>;
        private _transmissionScatterTexture;
        /**
         * Transmission scatter anisotropy
         * See OpenPBR's specs for transmission_scatter_anisotropy
         */
        transmissionScatterAnisotropy: number;
        private _transmissionScatterAnisotropy;
        /**
         * Transmission Dispersion Scale factor.
         * See OpenPBR's specs for transmission_dispersion_scale
         */
        transmissionDispersionScale: number;
        private _transmissionDispersionScale;
        /**
         * Transmission Dispersion Scale texture.
         * See OpenPBR's specs for transmission_dispersion_scale
         */
        transmissionDispersionScaleTexture: Nullable<BaseTexture>;
        private _transmissionDispersionScaleTexture;
        /**
         * Transmission Dispersion Abbe number.
         * See OpenPBR's specs for transmission_dispersion_abbe_number
         */
        transmissionDispersionAbbeNumber: number;
        private _transmissionDispersionAbbeNumber;
        /**
         * Defines the amount of subsurface scattering on the surface.
         * See OpenPBR's specs for subsurface_weight
         */
        subsurfaceWeight: number;
        private _subsurfaceWeight;
        /**
         * Subsurface weight texture.
         * See OpenPBR's specs for subsurface_weight
         */
        subsurfaceWeightTexture: Nullable<BaseTexture>;
        private _subsurfaceWeightTexture;
        /**
         * Defines the color of the subsurface scattering in the volume.
         * See OpenPBR's specs for subsurface_color
         */
        subsurfaceColor: Color3;
        private _subsurfaceColor;
        /**
         * Subsurface color texture.
         * See OpenPBR's specs for subsurface_color
         */
        subsurfaceColorTexture: Nullable<BaseTexture>;
        private _subsurfaceColorTexture;
        /**
         * Defines the radius of the subsurface scattering in the volume.
         * See OpenPBR's specs for subsurface_radius
         */
        subsurfaceRadius: number;
        private _subsurfaceRadius;
        /**
         * Defines the scale factor applied to the subsurface radius.
         * See OpenPBR's specs for subsurface_radius_scale
         */
        subsurfaceRadiusScale: Color3;
        private _subsurfaceRadiusScale;
        /**
         * Subsurface radius scale texture.
         * See OpenPBR's specs for subsurface_radius_scale
         */
        subsurfaceRadiusScaleTexture: Nullable<BaseTexture>;
        private _subsurfaceRadiusScaleTexture;
        /**
         * Defines the anisotropy of the subsurface scattering in the volume.
         * See OpenPBR's specs for subsurface_scatter_anisotropy
         */
        subsurfaceScatterAnisotropy: number;
        private _subsurfaceScatterAnisotropy;
        /**
         * Defines the amount of clear coat on the surface.
         * See OpenPBR's specs for coat_weight
         */
        coatWeight: number;
        private _coatWeight;
        /**
         * Coat weight texture.
         * See OpenPBR's specs for coat_weight
         */
        coatWeightTexture: Nullable<BaseTexture>;
        private _coatWeightTexture;
        /**
         * Defines the color of the clear coat on the surface.
         * See OpenPBR's specs for coat_color
         */
        coatColor: Color3;
        private _coatColor;
        /**
         * Color texture of the clear coat.
         * See OpenPBR's specs for coat_color
         */
        coatColorTexture: Nullable<BaseTexture>;
        private _coatColorTexture;
        /**
         * Defines the roughness of the clear coat on the surface.
         * See OpenPBR's specs for coat_roughness
         */
        coatRoughness: number;
        private _coatRoughness;
        /**
         * Roughness texture of the clear coat.
         * See OpenPBR's specs for coat_roughness
         */
        coatRoughnessTexture: Nullable<BaseTexture>;
        private _coatRoughnessTexture;
        /**
         * Defines the anisotropy of the clear coat on the surface.
         * See OpenPBR's specs for coat_roughness_anisotropy
         */
        coatRoughnessAnisotropy: number;
        private _coatRoughnessAnisotropy;
        /**
         * Anisotropic Roughness texture of the clear coat.
         * See OpenPBR's specs for coat_roughness_anisotropy
         */
        coatRoughnessAnisotropyTexture: Nullable<BaseTexture>;
        private _coatRoughnessAnisotropyTexture;
        /**
         * Defines the IOR of the clear coat on the surface.
         * See OpenPBR's specs for coat_ior
         */
        coatIor: number;
        private _coatIor;
        /**
         * Defines the amount that interreflections within the coat allow the underlying surface
         * to be darkened. A value of 1.0 means that the physically correct amount of darkening
         * is applied, while a value of 0.0 means that no darkening is applied.
         * See OpenPBR's specs for coat_darkening
         */
        coatDarkening: number;
        private _coatDarkening;
        /**
         * Defines the amount that interreflections within the coat allow the underlying surface
         * to be darkened. A value of 1.0 means that the physically correct amount of darkening
         * is applied, while a value of 0.0 means that no darkening is applied.
         * See OpenPBR's specs for coat_darkening
         */
        coatDarkeningTexture: Nullable<BaseTexture>;
        private _coatDarkeningTexture;
        /**
         * Specifies whether the coat roughness is taken from the
         * same texture as the coat_weight.
         */
        useCoatRoughnessFromWeightTexture: boolean;
        /**
         * Defines the weight of the fuzz layer on the surface.
         * See OpenPBR's specs for fuzz_weight
         */
        fuzzWeight: number;
        private _fuzzWeight;
        /**
         * Weight texture of the fuzz layer.
         * See OpenPBR's specs for fuzz_weight
         */
        fuzzWeightTexture: Nullable<BaseTexture>;
        private _fuzzWeightTexture;
        /**
         * Defines the color of the fuzz layer on the surface.
         * See OpenPBR's specs for fuzz_color
         */
        fuzzColor: Color3;
        private _fuzzColor;
        /**
         * Color texture of the fuzz layer.
         * See OpenPBR's specs for fuzz_color
         */
        fuzzColorTexture: Nullable<BaseTexture>;
        private _fuzzColorTexture;
        /**
         * Defines the roughness of the fuzz layer on the surface.
         * See OpenPBR's specs for fuzz_roughness
         */
        fuzzRoughness: number;
        private _fuzzRoughness;
        /**
         * Roughness texture of the fuzz layer.
         * See OpenPBR's specs for fuzz_roughness
         */
        fuzzRoughnessTexture: Nullable<BaseTexture>;
        private _fuzzRoughnessTexture;
        /**
         * Defines whether the geometry is thin-walled (like a sheet of paper) or not.
         * See OpenPBR's specs for geometry_thin_walled
         */
        geometryThinWalled: number;
        private _geometryThinWalled;
        /**
         * Defines the normal of the material's geometry.
         * See OpenPBR's specs for geometry_normal
         */
        geometryNormalTexture: Nullable<BaseTexture>;
        private _geometryNormalTexture;
        /**
         * Defines the tangent of the material's geometry. Used only for anisotropic reflections.
         * See OpenPBR's specs for geometry_tangent
         */
        geometryTangent: Vector2;
        private _geometryTangent;
        /**
         * Defines the angle of the tangent of the material's geometry. Used only for anisotropic reflections.
         * See OpenPBR's specs for geometry_tangent
         */
        get geometryTangentAngle(): number;
        set geometryTangentAngle(value: number);
        /**
         * Defines the tangent of the material's geometry. Used only for anisotropic reflections.
         * See OpenPBR's specs for geometry_tangent
         */
        geometryTangentTexture: Nullable<BaseTexture>;
        private _geometryTangentTexture;
        /**
         * Defines the normal of the material's coat layer.
         * See OpenPBR's specs for geometry_coat_normal
         */
        geometryCoatNormalTexture: Nullable<BaseTexture>;
        private _geometryCoatNormalTexture;
        /**
         * Defines the tangent of the material's coat layer. Used only for anisotropic reflections.
         * See OpenPBR's specs for geometry_coat_tangent
         */
        geometryCoatTangent: Vector2;
        private _geometryCoatTangent;
        /**
         * Defines the angle of the tangent of the material's coat layer.
         */
        get geometryCoatTangentAngle(): number;
        /**
         * Defines the angle of the tangent of the material's coat layer.
         */
        set geometryCoatTangentAngle(value: number);
        /**
         * Defines the tangent of the material's coat layer. Used only for anisotropic reflections.
         * See OpenPBR's specs for geometry_coat_tangent
         */
        geometryCoatTangentTexture: Nullable<BaseTexture>;
        private _geometryCoatTangentTexture;
        /**
         * Defines the opacity of the material's geometry.
         * See OpenPBR's specs for geometry_opacity
         */
        geometryOpacity: number;
        private _geometryOpacity;
        /**
         * Defines the opacity texture of the material's geometry.
         * See OpenPBR's specs for geometry_opacity
         */
        geometryOpacityTexture: Nullable<BaseTexture>;
        private _geometryOpacityTexture;
        /**
         * Defines the thickness of the material's geometry.
         * Not part of OpenPBR's specs but useful for rasterization approximations of volume.
         */
        geometryThickness: number;
        private _geometryThickness;
        /**
         * Defines the thickness of the material's geometry.
         * Not part of OpenPBR's specs but useful for rasterization approximations of volume.
         */
        geometryThicknessTexture: Nullable<BaseTexture>;
        private _geometryThicknessTexture;
        /**
         * Defines the luminance of the material's emission.
         * See OpenPBR's specs for emission_luminance
         */
        emissionLuminance: number;
        private _emissionLuminance;
        /**
         * Defines the color of the material's emission.
         * See OpenPBR's specs for emission_color
         */
        emissionColor: Color3;
        private _emissionColor;
        /**
         * Defines the texture of the material's emission color.
         * See OpenPBR's specs for emission_color
         */
        emissionColorTexture: Nullable<BaseTexture>;
        private _emissionColorTexture;
        /**
         * Defines the weight of the thin film layer on top of the base layer for iridescent effects.
         */
        thinFilmWeight: number;
        private _thinFilmWeight;
        /**
         * Thin film weight texture.
         */
        thinFilmWeightTexture: Nullable<BaseTexture>;
        private _thinFilmWeightTexture;
        /**
         * Defines the thickness of the thin film layer in μm. If a texture is provided for thinFilmWeightTexture,
         * this value will act as a multiplier to the texture values.
         * See OpenPBR's specs for thin_film_thickness
         */
        thinFilmThickness: number;
        private _thinFilmThickness;
        /**
         * Defines the minimum thickness of the thin film layer in μm.
         */
        thinFilmThicknessMin: number;
        private _thinFilmThicknessMin;
        /**
         * Defines the maximum thickness of the thin film layer in μm.
         */
        thinFilmThicknessTexture: Nullable<BaseTexture>;
        private _thinFilmThicknessTexture;
        /**
         * Defines the index of refraction of the thin film layer.
         */
        thinFilmIor: number;
        private _thinFilmIor;
        /**
         * Defines the ambient occlusion texture.
         */
        ambientOcclusionTexture: Nullable<BaseTexture>;
        private _ambientOcclusionTexture;
        /** SSS convolution uses 8 samples. */
        static readonly SSS_QUALITY_LOW = 0;
        /** SSS convolution uses 16 samples (default). */
        static readonly SSS_QUALITY_MEDIUM = 1;
        /** SSS convolution uses 32 samples. */
        static readonly SSS_QUALITY_HIGH = 2;
        private _sssQuality;
        /**
         * Controls the sample count of the screen-space SSS convolution kernel.
         * Use the SSS_QUALITY_LOW / MEDIUM / HIGH constants (8 / 16 / 32 samples).
         * Higher quality reduces noise at the cost of GPU time. Default: MEDIUM.
         */
        get sssQuality(): number;
        set sssQuality(value: number);
        private _sssIrradianceTexture;
        /**
         * Defines the irradiance texture used for subsurface scattering.
         * If it's not provided, the irradiance will be looked for in the scene.geometryBufferRenderer.
         * Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
         * handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
         * Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
         */
        get sssIrradianceTexture(): Nullable<ThinTexture>;
        set sssIrradianceTexture(value: Nullable<ThinTexture>);
        private _sssDepthTexture;
        /**
         * Defines the depth texture used for subsurface scattering. This is the depth defined
         * in screen space. If it's not provided, the depth will be looked for in the scene.geometryBufferRenderer.
         * Accepts a {@link ThinTexture} so that an {@link InternalTexture} obtained from a frame graph
         * handle can be wrapped with `new ThinTexture(internalTexture)` and assigned directly.
         * Setting this property marks all sub-meshes as textures-dirty so the shader recompiles.
         */
        get sssDepthTexture(): Nullable<ThinTexture>;
        set sssDepthTexture(value: Nullable<ThinTexture>);
        private _propertyList;
        private _uniformsList;
        /**
         * Flat array view of `_uniformsList`, populated once at construction. Used
         * by the per-frame bind loop to avoid `Object.values()` allocation and
         * closure creation on every submesh binding.
         */
        private _uniformsArray;
        private _samplersList;
        private _samplerDefines;
        private static _noiseTextures;
        /**
         * Intensity of the direct lights e.g. the four lights available in your scene.
         * This impacts both the direct diffuse and specular highlights.
         */
        directIntensity: number;
        /**
         * Intensity of the environment e.g. how much the environment will light the object
         * either through harmonics for rough material or through the reflection for shiny ones.
         */
        environmentIntensity: number;
        /**
         * Specifies that the specular weight is stored in the alpha channel of the specular weight texture.
         */
        useSpecularWeightFromTextureAlpha: boolean;
        /**
         * Enforces alpha test in opaque or blend mode in order to improve the performances of some situations.
         */
        forceAlphaTest: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         */
        alphaCutOff: number;
        /**
         * Specifies if the metallic texture contains the ambient occlusion information in its red channel.
         */
        useAmbientOcclusionFromMetallicTextureRed: boolean;
        /**
         * Specifies if the ambient texture contains the ambient occlusion information in its red channel only.
         */
        useAmbientInGrayScale: boolean;
        /**
         * Specifies if we can see through the surface of the material due to subsurface scattering or transmission.
         */
        get hasTransparency(): boolean;
        /** Specifies if the material has scattering properties such as subsurface scattering or transmission scattering. */
        get hasScattering(): boolean;
        /**
         * BJS is using an hardcoded light falloff based on a manually sets up range.
         * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.
         * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.
         */
        get usePhysicalLightFalloff(): boolean;
        /**
         * BJS is using an hardcoded light falloff based on a manually sets up range.
         * In PBR, one way to represents the falloff is to use the inverse squared root algorithm.
         * This parameter can help you switch back to the BJS mode in order to create scenes using both materials.
         */
        set usePhysicalLightFalloff(value: boolean);
        /**
         * In order to support the falloff compatibility with gltf, a special mode has been added
         * to reproduce the gltf light falloff.
         */
        get useGLTFLightFalloff(): boolean;
        /**
         * In order to support the falloff compatibility with gltf, a special mode has been added
         * to reproduce the gltf light falloff.
         */
        set useGLTFLightFalloff(value: boolean);
        /**
         * Allows using an object space normal map (instead of tangent space).
         */
        useObjectSpaceNormalMap: boolean;
        /**
         * Allows using the normal map in parallax mode.
         */
        useParallax: boolean;
        /**
         * Allows using the normal map in parallax occlusion mode.
         */
        useParallaxOcclusion: boolean;
        /**
         * Controls the scale bias of the parallax mode.
         */
        parallaxScaleBias: number;
        /**
         * If sets to true, disables all the lights affecting the material.
         */
        disableLighting: boolean;
        /**
         * Force the shader to compute irradiance in the fragment shader in order to take normal mapping into account.
         */
        forceIrradianceInFragment: boolean;
        /**
         * Number of Simultaneous lights allowed on the material.
         */
        maxSimultaneousLights: number;
        /**
         * If sets to true, x component of normal map value will invert (x = 1.0 - x).
         */
        invertNormalMapX: boolean;
        /**
         * If sets to true, y component of normal map value will invert (y = 1.0 - y).
         */
        invertNormalMapY: boolean;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         */
        twoSidedLighting: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)
         */
        useAlphaFresnel: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)
         */
        useLinearAlphaFresnel: boolean;
        /**
         * Let user defines the brdf lookup texture used for IBL.
         * A default 8bit version is embedded but you could point at :
         * * Default texture: https://assets.babylonjs.com/environments/correlatedMSBRDF_RGBD.png
         * * Default 16bit pixel depth texture: https://assets.babylonjs.com/environments/correlatedMSBRDF.dds
         * * LEGACY Default None correlated https://assets.babylonjs.com/environments/uncorrelatedBRDF_RGBD.png
         * * LEGACY Default None correlated 16bit pixel depth https://assets.babylonjs.com/environments/uncorrelatedBRDF.dds
         */
        environmentBRDFTexture: Nullable<BaseTexture>;
        /**
         * Force normal to face away from face.
         */
        forceNormalForward: boolean;
        /**
         * Enables specular anti aliasing in the PBR shader.
         * It will both interacts on the Geometry for analytical and IBL lighting.
         * It also prefilter the roughness map based on the normalmap values.
         */
        enableSpecularAntiAliasing: boolean;
        /**
         * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal
         * makes the reflect vector face the model (under horizon).
         */
        useHorizonOcclusion: boolean;
        /**
         * This parameters will enable/disable radiance occlusion by preventing the radiance to lit
         * too much the area relying on ambient texture to define their ambient occlusion.
         */
        useRadianceOcclusion: boolean;
        /**
         * If set to true, no lighting calculations will be applied.
         */
        unlit: boolean;
        /**
         * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)
         */
        applyDecalMapAfterDetailMap: boolean;
        /**
         * Force all the PBR materials to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * This stores the direct, emissive, environment, and specular light intensities into a Vector4.
         */
        private _lightingInfos;
        /**
         * Stores the radiance (and, possibly, irradiance) values in a texture.
         * @internal
         */
        _radianceTexture: Nullable<BaseTexture>;
        /**
         * Specifies that the specular weight will be read from the alpha channel.
         * This is for compatibility with glTF's KHR_materials_specular extension.
         * @internal
         */
        _useSpecularWeightFromAlpha: boolean;
        /**
         * Specifies that the specular weight will be read from the alpha channel of the specular color texture.
         * This is for compatibility with glTF's KHR_materials_specular extension.
         * @internal
         */
        _useSpecularWeightFromSpecularColorTexture: boolean;
        /**
         * Specifies if the material uses anisotropy weight read from the geometry tangent texture's blue channel.
         * This is for compatibility with glTF's anisotropy extension.
         * @internal
         */
        _useSpecularRoughnessAnisotropyFromTangentTexture: boolean;
        /**
         * Specifies if the material uses coat anisotropy weight read from the coat's geometry tangent texture's blue channel.
         * This is for compatibility with glTF's clearcoat_anisotropy extension.
         * @internal
         */
        _useCoatRoughnessAnisotropyFromTangentTexture: boolean;
        /**
         * Specifies whether the coat roughness is taken from the green channel of the coat texture.
         * This is for compatibility with glTF's KHR_materials_clearcoat and KHR_materials_coat extensions.
         * @internal
         */
        _useCoatRoughnessFromGreenChannel: boolean;
        /**
         * Assume the anisotropy data is stored in the format specified by
         * KHR_materials_anisotropy.
         * @internal
         */
        _useGltfStyleAnisotropy: boolean;
        /**
         * Specifies that the fuzz roughness is stored in the alpha channel of the texture.
         * This is for compatibility with glTF where the fuzz roughness is often stored in
         * the alpha channel of the fuzz color texture.
         */
        _useFuzzRoughnessFromTextureAlpha: boolean;
        /**
         * Specifies that the subsurface weight is stored in the alpha channel of the texture.
         * This is for compatibility with glTF where the subsurface weight is stored in
         * the alpha channel of the diffuseTransmissionTexture.
         */
        _useSubsurfaceWeightFromTextureAlpha: boolean;
        /**
         * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal
         * makes the reflect vector face the model (under horizon).
         * @internal
         */
        _useHorizonOcclusion: boolean;
        /**
         * This parameters will enable/disable radiance occlusion by preventing the radiance to lit
         * too much the area relying on ambient texture to define their ambient occlusion.
         * @internal
         */
        _useRadianceOcclusion: boolean;
        /**
         * Specifies that the alpha is coming from the base color texture's alpha channel.
         * This is for compatibility with glTF.
         * @internal
         */
        _useAlphaFromBaseColorTexture: boolean;
        /**
         * Specifies if the metallic texture contains the ambient occlusion information in its red channel.
         * This is for compatibility with glTF.
         * @internal
         */
        _useAmbientOcclusionFromMetallicTextureRed: boolean;
        /**
         * Specifies if the metallic texture contains the roughness information in its green channel.
         * This is for compatibility with glTF.
         * @internal
         */
        _useRoughnessFromMetallicTextureGreen: boolean;
        /**
         * Specifies if the metallic texture contains the metallic information in its blue channel.
         * This is for compatibility with glTF.
         * @internal
         */
        _useMetallicFromMetallicTextureBlue: boolean;
        /**
         * Specifies if the thin film thickness is stored in the green channel of the thin film thickness texture.
         * This is for compatibility with glTF.
         * @internal
         */
        _useThinFilmThicknessFromTextureGreen: boolean;
        /**
         * Specifies if the geometry thickness is stored in the green channel of the geometry thickness texture.
         * This is for compatibility with glTF.
         * @internal
         */
        _useGeometryThicknessFromGreenChannel: boolean;
        /**
         * Defines the  falloff type used in this material.
         * It by default is Physical.
         * @internal
         */
        _lightFalloff: number;
        /**
         * Allows using an object space normal map (instead of tangent space).
         * @internal
         */
        _useObjectSpaceNormalMap: boolean;
        /**
         * Allows using the normal map in parallax mode.
         * @internal
         */
        _useParallax: boolean;
        /**
         * Allows using the normal map in parallax occlusion mode.
         * @internal
         */
        _useParallaxOcclusion: boolean;
        /**
         * Controls the scale bias of the parallax mode.
         * @internal
         */
        _parallaxScaleBias: number;
        /**
         * If sets to true, disables all the lights affecting the material.
         * @internal
         */
        _disableLighting: boolean;
        /**
         * Number of Simultaneous lights allowed on the material.
         * @internal
         */
        _maxSimultaneousLights: number;
        /**
         * If sets to true, x component of normal map value will be inverted (x = 1.0 - x).
         * @internal
         */
        _invertNormalMapX: boolean;
        /**
         * If sets to true, y component of normal map value will be inverted (y = 1.0 - y).
         * @internal
         */
        _invertNormalMapY: boolean;
        /**
         * If sets to true and backfaceCulling is false, normals will be flipped on the backside.
         * @internal
         */
        _twoSidedLighting: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         * @internal
         */
        _alphaCutOff: number;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha is converted to gamma to compute the fresnel)
         * @internal
         */
        _useAlphaFresnel: boolean;
        /**
         * A fresnel is applied to the alpha of the model to ensure grazing angles edges are not alpha tested.
         * And/Or occlude the blended part. (alpha stays linear to compute the fresnel)
         * @internal
         */
        _useLinearAlphaFresnel: boolean;
        /**
         * Specifies the environment BRDF texture used to compute the scale and offset roughness values
         * from cos theta and roughness:
         * http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
         * @internal
         */
        _environmentBRDFTexture: Nullable<BaseTexture>;
        /**
         * Specifies the environment BRDF texture used to compute the scale and offset roughness values
         * from cos theta and roughness for the fuzz layer:
         * https://github.com/tizian/ltc-sheen?tab=readme-ov-file
         * @internal
         */
        _environmentFuzzBRDFTexture: Nullable<BaseTexture>;
        private _backgroundRefractionTexture;
        /**
         * Set the texture used for refraction of the background of transparent materials
         * @internal
         */
        get backgroundRefractionTexture(): Nullable<BaseTexture>;
        set backgroundRefractionTexture(texture: Nullable<BaseTexture>);
        private _refractionHighQualityBlur;
        /**
         * When true, uses a 4-tap rotated-grid kernel for refractive background blur,
         * eliminating bilinear block artifacts at the cost of 3 extra texture samples.
         * When false, a single dithered sample is used. Default: true.
         */
        get refractionHighQualityBlur(): boolean;
        set refractionHighQualityBlur(value: boolean);
        /**
         * Force the shader to compute irradiance in the fragment shader in order to take normal mapping into account.
         * @internal
         */
        _forceIrradianceInFragment: boolean;
        private _realTimeFiltering;
        /**
         * Enables realtime filtering on the texture.
         */
        get realTimeFiltering(): boolean;
        set realTimeFiltering(b: boolean);
        private _realTimeFilteringQuality;
        /**
         * Quality switch for realtime filtering
         */
        get realTimeFilteringQuality(): number;
        set realTimeFilteringQuality(n: number);
        private _fuzzSampleNumber;
        /**
         * The number of samples used to compute the fuzz IBL lighting.
         */
        get fuzzSampleNumber(): number;
        set fuzzSampleNumber(n: number);
        /**
         * Can this material render to several textures at once
         */
        get canRenderToMRT(): boolean;
        /**
         * Force normal to face away from face.
         * @internal
         */
        _forceNormalForward: boolean;
        /**
         * Enables specular anti aliasing in the PBR shader.
         * It will both interacts on the Geometry for analytical and IBL lighting.
         * It also prefilter the roughness map based on the normalmap values.
         * @internal
         */
        _enableSpecularAntiAliasing: boolean;
        /**
         * Stores the available render targets.
         */
        private _renderTargets;
        /**
         * If set to true, no lighting calculations will be applied.
         */
        private _unlit;
        /**
         * If sets to true, the decal map will be applied after the detail map. Else, it is applied before (default: false)
         */
        private _applyDecalMapAfterDetailMap;
        private _debugMode;
        private _shadersLoaded;
        private _breakShaderLoadedCheck;
        private _vertexPullingMetadata;
        /**
         * @internal
         * This is reserved for the inspector.
         * Defines the material debug mode.
         * It helps seeing only some components of the material while troubleshooting.
         */
        debugMode: number;
        /**
         * @internal
         * This is reserved for the inspector.
         * Specify from where on screen the debug mode should start.
         * The value goes from -1 (full screen) to 1 (not visible)
         * It helps with side by side comparison against the final render
         * This defaults to -1
         */
        debugLimit: number;
        /**
         * @internal
         * This is reserved for the inspector.
         * As the default viewing range might not be enough (if the ambient is really small for instance)
         * You can use the factor to better multiply the final value.
         */
        debugFactor: number;
        /**
         * Defines additional PrePass parameters for the material.
         */
        readonly prePassConfiguration: PrePassConfiguration;
        protected _cacheHasRenderTargetTextures: boolean;
        /**
         * Instantiates a new OpenPBRMaterial instance.
         *
         * @param name The material name
         * @param scene The scene the material will be use in.
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean);
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * Can this material render to prepass
         */
        get isPrePassCapable(): boolean;
        /**
         * @returns the name of the material class.
         */
        getClassName(): string;
        protected _transparencyMode: number;
        get transparencyMode(): number;
        set transparencyMode(value: number);
        /**
         * @returns whether or not the alpha value of the albedo texture should be used for alpha blending.
         */
        protected _shouldUseAlphaFromBaseColorTexture(): boolean;
        /**
         * @returns whether or not there is a usable alpha channel for transparency.
         */
        protected _hasAlphaChannel(): boolean;
        /**
         * @returns true when the material needs alpha blending — i.e. when geometry_opacity < 1
         * or a geometry opacity texture is present.
         */
        needAlphaBlending(): boolean;
        /**
         * Specifies if the mesh will require alpha blending.
         * Overridden to check geometry_opacity before the _hasTransparencyMode short-circuit in the
         * base class, which would otherwise always return false when _transparencyMode is MATERIAL_OPAQUE.
         * @param mesh The mesh to check
         * @returns true if alpha blending is needed for the mesh
         */
        needAlphaBlendingForMesh(mesh: AbstractMesh): boolean;
        /**
         * Makes a duplicate of the current material.
         * @param name - name to use for the new material.
         * @param cloneTexturesOnlyOnce - if a texture is used in more than one channel (e.g baseColor and opacity), only clone it once and reuse it on the other channels. Default false.
         * @param rootUrl defines the root URL to use to load textures
         * @returns cloned material instance
         */
        clone(name: string, cloneTexturesOnlyOnce?: boolean, rootUrl?: string): OpenPBRMaterial;
        /**
         * Serializes this PBR Material.
         * @returns - An object with the serialized material.
         */
        serialize(): any;
        /**
         * Parses a PBR Material from a serialized object.
         * @param source - Serialized object.
         * @param scene - BJS scene instance.
         * @param rootUrl - url for the scene object
         * @returns - OpenPBRMaterial
         */
        static Parse(source: any, scene: Scene, rootUrl: string): OpenPBRMaterial;
        /**
         * Force shader compilation
         * @param mesh - Define the mesh we want to force the compilation for
         * @param onCompiled - Define a callback triggered when the compilation completes
         * @param options - Define the options used to create the compilation
         */
        forceCompilation(mesh: AbstractMesh, onCompiled?: (material: Material) => void, options?: Partial<IMaterialCompilationOptions>): void;
        /**
         * Specifies that the submesh is ready to be used.
         * @param mesh - BJS mesh.
         * @param subMesh - A submesh of the BJS mesh.  Used to check if it is ready.
         * @param useInstances - Specifies that instances should be used.
         * @returns - boolean indicating that the submesh is ready or not.
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Initializes the uniform buffer layout for the shader.
         */
        buildUniformLayout(): void;
        /**
         * Binds the material data (this function is called even if mustRebind() returns false)
         * @param uniformBuffer defines the Uniform buffer to fill in.
         * @param scene defines the scene the material belongs to.
         * @param engine defines the engine the material belongs to.
         * @param subMesh the submesh to bind data for
         */
        bindPropertiesForSubMesh(uniformBuffer: UniformBuffer, scene: Scene, engine: Engine, subMesh: SubMesh): void;
        /**
         * Binds the submesh data.
         * @param world - The world matrix.
         * @param mesh - The BJS mesh.
         * @param subMesh - A submesh of the BJS mesh.
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Returns the animatable textures.
         * If material have animatable metallic texture, then reflectivity texture will not be returned, even if it has animations.
         * @returns - Array of animatable textures.
         */
        getAnimatables(): IAnimatable[];
        /**
         * Returns an array of the actively used textures.
         * @returns - Array of BaseTextures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Checks to see if a texture is used in the material.
         * @param texture - Base texture to use.
         * @returns - Boolean specifying if a texture is used in the material.
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Sets the required values to the prepass renderer.
         * It can't be sets when subsurface scattering of this material is disabled.
         * When scene have ability to enable subsurface prepass effect, it will enable.
         * @returns - If prepass is enabled or not.
         */
        setPrePassRenderer(): boolean;
        /**
         * Disposes the resources of the material.
         * @param forceDisposeEffect - Forces the disposal of effects.
         * @param forceDisposeTextures - Forces the disposal of all textures.
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void;
        /**
         * Returns the texture used for reflections.
         * @returns - Reflection texture if present.  Otherwise, returns the environment texture.
         */
        private _getRadianceTexture;
        private _prepareEffect;
        private _prepareDefines;
    }
    /**
     * Register side effects for openpbrMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterOpenpbrMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import openpbrMaterial.pure for tree-shakeable, side-effect-free usage.
     */




    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * A material to use for fast depth-only rendering.
     * @since 5.0.0
     */
    export class OcclusionMaterial extends ShaderMaterial {
        constructor(name: string, scene: Scene);
    }






    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Clear the material and set it to a default state for gaussian splatting
     * @param nodeMaterial node material to use
     */
    export function SetToDefaultGaussianSplatting(nodeMaterial: NodeMaterial): void;
    /**
     * Clear the material and set it to a default state for Smart Filter effects
     * @param nodeMaterial node material to use
     */
    export function SetToDefaultSFE(nodeMaterial: NodeMaterial): void;


    /**
     * Defines a connection point to be used for points with a custom object type
     */
    export class NodeMaterialConnectionPointCustomObject<T extends NodeMaterialBlock> extends NodeMaterialConnectionPoint {
        _blockType: new (...args: any[]) => T;
        private _blockName;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         * @param _blockType
         * @param _blockName
         */
        constructor(name: string, ownerBlock: NodeMaterialBlock, direction: NodeMaterialConnectionPointDirection, _blockType: new (...args: any[]) => T, _blockName: string);
        /**
         * Gets a number indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a number defining the compatibility state
         */
        checkCompatibilityState(connectionPoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPointCompatibilityStates;
        /**
         * Creates a block suitable to be used as an input for this input point.
         * If null is returned, a block based on the point type will be created.
         * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input
         */
        createCustomInputBlock(): Nullable<[NodeMaterialBlock, string]>;
    }


    /**
     * Class used to store shared data between 2 NodeMaterialBuildState
     */
    export class NodeMaterialBuildStateSharedData {
        /**
         * The node material we are currently building
         */
        nodeMaterial: NodeMaterial;
        /**
         * Gets the list of emitted varyings
         */
        temps: string[];
        /**
         * Gets the list of emitted varyings
         */
        varyings: string[];
        /**
         * Gets the varying declaration string (for vertex shader)
         */
        varyingDeclaration: string;
        /**
         * Gets the varying declaration string (for fragment shader)
         * This is potentially different from varyingDeclaration only in WebGPU
         */
        varyingDeclarationFragment: string;
        /**
         * Gets the varying initialization string (for fragment shader)
         * Only used in WebGPU, to reconstruct the varying values from the vertex shader if their types is mat4x4f
         */
        varyingInitializationsFragment: string;
        /**
         * List of the fragment output nodes
         */
        fragmentOutputNodes: Immutable<Array<NodeMaterialBlock>>;
        /**
         * Input blocks
         */
        inputBlocks: InputBlock[];
        /**
         * Input blocks
         */
        textureBlocks: NodeMaterialTextureBlocks[];
        /**
         * Bindable blocks (Blocks that need to set data to the effect)
         */
        bindableBlocks: NodeMaterialBlock[];
        /**
         * Bindable blocks (Blocks that need to set data to the effect) that will always be called (by bindForSubMesh), contrary to bindableBlocks that won't be called if _mustRebind() returns false
         */
        forcedBindableBlocks: NodeMaterialBlock[];
        /**
         * List of blocks that can provide a compilation fallback
         */
        blocksWithFallbacks: NodeMaterialBlock[];
        /**
         * List of blocks that can provide a define update
         */
        blocksWithDefines: NodeMaterialBlock[];
        /**
         * List of blocks that can provide a repeatable content
         */
        repeatableContentBlocks: NodeMaterialBlock[];
        /**
         * List of blocks that can provide a dynamic list of uniforms
         */
        dynamicUniformBlocks: NodeMaterialBlock[];
        /**
         * List of blocks that can block the isReady function for the material
         */
        blockingBlocks: NodeMaterialBlock[];
        /**
         * Gets the list of animated inputs
         */
        animatedInputs: InputBlock[];
        /**
         * Defines to inject in the vertex and fragment shaders
         */
        defines: {
            [key: string]: string;
        };
        /**
         * Configurations used to format the generated code
         */
        formatConfig: {
            getUniformAnnotation: Nullable<(name: string) => string>;
            formatVariablename: (name: string) => string;
        };
        /**
         * Build Id used to avoid multiple recompilations
         */
        buildId: number;
        /** List of emitted variables */
        variableNames: {
            [key: string]: number;
        };
        /** List of emitted defines */
        defineNames: {
            [key: string]: number;
        };
        /** Should emit comments? */
        emitComments: boolean;
        /** Emit build activity */
        verbose: boolean;
        /** Gets or sets the hosting scene */
        scene: Scene;
        /**
         * Gets the compilation hints emitted at compilation time
         */
        hints: {
            needWorldViewMatrix: boolean;
            needWorldViewProjectionMatrix: boolean;
            needAlphaBlending: boolean;
            needAlphaTesting: boolean;
        };
        /**
         * List of compilation checks
         */
        checks: {
            emitVertex: boolean;
            emitFragment: boolean;
            notConnectedNonOptionalInputs: NodeMaterialConnectionPoint[];
            customErrors: string[];
        };
        /**
         * Is vertex program allowed to be empty?
         */
        allowEmptyVertexProgram: boolean;
        /** Creates a new shared data */
        constructor();
        /**
         * Push a new error to the build state, avoiding exceptions that can break the build process
         * @param message defines the error message to push
         */
        raiseBuildError(message: string): void;
        /**
         * Emits console errors and exceptions if there is a failing check
         * @returns true if all checks pass
         */
        emitErrors(): boolean;
    }


    /**
     * Class used to store node based material build state
     */
    export class NodeMaterialBuildState {
        /** Gets or sets a boolean indicating if the current state can emit uniform buffers */
        supportUniformBuffers: boolean;
        /**
         * Gets the list of emitted attributes
         */
        attributes: string[];
        /**
         * Gets the list of emitted uniforms
         */
        uniforms: string[];
        /**
         * Gets the list of emitted constants
         */
        constants: string[];
        /**
         * Gets the list of emitted samplers
         */
        samplers: string[];
        /**
         * Gets the list of emitted functions
         */
        functions: {
            [key: string]: string;
        };
        /**
         * Gets the list of emitted extensions
         */
        extensions: {
            [key: string]: string;
        };
        /**
         * Gets the list of emitted prePass outputs - if using the prepass
         */
        prePassOutput: {
            [key: string]: string;
        };
        /**
         * Gets the target of the compilation state
         */
        target: NodeMaterialBlockTargets;
        /**
         * Gets the list of emitted counters
         */
        counters: {
            [key: string]: number;
        };
        /**
         * Shared data between multiple NodeMaterialBuildState instances
         */
        sharedData: NodeMaterialBuildStateSharedData;
        /** @internal */
        _terminalBlocks: Set<NodeMaterialBlock>;
        /** @internal */
        _vertexState: NodeMaterialBuildState;
        /** @internal */
        _attributeDeclaration: string;
        /** @internal */
        _uniformDeclaration: string;
        /** @internal */
        _constantDeclaration: string;
        /** @internal */
        _samplerDeclaration: string;
        /** @internal */
        _varyingTransfer: string;
        /** @internal */
        _injectAtEnd: string;
        /** @internal */
        _injectAtTop: string;
        /** @internal */
        _customEntryHeader: string;
        /** @internal */
        private _repeatableContentAnchorIndex;
        /** @internal */
        _builtCompilationString: string;
        /**
         * Gets the emitted compilation strings
         */
        compilationString: string;
        /**
         * Gets the current shader language to use
         */
        get shaderLanguage(): ShaderLanguage;
        /** Gets suffix to add behind type casting */
        get fSuffix(): "" | "f";
        /**
         * Returns the processed, compiled shader code
         * @param defines defines to use for the shader processing
         * @returns the raw shader code used by the engine
         */
        getProcessedShaderAsync(defines: string): Promise<string>;
        /**
         * Finalize the compilation strings
         * @param state defines the current compilation state
         */
        finalize(state: NodeMaterialBuildState): void;
        /** @internal */
        get _repeatableContentAnchor(): string;
        /**
         * @internal
         */
        _getFreeVariableName(prefix: string): string;
        /**
         * @internal
         */
        _getFreeDefineName(prefix: string): string;
        /**
         * @internal
         */
        _excludeVariableName(name: string): void;
        /**
         * @internal
         */
        _emit2DSampler(name: string, define?: string, force?: boolean, annotation?: string, unsignedSampler?: boolean, precision?: string): void;
        /**
         * @internal
         */
        _emitCubeSampler(name: string, define?: string, force?: boolean): void;
        /**
         * @internal
         */
        _emit2DArraySampler(name: string): void;
        /**
         * @internal
         */
        _getGLType(type: NodeMaterialBlockConnectionPointTypes): string;
        /**
         * @internal
         */
        _getShaderType(type: NodeMaterialBlockConnectionPointTypes): "" | "int" | "float" | "i32" | "f32" | "vec2f" | "vec2" | "vec3f" | "vec3" | "vec4f" | "vec4" | "mat4x4f" | "mat4";
        /**
         * @internal
         */
        _emitExtension(name: string, extension: string, define?: string): void;
        /**
         * @internal
         */
        _emitFunction(name: string, code: string, comments: string): void;
        /**
         * @internal
         */
        _emitCodeFromInclude(includeName: string, comments: string, options?: {
            replaceStrings?: {
                search: RegExp;
                replace: string;
            }[];
            repeatKey?: string;
            substitutionVars?: string;
        }): string;
        /**
         * @internal
         */
        _emitFunctionFromInclude(includeName: string, comments: string, options?: {
            repeatKey?: string;
            substitutionVars?: string;
            removeAttributes?: boolean;
            removeUniforms?: boolean;
            removeVaryings?: boolean;
            removeIfDef?: boolean;
            replaceStrings?: {
                search: RegExp;
                replace: string;
            }[];
        }, storeKey?: string): void;
        /**
         * @internal
         */
        _registerTempVariable(name: string): boolean;
        private _emitDefineStart;
        private _emitDefineEnd;
        /**
         * @internal
         */
        _emitVaryingFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define?: string, notDefine?: boolean): boolean;
        /**
         * @internal
         */
        _getVaryingName(name: string): string;
        /**
         * @internal
         */
        _emitUniformFromString(name: string, type: NodeMaterialBlockConnectionPointTypes, define?: string, notDefine?: boolean): void;
        /**
         * @internal
         */
        _generateTernary(trueStatement: string, falseStatement: string, condition: string): string;
        /**
         * @internal
         */
        _emitFloat(value: number): string;
        /**
         * @internal
         */
        _declareOutput(output: NodeMaterialConnectionPoint, isConst?: boolean): string;
        /**
         * @internal
         */
        _declareLocalVar(name: string, type: NodeMaterialBlockConnectionPointTypes, isConst?: boolean, isVarPrivate?: boolean): string;
        /**
         * @internal
         */
        _samplerCubeFunc(): "textureCube" | "textureSample";
        /**
         * @internal
         */
        _samplerFunc(): "texture2D" | "textureSample";
        /**
         * @internal
         */
        _samplerLODFunc(): "textureSampleLevel" | "texture2DLodEXT";
        _toLinearSpace(output: NodeMaterialConnectionPoint): string;
        /**
         * @internal
         */
        _generateTextureSample(uv: string, samplerName: string): string;
        /**
         * @internal
         */
        _generateTextureSampleLOD(uv: string, samplerName: string, lod: string): string;
        /**
         * @internal
         */
        _generateTextureSampleCube(uv: string, samplerName: string): string;
        /**
         * @internal
         */
        _generateTextureSampleCubeLOD(uv: string, samplerName: string, lod: string): string;
        private _convertVariableDeclarationToWGSL;
        private _convertVariableConstructorsToWGSL;
        private _convertOutParametersToWGSL;
        private _convertTernaryOperandsToWGSL;
        private _convertModOperatorsToWGSL;
        private _convertConstToWGSL;
        private _convertInnerFunctionsToWGSL;
        private _convertFunctionsToWGSL;
        _babylonSLtoWGSL(code: string): string;
        private _convertTernaryOperandsToGLSL;
        _babylonSLtoGLSL(code: string): string;
    }


    /**
     * Enum used to define the compatibility state between two connection points
     */
    export enum NodeMaterialConnectionPointCompatibilityStates {
        /** Points are compatibles */
        Compatible = 0,
        /** Points are incompatible because of their types */
        TypeIncompatible = 1,
        /** Points are incompatible because of their targets (vertex vs fragment) */
        TargetIncompatible = 2,
        /** Points are incompatible because they are in the same hierarchy **/
        HierarchyIssue = 3
    }
    /**
     * Defines the direction of a connection point
     */
    export enum NodeMaterialConnectionPointDirection {
        /** Input */
        Input = 0,
        /** Output */
        Output = 1
    }
    /**
     * Defines a connection point for a block
     */
    export class NodeMaterialConnectionPoint {
        /**
         * Checks if two types are equivalent
         * @param type1 type 1 to check
         * @param type2 type 2 to check
         * @returns true if both types are equivalent, else false
         */
        static AreEquivalentTypes(type1: number, type2: number): boolean;
        /** @internal */
        _isInactive: boolean;
        /**
         * Boolean used to provide visual clue to users when some ports are not active in the current block configuration
         */
        get isInactive(): boolean;
        /** @internal */
        _preventBubbleUp: boolean;
        /** @internal */
        readonly _ownerBlock: NodeMaterialBlock;
        private _connectedPointBackingField;
        private _connectedPointTypeChangedObserver;
        private get _connectedPoint();
        private set _connectedPoint(value);
        private readonly _endpoints;
        private _associatedVariableName;
        private readonly _direction;
        /** @internal */
        _redirectedSource: Nullable<NodeMaterialConnectionPoint>;
        private _typeConnectionSourceBackingField;
        private _typeConnectionSourceTypeChangedObserver;
        /** @internal */
        get _typeConnectionSource(): Nullable<NodeMaterialConnectionPoint>;
        /** @internal */
        set _typeConnectionSource(value: Nullable<NodeMaterialConnectionPoint>);
        private _defaultConnectionPointTypeBackingField;
        /** @internal */
        get _defaultConnectionPointType(): Nullable<NodeMaterialBlockConnectionPointTypes>;
        /** @internal */
        set _defaultConnectionPointType(value: Nullable<NodeMaterialBlockConnectionPointTypes>);
        /** @internal */
        _isMainLinkSource: boolean;
        private _linkedConnectionSourceBackingField;
        private _linkedConnectionSourceTypeChangedObserver;
        /** @internal */
        get _linkedConnectionSource(): Nullable<NodeMaterialConnectionPoint>;
        /** @internal */
        set _linkedConnectionSource(value: Nullable<NodeMaterialConnectionPoint>);
        /** @internal */
        _acceptedConnectionPointType: Nullable<NodeMaterialConnectionPoint>;
        private _type;
        /** @internal */
        _enforceAssociatedVariableName: boolean;
        /** @internal */
        _forPostBuild: boolean;
        /** Gets the direction of the point */
        get direction(): NodeMaterialConnectionPointDirection;
        /** Indicates that this connection point needs dual validation before being connected to another point */
        needDualDirectionValidation: boolean;
        /**
         * Gets or sets the additional types supported by this connection point
         */
        acceptedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[];
        /**
         * Gets or sets the additional types excluded by this connection point
         */
        excludedConnectionPointTypes: NodeMaterialBlockConnectionPointTypes[];
        /**
         * Observable triggered when this point is connected
         */
        readonly onConnectionObservable: Observable<NodeMaterialConnectionPoint>;
        /**
         * Observable triggered when this point is disconnected
         */
        readonly onDisconnectionObservable: Observable<NodeMaterialConnectionPoint>;
        /**
         * Observable triggered when the type of the connection point is changed
         */
        readonly onTypeChangedObservable: Observable<NodeMaterialBlockConnectionPointTypes>;
        private _isTypeChangeObservableNotifying;
        /**
         * Gets the declaration variable name in the shader
         */
        get declarationVariableName(): string;
        /**
         * Gets or sets the associated variable name in the shader
         */
        get associatedVariableName(): string;
        set associatedVariableName(value: string);
        /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */
        get innerType(): NodeMaterialBlockConnectionPointTypes;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeMaterialBlockConnectionPointTypes;
        set type(value: NodeMaterialBlockConnectionPointTypes);
        /**
         * Gets or sets the connection point name
         */
        readonly name: string;
        /**
         * Gets or sets the connection point name
         */
        displayName: string;
        /**
         * Gets or sets a boolean indicating that this connection point can be omitted
         */
        isOptional: boolean;
        /**
         * Gets or sets a boolean indicating that this connection point is exposed on a frame
         */
        isExposedOnFrame: boolean;
        /**
         * Gets or sets number indicating the position that the port is exposed to on a frame
         */
        exposedPortPosition: number;
        /**
         * Gets or sets a string indicating that this uniform must be defined under a #ifdef
         */
        define: string;
        /** @internal */
        _prioritizeVertex: boolean;
        private _target;
        /** Gets or sets the target of that connection point */
        get target(): NodeMaterialBlockTargets;
        set target(value: NodeMaterialBlockTargets);
        /**
         * Gets a boolean indicating that the current point is connected to another NodeMaterialBlock
         */
        get isConnected(): boolean;
        /**
         * Gets a boolean indicating that the current point is connected to an input block
         */
        get isConnectedToInputBlock(): boolean;
        /**
         * Gets a the connected input block (if any)
         */
        get connectInputBlock(): Nullable<InputBlock>;
        /** Get the other side of the connection (if any) */
        get connectedPoint(): Nullable<NodeMaterialConnectionPoint>;
        /** Get the block that owns this connection point */
        get ownerBlock(): NodeMaterialBlock;
        /** Get the block connected on the other side of this connection (if any) */
        get sourceBlock(): Nullable<NodeMaterialBlock>;
        /** Get the block connected on the endpoints of this connection (if any) */
        get connectedBlocks(): Array<NodeMaterialBlock>;
        /** Gets the list of connected endpoints */
        get endpoints(): NodeMaterialConnectionPoint[];
        /** Gets a boolean indicating if that output point is connected to at least one input */
        get hasEndpoints(): boolean;
        /** Gets a boolean indicating that this connection has a path to the vertex output*/
        get isDirectlyConnectedToVertexOutput(): boolean;
        /** Gets a boolean indicating that this connection will be used in the vertex shader */
        get isConnectedInVertexShader(): boolean;
        /** Gets a boolean indicating that this connection will be used in the fragment shader */
        get isConnectedInFragmentShader(): boolean;
        /**
         * Creates a block suitable to be used as an input for this input point.
         * If null is returned, a block based on the point type will be created.
         * @returns The returned string parameter is the name of the output point of NodeMaterialBlock (first parameter of the returned array) that can be connected to the input
         */
        createCustomInputBlock(): Nullable<[NodeMaterialBlock, string]>;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         */
        constructor(name: string, ownerBlock: NodeMaterialBlock, direction: NodeMaterialConnectionPointDirection);
        /**
         * Gets the current class name e.g. "NodeMaterialConnectionPoint"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a boolean
         */
        canConnectTo(connectionPoint: NodeMaterialConnectionPoint): boolean;
        /**
         * Gets a number indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a number defining the compatibility state
         */
        checkCompatibilityState(connectionPoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPointCompatibilityStates;
        /**
         * Connect this point to another connection point
         * @param connectionPoint defines the other connection point
         * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)
         * @returns the current connection point
         */
        connectTo(connectionPoint: NodeMaterialConnectionPoint, ignoreConstraints?: boolean): NodeMaterialConnectionPoint;
        /**
         * Disconnect this point from one of his endpoint
         * @param endpoint defines the other connection point
         * @returns the current connection point
         */
        disconnectFrom(endpoint: NodeMaterialConnectionPoint): NodeMaterialConnectionPoint;
        /**
         * Fill the list of excluded connection point types with all types other than those passed in the parameter
         * @param mask Types (ORed values of NodeMaterialBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list
         */
        addExcludedConnectionPointFromAllowedTypes(mask: number): void;
        /**
         * Serializes this point in a JSON representation
         * @param isInput defines if the connection point is an input (default is true)
         * @returns the serialized point object
         */
        serialize(isInput?: boolean): any;
        /**
         * Release resources
         */
        dispose(): void;
        private _updateTypeDependentState;
        private _notifyTypeChanged;
    }


    /**
     * Defines a block that can be used inside a node based material
     */
    export class NodeMaterialBlock {
        private _buildId;
        private _buildTarget;
        protected _target: NodeMaterialBlockTargets;
        private _isFinalMerger;
        private _isInput;
        private _isLoop;
        private _isTeleportOut;
        private _isTeleportIn;
        private _name;
        protected _isUnique: boolean;
        protected _codeIsReady: boolean;
        /** @internal */
        _isFinalOutput: boolean;
        /** @internal */
        get _isFinalOutputAndActive(): boolean;
        /** @internal */
        get _hasPrecedence(): boolean;
        /**
         * Observable raised when the block code is ready (if the code loading is async)
         */
        onCodeIsReadyObservable: Observable<NodeMaterialBlock>;
        /** Gets or sets a boolean indicating that only one input can be connected at a time */
        inputsAreExclusive: boolean;
        /** @internal */
        _codeVariableName: string;
        /** @internal */
        _inputs: NodeMaterialConnectionPoint[];
        /** @internal */
        _outputs: NodeMaterialConnectionPoint[];
        /** @internal */
        _preparationId: number;
        /** @internal */
        readonly _originalTargetIsNeutral: boolean;
        /**
         * Gets the name of the block
         */
        get name(): string;
        /**
         * Gets a boolean indicating that this block has is code ready to be used
         */
        get codeIsReady(): boolean;
        /**
         * Sets the name of the block. Will check if the name is valid.
         */
        set name(newName: string);
        /**
         * Gets or sets the unique id of the node
         */
        uniqueId: number;
        /**
         * Gets or sets the comments associated with this block
         */
        comments: string;
        /**
         * Gets a boolean indicating that this block can only be used once per NodeMaterial
         */
        get isUnique(): boolean;
        /**
         * Gets a boolean indicating that this block is an end block (e.g. it is generating a system value)
         */
        get isFinalMerger(): boolean;
        /**
         * Gets a boolean indicating that this block is an input (e.g. it sends data to the shader)
         */
        get isInput(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport out
         */
        get isTeleportOut(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport in
         */
        get isTeleportIn(): boolean;
        /**
         * Gets a boolean indicating if this block is a loop
         */
        get isLoop(): boolean;
        /**
         * Gets or sets the build Id
         */
        get buildId(): number;
        set buildId(value: number);
        /**
         * Gets or sets the target of the block
         */
        get target(): NodeMaterialBlockTargets;
        set target(value: NodeMaterialBlockTargets);
        /**
         * Gets the list of input points
         */
        get inputs(): NodeMaterialConnectionPoint[];
        /** Gets the list of output points */
        get outputs(): NodeMaterialConnectionPoint[];
        /**
         * Find an input by its name
         * @param name defines the name of the input to look for
         * @returns the input or null if not found
         */
        getInputByName(name: string): NodeMaterialConnectionPoint | null;
        /**
         * Find an output by its name
         * @param name defines the name of the output to look for
         * @returns the output or null if not found
         */
        getOutputByName(name: string): NodeMaterialConnectionPoint | null;
        /** Gets or sets a boolean indicating that this input can be edited in the Inspector (false by default) */
        visibleInInspector: boolean;
        /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */
        visibleOnFrame: boolean;
        /**
         * Creates a new NodeMaterialBlock
         * @param name defines the block name
         * @param target defines the target of that block (Vertex by default)
         * @param isFinalMerger defines a boolean indicating that this block is an end block (e.g. it is generating a system value). Default is false
         * @param isFinalOutput defines a boolean indicating that this block is generating a final output and no other block should be generated after
         */
        constructor(name: string, target?: NodeMaterialBlockTargets, isFinalMerger?: boolean, isFinalOutput?: boolean);
        /** @internal */
        _setInitialTarget(target: NodeMaterialBlockTargets): void;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Bind data to effect. Will only be called for blocks with isBindable === true
         * @param effect defines the effect to bind data to
         * @param nodeMaterial defines the hosting NodeMaterial
         * @param mesh defines the mesh that will be rendered
         * @param subMesh defines the submesh that will be rendered
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh): void;
        protected _writeVariable(currentPoint: NodeMaterialConnectionPoint): string;
        protected _writeFloat(value: number): string;
        /**
         * Gets the current class name e.g. "NodeMaterialBlock"
         * @returns the class name
         */
        getClassName(): string;
        /** Gets a boolean indicating that this connection will be used in the fragment shader
         * @returns true if connected in fragment shader
         */
        isConnectedInFragmentShader(): boolean;
        /**
         * Register a new input. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param isOptional defines a boolean indicating that this input can be omitted
         * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerInput(name: string, type: NodeMaterialBlockConnectionPointTypes, isOptional?: boolean, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint): this;
        /**
         * Register a new output. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param target defines the target to use to limit the connection point (will be VertexAndFragment by default)
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerOutput(name: string, type: NodeMaterialBlockConnectionPointTypes, target?: NodeMaterialBlockTargets, point?: NodeMaterialConnectionPoint): this;
        /**
         * Will return the first available input e.g. the first one which is not an uniform or an attribute
         * @param forOutput defines an optional connection point to check compatibility with
         * @returns the first available input or null
         */
        getFirstAvailableInput(forOutput?: Nullable<NodeMaterialConnectionPoint>): NodeMaterialConnectionPoint | null;
        /**
         * Will return the first available output e.g. the first one which is not yet connected and not a varying
         * @param forBlock defines an optional block to check compatibility with
         * @returns the first available input or null
         */
        getFirstAvailableOutput(forBlock?: Nullable<NodeMaterialBlock>): NodeMaterialConnectionPoint | null;
        /**
         * Gets the sibling of the given output
         * @param current defines the current output
         * @returns the next output in the list or null
         */
        getSiblingOutput(current: NodeMaterialConnectionPoint): NodeMaterialConnectionPoint | null;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeMaterialBlock): boolean;
        /**
         * Connect current block with another block
         * @param other defines the block to connect with
         * @param options define the various options to help pick the right connections
         * @returns the current block
         */
        connectTo(other: NodeMaterialBlock, options?: {
            input?: string;
            output?: string;
            outputSwizzle?: string;
        }): this | undefined;
        protected _buildBlock(state: NodeMaterialBuildState): void;
        protected _postBuildBlock(state: NodeMaterialBuildState): void;
        /**
         * Add uniforms, samplers and uniform buffers at compilation time
         * @param state defines the state to update
         * @param nodeMaterial defines the node material requesting the update
         * @param defines defines the material defines to update
         * @param uniformBuffers defines the list of uniform buffer names
         */
        updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]): void;
        /**
         * Add potential fallbacks if shader compilation fails
         * @param fallbacks defines the current prioritized list of fallbacks
         * @param mesh defines the mesh to be rendered
         */
        provideFallbacks(fallbacks: EffectFallbacks, mesh?: AbstractMesh): void;
        /**
         * Initialize defines for shader compilation
         * @param defines defines the material defines to update
         */
        initializeDefines(defines: NodeMaterialDefines): void;
        /**
         * Update defines for shader compilation
         * @param defines defines the material defines to update
         * @param nodeMaterial defines the node material requesting the update
         * @param mesh defines the mesh to be rendered
         * @param useInstances specifies that instances should be used
         * @param subMesh defines which submesh to render
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh, useInstances?: boolean, subMesh?: SubMesh): void;
        /**
         * Lets the block try to connect some inputs automatically
         * @param material defines the hosting NodeMaterial
         * @param additionalFilteringInfo optional additional filtering condition when looking for compatible blocks
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Function called when a block is declared as repeatable content generator
         * @param vertexShaderState defines the current compilation state for the vertex shader
         * @param defines defines the material defines to update
         * @param mesh defines the mesh to be rendered
         */
        replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, defines: NodeMaterialDefines, mesh?: AbstractMesh): void;
        /** Gets a boolean indicating that the code of this block will be promoted to vertex shader even if connected to fragment output */
        get willBeGeneratedIntoVertexShaderFromFragmentShader(): boolean;
        /**
         * Checks if the block is ready
         * @param mesh defines the mesh to be rendered
         * @param nodeMaterial defines the node material requesting the update
         * @param defines defines the material defines to update
         * @param useInstances specifies that instances should be used
         * @returns true if the block is ready
         */
        isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, useInstances?: boolean): boolean;
        protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling?: boolean): void;
        private _processBuild;
        /**
         * Validates the new name for the block node.
         * @param newName the new name to be given to the node.
         * @returns false if the name is a reserve word, else true.
         */
        validateBlockName(newName: string): boolean;
        protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void;
        /**
         * Compile the current node and generate the shader code
         * @param state defines the current compilation state (uniforms, samplers, current string)
         * @param activeBlocks defines the list of active blocks (i.e. blocks to compile)
         * @returns true if already built
         */
        build(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): boolean;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        protected _dumpPropertiesCode(): string;
        /**
         * @internal
         */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]): string;
        /**
         * @internal
         */
        _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]): string;
        /**
         * Clone the current block to a new identical block
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a copy of the current block
         */
        clone(scene: Scene, rootUrl?: string): NodeMaterialBlock | null;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * @internal
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string): void;
        private _deserializePortDisplayNamesAndExposedOnFrame;
        /**
         * Release resources
         */
        dispose(): void;
    }


    type NodeMaterialBlockIsTextureBlockType = typeof NodeMaterialBlockIsTextureBlock;
    type NodeMaterialCreateDefaultType = typeof NodeMaterialCreateDefault;
    type NodeMaterialParseType = typeof NodeMaterialParse;
    type NodeMaterialParseFromFileAsyncType = typeof NodeMaterialParseFromFileAsync;
    type NodeMaterialParseFromSnippetAsyncType = typeof NodeMaterialParseFromSnippetAsync;
        export namespace NodeMaterial {
            let _BlockIsTextureBlock: NodeMaterialBlockIsTextureBlockType;
            let Parse: NodeMaterialParseType;
            let ParseFromFileAsync: NodeMaterialParseFromFileAsyncType;
            let ParseFromSnippetAsync: NodeMaterialParseFromSnippetAsyncType;
            let CreateDefault: NodeMaterialCreateDefaultType;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Interface used to configure the node material editor
     */
    export interface INodeMaterialEditorOptions {
        /** Define the URL to load node editor script from */
        editorURL?: string;
        /** Additional configuration for the NME */
        nodeEditorConfig?: {
            backgroundColor?: Color4;
        };
    }
    var NodeMaterialDefinesBase_base: {
        new (...args: any[]): {
            MAINUV1: boolean;
            MAINUV2: boolean;
            MAINUV3: boolean;
            MAINUV4: boolean;
            MAINUV5: boolean;
            MAINUV6: boolean;
            UV1: boolean;
            UV2: boolean;
            UV3: boolean;
            UV4: boolean;
            UV5: boolean;
            UV6: boolean;
        };
    } & typeof MaterialDefines;
    class NodeMaterialDefinesBase extends NodeMaterialDefinesBase_base {
    }
    var NodeMaterialDefines_base: {
        new (...args: any[]): {
            IMAGEPROCESSING: boolean;
            VIGNETTE: boolean;
            VIGNETTEBLENDMODEMULTIPLY: boolean;
            VIGNETTEBLENDMODEOPAQUE: boolean;
            TONEMAPPING: number;
            CONTRAST: boolean;
            COLORCURVES: boolean;
            COLORGRADING: boolean;
            COLORGRADING3D: boolean;
            SAMPLER3DGREENDEPTH: boolean;
            SAMPLER3DBGRMAP: boolean;
            DITHER: boolean;
            IMAGEPROCESSINGPOSTPROCESS: boolean;
            SKIPFINALCOLORCLAMP: boolean;
            EXPOSURE: boolean;
        };
    } & typeof NodeMaterialDefinesBase;
    /** @internal */
    export class NodeMaterialDefines extends NodeMaterialDefines_base {
        /** Normal */
        NORMAL: boolean;
        /** Tangent */
        TANGENT: boolean;
        /** Vertex color */
        VERTEXCOLOR_NME: boolean;
        /** Prepass **/
        PREPASS: boolean;
        /** Prepass normal */
        PREPASS_NORMAL: boolean;
        /** Prepass normal index */
        PREPASS_NORMAL_INDEX: number;
        /** Prepass world normal */
        PREPASS_WORLD_NORMAL: boolean;
        /** Prepass world normal index */
        PREPASS_WORLD_NORMAL_INDEX: number;
        /** Prepass position */
        PREPASS_POSITION: boolean;
        /** Prepass position index */
        PREPASS_POSITION_INDEX: number;
        /** Prepass local position */
        PREPASS_LOCAL_POSITION: boolean;
        /** Prepass local position index */
        PREPASS_LOCAL_POSITION_INDEX: number;
        /** Prepass depth */
        PREPASS_DEPTH: boolean;
        /** Prepass depth index */
        PREPASS_DEPTH_INDEX: number;
        /** Clip-space depth */
        PREPASS_SCREENSPACE_DEPTH: boolean;
        /** Clip-space depth index */
        PREPASS_SCREENSPACE_DEPTH_INDEX: number;
        /** Reflectivity */
        PREPASS_REFLECTIVITY: boolean;
        /** Reflectivity index */
        PREPASS_REFLECTIVITY_INDEX: number;
        /** Velocity */
        PREPASS_VELOCITY: boolean;
        /** Velocity index */
        PREPASS_VELOCITY_INDEX: number;
        /** Velocity linear */
        PREPASS_VELOCITY_LINEAR: boolean;
        /** Velocity linear index */
        PREPASS_VELOCITY_LINEAR_INDEX: number;
        /** Scene MRT count */
        SCENE_MRT_COUNT: number;
        /** BONES */
        NUM_BONE_INFLUENCERS: number;
        /** Bones per mesh */
        BonesPerMesh: number;
        /** Using texture for bone storage */
        BONETEXTURE: boolean;
        /** MORPH TARGETS */
        MORPHTARGETS: boolean;
        /** Morph target position */
        MORPHTARGETS_POSITION: boolean;
        /** Morph target normal */
        MORPHTARGETS_NORMAL: boolean;
        /** Morph target tangent */
        MORPHTARGETS_TANGENT: boolean;
        /** Morph target uv */
        MORPHTARGETS_UV: boolean;
        /** Morph target uv2 */
        MORPHTARGETS_UV2: boolean;
        /** Morph target color support */
        MORPHTARGETS_COLOR: boolean;
        /** Morph target support positions */
        MORPHTARGETTEXTURE_HASPOSITIONS: boolean;
        /** Morph target support normals */
        MORPHTARGETTEXTURE_HASNORMALS: boolean;
        /** Morph target support tangents */
        MORPHTARGETTEXTURE_HASTANGENTS: boolean;
        /** Morph target support uvs */
        MORPHTARGETTEXTURE_HASUVS: boolean;
        /** Morph target support uv2s */
        MORPHTARGETTEXTURE_HASUV2S: boolean;
        /** Morph target texture has colors */
        MORPHTARGETTEXTURE_HASCOLORS: boolean;
        /** Number of morph influencers */
        NUM_MORPH_INFLUENCERS: number;
        /** Using a texture to store morph target data */
        MORPHTARGETS_TEXTURE: boolean;
        /** MISC. */
        BUMPDIRECTUV: number;
        /** Camera is orthographic */
        CAMERA_ORTHOGRAPHIC: boolean;
        /** Camera is perspective */
        CAMERA_PERSPECTIVE: boolean;
        /** Area light support */
        AREALIGHTSUPPORTED: boolean;
        /** Area light no roughness */
        AREALIGHTNOROUGHTNESS: boolean;
        /** Position W as varying */
        POSITIONW_AS_VARYING: boolean;
        /**
         * Creates a new NodeMaterialDefines
         */
        constructor();
        /**
         * Set the value of a specific key
         * @param name defines the name of the key to set
         * @param value defines the value to set
         * @param markAsUnprocessedIfDirty Flag to indicate to the cache that this value needs processing
         */
        setValue(name: string, value: any, markAsUnprocessedIfDirty?: boolean): void;
    }
    /**
     * Class used to configure NodeMaterial
     */
    export interface INodeMaterialOptions {
        /**
         * Defines if blocks should emit comments
         */
        emitComments: boolean;
        /** Defines shader language to use (default to GLSL) */
        shaderLanguage: ShaderLanguage;
    }
    /**
     * Blocks that manage a texture
     */
    export type NodeMaterialTextureBlocks = TextureBlock | ReflectionTextureBaseBlock | RefractionBlock | CurrentScreenBlock | ParticleTextureBlock | ImageSourceBlock | TriPlanarBlock | BiPlanarBlock | PrePassTextureBlock;
    var NodeMaterialBase_base: {
        new (...args: any[]): {
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            get cameraColorCurvesEnabled(): boolean;
            set cameraColorCurvesEnabled(value: boolean);
            get cameraColorGradingEnabled(): boolean;
            set cameraColorGradingEnabled(value: boolean);
            get cameraToneMappingEnabled(): boolean;
            set cameraToneMappingEnabled(value: boolean);
            get cameraExposure(): number;
            set cameraExposure(value: number);
            get cameraContrast(): number;
            set cameraContrast(value: number);
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            get cameraColorCurves(): Nullable<ColorCurves>;
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & typeof PushMaterial;
    class NodeMaterialBase extends NodeMaterialBase_base {
    }
    /**
     * Class used to create a node based material built by assembling shader blocks
     */
    export class NodeMaterial extends NodeMaterialBase {
        private static _BuildIdGenerator;
        private _options;
        private _vertexCompilationState;
        private _fragmentCompilationState;
        private _sharedData;
        private _buildId;
        private _buildWasSuccessful;
        private _cachedWorldViewMatrix;
        private _cachedWorldViewProjectionMatrix;
        private _optimizers;
        private _animationFrame;
        private _buildIsInProgress;
        /** Define the Url to load node editor script */
        static EditorURL: string;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /** Gets or sets a boolean indicating that node materials should not deserialize textures from json / snippet content */
        static IgnoreTexturesAtLoadTime: boolean;
        /** Gets or sets a boolean indicating that render target textures can be serialized */
        static AllowSerializationOfRenderTargetTextures: boolean;
        /** Defines default shader language when no option is defined */
        static DefaultShaderLanguage: ShaderLanguage;
        /** If true, the node material will use GLSL if the engine is WebGL and WGSL if it's WebGPU. It takes priority over DefaultShaderLanguage if it's true */
        static UseNativeShaderLanguageOfEngine: boolean;
        private BJSNODEMATERIALEDITOR;
        /** Gets whether the node material is currently building */
        get buildIsInProgress(): boolean;
        /** @internal */
        _useAdditionalColor: boolean;
        /**
         * Sets whether glow mode is enabled
         * @param value - the value to set
         */
        set _glowModeEnabled(value: boolean);
        /** Get the inspector from bundle or global
         * @returns the global NME
         */
        private _getGlobalNodeMaterialEditor;
        /** Gets or sets the active shader language */
        get shaderLanguage(): ShaderLanguage;
        set shaderLanguage(value: ShaderLanguage);
        /**
         * Snippet ID if the material was created from the snippet server
         */
        snippetId: string;
        /**
         * Gets or sets data used by visual editor
         * @see https://nme.babylonjs.com
         */
        editorData: any;
        /**
         * Gets or sets a boolean indicating that alpha value must be ignored (This will turn alpha blending off even if an alpha value is produced by the material)
         */
        ignoreAlpha: boolean;
        /**
         * Defines the maximum number of lights that can be used in the material
         */
        maxSimultaneousLights: number;
        /**
         * Observable raised when the material is built
         */
        onBuildObservable: Observable<NodeMaterial>;
        /**
         * Observable raised when an error is detected
         */
        onBuildErrorObservable: Observable<string>;
        /**
         * Gets or sets the root nodes of the material vertex shader
         */
        _vertexOutputNodes: NodeMaterialBlock[];
        /**
         * Gets or sets the root nodes of the material fragment (pixel) shader
         */
        _fragmentOutputNodes: NodeMaterialBlock[];
        /** Gets or sets options to control the node material overall behavior */
        get options(): INodeMaterialOptions;
        set options(options: INodeMaterialOptions);
        /**
         * Gets an array of blocks that needs to be serialized even if they are not yet connected
         */
        attachedBlocks: NodeMaterialBlock[];
        /**
         * Specifies the mode of the node material
         * @internal
         */
        _mode: NodeMaterialModes;
        /**
         * Gets or sets the mode property
         */
        get mode(): NodeMaterialModes;
        set mode(value: NodeMaterialModes);
        /** Gets or sets the unique identifier used to identified the effect associated with the material */
        get buildId(): number;
        set buildId(value: number);
        /**
         * A free comment about the material
         */
        comment: string;
        /**
         * Create a new node based material
         * @param name defines the material name
         * @param scene defines the hosting scene
         * @param options defines creation option
         */
        constructor(name: string, scene?: Scene, options?: Partial<INodeMaterialOptions>);
        /**
         * Gets the current class name of the material e.g. "NodeMaterial"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Get a block by its name
         * @param name defines the name of the block to retrieve
         * @returns the required block or null if not found
         */
        getBlockByName(name: string): NodeMaterialBlock | null;
        /**
         * Get a block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required block or null if not found
         */
        getBlockByPredicate(predicate: (block: NodeMaterialBlock) => boolean): NodeMaterialBlock | null;
        /**
         * Get an input block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required input block or null if not found
         */
        getInputBlockByPredicate(predicate: (block: InputBlock) => boolean): Nullable<InputBlock>;
        /**
         * Gets the list of input blocks attached to this material
         * @returns an array of InputBlocks
         */
        getInputBlocks(): InputBlock[];
        /**
         * Adds a new optimizer to the list of optimizers
         * @param optimizer defines the optimizers to add
         * @returns the current material
         */
        registerOptimizer(optimizer: NodeMaterialOptimizer): this | undefined;
        /**
         * Remove an optimizer from the list of optimizers
         * @param optimizer defines the optimizers to remove
         * @returns the current material
         */
        unregisterOptimizer(optimizer: NodeMaterialOptimizer): this | undefined;
        /**
         * Add a new block to the list of output nodes
         * @param node defines the node to add
         * @returns the current material
         */
        addOutputNode(node: NodeMaterialBlock): this;
        /**
         * Remove a block from the list of root nodes
         * @param node defines the node to remove
         * @returns the current material
         */
        removeOutputNode(node: NodeMaterialBlock): this;
        private _addVertexOutputNode;
        private _removeVertexOutputNode;
        private _addFragmentOutputNode;
        private _removeFragmentOutputNode;
        /**
         * Gets or sets a boolean indicating that alpha blending must be enabled no matter what alpha value or alpha channel of the FragmentBlock are
         */
        forceAlphaBlending: boolean;
        /**
         * Gets whether the glow layer is supported
         * @returns true if the glow layer is supported
         */
        get _supportGlowLayer(): boolean;
        /**
         * Specifies if the material will require alpha blending
         * @returns a boolean specifying if alpha blending is needed
         */
        needAlphaBlending(): boolean;
        /**
         * Specifies if this material should be rendered in alpha test mode
         * @returns a boolean specifying if an alpha test is needed.
         */
        needAlphaTesting(): boolean;
        private _processInitializeOnLink;
        private _attachBlock;
        private _initializeBlock;
        private _resetDualBlocks;
        /**
         * Remove a block from the current node material
         * @param block defines the block to remove
         */
        removeBlock(block: NodeMaterialBlock): void;
        /**
         * Build the material and generates the inner effect
         * @param verbose defines if the build should log activity
         * @param updateBuildId defines if the internal build Id should be updated (default is true)
         * @param autoConfigure defines if the autoConfigure method should be called when initializing blocks (default is false)
         */
        build(verbose?: boolean, updateBuildId?: boolean, autoConfigure?: boolean): void;
        private _finishBuildProcess;
        /**
         * Runs an optimization phase to try to improve the shader code
         */
        optimize(): void;
        private _prepareDefinesForAttributes;
        /**
         * Can this material render to prepass
         */
        get isPrePassCapable(): boolean;
        /**
         * Outputs written to the prepass
         */
        get prePassTextureOutputs(): number[];
        /**
         * Gets the list of prepass texture required
         */
        get prePassTextureInputs(): number[];
        /**
         * Sets the required values to the prepass renderer.
         * @param prePassRenderer defines the prepass renderer to set
         * @returns true if the pre pass is needed
         */
        setPrePassRenderer(prePassRenderer: PrePassRenderer): boolean;
        /**
         * Create a post process from the material
         * @param camera The camera to apply the render pass to.
         * @param options The required width/height ratio to downsize to before computing the render pass. (Use 1.0 for full size)
         * @param samplingMode The sampling mode to be used when computing the pass. (default: 0)
         * @param engine The engine which the post process will be applied. (default: current engine)
         * @param reusable If the post process can be reused on the same frame. (default: false)
         * @param textureType Type of textures used when performing the post process. (default: 0)
         * @param textureFormat Format of textures used when performing the post process. (default: TEXTUREFORMAT_RGBA)
         * @returns the post process created
         */
        createPostProcess(camera: Nullable<Camera>, options?: number | PostProcessOptions, samplingMode?: number, engine?: AbstractEngine, reusable?: boolean, textureType?: number, textureFormat?: number): Nullable<PostProcess>;
        /**
         * Create the post process effect from the material
         * @param postProcess The post process to create the effect for
         */
        createEffectForPostProcess(postProcess: PostProcess): void;
        private _createEffectForPostProcess;
        /**
         * Create a new procedural texture based on this node material
         * @param size defines the size of the texture
         * @param scene defines the hosting scene
         * @returns the new procedural texture attached to this node material
         */
        createProceduralTexture(size: number | {
            width: number;
            height: number;
            layers?: number;
        }, scene: Scene): Nullable<ProceduralTexture>;
        private _createEffectForParticles;
        private _checkInternals;
        /**
         * Create the effect to be used as the custom effect for a particle system
         * @param particleSystem Particle system to create the effect for
         * @param onCompiled defines a function to call when the effect creation is successful
         * @param onError defines a function to call when the effect creation has failed
         */
        createEffectForParticles(particleSystem: IParticleSystem, onCompiled?: (effect: Effect) => void, onError?: (effect: Effect, errors: string) => void): void;
        /**
         * Use this material as the shadow depth wrapper of a target material
         * @param targetMaterial defines the target material
         */
        createAsShadowDepthWrapper(targetMaterial: Material): void;
        private _processDefines;
        /**
         * Get if the submesh is ready to be used and all its information available.
         * Child classes can use it to update shaders
         * @param mesh defines the mesh to check
         * @param subMesh defines which submesh to check
         * @param useInstances specifies that instances should be used
         * @returns a boolean indicating that the submesh is ready or not
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Get a string representing the shaders built by the current node graph
         */
        get compiledShaders(): string;
        /**
         * Get a string representing the fragment shader used by the engine for the current node graph
         * @internal
         */
        _getProcessedFragmentAsync(): Promise<string>;
        /**
         * Binds the world matrix to the material
         * @param world defines the world transformation matrix
         */
        bindOnlyWorldMatrix(world: Matrix): void;
        /**
         * Binds the submesh to this material by preparing the effect and shader to draw
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh containing the submesh
         * @param subMesh defines the submesh to bind the material to
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Gets the active textures from the material
         * @returns an array of textures
         */
        getActiveTextures(): BaseTexture[];
        /**
         * Gets the list of texture blocks
         * Note that this method will only return blocks that are reachable from the final block(s) and only after the material has been built!
         * @returns an array of texture blocks
         */
        getTextureBlocks(): NodeMaterialTextureBlocks[];
        /**
         * Gets the list of all texture blocks
         * Note that this method will scan all attachedBlocks and return blocks that are texture blocks
         * @returns
         */
        getAllTextureBlocks(): NodeMaterialTextureBlocks[];
        /**
         * Specifies if the material uses a texture
         * @param texture defines the texture to check against the material
         * @returns a boolean specifying if the material uses the texture
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Disposes the material
         * @param forceDisposeEffect specifies if effects should be forcefully disposed
         * @param forceDisposeTextures specifies if textures should be forcefully disposed
         * @param notBoundToMesh specifies if the material that is being disposed is known to be not bound to any mesh
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean, notBoundToMesh?: boolean): void;
        /** Creates the node editor window.
         * @param additionalConfig Define the configuration of the editor
         */
        private _createNodeEditor;
        /**
         * Launch the node material editor
         * @param config Define the configuration of the editor
         * @returns a promise fulfilled when the node editor is visible
         */
        edit(config?: INodeMaterialEditorOptions): Promise<void>;
        /**
         * Clear the current material
         */
        clear(): void;
        /**
         * Clear the current material and set it to a default state
         */
        setToDefault(): void;
        /**
         * Clear the current material and set it to a default state for post process
         */
        setToDefaultPostProcess(): void;
        /**
         * Clear the current material and set it to a default state for procedural texture
         */
        setToDefaultProceduralTexture(): void;
        /**
         * Clear the current material and set it to a default state for particle
         */
        setToDefaultParticle(): void;
        /**
         * Loads the current Node Material from a url pointing to a file save by the Node Material Editor
         * @deprecated Please use NodeMaterial.ParseFromFileAsync instead
         * @param url defines the url to load from
         * @param rootUrl defines the root URL for nested url in the node material
         * @returns a promise that will fulfil when the material is fully loaded
         */
        loadAsync(url: string, rootUrl?: string): Promise<NodeMaterial>;
        private _gatherBlocks;
        /**
         * Generate a string containing the code declaration required to create an equivalent of this material
         * @returns a string
         */
        generateCode(): string;
        /**
         * Serializes this material in a JSON representation
         * @param selectedBlocks defines an optional list of blocks to serialize
         * @returns the serialized material object
         */
        serialize(selectedBlocks?: NodeMaterialBlock[]): any;
        private _restoreConnections;
        /**
         * Clear the current graph and load a new one from a serialization object
         * @param source defines the JSON representation of the material
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @param merge defines whether or not the source must be merged or replace the current content
         * @param urlRewriter defines a function used to rewrite urls
         */
        parseSerializedObject(source: any, rootUrl?: string, merge?: boolean, urlRewriter?: (url: string) => string): void;
        /**
         * Clear the current graph and load a new one from a serialization object
         * @param source defines the JSON representation of the material
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @param merge defines whether or not the source must be merged or replace the current content
         * @deprecated Please use the parseSerializedObject method instead
         */
        loadFromSerialization(source: any, rootUrl?: string, merge?: boolean): void;
        /**
         * Makes a duplicate of the current material.
         * @param name defines the name to use for the new material
         * @param shareEffect defines if the clone material should share the same effect (default is false)
         * @returns the cloned material
         */
        clone(name: string, shareEffect?: boolean): NodeMaterial;
        /**
         * Awaits for all the material textures to be ready before resolving the returned promise.
         * @returns A promise that resolves when the textures are ready.
         */
        whenTexturesReadyAsync(): Promise<void[]>;
    }
    /**
     * Checks if a block is a texture block
     * @param block The block to check
     * @returns True if the block is a texture block
     */
    export function NodeMaterialBlockIsTextureBlock(block: NodeMaterialBlock): block is NodeMaterialTextureBlocks;
    /**
     * Creates a node material from parsed material data
     * @param source defines the JSON representation of the material
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @param shaderLanguage defines the language to use (GLSL by default)
     * @returns a new node material
     */
    export function NodeMaterialParse(source: any, scene: Scene, rootUrl?: string, shaderLanguage?: ShaderLanguage): NodeMaterial;
    /**
     * Creates a node material from a snippet saved in a remote file
     * @param name defines the name of the material to create
     * @param url defines the url to load from
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL for nested url in the node material
     * @param skipBuild defines whether to build the node material
     * @param targetMaterial defines a material to use instead of creating a new one
     * @param urlRewriter defines a function used to rewrite urls
     * @param options defines options to be used with the node material
     * @returns a promise that will resolve to the new node material
     */
    export function NodeMaterialParseFromFileAsync(name: string, url: string, scene: Scene, rootUrl?: string, skipBuild?: boolean, targetMaterial?: NodeMaterial, urlRewriter?: (url: string) => string, options?: Partial<INodeMaterialOptions>): Promise<NodeMaterial>;
    /**
     * Creates a node material from a snippet saved by the node material editor
     * @param snippetId defines the snippet to load
     * @param scene defines the hosting scene
     * @param rootUrl defines the root URL to use to load textures and relative dependencies
     * @param nodeMaterial defines a node material to update (instead of creating a new one)
     * @param skipBuild defines whether to build the node material
     * @param waitForTextureReadyness defines whether to wait for texture readiness resolving the promise (default: false)
     * @param urlRewriter defines a function used to rewrite urls
     * @param options defines options to be used with the node material
     * @returns a promise that will resolve to the new node material
     */
    export function NodeMaterialParseFromSnippetAsync(this: typeof NodeMaterial | void, snippetId: string, scene?: Scene, rootUrl?: string, nodeMaterial?: NodeMaterial, skipBuild?: boolean, waitForTextureReadyness?: boolean, urlRewriter?: (url: string) => string, options?: Partial<INodeMaterialOptions>): Promise<NodeMaterial>;
    /**
     * Creates a new node material set to default basic configuration
     * @param name defines the name of the material
     * @param scene defines the hosting scene
     * @returns a new NodeMaterial
     */
    export function NodeMaterialCreateDefault(name: string, scene?: Scene): NodeMaterial;
    /**
     * Register side effects for nodeMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNodeMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import nodeMaterial.pure for tree-shakeable, side-effect-free usage.
     */




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Root class for all node material optimizers
     */
    export class NodeMaterialOptimizer {
        /**
         * Function used to optimize a NodeMaterial graph
         * @param _vertexOutputNodes defines the list of output nodes for the vertex shader
         * @param _fragmentOutputNodes defines the list of output nodes for the fragment shader
         */
        optimize(_vertexOutputNodes: NodeMaterialBlock[], _fragmentOutputNodes: NodeMaterialBlock[]): void;
    }




    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Enum used to define system values e.g. values automatically provided by the system
     */
    export enum NodeMaterialSystemValues {
        /** World */
        World = 1,
        /** View */
        View = 2,
        /** Projection */
        Projection = 3,
        /** ViewProjection */
        ViewProjection = 4,
        /** WorldView */
        WorldView = 5,
        /** WorldViewProjection */
        WorldViewProjection = 6,
        /** CameraPosition */
        CameraPosition = 7,
        /** Fog Color */
        FogColor = 8,
        /** Delta time */
        DeltaTime = 9,
        /** Camera parameters */
        CameraParameters = 10,
        /** Material alpha */
        MaterialAlpha = 11,
        /** Projection */
        ProjectionInverse = 12,
        /** CameraForward */
        CameraForward = 13
    }


    /**
     * Enum used to define the material modes
     */
    export enum NodeMaterialModes {
        /** Regular material */
        Material = 0,
        /** For post process */
        PostProcess = 1,
        /** For particle system */
        Particle = 2,
        /** For procedural texture */
        ProceduralTexture = 3,
        /** For gaussian splatting */
        GaussianSplatting = 4,
        /** For SFE */
        SFE = 5
    }


    /**
     * Enum used to define the target of a block
     */
    export enum NodeMaterialBlockTargets {
        /** Vertex shader */
        Vertex = 1,
        /** Fragment shader */
        Fragment = 2,
        /** Neutral */
        Neutral = 4,
        /** Vertex and Fragment */
        VertexAndFragment = 3
    }


    /**
     * Defines the kind of connection point for node based material
     */
    export enum NodeMaterialBlockConnectionPointTypes {
        /** Float */
        Float = 1,
        /** Int */
        Int = 2,
        /** Vector2 */
        Vector2 = 4,
        /** Vector3 */
        Vector3 = 8,
        /** Vector4 */
        Vector4 = 16,
        /** Color3 */
        Color3 = 32,
        /** Color4 */
        Color4 = 64,
        /** Matrix */
        Matrix = 128,
        /** Custom object */
        Object = 256,
        /** Detect type based on connection */
        AutoDetect = 1024,
        /** Output type that will be defined by input type */
        BasedOnInput = 2048,
        /** Bitmask of all types */
        All = 4095
    }


    /**
     * Enum defining the mode of a NodeMaterialBlockConnectionPoint
     */
    export enum NodeMaterialBlockConnectionPointMode {
        /** Value is an uniform */
        Uniform = 0,
        /** Value is a mesh attribute */
        Attribute = 1,
        /** Value is a varying between vertex and fragment shaders */
        Varying = 2,
        /** Mode is undefined */
        Undefined = 3
    }




    /** This file must only contain pure code and pure imports */
    /**
     * block used to Generate a Worley Noise 3D Noise Pattern
     */
    /** Block used to generate Worley Noise 3D */
    export class WorleyNoise3DBlock extends NodeMaterialBlock {
        /** Gets or sets a boolean indicating that normal should be inverted on X axis */
        manhattanDistance: boolean;
        /**
         * Creates a new WorleyNoise3DBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the seed input component
         */
        get seed(): NodeMaterialConnectionPoint;
        /**
         * Gets the jitter input component
         */
        get jitter(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the x component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y component
         */
        get y(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Exposes the properties to the UI?
         * @returns - boolean indicating if the block has properties or not
         */
        protected _dumpPropertiesCode(): string;
        /**
         * Exposes the properties to the Serialize?
         * @returns - a serialized object
         */
        serialize(): any;
        /**
         * Exposes the properties to the deserialize?
         * @param serializationObject
         * @param scene
         * @param rootUrl
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for worleyNoise3DBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWorleyNoise3DBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import worleyNoise3DBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Wave block
     */
    export enum WaveBlockKind {
        /** SawTooth */
        SawTooth = 0,
        /** Square */
        Square = 1,
        /** Triangle */
        Triangle = 2
    }
    /**
     * Block used to apply wave operation to floats
     */
    export class WaveBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the kibnd of wave to be applied by the block
         */
        kind: WaveBlockKind;
        /**
         * Creates a new WaveBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for waveBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterWaveBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import waveBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * block used to Generate a Voronoi Noise Pattern
     */
    export class VoronoiNoiseBlock extends NodeMaterialBlock {
        /**
         * Creates a new VoronoiNoiseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the seed input component
         */
        get seed(): NodeMaterialConnectionPoint;
        /**
         * Gets the offset input component
         */
        get offset(): NodeMaterialConnectionPoint;
        /**
         * Gets the density input component
         */
        get density(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get cells(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for voronoiNoiseBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVoronoiNoiseBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import voronoiNoiseBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the view direction
     */
    export class ViewDirectionBlock extends NodeMaterialBlock {
        /**
         * Creates a new ViewDirectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera position component
         */
        get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for viewDirectionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterViewDirectionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import viewDirectionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to expand a Vector3/4 into 4 outputs (one for each component)
     */
    export class VectorSplitterBlock extends NodeMaterialBlock {
        /**
         * Create a new VectorSplitterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the xyzw component (input)
         */
        get xyzw(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component (input)
         */
        get xyzIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the xy component (input)
         */
        get xyIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component (output)
         */
        get xyzOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the xy component (output)
         */
        get xyOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the zw component (output)
         */
        get zw(): NodeMaterialConnectionPoint;
        /**
         * Gets the x component (output)
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y component (output)
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Gets the z component (output)
         */
        get z(): NodeMaterialConnectionPoint;
        /**
         * Gets the w component (output)
         */
        get w(): NodeMaterialConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for vectorSplitterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVectorSplitterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import vectorSplitterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to create a Vector2/3/4 out of individual inputs (one for each component)
     */
    export class VectorMergerBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the swizzle for x (meaning which component to affect to the output.x)
         */
        xSwizzle: "x" | "y" | "z" | "w";
        /**
         * Gets or sets the swizzle for y (meaning which component to affect to the output.y)
         */
        ySwizzle: "x" | "y" | "z" | "w";
        /**
         * Gets or sets the swizzle for z (meaning which component to affect to the output.z)
         */
        zSwizzle: "x" | "y" | "z" | "w";
        /**
         * Gets or sets the swizzle for w (meaning which component to affect to the output.w)
         */
        wSwizzle: "x" | "y" | "z" | "w";
        /**
         * Create a new VectorMergerBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the xyzw component (input)
         */
        get xyzwIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component (input)
         */
        get xyzIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the xy component (input)
         */
        get xyIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the zw component (input)
         */
        get zwIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the x component (input)
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y component (input)
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Gets the z component (input)
         */
        get z(): NodeMaterialConnectionPoint;
        /**
         * Gets the w component (input)
         */
        get w(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyzw component (output)
         */
        get xyzw(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component (output)
         */
        get xyzOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the xy component (output)
         */
        get xyOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the zw component (output)
         */
        get zwOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the xy component (output)
         * @deprecated Please use xyOut instead.
         */
        get xy(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component (output)
         * @deprecated Please use xyzOut instead.
         */
        get xyz(): NodeMaterialConnectionPoint;
        protected _inputRename(name: string): string;
        private _buildSwizzle;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for vectorMergerBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVectorMergerBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import vectorMergerBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the Trigonometry block
     */
    export enum TrigonometryBlockOperations {
        /** Cos */
        Cos = 0,
        /** Sin */
        Sin = 1,
        /** Abs */
        Abs = 2,
        /** Exp */
        Exp = 3,
        /** Exp2 */
        Exp2 = 4,
        /** Round */
        Round = 5,
        /** Floor */
        Floor = 6,
        /** Ceiling */
        Ceiling = 7,
        /** Square root */
        Sqrt = 8,
        /** Log */
        Log = 9,
        /** Tangent */
        Tan = 10,
        /** Arc tangent */
        ArcTan = 11,
        /** Arc cosinus */
        ArcCos = 12,
        /** Arc sinus */
        ArcSin = 13,
        /** Fraction */
        Fract = 14,
        /** Sign */
        Sign = 15,
        /** To radians (from degrees) */
        Radians = 16,
        /** To degrees (from radians) */
        Degrees = 17,
        /** To Set a = b */
        Set = 18
    }
    /**
     * Block used to apply trigonometry operation to floats
     */
    export class TrigonometryBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the operation applied by the block
         */
        operation: TrigonometryBlockOperations;
        /**
         * Creates a new TrigonometryBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for trigonometryBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTrigonometryBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import trigonometryBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read a texture with triplanar mapping (see "boxmap" in https://iquilezles.org/articles/biplanar/)
     */
    export class TriPlanarBlock extends NodeMaterialBlock {
        private _linearDefineName;
        private _gammaDefineName;
        protected _tempTextureRead: string;
        private _samplerName;
        private _textureInfoName;
        private _textureInfoName2;
        private _imageSource;
        /**
         * Project the texture(s) for a better fit to a cube
         */
        projectAsCube: boolean;
        protected _texture: Nullable<Texture>;
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<Texture>;
        set texture(texture: Nullable<Texture>);
        /**
         * Gets the textureY associated with the node
         */
        get textureY(): Nullable<Texture>;
        /**
         * Gets the textureZ associated with the node
         */
        get textureZ(): Nullable<Texture>;
        protected _getImageSourceBlock(connectionPoint: Nullable<NodeMaterialConnectionPoint>): Nullable<ImageSourceBlock>;
        /**
         * Gets the sampler name associated with this texture
         */
        get samplerName(): string;
        /**
         * Gets the samplerY name associated with this texture
         */
        get samplerYName(): Nullable<string>;
        /**
         * Gets the samplerZ name associated with this texture
         */
        get samplerZName(): Nullable<string>;
        /**
         * Gets a boolean indicating that this block is linked to an ImageSourceBlock
         */
        get hasImageSource(): boolean;
        private _convertToGammaSpace;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to gamma space
         */
        set convertToGammaSpace(value: boolean);
        get convertToGammaSpace(): boolean;
        private _convertToLinearSpace;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to linear space
         */
        set convertToLinearSpace(value: boolean);
        get convertToLinearSpace(): boolean;
        /**
         * Gets or sets a boolean indicating if multiplication of texture with level should be disabled
         */
        disableLevelMultiplication: boolean;
        /**
         * Create a new TriPlanarBlock
         * @param name defines the block name
         * @param hideSourceZ defines a boolean indicating that normal Z should not be used (false by default)
         */
        constructor(name: string, hideSourceZ?: boolean);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the position input component
         */
        get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal input component
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the sharpness input component
         */
        get sharpness(): NodeMaterialConnectionPoint;
        /**
         * Gets the source input component
         */
        get source(): NodeMaterialConnectionPoint;
        /**
         * Gets the sourceY input component
         */
        get sourceY(): NodeMaterialConnectionPoint;
        /**
         * Gets the sourceZ input component
         */
        get sourceZ(): Nullable<NodeMaterialConnectionPoint>;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the r output component
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g output component
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b output component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a output component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Gets the level output component
         */
        get level(): NodeMaterialConnectionPoint;
        /**
         * Prepares the defines for the block
         * @param defines - the defines to prepare
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if the block is ready
         */
        isReady(): boolean;
        /**
         * Bind the block
         * @param effect - the effect to bind
         */
        bind(effect: Effect): void;
        private _samplerFunc;
        private _generateTextureSample;
        protected _generateTextureLookup(state: NodeMaterialBuildState): void;
        private _generateConversionCode;
        private _writeOutput;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for triPlanarBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTriPlanarBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import triPlanarBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to transform a vector (2, 3 or 4) with a matrix. It will generate a Vector4
     */
    export class TransformBlock extends NodeMaterialBlock {
        /**
         * Defines the value to use to complement W value to transform it to a Vector4
         */
        complementW: number;
        /**
         * Defines the value to use to complement z value to transform it to a Vector4
         */
        complementZ: number;
        /**
         * Boolean indicating if the transformation is made for a direction vector and not a position vector
         * If set to true the complementW value will be set to 0 else it will be set to 1
         */
        get transformAsDirection(): boolean;
        set transformAsDirection(value: boolean);
        /**
         * Creates a new TransformBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the vector input
         */
        get vector(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz output component
         */
        get xyz(): NodeMaterialConnectionPoint;
        /**
         * Gets the matrix transform input
         */
        get transform(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Update defines for shader compilation
         * @param defines defines the material defines to update
         * @param nodeMaterial defines the node material requesting the update
         * @param mesh defines the mesh to be rendered
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for transformBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTransformBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import transformBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to subtract 2 vectors
     */
    export class SubtractBlock extends BaseMathBlock {
        /**
         * Creates a new SubtractBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for subtractBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSubtractBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import subtractBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to write to a variable within a loop
     */
    export class StorageWriteBlock extends NodeMaterialBlock {
        /**
         * Creates a new StorageWriteBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the loop link component
         */
        get loopID(): NodeMaterialConnectionPoint;
        /**
         * Gets the value component
         */
        get value(): NodeMaterialConnectionPoint;
        /** Gets a boolean indicating that this connection will be used in the fragment shader
         * @returns true if connected in fragment shader
         */
        isConnectedInFragmentShader(): boolean;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for storageWriteBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStorageWriteBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import storageWriteBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read from a variable within a loop
     */
    export class StorageReadBlock extends NodeMaterialBlock {
        /**
         * Creates a new StorageReadBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the loop link component
         */
        get loopID(): NodeMaterialConnectionPoint;
        /**
         * Gets the value component
         */
        get value(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for storageReadBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStorageReadBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import storageReadBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to step a value
     */
    export class StepBlock extends NodeMaterialBlock {
        /**
         * Creates a new StepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the edge operand input component
         */
        get edge(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for stepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import stepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to smooth step a value
     */
    export class SmoothStepBlock extends NodeMaterialBlock {
        /**
         * Creates a new SmoothStepBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the first edge operand input component
         */
        get edge0(): NodeMaterialConnectionPoint;
        /**
         * Gets the second edge operand input component
         */
        get edge1(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for smoothStepBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSmoothStepBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import smoothStepBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * block used to Generate a Simplex Perlin 3d Noise Pattern
     */
    export class SimplexPerlin3DBlock extends NodeMaterialBlock {
        /**
         * Creates a new SimplexPerlin3DBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the seed operand input component
         */
        get seed(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for simplexPerlin3DBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSimplexPerlin3DBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import simplexPerlin3DBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to scale a vector by a float
     */
    export class ScaleBlock extends NodeMaterialBlock {
        /**
         * Creates a new ScaleBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the factor input component
         */
        get factor(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for scaleBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScaleBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import scaleBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to rotate a 2d vector by a given angle
     */
    export class Rotate2dBlock extends NodeMaterialBlock {
        /**
         * Creates a new Rotate2dBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input vector
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the input angle
         */
        get angle(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /** Auto configure the block based on the material */
        autoConfigure(): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for rotate2dBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRotate2dBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import rotate2dBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to replace a color by another one
     */
    export class ReplaceColorBlock extends NodeMaterialBlock {
        /**
         * Creates a new ReplaceColorBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the reference input component
         */
        get reference(): NodeMaterialConnectionPoint;
        /**
         * Gets the distance input component
         */
        get distance(): NodeMaterialConnectionPoint;
        /**
         * Gets the replacement input component
         */
        get replacement(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for replaceColorBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReplaceColorBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import replaceColorBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to remap a float from a range to a new one
     */
    export class RemapBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the source range
         */
        sourceRange: Vector2;
        /**
         * Gets or sets the target range
         */
        targetRange: Vector2;
        /**
         * Creates a new RemapBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the source min input component
         */
        get sourceMin(): NodeMaterialConnectionPoint;
        /**
         * Gets the source max input component
         */
        get sourceMax(): NodeMaterialConnectionPoint;
        /**
         * Gets the target min input component
         */
        get targetMin(): NodeMaterialConnectionPoint;
        /**
         * Gets the target max input component
         */
        get targetMax(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for remapBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRemapBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import remapBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the refracted vector from a direction and a normal
     */
    export class RefractBlock extends NodeMaterialBlock {
        /**
         * Creates a new RefractBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the incident component
         */
        get incident(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal component
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the index of refraction component
         */
        get ior(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for refractBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRefractBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import refractBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the reflected vector from a direction and a normal
     */
    export class ReflectBlock extends NodeMaterialBlock {
        /**
         * Creates a new ReflectBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the incident component
         */
        get incident(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal component
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for reflectBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the reciprocal (1 / x) of a value
     */
    export class ReciprocalBlock extends NodeMaterialBlock {
        /**
         * Creates a new ReciprocalBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for reciprocalBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReciprocalBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reciprocalBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get a random number
     */
    export class RandomNumberBlock extends NodeMaterialBlock {
        /**
         * Creates a new RandomNumberBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the seed input component
         */
        get seed(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for randomNumberBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRandomNumberBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import randomNumberBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the value of the first parameter raised to the power of the second
     */
    export class PowBlock extends NodeMaterialBlock {
        /**
         * Creates a new PowBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value operand input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the power operand input component
         */
        get power(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for powBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import powBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to posterize a value
     * @see https://en.wikipedia.org/wiki/Posterization
     */
    export class PosterizeBlock extends NodeMaterialBlock {
        /**
         * Creates a new PosterizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the steps input component
         */
        get steps(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for posterizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPosterizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import posterizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to pan UV coordinates over time (similar to Unreal's Panner node).
     * This block takes UV coordinates, speed values for X and Y axes, and a time input,
     * then outputs animated UV coordinates that scroll based on the speed and time.
     */
    export class PannerBlock extends NodeMaterialBlock {
        /**
         * Creates a new PannerBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the speed input component
         */
        get speed(): NodeMaterialConnectionPoint;
        /**
         * Gets the time input component
         */
        get time(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for pannerBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPannerBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pannerBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the opposite (1 - x) of a value
     */
    export class OneMinusBlock extends NodeMaterialBlock {
        /**
         * Creates a new OneMinusBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for oneMinusBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterOneMinusBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import oneMinusBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to normalize a vector
     */
    export class NormalizeBlock extends NodeMaterialBlock {
        /**
         * Creates a new NormalizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for normalizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNormalizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import normalizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to blend normals
     */
    export class NormalBlendBlock extends NodeMaterialBlock {
        /**
         * Creates a new NormalBlendBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the first input component
         */
        get normalMap0(): NodeMaterialConnectionPoint;
        /**
         * Gets the second input component
         */
        get normalMap1(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for normalBlendBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNormalBlendBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import normalBlendBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get negative version of a value (i.e. x * -1)
     */
    export class NegateBlock extends NodeMaterialBlock {
        /**
         * Creates a new NegateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for negateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNegateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import negateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to normalize lerp between 2 values
     */
    export class NLerpBlock extends NodeMaterialBlock {
        /**
         * Creates a new NLerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for nLerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterNLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import nLerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to multiply 2 values
     */
    export class MultiplyBlock extends BaseMathBlock {
        /**
         * Creates a new MultiplyBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for multiplyBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMultiplyBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import multiplyBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute value of one parameter modulo another
     */
    export class ModBlock extends NodeMaterialBlock {
        /**
         * Creates a new ModBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for modBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterModBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import modBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the min of 2 values
     */
    export class MinBlock extends NodeMaterialBlock {
        /**
         * Creates a new MinBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for minBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMinBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import minBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export enum MeshAttributeExistsBlockTypes {
        None = 0,
        Normal = 1,
        Tangent = 2,
        VertexColor = 3,
        UV1 = 4,
        UV2 = 5,
        UV3 = 6,
        UV4 = 7,
        UV5 = 8,
        UV6 = 9
    }
    /**
     * Block used to check if Mesh attribute of specified type exists
     * and provide an alternative fallback input for to use in such case
     */
    export class MeshAttributeExistsBlock extends NodeMaterialBlock {
        /**
         * Creates a new MeshAttributeExistsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Defines which mesh attribute to use
         */
        attributeType: MeshAttributeExistsBlockTypes;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the fallback component when speciefied attribute doesn't exist
         */
        get fallback(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block from a serialization object
         * @param serializationObject - the object to deserialize from
         * @param scene - the current scene
         * @param rootUrl - the root URL for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for meshAttributeExistsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMeshAttributeExistsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import meshAttributeExistsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the max of 2 values
     */
    export class MaxBlock extends NodeMaterialBlock {
        /**
         * Creates a new MaxBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for maxBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaxBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import maxBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to transpose a matrix
     */
    export class MatrixTransposeBlock extends NodeMaterialBlock {
        /**
         * Creates a new MatrixTransposeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input matrix
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for matrixTransposeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMatrixTransposeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import matrixTransposeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to split a matrix into Vector4
     */
    export class MatrixSplitterBlock extends NodeMaterialBlock {
        /**
         * Creates a new MatrixSplitterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the row0 output vector
         */
        get row0(): NodeMaterialConnectionPoint;
        /**
         * Gets the row1 output vector
         */
        get row1(): NodeMaterialConnectionPoint;
        /**
         * Gets the row2 output vector
         */
        get row2(): NodeMaterialConnectionPoint;
        /**
         * Gets the row3 output vector
         */
        get row3(): NodeMaterialConnectionPoint;
        /**
         * Gets the col0 output vector
         */
        get col0(): NodeMaterialConnectionPoint;
        /**
         * Gets the col1 output vector
         */
        get col1(): NodeMaterialConnectionPoint;
        /**
         * Gets the col2 output vector
         */
        get col2(): NodeMaterialConnectionPoint;
        /**
         * Gets the col3 output vector
         */
        get col3(): NodeMaterialConnectionPoint;
        private _exportColumn;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for matrixSplitterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMatrixSplitterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import matrixSplitterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute the determinant of a matrix
     */
    export class MatrixDeterminantBlock extends NodeMaterialBlock {
        /**
         * Creates a new MatrixDeterminantBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input matrix
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for matrixDeterminantBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMatrixDeterminantBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import matrixDeterminantBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to build a matrix from 4 Vector4
     */
    export class MatrixBuilderBlock extends NodeMaterialBlock {
        /**
         * Creates a new MatrixBuilder
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the row0 vector
         */
        get row0(): NodeMaterialConnectionPoint;
        /**
         * Gets the row1 vector
         */
        get row1(): NodeMaterialConnectionPoint;
        /**
         * Gets the row2 vector
         */
        get row2(): NodeMaterialConnectionPoint;
        /**
         * Gets the row3 vector
         */
        get row3(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /** Auto configure the block based on the material */
        autoConfigure(): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for matrixBuilderBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMatrixBuilderBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import matrixBuilderBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to repeat code
     */
    export class LoopBlock extends NodeMaterialBlock {
        /**
         * Gets or sets number of iterations
         * Will be ignored if the iterations input is connected
         */
        iterations: number;
        /**
         * Creates a new LoopBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the main input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the iterations input component
         */
        get iterationsInput(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the index component which will be incremented at each iteration
         */
        get index(): NodeMaterialConnectionPoint;
        /**
         * Gets the loop ID component
         */
        get loopID(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _postBuildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for loopBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLoopBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import loopBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to lerp between 2 values
     */
    export class LerpBlock extends NodeMaterialBlock {
        /**
         * Creates a new LerpBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the gradient operand input component
         */
        get gradient(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for lerpBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLerpBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lerpBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the length of a vector
     */
    export class LengthBlock extends NodeMaterialBlock {
        /**
         * Creates a new LengthBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for lengthBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLengthBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lengthBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Class used to store a color step for the GradientBlock
     */
    export class GradientBlockColorStep {
        private _step;
        /**
         * Gets value indicating which step this color is associated with (between 0 and 1)
         */
        get step(): number;
        /**
         * Sets a value indicating which step this color is associated with (between 0 and 1)
         */
        set step(val: number);
        private _color;
        /**
         * Gets the color associated with this step
         */
        get color(): Color3;
        /**
         * Sets the color associated with this step
         */
        set color(val: Color3);
        /**
         * Creates a new GradientBlockColorStep
         * @param step defines a value indicating which step this color is associated with (between 0 and 1)
         * @param color defines the color associated with this step
         */
        constructor(step: number, color: Color3);
    }
    /**
     * Block used to return a color from a gradient based on an input value between 0 and 1
     */
    export class GradientBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the list of color steps
         */
        colorSteps: GradientBlockColorStep[];
        /** Gets an observable raised when the value is changed */
        onValueChangedObservable: Observable<GradientBlock>;
        /** calls observable when the value is changed*/
        colorStepsUpdated(): void;
        /**
         * Creates a new GradientBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the gradient input component
         */
        get gradient(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        private _writeColorConstant;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for gradientBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGradientBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gradientBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute fresnel value
     */
    export class FresnelBlock extends NodeMaterialBlock {
        /**
         * Create a new FresnelBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the view direction input component
         */
        get viewDirection(): NodeMaterialConnectionPoint;
        /**
         * Gets the bias input component
         */
        get bias(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera (or eye) position component
         */
        get power(): NodeMaterialConnectionPoint;
        /**
         * Gets the fresnel output component
         */
        get fresnel(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         */
        autoConfigure(material: NodeMaterial): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for fresnelBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFresnelBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fresnelBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as a pass through
     */
    export class ElbowBlock extends NodeMaterialBlock {
        /**
         * Creates a new ElbowBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets or sets the target of the block
         */
        get target(): NodeMaterialBlockTargets;
        set target(value: NodeMaterialBlockTargets);
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for materialsNodeBlocksElbowBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialsNodeBlocksElbowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import elbowBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply a dot product between 2 vectors
     */
    export class DotBlock extends NodeMaterialBlock {
        /**
         * Creates a new DotBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for dotBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDotBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import dotBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to divide 2 vectors
     */
    export class DivideBlock extends BaseMathBlock {
        /**
         * Creates a new DivideBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for divideBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDivideBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import divideBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the distance between 2 values
     */
    export class DistanceBlock extends NodeMaterialBlock {
        /**
         * Creates a new DistanceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for distanceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDistanceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import distanceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to desaturate a color
     */
    export class DesaturateBlock extends NodeMaterialBlock {
        /**
         * Creates a new DesaturateBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color operand input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the level operand input component
         */
        get level(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for desaturateBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDesaturateBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import desaturateBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to render intermediate debug values
     * Please note that the node needs to be active to be generated in the shader
     * Only one DebugBlock should be active at a time
     */
    export class NodeMaterialDebugBlock extends NodeMaterialBlock {
        private _isActive;
        /** @internal */
        _forcedActive: boolean;
        /** Gets or sets a boolean indicating if we want to render alpha when using a rgba input*/
        renderAlpha: boolean;
        /**
         * Gets or sets a boolean indicating that the block is active
         */
        get isActive(): boolean;
        set isActive(value: boolean);
        /**
         * Creates a new NodeMaterialDebugBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /** @internal */
        get _isFinalOutputAndActive(): boolean;
        /** @internal */
        get _hasPrecedence(): boolean;
        /**
         * Gets the rgba input component
         */
        get debug(): NodeMaterialConnectionPoint;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for materialsNodeBlocksDebugBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialsNodeBlocksDebugBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import debugBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Custom block created from user-defined json
     */
    export class CustomBlock extends NodeMaterialBlock {
        private _options;
        private _code;
        private _inputSamplers;
        /**
         * Gets or sets the options for this custom block
         */
        get options(): any;
        set options(options: any);
        /**
         * Creates a new CustomBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        private _deserializeOptions;
        private _findInputByName;
    }
    /**
     * Register side effects for customBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCustomBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import customBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Types of curves supported by the Curve block
     */
    export enum CurveBlockTypes {
        /** EaseInSine */
        EaseInSine = 0,
        /** EaseOutSine */
        EaseOutSine = 1,
        /** EaseInOutSine */
        EaseInOutSine = 2,
        /** EaseInQuad */
        EaseInQuad = 3,
        /** EaseOutQuad */
        EaseOutQuad = 4,
        /** EaseInOutQuad */
        EaseInOutQuad = 5,
        /** EaseInCubic */
        EaseInCubic = 6,
        /** EaseOutCubic */
        EaseOutCubic = 7,
        /** EaseInOutCubic */
        EaseInOutCubic = 8,
        /** EaseInQuart */
        EaseInQuart = 9,
        /** EaseOutQuart */
        EaseOutQuart = 10,
        /** EaseInOutQuart */
        EaseInOutQuart = 11,
        /** EaseInQuint */
        EaseInQuint = 12,
        /** EaseOutQuint */
        EaseOutQuint = 13,
        /** EaseInOutQuint */
        EaseInOutQuint = 14,
        /** EaseInExpo */
        EaseInExpo = 15,
        /** EaseOutExpo */
        EaseOutExpo = 16,
        /** EaseInOutExpo */
        EaseInOutExpo = 17,
        /** EaseInCirc */
        EaseInCirc = 18,
        /** EaseOutCirc */
        EaseOutCirc = 19,
        /** EaseInOutCirc */
        EaseInOutCirc = 20,
        /** EaseInBack */
        EaseInBack = 21,
        /** EaseOutBack */
        EaseOutBack = 22,
        /** EaseInOutBack */
        EaseInOutBack = 23,
        /** EaseInElastic */
        EaseInElastic = 24,
        /** EaseOutElastic */
        EaseOutElastic = 25,
        /** EaseInOutElastic */
        EaseInOutElastic = 26
    }
    /**
     * Block used to apply curve operation
     */
    export class CurveBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the type of the curve applied by the block
         */
        type: CurveBlockTypes;
        /**
         * Creates a new CurveBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        private _duplicateEntry;
        private _duplicateEntryDirect;
        private _duplicateVector;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for curveBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCurveBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import curveBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply a cross product between 2 vectors
     */
    export class CrossBlock extends NodeMaterialBlock {
        /**
         * Creates a new CrossBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for crossBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCrossBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import crossBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Operations supported by the ConditionalBlock block
     */
    export enum ConditionalBlockConditions {
        /** Equal */
        Equal = 0,
        /** NotEqual */
        NotEqual = 1,
        /** LessThan */
        LessThan = 2,
        /** GreaterThan */
        GreaterThan = 3,
        /** LessOrEqual */
        LessOrEqual = 4,
        /** GreaterOrEqual */
        GreaterOrEqual = 5,
        /** Logical Exclusive OR */
        Xor = 6,
        /** Logical Or */
        Or = 7,
        /** Logical And */
        And = 8
    }
    /**
     * Block used to apply conditional operation between floats
     * @since 5.0.0
     */
    export class ConditionalBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the condition applied by the block
         */
        condition: ConditionalBlockConditions;
        /**
         * Creates a new ConditionalBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the first operand component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Gets the second operand component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the value to return if condition is true
         */
        get true(): NodeMaterialConnectionPoint;
        /**
         * Gets the value to return if condition is false
         */
        get false(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param nodeMaterial - the node material
         */
        autoConfigure(nodeMaterial: NodeMaterial): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for conditionalBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterConditionalBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import conditionalBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to expand a Color3/4 into 4 outputs (one for each component)
     */
    export class ColorSplitterBlock extends NodeMaterialBlock {
        /**
         * Create a new ColorSplitterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the rgba component (input)
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb component (input)
         */
        get rgbIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb component (output)
         */
        get rgbOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the r component (output)
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g component (output)
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b component (output)
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a component (output)
         */
        get a(): NodeMaterialConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for colorSplitterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorSplitterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorSplitterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to create a Color3/4 out of individual inputs (one for each component)
     */
    export class ColorMergerBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the swizzle for r (meaning which component to affect to the output.r)
         */
        rSwizzle: "r" | "g" | "b" | "a";
        /**
         * Gets or sets the swizzle for g (meaning which component to affect to the output.g)
         */
        gSwizzle: "r" | "g" | "b" | "a";
        /**
         * Gets or sets the swizzle for b (meaning which component to affect to the output.b)
         */
        bSwizzle: "r" | "g" | "b" | "a";
        /**
         * Gets or sets the swizzle for a (meaning which component to affect to the output.a)
         */
        aSwizzle: "r" | "g" | "b" | "a";
        /**
         * Create a new ColorMergerBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the rgb component (input)
         */
        get rgbIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the r component (input)
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g component (input)
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b component (input)
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a component (input)
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba component (output)
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb component (output)
         */
        get rgbOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb component (output)
         * @deprecated Please use rgbOut instead.
         */
        get rgb(): NodeMaterialConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        private _buildSwizzle;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
        protected _dumpPropertiesCode(): string;
    }
    /**
     * Register side effects for colorMergerBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorMergerBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorMergerBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to apply rgb/hsl convertions
     */
    export class ColorConverterBlock extends NodeMaterialBlock {
        /**
         * Create a new ColorConverterBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the rgb value (input)
         */
        get rgbIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the hsl value (input)
         */
        get hslIn(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb value (output)
         */
        get rgbOut(): NodeMaterialConnectionPoint;
        /**
         * Gets the hsl value (output)
         */
        get hslOut(): NodeMaterialConnectionPoint;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for colorConverterBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterColorConverterBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import colorConverterBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * block used to Generate Fractal Brownian Motion Clouds
     */
    export class CloudBlock extends NodeMaterialBlock {
        /** Gets or sets the number of octaves */
        octaves: number;
        /**
         * Creates a new CloudBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the seed input component
         */
        get seed(): NodeMaterialConnectionPoint;
        /**
         * Gets the chaos input component
         */
        get chaos(): NodeMaterialConnectionPoint;
        /**
         * Gets the offset X input component
         */
        get offsetX(): NodeMaterialConnectionPoint;
        /**
         * Gets the offset Y input component
         */
        get offsetY(): NodeMaterialConnectionPoint;
        /**
         * Gets the offset Z input component
         */
        get offsetZ(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for cloudBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCloudBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cloudBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to clamp a float
     */
    export class ClampBlock extends NodeMaterialBlock {
        /** Gets or sets the minimum range */
        minimum: number;
        /** Gets or sets the maximum range */
        maximum: number;
        /**
         * Creates a new ClampBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the value input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for clampBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterClampBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import clampBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read a texture with triplanar mapping (see https://iquilezles.org/articles/biplanar/)
     */
    export class BiPlanarBlock extends TriPlanarBlock {
        /**
         * Create a new BiPlanarBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        private _declareLocalVarAsVec3I;
        private _getTextureGrad;
        protected _generateTextureLookup(state: NodeMaterialBuildState): void;
    }
    /**
     * Register side effects for biPlanarBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBiPlanarBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import biPlanarBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Block used to perform a mathematical operation on 2 values
     */
    export class BaseMathBlock extends NodeMaterialBlock {
        private readonly _connectionObservers;
        protected constructor(name: string);
        /**
         * Gets the left operand input component
         */
        get left(): NodeMaterialConnectionPoint;
        /**
         * Gets the right operand input component
         */
        get right(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        private _updateInputOutputTypes;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to compute arc tangent of 2 values
     */
    export class ArcTan2Block extends NodeMaterialBlock {
        /**
         * Creates a new ArcTan2Block
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the x operand input component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y operand input component
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for arcTan2Block.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterArcTan2Block(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import arcTan2Block.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Registers all vertex shader node material blocks for deserialization.
     * Call this if you only need vertex blocks to be deserializable.
     */
    export function RegisterNodeMaterialVertexBlocks(): void;
    /**
     * Registers all fragment shader node material blocks for deserialization.
     * Call this if you only need fragment blocks to be deserializable.
     */
    export function RegisterNodeMaterialFragmentBlocks(): void;
    /**
     * Registers all dual (vertex + fragment) node material blocks for deserialization.
     * Call this if you only need dual blocks to be deserializable.
     */
    export function RegisterNodeMaterialDualBlocks(): void;
    /**
     * Registers all input node material blocks for deserialization.
     * Call this if you only need input blocks to be deserializable.
     */
    export function RegisterNodeMaterialInputBlocks(): void;
    /**
     * Registers all teleport node material blocks for deserialization.
     * Call this if you only need teleport blocks to be deserializable.
     */
    export function RegisterNodeMaterialTeleportBlocks(): void;
    /**
     * Registers all PBR node material blocks for deserialization.
     * Call this if you only need PBR blocks to be deserializable.
     */
    export function RegisterNodeMaterialPBRBlocks(): void;
    /**
     * Registers all particle node material blocks for deserialization.
     * Call this if you only need particle blocks to be deserializable.
     */
    export function RegisterNodeMaterialParticleBlocks(): void;
    /**
     * Registers all Gaussian splatting node material blocks for deserialization.
     * Call this if you only need Gaussian splatting blocks to be deserializable.
     */
    export function RegisterNodeMaterialGaussianSplattingBlocks(): void;
    /**
     * Registers all root-level (math/utility) node material blocks for deserialization.
     * Call this if you only need math and utility blocks to be deserializable.
     */
    export function RegisterNodeMaterialMathBlocks(): void;
    /**
     * Registers all node material blocks for deserialization.
     * Call this function when you need to deserialize node materials from JSON/snippets
     * and cannot know at build time which blocks will be used.
     *
     * This is the tree-shakeable replacement for:
     * ```ts
     * import "@babylonjs/core/Materials/Node/Blocks/index";
     * ```
     *
     * For granular control, use per-category functions instead:
     * - {@link RegisterNodeMaterialVertexBlocks}
     * - {@link RegisterNodeMaterialFragmentBlocks}
     * - {@link RegisterNodeMaterialDualBlocks}
     * - {@link RegisterNodeMaterialInputBlocks}
     * - {@link RegisterNodeMaterialTeleportBlocks}
     * - {@link RegisterNodeMaterialPBRBlocks}
     * - {@link RegisterNodeMaterialParticleBlocks}
     * - {@link RegisterNodeMaterialGaussianSplattingBlocks}
     * - {@link RegisterNodeMaterialMathBlocks}
     */
    export function RegisterAllNodeMaterialBlocks(): void;




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add 2 vectors
     */
    export class AddBlock extends BaseMathBlock {
        /**
         * Creates a new AddBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for addBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAddBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import addBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to output the vertex position
     */
    export class VertexOutputBlock extends NodeMaterialBlock {
        /**
         * Creates a new VertexOutputBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the vector input component
         */
        get vector(): NodeMaterialConnectionPoint;
        private _isLogarithmicDepthEnabled;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for vertexOutputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterVertexOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import vertexOutputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add morph targets support to vertex shader
     */
    export class MorphTargetsBlock extends NodeMaterialBlock {
        private _repeatableContentAnchor;
        /**
         * Create a new MorphTargetsBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the position input component
         */
        get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal input component
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the tangent input component
         */
        get tangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv2 input component
         */
        get uv2(): NodeMaterialConnectionPoint;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the position output component
         */
        get positionOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal output component
         */
        get normalOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the tangent output component
         */
        get tangentOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv output component
         */
        get uvOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv2 output component
         */
        get uv2Output(): NodeMaterialConnectionPoint;
        /**
         * Gets the color output component
         */
        get colorOutput(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block
         * @param state - the build state
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        /**
         * Replace repeatable content
         * @param vertexShaderState - the vertex shader build state
         * @param defines - the list of defines
         * @param mesh - the mesh
         */
        replaceRepeatableContent(vertexShaderState: NodeMaterialBuildState, defines: NodeMaterialDefines, mesh?: AbstractMesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for morphTargetsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMorphTargetsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import morphTargetsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get data information from a light
     */
    export class LightInformationBlock extends NodeMaterialBlock {
        private _lightDataUniformName;
        private _lightColorUniformName;
        private _lightShadowUniformName;
        private _lightShadowExtraUniformName;
        private _lightTypeDefineName;
        private _forcePrepareDefines;
        /**
         * Gets or sets the light associated with this block
         */
        light: Nullable<Light>;
        /**
         * Creates a new LightInformationBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the direction output component
         */
        get direction(): NodeMaterialConnectionPoint;
        /**
         * Gets the direction output component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the direction output component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow bias output component
         */
        get shadowBias(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow normal bias output component
         */
        get shadowNormalBias(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow depth scale component
         */
        get shadowDepthScale(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow depth range component
         */
        get shadowDepthRange(): NodeMaterialConnectionPoint;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for lightInformationBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLightInformationBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lightInformationBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add support for instances
     * @see https://doc.babylonjs.com/features/featuresDeepDive/mesh/copies/instances
     */
    export class InstancesBlock extends NodeMaterialBlock {
        /**
         * Creates a new InstancesBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the first world row input component
         */
        get world0(): NodeMaterialConnectionPoint;
        /**
         * Gets the second world row input component
         */
        get world1(): NodeMaterialConnectionPoint;
        /**
         * Gets the third world row input component
         */
        get world2(): NodeMaterialConnectionPoint;
        /**
         * Gets the forth world row input component
         */
        get world3(): NodeMaterialConnectionPoint;
        /**
         * Gets the world input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the instanceID component
         */
        get instanceID(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         * @param useInstances - whether to use instances
         * @param subMesh - the sub mesh
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh, useInstances?: boolean, subMesh?: SubMesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for instancesBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterInstancesBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import instancesBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add support for vertex skinning (bones)
     */
    export class BonesBlock extends NodeMaterialBlock {
        /**
         * Creates a new BonesBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the matrix indices input component
         */
        get matricesIndices(): NodeMaterialConnectionPoint;
        /**
         * Gets the matrix weights input component
         */
        get matricesWeights(): NodeMaterialConnectionPoint;
        /**
         * Gets the extra matrix indices input component
         */
        get matricesIndicesExtra(): NodeMaterialConnectionPoint;
        /**
         * Gets the extra matrix weights input component
         */
        get matricesWeightsExtra(): NodeMaterialConnectionPoint;
        /**
         * Gets the world input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Provides the fallbacks
         * @param fallbacks - the effect fallbacks
         * @param mesh - the mesh
         */
        provideFallbacks(fallbacks: EffectFallbacks, mesh?: AbstractMesh): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for bonesBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBonesBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import bonesBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to receive a value from a teleport entry point
     */
    export class NodeMaterialTeleportOutBlock extends NodeMaterialBlock {
        /** @internal */
        _entryPoint: Nullable<NodeMaterialTeleportInBlock>;
        /** @internal */
        _tempEntryPointUniqueId: Nullable<number>;
        /**
         * Create a new TeleportOutBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the entry point
         */
        get entryPoint(): Nullable<NodeMaterialTeleportInBlock>;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets or sets the target of the block
         */
        get target(): NodeMaterialBlockTargets;
        set target(value: NodeMaterialBlockTargets);
        /** Detach from entry point */
        detach(): void;
        protected _buildBlock(state: NodeMaterialBuildState): void;
        /**
         * Clone the current block to a new identical block
         * @param scene defines the hosting scene
         * @param rootUrl defines the root URL to use to load textures and relative dependencies
         * @returns a copy of the current block
         */
        clone(scene: Scene, rootUrl?: string): NodeMaterialBlock | null;
        protected _customBuildStep(state: NodeMaterialBuildState, activeBlocks: NodeMaterialBlock[]): void;
        /**
         * Dumps the code for the block
         * @param uniqueNames - the unique names
         * @param alreadyDumped - the already dumped blocks
         * @returns the code string
         */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]): string;
        /**
         * Dumps the code for output connections
         * @param alreadyDumped - the already dumped blocks
         * @returns the code string
         */
        _dumpCodeForOutputConnections(alreadyDumped: NodeMaterialBlock[]): string;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for materialsNodeBlocksTeleportTeleportOutBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialsNodeBlocksTeleportTeleportOutBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import teleportOutBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines a block used to teleport a value to an endpoint
     */
    export class NodeMaterialTeleportInBlock extends NodeMaterialBlock {
        private _endpoints;
        /** Gets the list of attached endpoints */
        get endpoints(): NodeMaterialTeleportOutBlock[];
        /**
         * Gets or sets the target of the block
         */
        get target(): NodeMaterialBlockTargets;
        set target(value: NodeMaterialBlockTargets);
        /**
         * Create a new NodeMaterialTeleportInBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * @returns a boolean indicating that this connection will be used in the fragment shader
         */
        isConnectedInFragmentShader(): boolean;
        /**
         * Checks if the input is connected to a uniform input block
         */
        get isConnectedToUniform(): boolean;
        /**
         * Dumps the code for the block
         * @param uniqueNames - the unique names
         * @param alreadyDumped - the already dumped blocks
         * @returns the code string
         */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeMaterialBlock[]): string;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeMaterialBlock): boolean;
        /**
         * Add an enpoint to this block
         * @param endpoint define the endpoint to attach to
         */
        attachToEndpoint(endpoint: NodeMaterialTeleportOutBlock): void;
        /**
         * Remove enpoint from this block
         * @param endpoint define the endpoint to remove
         */
        detachFromEndpoint(endpoint: NodeMaterialTeleportOutBlock): void;
        /**
         * Release resources
         */
        dispose(): void;
    }
    /**
     * Register side effects for materialsNodeBlocksTeleportTeleportInBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialsNodeBlocksTeleportTeleportInBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import teleportInBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */




    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Base block used for the particle texture
     */
    export class ParticleTextureBlock extends NodeMaterialBlock {
        private _samplerName;
        private _linearDefineName;
        private _gammaDefineName;
        private _tempTextureRead;
        /**
         * Gets or sets the texture associated with the node
         */
        texture: Nullable<BaseTexture>;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to gamma space
         */
        convertToGammaSpace: boolean;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to linear space
         */
        convertToLinearSpace: boolean;
        /**
         * Create a new ParticleTextureBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the r output component
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g output component
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b output component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a output component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - defines the node material
         * @param additionalFilteringInfo - defines additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - defines the list of defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        private _writeOutput;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - defines the serialized object
         * @param scene - defines the scene
         * @param rootUrl - defines the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for particleTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used for the particle ramp gradient section
     */
    export class ParticleRampGradientBlock extends NodeMaterialBlock {
        /**
         * Create a new ParticleRampGradientBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the rampColor output component
         */
        get rampColor(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for particleRampGradientBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleRampGradientBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleRampGradientBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used for the particle blend multiply section
     */
    export class ParticleBlendMultiplyBlock extends NodeMaterialBlock {
        /**
         * Create a new ParticleBlendMultiplyBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the alphaTexture input component
         */
        get alphaTexture(): NodeMaterialConnectionPoint;
        /**
         * Gets the alphaColor input component
         */
        get alphaColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the blendColor output component
         */
        get blendColor(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for particleBlendMultiplyBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterParticleBlendMultiplyBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import particleBlendMultiplyBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the sub surface module of the PBR material
     */
    export class SubSurfaceBlock extends NodeMaterialBlock {
        /**
         * Create a new SubSurfaceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Set it to true if your rendering in 8.0+ is different from that in 7 when you use sub-surface properties (transmission, refraction, etc.)
         */
        applyAlbedoAfterSubSurface: boolean;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the thickness component
         */
        get thickness(): NodeMaterialConnectionPoint;
        /**
         * Gets the tint color input component
         */
        get tintColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the translucency intensity input component
         */
        get translucencyIntensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the translucency diffusion distance input component
         */
        get translucencyDiffusionDist(): NodeMaterialConnectionPoint;
        /**
         * Gets the refraction object parameters
         */
        get refraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the dispersion input component
         */
        get dispersion(): NodeMaterialConnectionPoint;
        /**
         * Gets the sub surface object output component
         */
        get subsurface(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         */
        autoConfigure(): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Gets the main code of the block (fragment side)
         * @param state current state of the node material building
         * @param ssBlock instance of a SubSurfaceBlock or null if the code must be generated without an active sub surface module
         * @param reflectionBlock instance of a ReflectionBlock null if the code must be generated without an active reflection module
         * @param worldPosVarName name of the variable holding the world position
         * @returns the shader code
         */
        static GetCode(state: NodeMaterialBuildState, ssBlock: Nullable<SubSurfaceBlock>, reflectionBlock: Nullable<ReflectionBlock>, worldPosVarName: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for subSurfaceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSubSurfaceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import subSurfaceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the sheen module of the PBR material
     */
    export class SheenBlock extends NodeMaterialBlock {
        /**
         * Create a new SheenBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * If true, the sheen effect is layered above the base BRDF with the albedo-scaling technique.
         * It allows the strength of the sheen effect to not depend on the base color of the material,
         * making it easier to setup and tweak the effect
         */
        albedoScaling: boolean;
        /**
         * Defines if the sheen is linked to the sheen color.
         */
        linkSheenWithAlbedo: boolean;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the intensity input component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the roughness input component
         */
        get roughness(): NodeMaterialConnectionPoint;
        /**
         * Gets the sheen object output component
         */
        get sheen(): NodeMaterialConnectionPoint;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Gets the main code of the block (fragment side)
         * @param reflectionBlock instance of a ReflectionBlock null if the code must be generated without an active reflection module
         * @param state define the build state
         * @returns the shader code
         */
        getCode(reflectionBlock: Nullable<ReflectionBlock>, state: NodeMaterialBuildState): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for sheenBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSheenBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sheenBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the refraction part of the sub surface module of the PBR material
     */
    export class RefractionBlock extends NodeMaterialBlock {
        /** @internal */
        _define3DName: string;
        /** @internal */
        _refractionMatrixName: string;
        /** @internal */
        _defineLODRefractionAlpha: string;
        /** @internal */
        _defineLinearSpecularRefraction: string;
        /** @internal */
        _defineOppositeZ: string;
        /** @internal */
        _cubeSamplerName: string;
        /** @internal */
        _2DSamplerName: string;
        /** @internal */
        _vRefractionMicrosurfaceInfosName: string;
        /** @internal */
        _vRefractionInfosName: string;
        /** @internal */
        _vRefractionFilteringInfoName: string;
        private _scene;
        /**
         * The properties below are set by the main PBR block prior to calling methods of this class.
         * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.
         * It's less burden on the user side in the editor part.
         */
        /** @internal */
        viewConnectionPoint: NodeMaterialConnectionPoint;
        /** @internal */
        indexOfRefractionConnectionPoint: NodeMaterialConnectionPoint;
        /**
         * This parameters will make the material used its opacity to control how much it is refracting against not.
         * Materials half opaque for instance using refraction could benefit from this control.
         */
        linkRefractionWithTransparency: boolean;
        /**
         * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.
         */
        invertRefractionY: boolean;
        /**
         * Controls if refraction needs to be inverted on Y. This could be useful for procedural texture.
         */
        useThicknessAsDepth: boolean;
        /**
         * Gets or sets the texture associated with the node
         */
        texture: Nullable<BaseTexture>;
        /**
         * Create a new RefractionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the intensity input component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the tint at distance input component
         */
        get tintAtDistance(): NodeMaterialConnectionPoint;
        /**
         * Gets the volume index of refraction input component
         */
        get volumeIndexOfRefraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the view input component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the refraction object output component
         */
        get refraction(): NodeMaterialConnectionPoint;
        /**
         * Returns true if the block has a texture
         */
        get hasTexture(): boolean;
        protected _getTexture(): Nullable<BaseTexture>;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        /**
         * Gets the main code of the block (fragment side)
         * @param state current state of the node material building
         * @returns the shader code
         */
        getCode(state: NodeMaterialBuildState): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for refractionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRefractionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import refractionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the reflection module of the PBR material
     */
    export class ReflectionBlock extends ReflectionTextureBaseBlock {
        /** @internal */
        _defineLODReflectionAlpha: string;
        /** @internal */
        _defineLinearSpecularReflection: string;
        private _vEnvironmentIrradianceName;
        /** @internal */
        _vReflectionMicrosurfaceInfosName: string;
        /** @internal */
        _vReflectionInfosName: string;
        /** @internal */
        _vReflectionFilteringInfoName: string;
        private _scene;
        private _iblIntensityName;
        /**
         * The properties below are set by the main PBR block prior to calling methods of this class.
         * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.
         * It's less burden on the user side in the editor part.
         */
        /** @internal */
        worldPositionConnectionPoint: NodeMaterialConnectionPoint;
        /** @internal */
        worldNormalConnectionPoint: NodeMaterialConnectionPoint;
        /** @internal */
        cameraPositionConnectionPoint: NodeMaterialConnectionPoint;
        /** @internal */
        viewConnectionPoint: NodeMaterialConnectionPoint;
        /**
         * Defines if the material uses spherical harmonics vs spherical polynomials for the
         * diffuse part of the IBL.
         */
        useSphericalHarmonics: boolean;
        /**
         * Force the shader to compute irradiance in the fragment shader in order to take bump in account.
         */
        forceIrradianceInFragment: boolean;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initReflectionBlockShaderSourceAsync;
        protected _onGenerateOnlyFragmentCodeChanged(): boolean;
        protected _setTarget(): void;
        /**
         * Create a new ReflectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the position input component
         */
        get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera (or eye) position component
         */
        get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view input component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the reflection object output component
         */
        get reflection(): NodeMaterialConnectionPoint;
        /**
         * Returns true if the block has a texture (either its own texture or the environment texture from the scene, if set)
         */
        get hasTexture(): boolean;
        /**
         * Gets the reflection color (either the name of the variable if the color input is connected, else a default value)
         */
        get reflectionColor(): string;
        protected _getTexture(): Nullable<BaseTexture>;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines to update
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind data to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind data for
         * @param subMesh - the submesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, subMesh?: SubMesh): void;
        /**
         * Gets the code to inject in the vertex shader
         * @param state current state of the node material building
         * @returns the shader code
         */
        handleVertexSide(state: NodeMaterialBuildState): string;
        /**
         * Gets the main code of the block (fragment side)
         * @param state current state of the node material building
         * @param normalVarName name of the existing variable corresponding to the normal
         * @returns the shader code
         */
        getCode(state: NodeMaterialBuildState, normalVarName: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the object to deserialize from
         * @param scene - the scene to deserialize in
         * @param rootUrl - the root URL for assets
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for reflectionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the PBR metallic/roughness model
     * @see https://playground.babylonjs.com/#D8AK3Z#80
     */
    export class PBRMetallicRoughnessBlock extends NodeMaterialBlock {
        /**
         * Gets or sets the light associated with this block
         */
        light: Nullable<Light>;
        private static _OnGenerateOnlyFragmentCodeChanged;
        private _setTarget;
        private _lightId;
        private _scene;
        private _environmentBRDFTexture;
        private _environmentBrdfSamplerName;
        private _vNormalWName;
        private _invertNormalName;
        private _metallicReflectanceColor;
        private _metallicF0Factor;
        private _vMetallicReflectanceFactorsName;
        private _baseDiffuseRoughnessName;
        /**
         * Create a new ReflectionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Intensity of the direct lights e.g. the four lights available in your scene.
         * This impacts both the direct diffuse and specular highlights.
         */
        directIntensity: number;
        /**
         * Intensity of the environment e.g. how much the environment will light the object
         * either through harmonics for rough material or through the reflection for shiny ones.
         */
        environmentIntensity: number;
        /**
         * This is a special control allowing the reduction of the specular highlights coming from the
         * four lights of the scene. Those highlights may not be needed in full environment lighting.
         */
        specularIntensity: number;
        /**
         * Defines the  falloff type used in this material.
         * It by default is Physical.
         */
        lightFalloff: number;
        /**
         * Specifies that alpha test should be used
         */
        useAlphaTest: boolean;
        /**
         * Defines the alpha limits in alpha test mode.
         */
        alphaTestCutoff: number;
        /**
         * Specifies that alpha blending should be used
         */
        useAlphaBlending: boolean;
        /**
         * Specifies that the material will keeps the reflection highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When the street lights reflects on it you can not see what is behind.
         */
        useRadianceOverAlpha: boolean;
        /**
         * Specifies that the material will keeps the specular highlights over a transparent surface (only the most luminous ones).
         * A car glass is a good example of that. When sun reflects on it you can not see what is behind.
         */
        useSpecularOverAlpha: boolean;
        /**
         * Enables specular anti aliasing in the PBR shader.
         * It will both interacts on the Geometry for analytical and IBL lighting.
         * It also prefilter the roughness map based on the bump values.
         */
        enableSpecularAntiAliasing: boolean;
        /**
         * Enables realtime filtering on the texture.
         */
        realTimeFiltering: boolean;
        /**
         * Quality switch for realtime filtering
         */
        realTimeFilteringQuality: number;
        /**
         * Base Diffuse Model
         */
        baseDiffuseModel: number;
        /**
         * Defines if the material uses energy conservation.
         */
        useEnergyConservation: boolean;
        /**
         * This parameters will enable/disable radiance occlusion by preventing the radiance to lit
         * too much the area relying on ambient texture to define their ambient occlusion.
         */
        useRadianceOcclusion: boolean;
        /**
         * This parameters will enable/disable Horizon occlusion to prevent normal maps to look shiny when the normal
         * makes the reflect vector face the model (under horizon).
         */
        useHorizonOcclusion: boolean;
        /**
         * If set to true, no lighting calculations will be applied.
         */
        unlit: boolean;
        /**
         * Force normal to face away from face.
         */
        forceNormalForward: boolean;
        /** Indicates that no code should be generated in the vertex shader. Can be useful in some specific circumstances (like when doing ray marching for eg) */
        generateOnlyFragmentCode: boolean;
        /**
         * Defines the material debug mode.
         * It helps seeing only some components of the material while troubleshooting.
         */
        debugMode: number;
        /**
         * Specify from where on screen the debug mode should start.
         * The value goes from -1 (full screen) to 1 (not visible)
         * It helps with side by side comparison against the final render
         * This defaults to 0
         */
        debugLimit: number;
        /**
         * As the default viewing range might not be enough (if the ambient is really small for instance)
         * You can use the factor to better multiply the final value.
         */
        debugFactor: number;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the view matrix parameter
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera position input component
         */
        get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the perturbed normal input component
         */
        get perturbedNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the base color input component
         */
        get baseColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the metallic input component
         */
        get metallic(): NodeMaterialConnectionPoint;
        /**
         * Gets the roughness input component
         */
        get roughness(): NodeMaterialConnectionPoint;
        /**
         * Gets the ambient occlusion input component
         */
        get ambientOcc(): NodeMaterialConnectionPoint;
        /**
         * Gets the opacity input component
         */
        get opacity(): NodeMaterialConnectionPoint;
        /**
         * Gets the index of refraction input component
         */
        get indexOfRefraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the ambient color input component
         */
        get ambientColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the reflection object parameters
         */
        get reflection(): NodeMaterialConnectionPoint;
        /**
         * Gets the clear coat object parameters
         */
        get clearcoat(): NodeMaterialConnectionPoint;
        /**
         * Gets the sheen object parameters
         */
        get sheen(): NodeMaterialConnectionPoint;
        /**
         * Gets the sub surface object parameters
         */
        get subsurface(): NodeMaterialConnectionPoint;
        /**
         * Gets the anisotropy object parameters
         */
        get anisotropy(): NodeMaterialConnectionPoint;
        /**
         * Gets the iridescence object parameters
         */
        get iridescence(): NodeMaterialConnectionPoint;
        /**
         * Gets the ambient output component
         */
        get ambientClr(): NodeMaterialConnectionPoint;
        /**
         * Gets the diffuse output component
         */
        get diffuseDir(): NodeMaterialConnectionPoint;
        /**
         * Gets the specular output component
         */
        get specularDir(): NodeMaterialConnectionPoint;
        /**
         * Gets the clear coat output component
         */
        get clearcoatDir(): NodeMaterialConnectionPoint;
        /**
         * Gets the sheen output component
         */
        get sheenDir(): NodeMaterialConnectionPoint;
        /**
         * Gets the indirect diffuse output component
         */
        get diffuseInd(): NodeMaterialConnectionPoint;
        /**
         * Gets the indirect specular output component
         */
        get specularInd(): NodeMaterialConnectionPoint;
        /**
         * Gets the indirect clear coat output component
         */
        get clearcoatInd(): NodeMaterialConnectionPoint;
        /**
         * Gets the indirect sheen output component
         */
        get sheenInd(): NodeMaterialConnectionPoint;
        /**
         * Gets the refraction output component
         */
        get refraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the global lighting output component
         */
        get lighting(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow output component
         */
        get shadow(): NodeMaterialConnectionPoint;
        /**
         * Gets the alpha output component
         */
        get alpha(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines to update
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to prepare defines for
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Update the uniforms and samples
         * @param state - the build state
         * @param nodeMaterial - the node material
         * @param defines - the list of defines
         * @param uniformBuffers - the uniform buffers
         */
        updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]): void;
        /**
         * Checks if the block is ready
         * @param mesh - the mesh to check
         * @param nodeMaterial - the node material
         * @param defines - the list of defines
         * @returns true if ready
         */
        isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines): boolean;
        /**
         * Bind data to effect
         * @param effect - the effect to bind data to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        private _injectVertexCode;
        private _getAlbedoOpacityCode;
        private _getAmbientOcclusionCode;
        private _getReflectivityCode;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the object to deserialize from
         * @param scene - the scene to deserialize in
         * @param rootUrl - the root URL for assets
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for pbrMetallicRoughnessBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPbrMetallicRoughnessBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pbrMetallicRoughnessBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the iridescence module of the PBR material
     */
    export class IridescenceBlock extends NodeMaterialBlock {
        /**
         * Create a new IridescenceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the intensity input component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the indexOfRefraction input component
         */
        get indexOfRefraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the thickness input component
         */
        get thickness(): NodeMaterialConnectionPoint;
        /**
         * Gets the iridescence object output component
         */
        get iridescence(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         */
        autoConfigure(): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines to update
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Gets the main code of the block (fragment side)
         * @param iridescenceBlock instance of a IridescenceBlock or null if the code must be generated without an active iridescence module
         * @param state defines the build state
         * @returns the shader code
         */
        static GetCode(iridescenceBlock: Nullable<IridescenceBlock>, state: NodeMaterialBuildState): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the object to deserialize from
         * @param scene - the scene to deserialize in
         * @param rootUrl - the root URL for assets
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for iridescenceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterIridescenceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import iridescenceBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the clear coat module of the PBR material
     */
    export class ClearCoatBlock extends NodeMaterialBlock {
        private _scene;
        private _tangentCorrectionFactorName;
        /**
         * Create a new ClearCoatBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Defines if the F0 value should be remapped to account for the interface change in the material.
         */
        remapF0OnInterfaceChange: boolean;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the intensity input component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the roughness input component
         */
        get roughness(): NodeMaterialConnectionPoint;
        /**
         * Gets the ior input component
         */
        get indexOfRefraction(): NodeMaterialConnectionPoint;
        /**
         * Gets the bump texture input component
         */
        get normalMapColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the tint color input component
         */
        get tintColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the tint "at distance" input component
         */
        get tintAtDistance(): NodeMaterialConnectionPoint;
        /**
         * Gets the tint thickness input component
         */
        get tintThickness(): NodeMaterialConnectionPoint;
        /**
         * Gets the world tangent input component
         */
        get worldTangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the TBN input component
         */
        get TBN(): NodeMaterialConnectionPoint;
        /**
         * Gets the clear coat object output component
         */
        get clearcoat(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         */
        autoConfigure(): void;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines to update
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind data to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        private _generateTBNSpace;
        /** @internal */
        static _GetInitializationCode(state: NodeMaterialBuildState, ccBlock: Nullable<ClearCoatBlock>): string;
        /**
         * Gets the main code of the block (fragment side)
         * @param state current state of the node material building
         * @param ccBlock instance of a ClearCoatBlock or null if the code must be generated without an active clear coat module
         * @param reflectionBlock instance of a ReflectionBlock null if the code must be generated without an active reflection module
         * @param worldPosVarName name of the variable holding the world position
         * @param generateTBNSpace if true, the code needed to create the TBN coordinate space is generated
         * @param vTBNAvailable indicate that the vTBN variable is already existing because it has already been generated by another block (PerturbNormal or Anisotropy)
         * @param worldNormalVarName name of the variable holding the world normal
         * @returns the shader code
         */
        static GetCode(state: NodeMaterialBuildState, ccBlock: Nullable<ClearCoatBlock>, reflectionBlock: Nullable<ReflectionBlock>, worldPosVarName: string, generateTBNSpace: boolean, vTBNAvailable: boolean, worldNormalVarName: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the object to deserialize from
         * @param scene - the scene to deserialize in
         * @param rootUrl - the root URL for assets
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for clearCoatBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterClearCoatBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import clearCoatBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement the anisotropy module of the PBR material
     */
    export class AnisotropyBlock extends NodeMaterialBlock {
        private _tangentCorrectionFactorName;
        /**
         * The two properties below are set by the main PBR block prior to calling methods of this class.
         * This is to avoid having to add them as inputs here whereas they are already inputs of the main block, so already known.
         * It's less burden on the user side in the editor part.
         */
        /** @internal */
        worldPositionConnectionPoint: NodeMaterialConnectionPoint;
        /** @internal */
        worldNormalConnectionPoint: NodeMaterialConnectionPoint;
        /**
         * Create a new AnisotropyBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the intensity input component
         */
        get intensity(): NodeMaterialConnectionPoint;
        /**
         * Gets the direction input component
         */
        get direction(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the worldTangent input component
         */
        get worldTangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the TBN input component
         */
        get TBN(): NodeMaterialConnectionPoint;
        /**
         * Gets the roughness input component
         */
        get roughness(): NodeMaterialConnectionPoint;
        /**
         * Gets the anisotropy object output component
         */
        get anisotropy(): NodeMaterialConnectionPoint;
        private _generateTBNSpace;
        /**
         * Gets the main code of the block (fragment side)
         * @param state current state of the node material building
         * @param generateTBNSpace if true, the code needed to create the TBN coordinate space is generated
         * @returns the shader code
         */
        getCode(state: NodeMaterialBuildState, generateTBNSpace?: boolean): string;
        /**
         * Prepare the list of defines
         * @param defines - the list of defines to update
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind data to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for anisotropyBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAnisotropyBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import anisotropyBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read from prepass textures
     */
    export class PrePassTextureBlock extends NodeMaterialBlock {
        private _positionSamplerName;
        private _localPositionSamplerName;
        private _depthSamplerName;
        private _screenSpaceDepthSamplerName;
        private _normalSamplerName;
        private _worldNormalSamplerName;
        /**
         * The texture associated with the node is the prepass texture
         */
        get texture(): any;
        set texture(value: any);
        /**
         * Creates a new PrePassTextureBlock
         * @param name defines the block name
         * @param target defines the target of that block (VertexAndFragment by default)
         */
        constructor(name: string, target?: NodeMaterialBlockTargets);
        /**
         * Returns the sampler name associated with the node connection point
         * @param output defines the connection point to get the associated sampler name
         * @returns
         */
        getSamplerName(output: NodeMaterialConnectionPoint): string;
        /**
         * Gets the position texture
         */
        get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the local position texture
         */
        get localPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the depth texture
         */
        get depth(): NodeMaterialConnectionPoint;
        /**
         * Gets the screen depth texture
         */
        get screenDepth(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal texture
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal texture
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the sampler name associated with this image source
         */
        get positionSamplerName(): string;
        /**
         * Gets the sampler name associated with this image source
         */
        get localPositionSamplerName(): string;
        /**
         * Gets the sampler name associated with this image source
         */
        get normalSamplerName(): string;
        /**
         * Gets the sampler name associated with this image source
         */
        get worldNormalSamplerName(): string;
        /**
         * Gets the sampler name associated with this image source
         */
        get depthSamplerName(): string;
        /**
         * Gets the sampler name associated with this image source
         */
        get linearDepthSamplerName(): string;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Bind data to effect
         * @param effect - defines the effect to bind data to
         * @param nodeMaterial - defines the node material
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial): void;
    }
    /**
     * Register side effects for prePassTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPrePassTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import prePassTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to expose an input value
     */
    export class InputBlock extends NodeMaterialBlock {
        private _mode;
        private _associatedVariableName;
        private _storedValue;
        private _valueCallback;
        private _type;
        private _animationType;
        private _prefix;
        /** Gets or set a value used to limit the range of float values */
        min: number;
        /** Gets or set a value used to limit the range of float values */
        max: number;
        /** Gets or set a value indicating that this input can only get 0 and 1 values */
        isBoolean: boolean;
        /** Gets or sets a value used by the Node Material editor to determine how to configure the current value if it is a matrix */
        matrixMode: number;
        /** @internal */
        _systemValue: Nullable<NodeMaterialSystemValues>;
        /** Gets or sets a boolean indicating that the value of this input will not change after a build */
        isConstant: boolean;
        /** Gets or sets the group to use to display this block in the Inspector */
        groupInInspector: string;
        /** Gets an observable raised when the value is changed */
        onValueChangedObservable: Observable<InputBlock>;
        /** Gets or sets a boolean indicating if content needs to be converted to gamma space (for color3/4 only) */
        convertToGammaSpace: boolean;
        /** Gets or sets a boolean indicating if content needs to be converted to linear space (for color3/4 only) */
        convertToLinearSpace: boolean;
        /**
         * Gets or sets the connection point type (default is float)
         */
        get type(): NodeMaterialBlockConnectionPointTypes;
        /**
         * Creates a new InputBlock
         * @param name defines the block name
         * @param target defines the target of that block (Vertex by default)
         * @param type defines the type of the input (can be set to NodeMaterialBlockConnectionPointTypes.AutoDetect)
         */
        constructor(name: string, target?: NodeMaterialBlockTargets, type?: NodeMaterialBlockConnectionPointTypes);
        /**
         * Validates if a name is a reserve word.
         * @param newName the new name to be given to the node.
         * @returns false if the name is a reserve word, else true.
         */
        validateBlockName(newName: string): boolean;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Set the source of this connection point to a vertex attribute
         * @param attributeName defines the attribute name (position, uv, normal, etc...). If not specified it will take the connection point name
         * @returns the current connection point
         */
        setAsAttribute(attributeName?: string): InputBlock;
        /**
         * Set the source of this connection point to a system value
         * @param value define the system value to use (world, view, etc...) or null to switch to manual value
         * @returns the current connection point
         */
        setAsSystemValue(value: Nullable<NodeMaterialSystemValues>): InputBlock;
        /**
         * Gets or sets the value of that point.
         * Please note that this value will be ignored if valueCallback is defined
         */
        get value(): any;
        set value(value: any);
        /**
         * Gets or sets a callback used to get the value of that point.
         * Please note that setting this value will force the connection point to ignore the value property
         */
        get valueCallback(): () => any;
        set valueCallback(value: () => any);
        /**
         * Gets the declaration variable name in the shader
         */
        get declarationVariableName(): string;
        /**
         * Gets or sets the associated variable name in the shader
         */
        get associatedVariableName(): string;
        set associatedVariableName(value: string);
        /** Gets or sets the type of animation applied to the input */
        get animationType(): AnimatedInputBlockTypes;
        set animationType(value: AnimatedInputBlockTypes);
        /**
         * Gets a boolean indicating that this connection point not defined yet
         */
        get isUndefined(): boolean;
        /**
         * Gets or sets a boolean indicating that this connection point is coming from an uniform.
         * In this case the connection point name must be the name of the uniform to use.
         * Can only be set on inputs
         */
        get isUniform(): boolean;
        set isUniform(value: boolean);
        /**
         * Gets or sets a boolean indicating that this connection point is coming from an attribute.
         * In this case the connection point name must be the name of the attribute to use
         * Can only be set on inputs
         */
        get isAttribute(): boolean;
        set isAttribute(value: boolean);
        /**
         * Gets or sets a boolean indicating that this connection point is generating a varying variable.
         * Can only be set on exit points
         */
        get isVarying(): boolean;
        set isVarying(value: boolean);
        /**
         * Gets a boolean indicating that the current connection point is a system value
         */
        get isSystemValue(): boolean;
        /**
         * Gets or sets the current well known value or null if not defined as a system value
         */
        get systemValue(): Nullable<NodeMaterialSystemValues>;
        set systemValue(value: Nullable<NodeMaterialSystemValues>);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Animate the input if animationType !== None
         * @param scene defines the rendering scene
         */
        animate(scene: Scene): void;
        private _emitDefine;
        /**
         * Initialize the block
         */
        initialize(): void;
        /**
         * Set the input block to its default value (based on its type)
         */
        setDefaultValue(): void;
        private _emitConstant;
        /** @internal */
        get _noContextSwitch(): boolean;
        private _emit;
        /**
         * @internal
         */
        _transmitWorld(effect: Effect, world: Matrix, worldView: Matrix, worldViewProjection: Matrix): void;
        /**
         * @internal
         */
        _transmit(effect: Effect, scene: Scene, material: NodeMaterial): void;
        protected _buildBlock(state: NodeMaterialBuildState): void;
        protected _dumpPropertiesCode(): string;
        /**
         * Releases the resources held by the block
         */
        dispose(): void;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - defines the serialized object
         * @param scene - defines the scene
         * @param rootUrl - defines the root URL
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for materialsNodeBlocksInputInputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterMaterialsNodeBlocksInputInputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import inputBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /**
     * Enum defining the type of animations supported by InputBlock
     */
    export enum AnimatedInputBlockTypes {
        /** No animation */
        None = 0,
        /** Time based animation (is incremented by 0.6 each second). Will only work for floats */
        Time = 1,
        /** Time elapsed (in seconds) since the engine was initialized. Will only work for floats */
        RealTime = 2,
        MouseInfo = 3
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Block used for Reading components of the Gaussian Splatting
     */
    export class SplatReaderBlock extends NodeMaterialBlock {
        /**
         * Create a new SplatReaderBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the splat index input component
         */
        get splatIndex(): NodeMaterialConnectionPoint;
        /**
         * Gets the splatPosition output component
         */
        get splatPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the splatColor output component
         */
        get splatColor(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Bind data to effect
         * @param effect - defines the effect to bind data to
         * @param nodeMaterial - defines the node material
         * @param mesh - defines the mesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for splatReaderBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSplatReaderBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import splatReaderBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used for the Gaussian Splatting
     */
    export class GaussianSplattingBlock extends NodeMaterialBlock {
        /**
         * Create a new GaussianSplattingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the position input component
         */
        get splatPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the scale input component
         */
        get splatScale(): NodeMaterialConnectionPoint;
        /**
         * Gets the View matrix input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the View matrix input component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the projection matrix input component
         */
        get projection(): NodeMaterialConnectionPoint;
        /**
         * Gets the splatVertex output component
         */
        get splatVertex(): NodeMaterialConnectionPoint;
        /**
         * Gets the SH output contribution
         */
        get SH(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Update defines for shader compilation
         * @param defines defines the material defines to update
         * @param nodeMaterial defines the node material requesting the update
         * @param mesh defines the mesh to be rendered
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for gaussianSplattingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used for the Gaussian Splatting Fragment part
     */
    export class GaussianBlock extends NodeMaterialBlock {
        /**
         * Create a new GaussianBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color input component
         */
        get splatColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the alpha output component
         */
        get alpha(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for gaussianBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to generate a twirl
     */
    export class TwirlBlock extends NodeMaterialBlock {
        /**
         * Creates a new TwirlBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the strength component
         */
        get strength(): NodeMaterialConnectionPoint;
        /**
         * Gets the center component
         */
        get center(): NodeMaterialConnectionPoint;
        /**
         * Gets the offset component
         */
        get offset(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the x output component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y output component
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         */
        autoConfigure(): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for twirlBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTwirlBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import twirlBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /** @internal */
    export const SfeModeDefine = "USE_SFE_FRAMEWORK";
    /**
     * Block used to output the final color with Smart Filters structural support.
     */
    export class SmartFilterFragmentOutputBlock extends FragmentOutputBlock {
        /**
         * Create a new SmartFilterFragmentOutputBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _generateInputBlockAnnotation;
        private _generateScreenSizeBlockAnnotation;
        private _getMainUvName;
        protected _getOutputString(): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for smartFilterFragmentOutputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSmartFilterFragmentOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import smartFilterFragmentOutputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to output the depth to a shadow map
     */
    export class ShadowMapBlock extends NodeMaterialBlock {
        /**
         * Create a new ShadowMapBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view x projection input component
         */
        get viewProjection(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the depth output component
         */
        get depth(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for shadowMapBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterShadowMapBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import shadowMapBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to transform a vector3 or a vector4 into screen space
     */
    export class ScreenSpaceBlock extends NodeMaterialBlock {
        /**
         * Creates a new ScreenSpaceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the vector input
         */
        get vector(): NodeMaterialConnectionPoint;
        /**
         * Gets the worldViewProjection transform input
         */
        get worldViewProjection(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the x output component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y output component
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - defines the hosting NodeMaterial
         * @param additionalFilteringInfo - defines additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for screenSpaceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScreenSpaceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import screenSpaceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the screen sizes
     */
    export class ScreenSizeBlock extends NodeMaterialBlock {
        private _varName;
        private _scene;
        /**
         * Name of the variable in the shader that holds the screen size
         */
        get associatedVariableName(): string;
        /**
         * Creates a new ScreenSizeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the xy component
         */
        get xy(): NodeMaterialConnectionPoint;
        /**
         * Gets the x component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y component
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Bind data to effect
         * @param effect - defines the effect to bind data to
         */
        bind(effect: Effect): void;
        protected writeOutputs(state: NodeMaterialBuildState, varName: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for screenSizeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterScreenSizeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import screenSizeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to output values on the prepass textures
     * @see https://playground.babylonjs.com/#WW65SN#9
     */
    export class PrePassOutputBlock extends NodeMaterialBlock {
        /**
         * Create a new PrePassOutputBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the view depth component
         */
        get viewDepth(): NodeMaterialConnectionPoint;
        /**
         * Gets the screen depth component
         */
        get screenDepth(): NodeMaterialConnectionPoint;
        /**
         * Gets the world position component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the position in local space component
         */
        get localPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view normal component
         */
        get viewNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the reflectivity component
         */
        get reflectivity(): NodeMaterialConnectionPoint;
        /**
         * Gets the velocity component
         */
        get velocity(): NodeMaterialConnectionPoint;
        /**
         * Gets the linear velocity component
         */
        get velocityLinear(): NodeMaterialConnectionPoint;
        private _getFragData;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for prePassOutputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPrePassOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import prePassOutputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to perturb normals based on a normal map
     */
    export class PerturbNormalBlock extends NodeMaterialBlock {
        private _tangentSpaceParameterName;
        private _tangentCorrectionFactorName;
        private _worldMatrixName;
        /** Gets or sets a boolean indicating that normal should be inverted on X axis */
        invertX: boolean;
        /** Gets or sets a boolean indicating that normal should be inverted on Y axis */
        invertY: boolean;
        /** Gets or sets a boolean indicating that parallax occlusion should be enabled */
        useParallaxOcclusion: boolean;
        /** Gets or sets a boolean indicating that sampling mode is in Object space */
        useObjectSpaceNormalMap: boolean;
        /**
         * Create a new PerturbNormalBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world tangent input component
         */
        get worldTangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal map color input component
         */
        get normalMapColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the strength input component
         */
        get strength(): NodeMaterialConnectionPoint;
        /**
         * Gets the view direction input component
         */
        get viewDirection(): NodeMaterialConnectionPoint;
        /**
         * Gets the parallax scale input component
         */
        get parallaxScale(): NodeMaterialConnectionPoint;
        /**
         * Gets the parallax height input component
         */
        get parallaxHeight(): NodeMaterialConnectionPoint;
        /**
         * Gets the TBN input component
         */
        get TBN(): NodeMaterialConnectionPoint;
        /**
         * Gets the World input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the uv offset output component
         */
        get uvOffset(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block
         * @param state - defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Prepare the list of defines
         * @param defines - defines the list of defines to update
         * @param nodeMaterial - defines the node material requesting the update
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial): void;
        /**
         * Bind data to effect
         * @param effect - defines the effect to bind data to
         * @param nodeMaterial - defines the node material
         * @param mesh - defines the mesh to bind data for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        /**
         * Auto configure the block based on the material
         * @param material - defines the hosting NodeMaterial
         * @param additionalFilteringInfo - defines additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - defines the serialized object
         * @param scene - defines the hosting scene
         * @param rootUrl - defines the root URL to use for loading
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for perturbNormalBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPerturbNormalBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import perturbNormalBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add image processing support to fragment shader
     */
    export class ImageProcessingBlock extends NodeMaterialBlock {
        /**
         * Create a new ImageProcessingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Defines if the input should be converted to linear space (default: true)
         */
        convertInputToLinearSpace: boolean;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color input component
         */
        get color(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Checks if the block is ready
         * @param mesh - the mesh to check
         * @param nodeMaterial - the node material
         * @param defines - the material defines
         * @returns true if ready
         */
        isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines): boolean;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         * @param nodeMaterial - the node material
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for imageProcessingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterImageProcessingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import imageProcessingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to convert a height vector to a normal
     */
    export class HeightToNormalBlock extends NodeMaterialBlock {
        /**
         * Creates a new HeightToNormalBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Defines if the output should be generated in world or tangent space.
         * Note that in tangent space the result is also scaled by 0.5 and offsetted by 0.5 so that it can directly be used as a PerturbNormal.normalMapColor input
         */
        generateInWorldSpace: boolean;
        /**
         * Defines that the worldNormal input will be normalized by the HeightToNormal block before being used
         */
        automaticNormalizationNormal: boolean;
        /**
         * Defines that the worldTangent input will be normalized by the HeightToNormal block before being used
         */
        automaticNormalizationTangent: boolean;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the position component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the normal component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the tangent component
         */
        get worldTangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component
         */
        get xyz(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for heightToNormalBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterHeightToNormalBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import heightToNormalBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to test if the fragment shader is front facing
     */
    export class FrontFacingBlock extends NodeMaterialBlock {
        /**
         * Creates a new FrontFacingBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for frontFacingBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFrontFacingBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import frontFacingBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Color spaces supported by the fragment output block
     */
    export enum FragmentOutputBlockColorSpace {
        /** Unspecified */
        NoColorSpace = 0,
        /** Gamma */
        Gamma = 1,
        /** Linear */
        Linear = 2
    }
    /**
     * Block used to output the final color
     */
    export class FragmentOutputBlock extends NodeMaterialBlock {
        private _linearDefineName;
        private _gammaDefineName;
        private _additionalColorDefineName;
        protected _outputString: string;
        /**
         * Create a new FragmentOutputBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /** Gets or sets a boolean indicating if content needs to be converted to gamma space */
        convertToGammaSpace: boolean;
        /** Gets or sets a boolean indicating if content needs to be converted to linear space */
        convertToLinearSpace: boolean;
        /** Gets or sets a boolean indicating if logarithmic depth should be used */
        useLogarithmicDepth: boolean;
        /**
         * Gets or sets the color space used for the block
         */
        get colorSpace(): FragmentOutputBlockColorSpace;
        set colorSpace(value: FragmentOutputBlockColorSpace);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the rgba input component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb input component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the a input component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Gets the additionalColor input component (named glow in the UI for now)
         */
        get additionalColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the glow input component
         */
        get glow(): NodeMaterialConnectionPoint;
        protected _getOutputString(state: NodeMaterialBuildState): string;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         * @param nodeMaterial - the node material
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for fragmentOutputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFragmentOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fragmentOutputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to write the fragment depth
     */
    export class FragDepthBlock extends NodeMaterialBlock {
        /**
         * Create a new FragDepthBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the depth input component
         */
        get depth(): NodeMaterialConnectionPoint;
        /**
         * Gets the worldPos input component
         */
        get worldPos(): NodeMaterialConnectionPoint;
        /**
         * Gets the viewProjection input component
         */
        get viewProjection(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for fragDepthBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFragDepthBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fragDepthBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to make gl_FragCoord available
     */
    export class FragCoordBlock extends NodeMaterialBlock {
        /**
         * Creates a new FragCoordBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the xy component
         */
        get xy(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyz component
         */
        get xyz(): NodeMaterialConnectionPoint;
        /**
         * Gets the xyzw component
         */
        get xyzw(): NodeMaterialConnectionPoint;
        /**
         * Gets the x component
         */
        get x(): NodeMaterialConnectionPoint;
        /**
         * Gets the y component
         */
        get y(): NodeMaterialConnectionPoint;
        /**
         * Gets the z component
         */
        get z(): NodeMaterialConnectionPoint;
        /**
         * Gets the w component
         */
        get output(): NodeMaterialConnectionPoint;
        protected writeOutputs(state: NodeMaterialBuildState): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for fragCoordBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFragCoordBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fragCoordBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to discard a pixel if a value is smaller than a cutoff
     */
    export class DiscardBlock extends NodeMaterialBlock {
        /**
         * Create a new DiscardBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the color input component
         */
        get value(): NodeMaterialConnectionPoint;
        /**
         * Gets the cutoff input component
         */
        get cutoff(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for discardBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDiscardBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import discardBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to get the derivative value on x and y of a given input
     */
    export class DerivativeBlock extends NodeMaterialBlock {
        /**
         * Create a new DerivativeBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the derivative output on x
         */
        get dx(): NodeMaterialConnectionPoint;
        /**
         * Gets the derivative output on y
         */
        get dy(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for derivativeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDerivativeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import derivativeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to evaluate screen spaceambient occlusion in a shader
     */
    export class AmbientOcclusionBlock extends NodeMaterialBlock {
        private _randomTexture;
        private _randomSamplerName;
        /**
         * Defines the radius around the analyzed pixel used by the SSAO post-process
         */
        radius: number;
        /**
         * Related to fallOff, used to interpolate SSAO samples (first interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to fallOff and superior to fallOff.
         */
        area: number;
        /**
         * Related to area, used to interpolate SSAO samples (second interpolate function input) based on the occlusion difference of each pixel
         * Must not be equal to area and inferior to area.
         */
        fallOff: number;
        /**
         * Create a new AmbientOcclusionBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the source component
         */
        get source(): NodeMaterialConnectionPoint;
        /**
         * Gets the screenSize component
         */
        get screenSize(): NodeMaterialConnectionPoint;
        /**
         * Gets the occlusion output
         */
        get occlusion(): NodeMaterialConnectionPoint;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         */
        bind(effect: Effect): void;
        private _createRandomTexture;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        /**
         * Releases the resources held by the block
         */
        dispose(): void;
    }
    /**
     * Register side effects for ambientOcclusionBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterAmbientOcclusionBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import ambientOcclusionBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement TBN matrix
     */
    export class TBNBlock extends NodeMaterialBlock {
        /**
         * Create a new TBNBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /**
         * Gets the normal input component
         */
        get normal(): NodeMaterialConnectionPoint;
        /**
         * Gets the tangent input component
         */
        get tangent(): NodeMaterialConnectionPoint;
        /**
         * Gets the world matrix input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the TBN output component
         */
        get TBN(): NodeMaterialConnectionPoint;
        /**
         * Gets the row0 of the output matrix
         */
        get row0(): NodeMaterialConnectionPoint;
        /**
         * Gets the row1 of the output matrix
         */
        get row1(): NodeMaterialConnectionPoint;
        /**
         * Gets the row2 of the output matrix
         */
        get row2(): NodeMaterialConnectionPoint;
        /**
         * Gets the block target
         */
        get target(): NodeMaterialBlockTargets;
        /**
         * Sets the block target
         */
        set target(value: NodeMaterialBlockTargets);
        /**
         * Auto configure the block based on the material
         * @param material - defines the hosting NodeMaterial
         * @param additionalFilteringInfo - defines additional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - defines the list of defines to update
         * @param nodeMaterial - defines the node material requesting the update
         * @param mesh - defines the mesh to bind data for
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for tBNBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTBNBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import TBNBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read a texture from a sampler
     */
    export class TextureBlock extends NodeMaterialBlock {
        private static _DefaultTextureByEngine;
        private _defineName;
        private _linearDefineName;
        private _gammaDefineName;
        private _tempTextureRead;
        private _samplerName;
        private _transformedUVName;
        private _textureTransformName;
        private _textureInfoName;
        private _mainUVName;
        private _mainUVDefineName;
        private _fragmentOnly;
        private _imageSource;
        protected _texture: Nullable<Texture>;
        /**
         * Gets or sets a boolean indicating if the block is used in fragment shader only
         * If false the system will allow optimizations to use it in vertex shader when possible for the uv computation
         */
        get fragmentOnly(): boolean;
        set fragmentOnly(value: boolean);
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<Texture>;
        set texture(texture: Nullable<Texture>);
        private static _IsPrePassTextureBlock;
        private static _GetDefaultTexture;
        private get _isSourcePrePass();
        /**
         * Gets the sampler name associated with this texture
         */
        get samplerName(): string;
        /**
         * Gets a boolean indicating that this block is linked to an ImageSourceBlock
         */
        get hasImageSource(): boolean;
        private _convertToGammaSpace;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to gamma space
         */
        set convertToGammaSpace(value: boolean);
        get convertToGammaSpace(): boolean;
        private _convertToLinearSpace;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to linear space
         */
        set convertToLinearSpace(value: boolean);
        get convertToLinearSpace(): boolean;
        /**
         * Gets or sets a boolean indicating if multiplication of texture with level should be disabled
         */
        disableLevelMultiplication: boolean;
        /**
         * Create a new TextureBlock
         * @param name defines the block name
         * @param fragmentOnly
         */
        constructor(name: string, fragmentOnly?: boolean);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the source input component
         */
        get source(): NodeMaterialConnectionPoint;
        /**
         * Gets the layer input component
         */
        get layer(): NodeMaterialConnectionPoint;
        /**
         * Gets the LOD input component
         */
        get lod(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the r output component
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g output component
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b output component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a output component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Gets the level output component
         */
        get level(): NodeMaterialConnectionPoint;
        private _isTiedToFragment;
        private _getEffectiveTarget;
        /** {@inheritDoc} */
        get target(): NodeMaterialBlockTargets;
        /** {@inheritDoc} */
        set target(value: NodeMaterialBlockTargets);
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - optional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Initialize the list of defines
         * @param defines - the material defines
         */
        initializeDefines(defines: NodeMaterialDefines): void;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         */
        bind(effect: Effect): void;
        private get _isMixed();
        private _injectVertexCode;
        private _getUVW;
        private _samplerFunc;
        private get _samplerLodSuffix();
        private _generateTextureSample;
        private _generateTextureLookup;
        private _writeTextureRead;
        private _generateConversionCode;
        private _writeOutput;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         * @param urlRewriter - optional url rewriter
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string): void;
    }
    /**
     * Register side effects for textureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import textureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Base block used for creating Smart Filter shader blocks for the SFE framework.
     * This block extends the functionality of CurrentScreenBlock, as both are used
     * to represent arbitrary 2D textures to compose, and work similarly.
     */
    export class SmartFilterTextureBlock extends CurrentScreenBlock {
        private _firstInit;
        /**
         * A boolean indicating whether this block should be the main input for the SFE pipeline.
         * If true, it can be used in SFE for auto-disabling.
         */
        isMainInput: boolean;
        /**
         * Gets the sampler name associated with this texture
         */
        get samplerName(): string;
        /**
         * Gets or sets the texture associated with this block
         */
        get texture(): Nullable<BaseTexture>;
        set texture(value: Nullable<BaseTexture>);
        /**
         * Create a new SmartFilterTextureBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the source input component
         */
        get source(): NodeMaterialConnectionPoint;
        /**
         * Gets a boolean indicating that this block is linked to an ImageSourceBlock
         */
        get hasImageSource(): boolean;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        protected _getMainUvName(state: NodeMaterialBuildState): string;
        protected _emitUvAndSampler(state: NodeMaterialBuildState): void;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - optional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /** {@inheritDoc} */
        _postBuildBlock(): void;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for smartFilterTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSmartFilterTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import smartFilterTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to retrieve the depth (zbuffer) of the scene
     * @since 5.0.0
     */
    export class SceneDepthBlock extends NodeMaterialBlock {
        private _samplerName;
        private _mainUVName;
        private _tempTextureRead;
        /**
         * Defines if the depth renderer should be setup in non linear mode
         */
        useNonLinearDepth: boolean;
        /**
         * Defines if the depth renderer should be setup in camera space Z mode (if set, useNonLinearDepth has no effect)
         */
        storeCameraSpaceZ: boolean;
        /**
         * Defines if the depth renderer should be setup in full 32 bits float mode
         */
        force32itsFloat: boolean;
        /**
         * Create a new SceneDepthBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the depth output component
         */
        get depth(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        /** {@inheritDoc} */
        get target(): NodeMaterialBlockTargets.Fragment | NodeMaterialBlockTargets.VertexAndFragment;
        private _getTexture;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial): void;
        private _injectVertexCode;
        private _writeTextureRead;
        private _writeOutput;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for sceneDepthBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSceneDepthBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sceneDepthBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to read a reflection texture from a sampler
     */
    export class ReflectionTextureBlock extends ReflectionTextureBaseBlock {
        protected _onGenerateOnlyFragmentCodeChanged(): boolean;
        protected _setTarget(): void;
        /**
         * Create a new ReflectionTextureBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world input component
         */
        get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera (or eye) position component
         */
        get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view input component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the r output component
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g output component
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b output component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a output component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - optional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for reflectionTextureBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectionTextureBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectionTextureBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Base block used to read a reflection texture from a sampler
     */
    export abstract class ReflectionTextureBaseBlock extends NodeMaterialBlock {
        /** @internal */
        _define3DName: string;
        /** @internal */
        _defineCubicName: string;
        /** @internal */
        _defineExplicitName: string;
        /** @internal */
        _defineProjectionName: string;
        /** @internal */
        _defineLocalCubicName: string;
        /** @internal */
        _defineSphericalName: string;
        /** @internal */
        _definePlanarName: string;
        /** @internal */
        _defineEquirectangularName: string;
        /** @internal */
        _defineMirroredEquirectangularFixedName: string;
        /** @internal */
        _defineEquirectangularFixedName: string;
        /** @internal */
        _defineSkyboxName: string;
        /** @internal */
        _defineOppositeZ: string;
        /** @internal */
        _cubeSamplerName: string;
        /** @internal */
        _2DSamplerName: string;
        /** @internal */
        _reflectionPositionName: string;
        /** @internal */
        _reflectionSizeName: string;
        protected _positionUVWName: string;
        protected _directionWname: string;
        protected _reflectionVectorName: string;
        /** @internal */
        _reflectionCoordsName: string;
        /** @internal */
        _reflectionMatrixName: string;
        protected _reflectionColorName: string;
        protected _worldPositionNameInFragmentOnlyMode: string;
        protected _texture: Nullable<BaseTexture>;
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<BaseTexture>;
        set texture(texture: Nullable<BaseTexture>);
        /** Indicates that no code should be generated in the vertex shader. Can be useful in some specific circumstances (like when doing ray marching for eg) */
        generateOnlyFragmentCode: boolean;
        protected static _OnGenerateOnlyFragmentCodeChanged(block: NodeMaterialBlock, _propertyName: string): boolean;
        protected _onGenerateOnlyFragmentCodeChanged(): boolean;
        protected _setTarget(): void;
        /**
         * Create a new ReflectionTextureBaseBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        abstract get position(): NodeMaterialConnectionPoint;
        /**
         * Gets the world position input component
         */
        abstract get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        abstract get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the world input component
         */
        abstract get world(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera (or eye) position component
         */
        abstract get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view input component
         */
        abstract get view(): NodeMaterialConnectionPoint;
        protected _getTexture(): Nullable<BaseTexture>;
        /**
         * Initialize the block
         * @param state - the build state
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the node based on the existing material
         * @param material defines the material to configure
         * @param additionalFilteringInfo defines additional info to be used when filtering inputs (we might want to skip some non relevant blocks)
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         * @param _subMesh - the submesh
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh, _subMesh?: SubMesh): void;
        /**
         * Gets the code to inject in the vertex shader
         * @param state current state of the node material building
         * @returns the shader code
         */
        handleVertexSide(state: NodeMaterialBuildState): string;
        /**
         * Handles the inits for the fragment code path
         * @param state node material build state
         */
        handleFragmentSideInits(state: NodeMaterialBuildState): void;
        /**
         * Generates the reflection coords code for the fragment code path
         * @param state defines the build state
         * @param worldNormalVarName name of the world normal variable
         * @param worldPos name of the world position variable. If not provided, will use the world position connected to this block
         * @param onlyReflectionVector if true, generates code only for the reflection vector computation, not for the reflection coordinates
         * @param doNotEmitInvertZ if true, does not emit the invertZ code
         * @returns the shader code
         */
        handleFragmentSideCodeReflectionCoords(state: NodeMaterialBuildState, worldNormalVarName: string, worldPos?: string, onlyReflectionVector?: boolean, doNotEmitInvertZ?: boolean): string;
        /**
         * Generates the reflection color code for the fragment code path
         * @param state defines the build state
         * @param lodVarName name of the lod variable
         * @param swizzleLookupTexture swizzle to use for the final color variable
         * @returns the shader code
         */
        handleFragmentSideCodeReflectionColor(state: NodeMaterialBuildState, lodVarName?: string, swizzleLookupTexture?: string): string;
        /**
         * Generates the code corresponding to the connected output points
         * @param state node material build state
         * @param varName name of the variable to output
         * @returns the shader code
         */
        writeOutputs(state: NodeMaterialBuildState, varName: string): string;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for reflectionTextureBaseBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterReflectionTextureBaseBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import reflectionTextureBaseBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add light in the fragment shader
     */
    export class LightBlock extends NodeMaterialBlock {
        private _lightId;
        /**
         * Gets or sets the light associated with this block
         */
        light: Nullable<Light>;
        /** Indicates that no code should be generated in the vertex shader. Can be useful in some specific circumstances (like when doing ray marching for eg) */
        generateOnlyFragmentCode: boolean;
        private static _OnGenerateOnlyFragmentCodeChanged;
        private _setTarget;
        /**
         * Create a new LightBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the world normal input component
         */
        get worldNormal(): NodeMaterialConnectionPoint;
        /**
         * Gets the camera (or eye) position component
         */
        get cameraPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the glossiness component
         */
        get glossiness(): NodeMaterialConnectionPoint;
        /**
         * Gets the glossiness power component
         */
        get glossPower(): NodeMaterialConnectionPoint;
        /**
         * Gets the diffuse color component
         */
        get diffuseColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the specular color component
         */
        get specularColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the view matrix component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the diffuse output component
         */
        get diffuseOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the specular output component
         */
        get specularOutput(): NodeMaterialConnectionPoint;
        /**
         * Gets the shadow output component
         */
        get shadow(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block
         * @param state - the build state
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - optional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to prepare for
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Checks if the block is ready
         * @param mesh - the mesh to check
         * @param nodeMaterial - the node material
         * @param defines - the list of defines
         * @returns true if ready
         */
        isReady(mesh: AbstractMesh, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines): boolean;
        /**
         * Update the uniforms and samples
         * @param state - the build state
         * @param nodeMaterial - the node material
         * @param defines - the material defines
         * @param uniformBuffers - the uniform buffers
         */
        updateUniformsAndSamples(state: NodeMaterialBuildState, nodeMaterial: NodeMaterial, defines: NodeMaterialDefines, uniformBuffers: string[]): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        private _injectVertexCode;
        private _injectUBODeclaration;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for lightBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLightBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lightBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide an image for a TextureBlock
     */
    export class ImageSourceBlock extends NodeMaterialBlock {
        private static _DefaultTextureByEngine;
        private _samplerName;
        protected _texture: Nullable<Texture>;
        private static _GetDefaultTexture;
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<Texture>;
        set texture(texture: Nullable<Texture>);
        /**
         * Gets the sampler name associated with this image source
         */
        get samplerName(): string;
        /**
         * Creates a new ImageSourceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param _nodeMaterial - the node material
         */
        bind(effect: Effect, _nodeMaterial: NodeMaterial): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get source(): NodeMaterialConnectionPoint;
        /**
         * Gets the dimension component
         */
        get dimensions(): NodeMaterialConnectionPoint;
        protected _buildBlock(state: NodeMaterialBuildState): this;
        protected _dumpPropertiesCode(ignoreTexture?: boolean): string;
        /**
         * Serializes the block
         * @param ignoreTexture - whether to skip texture serialization
         * @returns the serialized object
         */
        serialize(ignoreTexture?: boolean): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         * @param urlRewriter - optional url rewriter
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string, urlRewriter?: (url: string) => string): void;
    }
    /**
     * Register side effects for imageSourceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterImageSourceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import imageSourceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to add support for scene fog
     */
    export class FogBlock extends NodeMaterialBlock {
        private _fogDistanceName;
        private _fogParameters;
        /**
         * Create a new FogBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the world position input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /**
         * Gets the view input component
         */
        get view(): NodeMaterialConnectionPoint;
        /**
         * Gets the color input component
         */
        get input(): NodeMaterialConnectionPoint;
        /**
         * Gets the fog color input component
         */
        get fogColor(): NodeMaterialConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block
         * @param state - the build state
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Auto configure the block based on the material
         * @param material - the node material
         * @param additionalFilteringInfo - optional filtering info
         */
        autoConfigure(material: NodeMaterial, additionalFilteringInfo?: (node: NodeMaterialBlock) => boolean): void;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to prepare for
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this;
    }
    /**
     * Register side effects for fogBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFogBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import fogBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to provide an depth texture for a TextureBlock
     */
    export class DepthSourceBlock extends ImageSourceBlock {
        /**
         * Creates a new DepthSourceBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<Texture>;
        set texture(texture: Nullable<Texture>);
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        protected _dumpPropertiesCode(): string;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
    }
    /**
     * Register side effects for depthSourceBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDepthSourceBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import depthSourceBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Base block used as input for post process
     */
    export class CurrentScreenBlock extends NodeMaterialBlock {
        protected _samplerName: string;
        protected _linearDefineName: string;
        protected _gammaDefineName: string;
        protected _mainUVName: string;
        protected _tempTextureRead: string;
        protected _texture: Nullable<BaseTexture>;
        /**
         * The name of the sampler to read the screen texture from.
         */
        get samplerName(): string;
        /**
         * Gets or sets the texture associated with the node
         */
        get texture(): Nullable<BaseTexture>;
        set texture(value: Nullable<BaseTexture>);
        /**
         * Gets or sets a boolean indicating if content needs to be converted to gamma space
         */
        convertToGammaSpace: boolean;
        /**
         * Gets or sets a boolean indicating if content needs to be converted to linear space
         */
        convertToLinearSpace: boolean;
        /**
         * Create a new CurrentScreenBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the uv input component
         */
        get uv(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgba output component
         */
        get rgba(): NodeMaterialConnectionPoint;
        /**
         * Gets the rgb output component
         */
        get rgb(): NodeMaterialConnectionPoint;
        /**
         * Gets the r output component
         */
        get r(): NodeMaterialConnectionPoint;
        /**
         * Gets the g output component
         */
        get g(): NodeMaterialConnectionPoint;
        /**
         * Gets the b output component
         */
        get b(): NodeMaterialConnectionPoint;
        /**
         * Gets the a output component
         */
        get a(): NodeMaterialConnectionPoint;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /** {@inheritDoc} */
        get target(): NodeMaterialBlockTargets.Fragment | NodeMaterialBlockTargets.VertexAndFragment;
        /**
         * Prepare the list of defines
         * @param defines - the material defines
         */
        prepareDefines(defines: NodeMaterialDefines): void;
        /**
         * Checks if the block is ready
         * @returns true if ready
         */
        isReady(): boolean;
        protected _getMainUvName(_state: NodeMaterialBuildState): string;
        protected _injectVertexCode(state: NodeMaterialBuildState): void;
        protected _writeTextureRead(state: NodeMaterialBuildState, vertexMode?: boolean): void;
        protected _writeOutput(state: NodeMaterialBuildState, output: NodeMaterialConnectionPoint, swizzle: string, vertexMode?: boolean): void;
        protected _emitUvAndSampler(state: NodeMaterialBuildState): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
        /**
         * Serializes the block
         * @returns the serialized object
         */
        serialize(): any;
        /**
         * Deserializes the block
         * @param serializationObject - the serialization object
         * @param scene - the scene
         * @param rootUrl - the root url
         */
        _deserialize(serializationObject: any, scene: Scene, rootUrl: string): void;
    }
    /**
     * Register side effects for currentScreenBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCurrentScreenBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import currentScreenBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to implement clip planes
     */
    export class ClipPlanesBlock extends NodeMaterialBlock {
        /**
         * Create a new ClipPlanesBlock
         * @param name defines the block name
         */
        constructor(name: string);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Initialize the block and prepare the context for build
         * @param state defines the state that will be used for the build
         */
        initialize(state: NodeMaterialBuildState): void;
        private _initShaderSourceAsync;
        /**
         * Gets the worldPosition input component
         */
        get worldPosition(): NodeMaterialConnectionPoint;
        /** {@inheritDoc} */
        get target(): NodeMaterialBlockTargets;
        /** {@inheritDoc} */
        set target(value: NodeMaterialBlockTargets);
        /**
         * Prepares the shader defines related to clip planes for the given mesh
         * @param defines - the material defines
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to prepare for
         */
        prepareDefines(defines: NodeMaterialDefines, nodeMaterial: NodeMaterial, mesh?: AbstractMesh): void;
        /**
         * Bind data to effect
         * @param effect - the effect to bind to
         * @param nodeMaterial - the node material
         * @param mesh - the mesh to bind for
         */
        bind(effect: Effect, nodeMaterial: NodeMaterial, mesh?: Mesh): void;
        protected _buildBlock(state: NodeMaterialBuildState): this | undefined;
    }
    /**
     * Register side effects for clipPlanesBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterClipPlanesBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import clipPlanesBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    export const GreasedLineUseOffsetsSimpleMaterialDefine = "GREASED_LINE_USE_OFFSETS";
    /**
     * GreasedLineSimpleMaterial
     */
    export class GreasedLineSimpleMaterial extends ShaderMaterial implements IGreasedLineMaterial {
        /**
         * Force to use GLSL in WebGPU
         */
        static ForceGLSL: boolean;
        private _visibility;
        private _width;
        private _useDash;
        private _dashCount;
        private _dashArray;
        private _dashRatio;
        private _dashOffset;
        private _useColors;
        private _color;
        private _colors;
        private _colorsDistributionType;
        private _colorMode;
        private _colorsSampling;
        private _resolution;
        private _sizeAttenuation;
        private _colorsTexture;
        private _cameraFacing;
        /**
         * GreasedLineSimple material constructor
         * @param name material name
         * @param scene the scene
         * @param options material options
         */
        constructor(name: string, scene: Scene, options: GreasedLineMaterialOptions);
        /**
         * Disposes the plugin material.
         */
        dispose(): void;
        private _setColorModeAndColorDistributionType;
        /**
         * Updates the material. Use when material created in lazy mode.
         */
        updateLazy(): void;
        /**
         * Returns the colors used to colorize the line
         */
        get colors(): Nullable<Color3[]>;
        /**
         * Sets the colors used to colorize the line
         */
        set colors(value: Nullable<Color3[]>);
        /**
         * Creates or updates the colors texture
         * @param colors color table RGBA
         * @param lazy if lazy, the colors are not updated
         * @param forceNewTexture force creation of a new texture
         */
        setColors(colors: Nullable<Color3[]>, lazy?: boolean, forceNewTexture?: boolean): void;
        /**
         * Gets the colors texture
         */
        get colorsTexture(): RawTexture;
        /**
         * Sets the colorsTexture
         */
        set colorsTexture(value: RawTexture);
        /**
         * Line base width. At each point the line width is calculated by widths[pointIndex] * width
         */
        get width(): number;
        /**
         * Line base width. At each point the line width is calculated by widths[pointIndex] * width
         */
        set width(value: number);
        /**
         * Whether to use the colors option to colorize the line
         */
        get useColors(): boolean;
        set useColors(value: boolean);
        /**
         * The type of sampling of the colors texture. The values are the same when using with textures.
         */
        get colorsSampling(): number;
        /**
         * The type of sampling of the colors texture. The values are the same when using with textures.
         */
        set colorsSampling(value: number);
        /**
         * Normalized value of how much of the line will be visible
         * 0 - 0% of the line will be visible
         * 1 - 100% of the line will be visible
         */
        get visibility(): number;
        set visibility(value: number);
        /**
         * Turns on/off dash mode
         */
        get useDash(): boolean;
        /**
         * Turns on/off dash mode
         */
        set useDash(value: boolean);
        /**
         * Gets the dash offset
         */
        get dashOffset(): number;
        /**
         * Sets the dash offset
         */
        set dashOffset(value: number);
        /**
         * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.
         */
        get dashRatio(): number;
        /**
         * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.
         */
        set dashRatio(value: number);
        /**
         * Gets the number of dashes in the line
         */
        get dashCount(): number;
        /**
         * Sets the number of dashes in the line
         * @param value dash
         */
        set dashCount(value: number);
        /**
         * False means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines
         */
        get sizeAttenuation(): boolean;
        /**
         * Turn on/off attenuation of the width option and widths array.
         * @param value false means 1 unit in width = 1 unit on scene, true means 1 unit in width is reduced on the screen to make better looking lines
         */
        set sizeAttenuation(value: boolean);
        /**
         * Gets the color of the line
         */
        get color(): Color3;
        /**
         * Sets the color of the line
         * @param value Color3
         */
        set color(value: Color3);
        /**
         * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.
         * The simple material always needs a color to be set. If you set it to null it will set the color to the default color (GreasedLineSimpleMaterial.DEFAULT_COLOR).
         * @param value color
         */
        setColor(value: Nullable<Color3>): void;
        /**
         * Gets the color distributiopn type
         */
        get colorsDistributionType(): GreasedLineMeshColorDistributionType;
        /**
         * Sets the color distribution type
         * @see GreasedLineMeshColorDistributionType
         * @param value color distribution type
         */
        set colorsDistributionType(value: GreasedLineMeshColorDistributionType);
        /**
         * Gets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.
         * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.
         * @see GreasedLineMeshColorMode
         */
        get colorMode(): GreasedLineMeshColorMode;
        /**
         * Sets the mixing mode of the color and colors paramaters. Default value is GreasedLineMeshColorMode.SET.
         * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.
         * @see GreasedLineMeshColorMode
         */
        set colorMode(value: GreasedLineMeshColorMode);
        /**
         * Gets the resolution
         */
        get resolution(): Vector2;
        /**
         * Sets the resolution
         * @param value resolution of the screen for GreasedLine
         */
        set resolution(value: Vector2);
        /**
         * Serializes this plugin material
         * @returns serializationObjec
         */
        serialize(): any;
        /**
         * Parses a serialized objects
         * @param source serialized object
         * @param scene scene
         * @param _rootUrl root url for textures
         */
        parse(source: any, scene: Scene, _rootUrl: string): void;
    }


    /**
     * Returns WGSL custom shader code
     * @param shaderType vertex or fragment
     * @param cameraFacing is in camera facing mode?
     * @returns WGSL custom shader code
     */
    /** @internal */
    export function GetCustomCode(shaderType: string, cameraFacing: boolean): Nullable<{
        [pointName: string]: string;
    }>;


    /**
     * Returns GLSL custom shader code
     * @param shaderType vertex or fragment
     * @param cameraFacing is in camera facing mode?
     * @returns GLSL custom shader code
     */
    /** @internal */
    export function GetCustomCode(shaderType: string, cameraFacing: boolean): Nullable<{
        [pointName: string]: string;
    }>;


    /** This file must only contain pure code and pure imports */
    /**
     * @internal
     */
    export class MaterialGreasedLineDefines extends MaterialDefines {
        /**
         * The material has a color option specified
         */
        GREASED_LINE_HAS_COLOR: boolean;
        /**
         * The material's size attenuation optiom
         */
        GREASED_LINE_SIZE_ATTENUATION: boolean;
        /**
         * The type of color distribution is set to line this value equals to true.
         */
        GREASED_LINE_COLOR_DISTRIBUTION_TYPE_LINE: boolean;
        /**
         * True if scene is in right handed coordinate system.
         */
        GREASED_LINE_RIGHT_HANDED_COORDINATE_SYSTEM: boolean;
        /**
         * True if the line is in camera facing mode
         */
        GREASED_LINE_CAMERA_FACING: boolean;
        /**
         * True if the line uses offsets
         */
        GREASED_LINE_USE_OFFSETS: boolean;
    }
    /**
     * GreasedLinePluginMaterial for GreasedLineMesh/GreasedLineRibbonMesh.
     * Use the GreasedLineBuilder.CreateGreasedLineMaterial function to create and instance of this class.
     */
    export class GreasedLinePluginMaterial extends MaterialPluginBase implements IGreasedLineMaterial {
        /**
         * Plugin name
         */
        static readonly GREASED_LINE_MATERIAL_NAME = "GreasedLinePluginMaterial";
        /**
         * Force all the greased lines to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Whether to use the colors option to colorize the line
         */
        useColors: boolean;
        /**
         * Normalized value of how much of the line will be visible
         * 0 - 0% of the line will be visible
         * 1 - 100% of the line will be visible
         */
        visibility: number;
        /**
         * Dash offset
         */
        dashOffset: number;
        /**
         * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.
         */
        dashRatio: number;
        /**
         * Line base width. At each point the line width is calculated by widths[pointIndex] * width
         */
        width: number;
        /**
         * The type of sampling of the colors texture. The values are the same when using with textures.
         */
        colorsSampling: number;
        /**
         * Turns on/off dash mode
         */
        useDash: boolean;
        /**
         * The mixing mode of the color paramater. Default value is GreasedLineMeshColorMode.SET
         * @see GreasedLineMeshColorMode
         */
        colorMode: GreasedLineMeshColorMode;
        /**
         * You can provide a colorsTexture to use instead of one generated from the 'colors' option
         */
        colorsTexture: Nullable<RawTexture>;
        private _scene;
        private _dashCount;
        private _dashArray;
        private _color;
        private _colors;
        private _colorsDistributionType;
        private _resolution;
        private _aspect;
        private _sizeAttenuation;
        private _cameraFacing;
        private _engine;
        private _forceGLSL;
        /**
         * Gets a boolean indicating that the plugin is compatible with a given shader language
         * @param _shaderLanguage The shader language to use
         * @returns true if the plugin is compatible with the shader language. Return always true since both GLSL and WGSL are supported
         */
        isCompatible(_shaderLanguage: ShaderLanguage): boolean;
        /**
         * Creates a new instance of the GreasedLinePluginMaterial
         * @param material Base material for the plugin
         * @param scene The scene
         * @param options Plugin options
         */
        constructor(material: Material, scene?: Scene, options?: GreasedLineMaterialOptions);
        /**
         * Get the shader attributes
         * @param attributes array which will be filled with the attributes
         */
        getAttributes(attributes: string[]): void;
        /**
         * Get the shader samplers
         * @param samplers
         */
        getSamplers(samplers: string[]): void;
        /**
         * Get the shader textures
         * @param activeTextures array which will be filled with the textures
         */
        getActiveTextures(activeTextures: BaseTexture[]): void;
        /**
         * Get the shader uniforms
         * @param shaderLanguage The shader language to use
         * @returns uniforms
         */
        getUniforms(shaderLanguage?: ShaderLanguage): {
            ubo: {
                name: string;
                size: number;
                type: string;
            }[];
            vertex: string;
            fragment: string;
        };
        get isEnabled(): boolean;
        /**
         * Bind the uniform buffer
         * @param uniformBuffer
         */
        bindForSubMesh(uniformBuffer: UniformBuffer): void;
        /**
         * Prepare the defines
         * @param defines
         * @param _scene
         * @param mesh
         */
        prepareDefines(defines: MaterialGreasedLineDefines, _scene: Scene, mesh: AbstractMesh): void;
        /**
         * Get the class name
         * @returns class name
         */
        getClassName(): string;
        /**
         * Get shader code
         * @param shaderType vertex/fragment
         * @param shaderLanguage GLSL or WGSL
         * @returns shader code
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        /**
         * Disposes the plugin material.
         */
        dispose(): void;
        /**
         * Returns the colors used to colorize the line
         */
        get colors(): Nullable<Color3[]>;
        /**
         * Sets the colors used to colorize the line
         */
        set colors(value: Nullable<Color3[]>);
        /**
         * Creates or updates the colors texture
         * @param colors color table RGBA
         * @param lazy if lazy, the colors are not updated
         * @param forceNewTexture force creation of a new texture
         */
        setColors(colors: Nullable<Color3[]>, lazy?: boolean, forceNewTexture?: boolean): void;
        /**
         * Updates the material. Use when material created in lazy mode.
         */
        updateLazy(): void;
        /**
         * Gets the number of dashes in the line
         */
        get dashCount(): number;
        /**
         * Sets the number of dashes in the line
         * @param value dash
         */
        set dashCount(value: number);
        /**
         * If set to true the line will be rendered always with the same width regardless how far it is located from the camera.
         * Not supported for non camera facing lines.
         */
        get sizeAttenuation(): boolean;
        /**
         * Turn on/off size attenuation of the width option and widths array.
         * Not supported for non camera facing lines.
         * @param value If set to true the line will be rendered always with the same width regardless how far it is located from the camera.
         */
        set sizeAttenuation(value: boolean);
        /**
         * Gets the color of the line
         */
        get color(): Nullable<Color3>;
        /**
         * Sets the color of the line
         * @param value Color3 or null to clear the color. You need to clear the color if you use colors and useColors = true
         */
        set color(value: Nullable<Color3>);
        /**
         * Sets the color of the line. If set the whole line will be mixed with this color according to the colorMode option.
         * @param value color
         * @param doNotMarkDirty if true, the material will not be marked as dirty
         */
        setColor(value: Nullable<Color3>, doNotMarkDirty?: boolean): void;
        /**
         * Gets the color distributiopn type
         */
        get colorsDistributionType(): GreasedLineMeshColorDistributionType;
        /**
         * Sets the color distribution type
         * @see GreasedLineMeshColorDistributionType
         * @param value color distribution type
         */
        set colorsDistributionType(value: GreasedLineMeshColorDistributionType);
        /**
         * Gets the resolution
         */
        get resolution(): Vector2;
        /**
         * Sets the resolution
         * @param value resolution of the screen for GreasedLine
         */
        set resolution(value: Vector2);
        /**
         * Serializes this plugin material
         * @returns serializationObjec
         */
        serialize(): any;
        /**
         * Parses a serialized objects
         * @param source serialized object
         * @param scene scene
         * @param rootUrl root url for textures
         */
        parse(source: any, scene: Scene, rootUrl: string): void;
        /**
         * Makes a duplicate of the current configuration into another one.
         * @param plugin define the config where to copy the info
         */
        copyTo(plugin: MaterialPluginBase): void;
        private _isGLSL;
    }
    /**
     * Register side effects for greasedLinePluginMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGreasedLinePluginMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import greasedLinePluginMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Interface which defines the available methods for a GreasedLineMaterial
     */
    export interface IGreasedLineMaterial {
        /**
         * Normalized value of how much of the line will be visible
         * 0 - 0% of the line will be visible
         * 1 - 100% of the line will be visible
         */
        visibility: number;
        /**
         * Line base width. At each point the line width is calculated by widths[pointIndex] * width
         */
        width: number;
        /**
         * Turns on/off dash mode
         */
        useDash: boolean;
        /**
         * @see GreasedLinePluginMaterial.setDashCount
         * Number of dashes in the line.
         * Defaults to 1.
         */
        dashCount: number;
        /**
         * Dash offset
         */
        dashOffset: number;
        /**
         * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.
         */
        dashRatio: number;
        /**
         * Whether to use the colors option to colorize the line
         */
        useColors: boolean;
        /**
         * The mixing mode of the color paramater. Default value is GreasedLineMeshColorMode.SET.
         * MATERIAL_TYPE_SIMPLE mixes the color and colors of the greased line material.
         * MATERIAL_TYPE_STANDARD and MATERIAL_TYPE_PBR mixes the color from the base material with the color and/or colors of the greased line material.
         * @see GreasedLineMeshColorMode
         */
        colorMode: GreasedLineMeshColorMode;
        /**
         * Colors of the line segments.
         * Defaults to empty.
         */
        colors: Nullable<Color3[]>;
        /**
         * If false then width units = scene units. If true then line will width be reduced.
         * Defaults to false.
         */
        sizeAttenuation: boolean;
        /**
         * Color of the line. Applies to all line segments.
         * Defaults to White.
         */
        color: Nullable<Color3>;
        /**
         * The method used to distribute the colors along the line.
         * You can use segment distribution when each segment will use on color from the color table.
         * Or you can use line distribution when the colors are distributed evenly along the line ignoring the segments.
         */
        colorsDistributionType: GreasedLineMeshColorDistributionType;
        /**
         * Defaults to engine.getRenderWidth() and engine.getRenderHeight()
         * Rendering resolution
         */
        resolution: Vector2;
        /**
         * You can provide a colorsTexture to use instead of one generated from the 'colors' option
         */
        colorsTexture: Nullable<RawTexture>;
        /**
         * Allows to change the color without marking the material dirty.
         * MATERIAL_TYPE_STANDARD and MATERIAL_TYPE_PBR material's shaders will get recompiled if there was no color set and you set a color or when there was a color set and you set it to null.
         * @param value the color
         * @param doNotMarkDirty the flag
         */
        setColor(value: Nullable<Color3>, doNotMarkDirty?: boolean): void;
        /**
         * Set the colors
         * @param colors colors array
         * @param lazy if true the colors texture will not be updated
         * @param forceNewTexture forces to create a new colors texture
         */
        setColors(colors: Nullable<Color3[]>, lazy: boolean, forceNewTexture?: boolean): void;
        /**
         * Creates and sets the colors texture from the colors array which was created in lazy mode
         */
        updateLazy(): void;
    }
    /**
     * Material types for GreasedLine
     * {@link https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/greased_line#materialtype}
     */
    export enum GreasedLineMeshMaterialType {
        /**
         * StandardMaterial
         */
        MATERIAL_TYPE_STANDARD = 0,
        /**
         * PBR Material
         */
        MATERIAL_TYPE_PBR = 1,
        /**
         * Simple and fast shader material without texture, light, fog, instances, ... support.
         * Just raw colored lines.
         * Dashing and visibility is supported.
         */
        MATERIAL_TYPE_SIMPLE = 2
    }
    /**
     * Color blending mode of the @see GreasedLineMaterial and the base material
     * {@link https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/greased_line#colormode}
     */
    export enum GreasedLineMeshColorMode {
        /**
         * Color blending mode SET
         */
        COLOR_MODE_SET = 0,
        /**
         * Color blending mode ADD
         */
        COLOR_MODE_ADD = 1,
        /**
         * Color blending mode ADD
         */
        COLOR_MODE_MULTIPLY = 2
    }
    /**
     * Color distribution type of the @see colors.
     * {@link https://doc.babylonjs.com/features/featuresDeepDive/mesh/creation/param/greased_line#colordistributiontype}
     *
     */
    export enum GreasedLineMeshColorDistributionType {
        /**
         * Colors distributed between segments of the line
         */
        COLOR_DISTRIBUTION_TYPE_SEGMENT = 0,
        /**
         * Colors distributed along the line ingoring the segments
         */
        COLOR_DISTRIBUTION_TYPE_LINE = 1
    }
    /**
     * Options for GreasedLineMaterial
     */
    export interface GreasedLineMaterialOptions {
        /**
         * Force the greased lines to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        forceGLSL?: boolean;
        /**
         * Line width. If sizeAttenuation os false scene units will be used for width.
         * Defaults to 0.1 if @see sizeAttenuation is false, or to 1 if it's true.
         */
        width?: number;
        /**
         * If false then width units = scene units. If true then line will width be reduced.
         * Defaults to false.
         */
        sizeAttenuation?: boolean;
        /**
         * Type of the material to use to render the line.
         * Defaults to StandardMaterial.
         */
        materialType?: GreasedLineMeshMaterialType;
        /**
         * Color of the line. Applies to all line segments.
         * Defaults to White.
         */
        color?: Color3;
        /**
         * Color mode of the line. Applies to all line segments.
         * The pixel color from the material shader will be modified with the value of @see color using the colorMode.
         * Defaults to @see GreasedLineMeshColorMode.SET
         */
        colorMode?: GreasedLineMeshColorMode;
        /**
         * Colors of the line segments.
         * Defaults to empty.
         */
        colors?: Color3[];
        /**
         * If true, @see colors are used, otherwise they're ignored.
         * Defaults to false.
         */
        useColors?: boolean;
        /**
         * Sampling type of the colors texture
         * Defaults to NEAREST_NEAREST.
         */
        colorsSampling?: number;
        /**
         * The method used to distribute the colors along the line.
         * You can use segment distribution when each segment will use on color from the color table.
         * Or you can use line distribution when the colors are distributed evenly along the line ignoring the segments.
         */
        colorDistributionType?: GreasedLineMeshColorDistributionType;
        /**
         * If true, dashing is used.
         * Defaults to false.
         */
        useDash?: boolean;
        /**
         * @see GreasedLinePluginMaterial.setDashCount
         * Number of dashes in the line.
         * Defaults to 1.
         */
        dashCount?: number;
        /**
         * Offset of the dashes along the line. 0 to 1.
         * Defaults to 0.
         * @see GreasedLinePluginMaterial.setDashOffset
         */
        dashOffset?: number;
        /**
         * Length of the dash. 0 to 1. 0.5 means half empty, half drawn.
         * Defaults to 0.5.
         * @see GreasedLinePluginMaterial.setDashRatio
         */
        dashRatio?: number;
        /**
         * Sets the line length visibility.
         * 0 - 0% of the line will be visible.
         * 1 - 100% of the line will be visible.
         * @see GreasedLinePluginMaterial.setVisibility
         */
        visibility?: number;
        /**
         * Defaults to engine.getRenderWidth() and engine.getRenderHeight()
         * Rendering resolution
         */
        resolution?: Vector2;
        /**
         * Whether to use camera facing for the line.
         * Defaults to true.
         */
        cameraFacing?: boolean;
        /**
         * You can provide a colorsTexture to use instead of one generated from the 'colors' option
         */
        colorsTexture?: RawTexture;
    }


    /**
     * Default settings for GreasedLine materials
     */
    export class GreasedLineMaterialDefaults {
        /**
         * Default line color for newly created lines
         */
        static DEFAULT_COLOR: Color3;
        /**
         * Default line width when sizeAttenuation is true
         */
        static DEFAULT_WIDTH_ATTENUATED: number;
        /**
         * Defaule line width
         */
        static DEFAULT_WIDTH: number;
        /**
         * Empty colors texture for WebGPU
         */
        static EmptyColorsTexture: Nullable<RawTexture>;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Plugin for GaussianSplattingMaterial that replaces per-splat colors with a
     * solid color per compound-mesh part. Each part index maps to a single Color3
     * value, which is looked up in a uniform array in the fragment shader.
     */
    export class GaussianSplattingSolidColorMaterialPlugin extends MaterialPluginBase {
        private _partColors;
        private _maxPartCount;
        private _isEnabled;
        private readonly _partColorArray;
        /**
         * Whether the solid-color override is active. When false, splats
         * render with their original per-splat colors.
         * Toggled via a shader uniform so no recompilation is required.
         */
        isEnabled: boolean;
        /** @internal */
        _onIsEnabledChanged(): void;
        /**
         * Creates a new GaussianSplatSolidColorPlugin.
         * @param material The GaussianSplattingMaterial to attach the plugin to.
         * @param partColors A map from part index to the solid Color3 for that part.
         * @param maxPartCount The maximum number of parts supported. This determines the size of the uniform array.
         */
        constructor(material: GaussianSplattingMaterial, partColors: Color3[], maxPartCount?: number);
        /**
         * Updates the part colors dynamically.
         * @param partColors A map from part index to the solid Color3 for that part.
         */
        updatePartColors(partColors: Color3[]): void;
        /**
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Indicates this plugin supports both GLSL and WGSL.
         * @param shaderLanguage the shader language to check
         * @returns true for GLSL and WGSL
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        /**
         * Always ready — no textures or async resources to wait on.
         * @param _defines the defines
         * @param _scene the scene
         * @param _engine the engine
         * @param _subMesh the submesh
         * @returns true
         */
        isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean;
        /**
         * Returns custom shader code fragments to inject solid-color rendering.
         *
         * @param shaderType "vertex" or "fragment"
         * @param shaderLanguage the shader language to use (default: GLSL)
         * @returns null or a map of injection point names to code strings
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        private _getCustomCodeGLSL;
        private _getCustomCodeWGSL;
        /**
         * Registers the plugin uniforms with the engine so that
         * the Effect can resolve their locations.
         * @returns uniform descriptions
         */
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size?: number;
                type?: string;
                arraySize?: number;
            }>;
            vertex?: string;
            fragment?: string;
            externalUniforms?: string[];
        };
        /**
         * Binds the plugin uniforms each frame.
         * @param _uniformBuffer the uniform buffer (unused — we bind directly on the effect)
         * @param _scene the current scene
         * @param _engine the current engine
         * @param subMesh the submesh being rendered
         */
        bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void;
    }
    /**
     * Register side effects for gaussianSplattingSolidColorMaterialPlugin.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingSolidColorMaterialPlugin(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingSolidColorMaterialPlugin.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Computes the maximum number of Gaussian Splatting compound parts supported by the given engine.
     * The limit is derived from the engine's maximum vertex uniform vectors capability.
     * @param engine - The engine to compute the limit for
     * @returns The maximum number of parts supported
     */
    export function GetGaussianSplattingMaxPartCount(engine: AbstractEngine): number;
    /**
     * @deprecated Use {@link GetGaussianSplattingMaxPartCount} with an engine instance instead.
     */
    export const GaussianSplattingMaxPartCount = 128;
    /**
     * GaussianSplattingMaterial material used to render Gaussian Splatting
     * @experimental
     */
    export class GaussianSplattingMaterial extends PushMaterial {
        /**
         * Instantiates a Gaussian Splatting Material in the given scene
         * @param name The friendly name of the material
         * @param scene The scene to add the material to
         */
        constructor(name: string, scene?: Scene);
        /**
         * Point spread function (default 0.3). Can be overriden per GS material
         */
        static KernelSize: number;
        /**
         * Compensation
         */
        static Compensation: boolean;
        /**
         * Point spread function (default 0.3). Can be overriden per GS material, otherwise, using default static `KernelSize` value
         */
        kernelSize: number;
        private _compensation;
        private _isDirty;
        /**
         * Set compensation default value is `GaussianSplattingMaterial.Compensation`
         */
        set compensation(value: boolean);
        /**
         * Get compensation
         */
        get compensation(): boolean;
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * Specifies whether or not this material should be rendered in alpha test mode.
         * @returns false
         */
        needAlphaTesting(): boolean;
        /**
         * Specifies whether or not this material should be rendered in alpha blend mode.
         * @returns true
         */
        needAlphaBlending(): boolean;
        protected static _Attribs: string[];
        protected static _Samplers: string[];
        protected static _UniformBuffers: string[];
        protected static _VoxelUniforms: string[];
        protected static _VoxelSamplers: string[];
        protected static _Uniforms: string[];
        private _sourceMesh;
        /**
         * Checks whether the material is ready to be rendered for a given mesh.
         * @param mesh The mesh to render
         * @param subMesh The submesh to check against
         * @returns true if all the dependencies are ready (Textures, Effects...)
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh): boolean;
        /**
         * GaussianSplattingMaterial belongs to a single mesh
         * @param mesh mesh this material belongs to
         */
        setSourceMesh(mesh: GaussianSplattingMesh): void;
        /**
         * Gets the source mesh of this material, which is the Gaussian Splatting mesh that provides the data for rendering
         * @returns The Gaussian Splatting mesh that provides the data for rendering, or null if not set
         */
        getSourceMesh(): GaussianSplattingMesh | null;
        /**
         * Bind material effect for a specific Gaussian Splatting mesh
         * @param mesh Gaussian splatting mesh
         * @param effect Splatting material or node material
         * @param scene scene that contains mesh and camera used for rendering
         */
        static BindEffect(mesh: Mesh, effect: Effect, scene: Scene): void;
        /**
         * Bind SOG dequantization uniforms + raw textures.
         * @internal
         */
        protected static _BindSogUniforms(gsMesh: GaussianSplattingMesh, effect: Effect): void;
        /**
         * Binds the submesh to this material by preparing the effect and shader to draw
         * @param world defines the world transformation matrix
         * @param mesh defines the mesh containing the submesh
         * @param subMesh defines the submesh to bind the material to
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        protected static _BindEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial, scene: Scene): void;
        private _voxelMissingTextureWarned;
        private _voxelPartWorldData;
        private readonly _voxelPartVisibilityData;
        protected _bindVoxelEffectUniforms(gsMesh: GaussianSplattingMesh, gsMaterial: GaussianSplattingMaterial, shaderMaterial: ShaderMaterial): boolean;
        /**
         * Create a voxel rendering material for a Gaussian Splatting mesh, for use with IBL shadow voxelization.
         * The returned ShaderMaterial's onBindObservable binds the GS mesh-side uniforms (textures, alpha, dataTextureSize, part data).
         * The caller (e.g. iblShadowsVoxelRenderer) is responsible for setting the per-slab uniforms on the returned material:
         * viewMatrix, invWorldScale, nearPlane, farPlane, stepSize.
         * @param scene scene it belongs to
         * @param shaderLanguage GLSL or WGSL
         * @param maxDrawBuffers number of draw buffers (MRT outputs) per voxelization slab
         * @param compoundMesh whether the mesh is a compound mesh
         * @returns voxel rendering shader material
         */
        makeVoxelRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, maxDrawBuffers: number, compoundMesh?: boolean): ShaderMaterial;
        /**
         * Create a depth rendering material for a Gaussian Splatting mesh
         * @param scene scene it belongs to
         * @param shaderLanguage GLSL or WGSL
         * @param alphaBlendedDepth whether to enable alpha blended depth rendering
         * @param compoundMesh whether the mesh is a compound mesh
         * @returns depth rendering shader material
         */
        makeDepthRenderingMaterial(scene: Scene, shaderLanguage: ShaderLanguage, alphaBlendedDepth?: boolean, compoundMesh?: boolean): ShaderMaterial;
        protected static _MakeGaussianSplattingShadowDepthWrapper(scene: Scene, shaderLanguage: ShaderLanguage): ShadowDepthWrapper;
        /**
         * Clones the material.
         * @param name The cloned name.
         * @returns The cloned material.
         */
        clone(name: string): GaussianSplattingMaterial;
        /**
         * Serializes the current material to its JSON representation.
         * @returns The JSON representation.
         */
        serialize(): any;
        /**
         * Gets the class name of the material
         * @returns "GaussianSplattingMaterial"
         */
        getClassName(): string;
        /**
         * Parse a JSON input to create back a Gaussian Splatting material.
         * @param source The JSON data to parse
         * @param scene The scene to create the parsed material in
         * @param rootUrl The root url of the assets the material depends upon
         * @returns the instantiated GaussianSplattingMaterial.
         */
        static Parse(source: any, scene: Scene, rootUrl: string): GaussianSplattingMaterial;
    }
    /**
     * Register side effects for gaussianSplattingMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Plugin for GaussianSplattingMaterial that replaces per-splat color output with
     * a pre-computed picking color for GPU-based hit testing.
     *
     * The picking color is computed on the CPU by encoding a 24-bit picking ID as RGB
     * (matching the readback decoding in GPUPicker).
     * @experimental
     */
    export class GaussianSplattingGpuPickingMaterialPlugin extends MaterialPluginBase {
        private _pickingColor;
        private _isCompound;
        private _partPickingColors;
        private _partVisibility;
        private _defaultPartVisibility;
        private _maxPartCount;
        /**
         * Creates a new GaussianSplattingGpuPickingMaterialPlugin.
         * @param material The GaussianSplattingMaterial to attach the plugin to.
         * @param maxPartCount The maximum number of parts supported for compound meshes.
         */
        constructor(material: GaussianSplattingMaterial, maxPartCount?: number);
        /**
         * Encodes a 24-bit picking ID into normalized RGB components.
         * @param id The picking ID to encode
         * @returns A tuple [r, g, b] with values in [0, 1]
         */
        static EncodeIdToColor(id: number): [number, number, number];
        /**
         * Sets the picking color for a non-compound mesh from a picking ID.
         * The ID is encoded into an RGB color on the CPU.
         * @param id The 24-bit picking ID.
         */
        set meshId(id: number);
        /**
         * Sets whether this material is for a compound mesh with per-part picking.
         */
        set isCompound(value: boolean);
        /**
         * Gets whether this material is for a compound mesh with per-part picking.
         */
        get isCompound(): boolean;
        /**
         * Sets the per-part picking colors from an array of picking IDs.
         * Each ID is encoded into an RGB color on the CPU.
         * @param ids Array mapping part index to picking ID.
         */
        set partMeshIds(ids: number[]);
        /**
         * Sets which parts are active (pickable) for the compound picking pass.
         * Parts not in the set are discarded in the shader by overriding partVisibility to 0.
         * @param activeParts Array of part indices that should be pickable.
         */
        setPartActive(activeParts: number[]): void;
        /**
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Indicates this plugin supports both GLSL and WGSL.
         * @param shaderLanguage the shader language to check
         * @returns true for GLSL and WGSL
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        /**
         * Always ready — no textures or async resources to wait on.
         * @param _defines the defines
         * @param _scene the scene
         * @param _engine the engine
         * @param _subMesh the submesh
         * @returns true
         */
        isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean;
        /**
         * Returns custom shader code to inject GPU picking color output.
         *
         * @param shaderType "vertex" or "fragment"
         * @param shaderLanguage the shader language to use (default: GLSL)
         * @returns null or a map of injection point names to code strings
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        private _getCustomCodeGLSL;
        private _getCustomCodeWGSL;
        /**
         * Registers the picking uniforms with the engine.
         * @returns uniform descriptions
         */
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size?: number;
                type?: string;
                arraySize?: number;
            }>;
            vertex?: string;
            fragment?: string;
            externalUniforms?: string[];
        };
        /**
         * Binds the picking color uniform(s) each frame.
         * @param _uniformBuffer the uniform buffer (unused — we bind directly on the effect)
         * @param _scene the current scene
         * @param _engine the current engine
         * @param subMesh the submesh being rendered
         */
        bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void;
    }
    /**
     * Register side effects for gaussianSplattingGpuPickingMaterialPlugin.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingGpuPickingMaterialPlugin(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingGpuPickingMaterialPlugin.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /** @internal */
    class GaussianSplattingDebugDefines extends MaterialDefines {
        /** Defines whether any debug feature is active */
        GS_DBG_ENABLED: boolean;
        /** Defines whether world-space clipping box is enabled (0: off, 1: on) */
        GS_DBG_CLIP: number;
        /** Defines whether opacity culling is enabled (0: off, 1: on) */
        GS_DBG_CULL_OPACITY: number;
        /** Defines whether size culling is enabled (0: off, 1: on) */
        GS_DBG_CULL_SIZE: number;
        /** Defines whether per-splat opacity scaling is enabled (0: off, 1: on) */
        GS_DBG_OPACITY_SCALE: number;
        /** Defines whether opacity saturation (flat disk) is enabled (0: off, 1: on) */
        GS_DBG_OPACITY_SATURATE: number;
        /** Defines whether the DC (base) SH color is included (0: off, 1: on) */
        GS_DBG_SH_DC: number;
        /** Defines whether SH band 1 contribution is included (0: off, 1: on) */
        GS_DBG_SH_ORDER1: number;
        /** Defines whether SH band 2 contribution is included (0: off, 1: on) */
        GS_DBG_SH_ORDER2: number;
        /** Defines whether SH band 3 contribution is included (0: off, 1: on) */
        GS_DBG_SH_ORDER3: number;
        /** Defines whether SH band 4 contribution is included (0: off, 1: on) */
        GS_DBG_SH_ORDER4: number;
    }
    /**
     * Per-part debug options for compound Gaussian splat meshes.
     * Each field is optional; unset fields fall back to the global setting on the plugin,
     * and if that is also unset, a neutral value is used (no culling, full SH, etc.).
     */
    export interface IGaussianSplattingDebugOptions {
        /** World-space axis-aligned clipping box, or null to disable. */
        clippingBox: Nullable<{
            min: Vector3;
            max: Vector3;
        }>;
        /** Opacity culling range [0..1], or null to disable. */
        opacityCulling: Nullable<{
            min: number;
            max: number;
        }>;
        /** Size culling range, or null to disable. */
        sizeCulling: Nullable<{
            min: number;
            max: number;
        }>;
        /** Scalar opacity multiplier. 1.0 = no change. */
        opacityScale: number;
        /** When true, replaces Gaussian falloff with flat disk opacity. */
        opacitySaturate: boolean;
        /** Include the DC (base) SH color. */
        shDc: boolean;
        /** Include SH band 1 contribution. */
        shOrder1: boolean;
        /** Include SH band 2 contribution. */
        shOrder2: boolean;
        /** Include SH band 3 contribution. */
        shOrder3: boolean;
        /** Include SH band 4 contribution. */
        shOrder4: boolean;
    }
    /**
     * Debug plugin for GaussianSplattingMaterial.
     * Provides runtime controls for clipping, opacity/size culling, opacity scaling,
     * opacity saturation, and per-SH-order toggling. All features are gated behind
     * the GS_DBG_ENABLED shader define — when every option is at its default value
     * the define is absent and the shader compiles to identical code as without the plugin.
     *
     * In compound mode (partCount \> 0), per-part overrides can be set via setPartOptions().
     * Global settings act as defaults; per-part settings override them for that part index.
     */
    export class GaussianSplattingDebugMaterialPlugin extends MaterialPluginBase {
        private _clippingBox;
        private _opacityCulling;
        private _sizeCulling;
        private _opacityScale;
        private _opacitySaturate;
        private _shDc;
        private _shOrder1;
        private _shOrder2;
        private _shOrder3;
        private _shOrder4;
        private _partCount;
        private _partClippingBoxes;
        private _partOpacityCullings;
        private _partSizeCullings;
        private _partOpacityScales;
        private _partOpacitySaturates;
        private _partShDcs;
        private _partShOrder1s;
        private _partShOrder2s;
        private _partShOrder3s;
        private _partShOrder4s;
        private readonly _partArrays;
        private _dbgPartDataTexture;
        private _textureDirty;
        private _maxPartCount;
        /**
         * Creates a new GaussianSplattingDebugMaterialPlugin.
         * @param material The GaussianSplattingMaterial to attach the plugin to.
         */
        constructor(material: GaussianSplattingMaterial);
        private _isAnyFeatureActive;
        private _markDirty;
        /**
         * Number of parts in compound mode. Set automatically by GaussianSplattingDebugger.addMesh().
         * When 0 (non-compound), setPartOptions() logs an error.
         * @returns the part count
         */
        get partCount(): number;
        set partCount(count: number);
        /**
         * Sets per-part debug overrides for the given part index.
         * Only valid on compound meshes (partCount \> 0); logs an error otherwise.
         * @param partIndex The zero-based part index.
         * @param options Partial set of debug options to override for this part.
         */
        setPartOptions(partIndex: number, options: Partial<IGaussianSplattingDebugOptions>): void;
        /**
         * Clears all per-part debug overrides for the given part index,
         * falling back to global settings.
         * @param partIndex The zero-based part index.
         */
        clearPartOptions(partIndex: number): void;
        /**
         * Removes the per-part override slot at `removedIndex` and shifts all higher-indexed
         * slots down by one, keeping the arrays aligned with the compound mesh's new part layout.
         * @param removedIndex The original (pre-removal) part index.
         * @internal
         */
        shiftPartOptions(removedIndex: number): void;
        /**
         * World-space axis-aligned clipping box. Splats outside are not rendered.
         * Set to null to disable clipping.
         * Example: `{ min: new Vector3(-2,-2,-2), max: new Vector3(2,2,2) }`
         */
        get clippingBox(): Nullable<{
            min: Vector3;
            max: Vector3;
        }>;
        set clippingBox(value: Nullable<{
            min: Vector3;
            max: Vector3;
        }>);
        /**
         * Opacity culling range [0..1]. Splats whose stored opacity falls outside this
         * range are not rendered. Set to null to disable.
         */
        get opacityCulling(): Nullable<{
            min: number;
            max: number;
        }>;
        set opacityCulling(value: Nullable<{
            min: number;
            max: number;
        }>);
        /**
         * Size culling range. Size is pow(|det(Σ)|, 1/6) of the 3D covariance matrix,
         * equal to the geometric mean of the principal radii. Use GaussianSplattingMeshBase.splatSizeRange
         * to find the asset's range. Set to null to disable.
         */
        get sizeCulling(): Nullable<{
            min: number;
            max: number;
        }>;
        set sizeCulling(value: Nullable<{
            min: number;
            max: number;
        }>);
        /**
         * Scalar multiplier applied to every splat's opacity after all other modifiers.
         * 1.0 (default) = no change.
         */
        get opacityScale(): number;
        set opacityScale(value: number);
        /**
         * When true, replaces the Gaussian spatial falloff with a flat uniform opacity,
         * making each splat appear as a solid disk with its raw alpha value.
         */
        get opacitySaturate(): boolean;
        set opacitySaturate(value: boolean);
        /** Include the DC (base) color from colorsTexture. Default: true. */
        get shDc(): boolean;
        set shDc(value: boolean);
        /** Include SH band 1 contribution. Default: true. */
        get shOrder1(): boolean;
        set shOrder1(value: boolean);
        /** Include SH band 2 contribution. Default: true. */
        get shOrder2(): boolean;
        set shOrder2(value: boolean);
        /** Include SH band 3 contribution. Default: true. */
        get shOrder3(): boolean;
        set shOrder3(value: boolean);
        /** Include SH band 4 contribution. Default: true. */
        get shOrder4(): boolean;
        set shOrder4(value: boolean);
        /**
         * Adds the per-part debug data texture name to the sampler list so the effect can bind it.
         * @param samplers the sampler list to populate
         */
        getSamplers(samplers: string[]): void;
        /** @returns the class name of this plugin */
        getClassName(): string;
        /**
         * @param shaderLanguage the shader language to check
         * @returns true for GLSL and WGSL
         */
        isCompatible(shaderLanguage: ShaderLanguage): boolean;
        /**
         * Always ready — no async resources.
         * @param _defines unused
         * @param _scene unused
         * @param _engine unused
         * @param _subMesh unused
         * @returns true
         */
        isReadyForSubMesh(_defines: MaterialDefines, _scene: Scene, _engine: AbstractEngine, _subMesh: SubMesh): boolean;
        /**
         * Sets shader defines from current property state. GS_DBG_ENABLED is set to true
         * only when at least one feature is non-default, ensuring zero overhead otherwise.
         * Sub-flags also check per-part arrays so compound-only overrides activate the correct
         * code paths even when the global setting is at its default.
         * @param defines the defines object
         */
        prepareDefines(defines: GaussianSplattingDebugDefines): void;
        /**
         * Returns shader code injections for the debug features.
         * @param shaderType "vertex" or "fragment"
         * @param shaderLanguage GLSL or WGSL
         * @returns map of injection-point name to injected code, or null
         */
        getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{
            [pointName: string]: string;
        }>;
        private _getCustomCodeGLSL;
        private _getCustomCodeWGSL;
        /**
         * Declares the non-compound scalar debug uniform names as external so the Effect can
         * resolve their locations. WGSL uniforms are declared inline in getCustomCode() injections.
         * @returns uniform descriptor with externalUniforms list
         */
        getUniforms(): {
            ubo?: Array<{
                name: string;
                size?: number;
                type?: string;
                arraySize?: number;
            }>;
            vertex?: string;
            fragment?: string;
            externalUniforms?: string[];
        };
        private _buildTextureData;
        private _updateOrCreateTexture;
        /**
         * Binds uniform values each frame. Scalar uniforms are uploaded for non-compound mode;
         * the per-part data texture is updated and bound for compound mode.
         * @param _uniformBuffer unused
         * @param _scene the current scene
         * @param _engine unused
         * @param subMesh the submesh being rendered
         */
        bindForSubMesh(_uniformBuffer: UniformBuffer, _scene: Scene, _engine: AbstractEngine, subMesh: SubMesh): void;
        /**
         * Disposes the per-part data texture.
         * @param _forceDisposeTextures unused; the LUT texture is always disposed as it is owned by this plugin
         */
        dispose(_forceDisposeTextures?: boolean): void;
    }
    /**
     * Register side effects for GaussianSplattingDebugMaterialPlugin.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGaussianSplattingDebugMaterialPlugin(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gaussianSplattingDebugMaterialPlugin.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    var BackgroundMaterialBase_base: {
        new (...args: any[]): {
            _imageProcessingConfiguration: ImageProcessingConfiguration;
            get imageProcessingConfiguration(): ImageProcessingConfiguration;
            set imageProcessingConfiguration(value: ImageProcessingConfiguration);
            _imageProcessingObserver: Nullable<Observer<ImageProcessingConfiguration>>;
            _attachImageProcessingConfiguration(configuration: Nullable<ImageProcessingConfiguration>): void;
            get cameraColorCurvesEnabled(): boolean;
            set cameraColorCurvesEnabled(value: boolean);
            get cameraColorGradingEnabled(): boolean;
            set cameraColorGradingEnabled(value: boolean);
            get cameraToneMappingEnabled(): boolean;
            set cameraToneMappingEnabled(value: boolean);
            get cameraExposure(): number;
            set cameraExposure(value: number);
            get cameraContrast(): number;
            set cameraContrast(value: number);
            get cameraColorGradingTexture(): Nullable<BaseTexture>;
            set cameraColorGradingTexture(value: Nullable<BaseTexture>);
            get cameraColorCurves(): Nullable<ColorCurves>;
            set cameraColorCurves(value: Nullable<ColorCurves>);
        };
    } & typeof PushMaterial;
    class BackgroundMaterialBase extends BackgroundMaterialBase_base {
    }
    /**
     * Background material used to create an efficient environment around your scene.
     * #157MGZ: simple test
     */
    export class BackgroundMaterial extends BackgroundMaterialBase {
        /**
         * Standard reflectance value at parallel view angle.
         */
        static StandardReflectance0: number;
        /**
         * Standard reflectance value at grazing angle.
         */
        static StandardReflectance90: number;
        protected _primaryColor: Color3;
        /**
         * Key light Color (multiply against the environment texture)
         */
        primaryColor: Color3;
        protected __perceptualColor: Nullable<Color3>;
        /**
         * Experimental Internal Use Only.
         *
         * Key light Color in "perceptual value" meaning the color you would like to see on screen.
         * This acts as a helper to set the primary color to a more "human friendly" value.
         * Conversion to linear space as well as exposure and tone mapping correction will be applied to keep the
         * output color as close as possible from the chosen value.
         * (This does not account for contrast color grading and color curves as they are considered post effect and not directly
         * part of lighting setup.)
         */
        get _perceptualColor(): Nullable<Color3>;
        set _perceptualColor(value: Nullable<Color3>);
        protected _primaryColorShadowLevel: float;
        /**
         * Defines the level of the shadows (dark area of the reflection map) in order to help scaling the colors.
         * The color opposite to the primary color is used at the level chosen to define what the black area would look.
         */
        get primaryColorShadowLevel(): float;
        set primaryColorShadowLevel(value: float);
        protected _primaryColorHighlightLevel: float;
        /**
         * Defines the level of the highlights (highlight area of the reflection map) in order to help scaling the colors.
         * The primary color is used at the level chosen to define what the white area would look.
         */
        get primaryColorHighlightLevel(): float;
        set primaryColorHighlightLevel(value: float);
        protected _reflectionTexture: Nullable<BaseTexture>;
        /**
         * Reflection Texture used in the material.
         * Should be author in a specific way for the best result (refer to the documentation).
         */
        reflectionTexture: Nullable<BaseTexture>;
        protected _reflectionBlur: float;
        /**
         * Reflection Texture level of blur.
         *
         * Can be use to reuse an existing HDR Texture and target a specific LOD to prevent authoring the
         * texture twice.
         */
        reflectionBlur: float;
        protected _diffuseTexture: Nullable<BaseTexture>;
        /**
         * Diffuse Texture used in the material.
         * Should be author in a specific way for the best result (refer to the documentation).
         */
        diffuseTexture: Nullable<BaseTexture>;
        protected _shadowLights: Nullable<IShadowLight[]>;
        /**
         * Specify the list of lights casting shadow on the material.
         * All scene shadow lights will be included if null.
         */
        shadowLights: Nullable<IShadowLight[]>;
        protected _shadowLevel: float;
        /**
         * Helps adjusting the shadow to a softer level if required.
         * 0 means black shadows and 1 means no shadows.
         */
        shadowLevel: float;
        protected _sceneCenter: Vector3;
        /**
         * In case of opacity Fresnel or reflection falloff, this is use as a scene center.
         * It is usually zero but might be interesting to modify according to your setup.
         */
        sceneCenter: Vector3;
        protected _opacityFresnel: boolean;
        /**
         * This helps specifying that the material is falling off to the sky box at grazing angle.
         * This helps ensuring a nice transition when the camera goes under the ground.
         */
        opacityFresnel: boolean;
        protected _reflectionFresnel: boolean;
        /**
         * This helps specifying that the material is falling off from diffuse to the reflection texture at grazing angle.
         * This helps adding a mirror texture on the ground.
         */
        reflectionFresnel: boolean;
        protected _reflectionFalloffDistance: number;
        /**
         * This helps specifying the falloff radius off the reflection texture from the sceneCenter.
         * This helps adding a nice falloff effect to the reflection if used as a mirror for instance.
         */
        reflectionFalloffDistance: number;
        protected _reflectionAmount: number;
        /**
         * This specifies the weight of the reflection against the background in case of reflection Fresnel.
         */
        reflectionAmount: number;
        protected _reflectionReflectance0: number;
        /**
         * This specifies the weight of the reflection at grazing angle.
         */
        reflectionReflectance0: number;
        protected _reflectionReflectance90: number;
        /**
         * This specifies the weight of the reflection at a perpendicular point of view.
         */
        reflectionReflectance90: number;
        /**
         * Sets the reflection reflectance fresnel values according to the default standard
         * empirically know to work well :-)
         */
        set reflectionStandardFresnelWeight(value: number);
        protected _useRGBColor: boolean;
        /**
         * Helps to directly use the maps channels instead of their level.
         */
        useRGBColor: boolean;
        protected _enableNoise: boolean;
        /**
         * This helps reducing the banding effect that could occur on the background.
         */
        enableNoise: boolean;
        /**
         * The current fov(field of view) multiplier, 0.0 - 2.0. Defaults to 1.0. Lower values "zoom in" and higher values "zoom out".
         * Best used when trying to implement visual zoom effects like fish-eye or binoculars while not adjusting camera fov.
         * Recommended to be keep at 1.0 except for special cases.
         */
        get fovMultiplier(): number;
        set fovMultiplier(value: number);
        private _fovMultiplier;
        /**
         * Enable the FOV adjustment feature controlled by fovMultiplier.
         */
        useEquirectangularFOV: boolean;
        private _maxSimultaneousLights;
        /**
         * Number of Simultaneous lights allowed on the material.
         */
        maxSimultaneousLights: int;
        private _shadowOnly;
        /**
         * Make the material only render shadows
         */
        shadowOnly: boolean;
        /**
         * Due to a bug in iOS10, video tags (which are using the background material) are in BGR and not RGB.
         * Setting this flag to true (not done automatically!) will convert it back to RGB.
         */
        switchToBGR: boolean;
        private _enableGroundProjection;
        /**
         * Enables the ground projection mode on the material.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/skybox#ground-projection
         */
        enableGroundProjection: boolean;
        /**
         * Defines the radius of the projected ground if enableGroundProjection is true.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/skybox#ground-projection
         */
        projectedGroundRadius: number;
        /**
         * Defines the height of the projected ground if enableGroundProjection is true.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/skybox#ground-projection
         */
        projectedGroundHeight: number;
        private _renderTargets;
        private _reflectionControls;
        private _white;
        private _primaryShadowColor;
        private _primaryHighlightColor;
        private _shadersLoaded;
        /**
         * Instantiates a Background Material in the given scene
         * @param name The friendly name of the material
         * @param scene The scene to add the material to
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean);
        /**
         * Gets a boolean indicating that current material needs to register RTT
         */
        get hasRenderTargetTextures(): boolean;
        /**
         * The entire material has been created in order to prevent overdraw.
         * @returns false
         */
        needAlphaTesting(): boolean;
        /**
         * The entire material has been created in order to prevent overdraw.
         * @returns true if blending is enable
         */
        needAlphaBlending(): boolean;
        /**
         * Checks whether the material is ready to be rendered for a given mesh.
         * @param mesh The mesh to render
         * @param subMesh The submesh to check against
         * @param useInstances Specify wether or not the material is used with instances
         * @returns true if all the dependencies are ready (Textures, Effects...)
         */
        isReadyForSubMesh(mesh: AbstractMesh, subMesh: SubMesh, useInstances?: boolean): boolean;
        /**
         * Compute the primary color according to the chosen perceptual color.
         */
        private _computePrimaryColorFromPerceptualColor;
        /**
         * Compute the highlights and shadow colors according to their chosen levels.
         */
        private _computePrimaryColors;
        /**
         * Build the uniform buffer used in the material.
         */
        buildUniformLayout(): void;
        /**
         * Unbind the material.
         */
        unbind(): void;
        /**
         * Bind only the world matrix to the material.
         * @param world The world matrix to bind.
         */
        bindOnlyWorldMatrix(world: Matrix): void;
        /**
         * Bind the material for a dedicated submesh (every used meshes will be considered opaque).
         * @param world The world matrix to bind.
         * @param mesh the mesh to bind for.
         * @param subMesh The submesh to bind for.
         */
        bindForSubMesh(world: Matrix, mesh: Mesh, subMesh: SubMesh): void;
        /**
         * Checks to see if a texture is used in the material.
         * @param texture - Base texture to use.
         * @returns - Boolean specifying if a texture is used in the material.
         */
        hasTexture(texture: BaseTexture): boolean;
        /**
         * Dispose the material.
         * @param forceDisposeEffect Force disposal of the associated effect.
         * @param forceDisposeTextures Force disposal of the associated textures.
         */
        dispose(forceDisposeEffect?: boolean, forceDisposeTextures?: boolean): void;
        /**
         * Clones the material.
         * @param name The cloned name.
         * @returns The cloned material.
         */
        clone(name: string): BackgroundMaterial;
        /**
         * Serializes the current material to its JSON representation.
         * @returns The JSON representation.
         */
        serialize(): any;
        /**
         * Gets the class name of the material
         * @returns "BackgroundMaterial"
         */
        getClassName(): string;
        /**
         * Parse a JSON input to create back a background material.
         * @param source The JSON data to parse
         * @param scene The scene to create the parsed material in
         * @param rootUrl The root url of the assets the material depends upon
         * @returns the instantiated BackgroundMaterial.
         */
        static Parse(source: any, scene: Scene, rootUrl: string): BackgroundMaterial;
    }
    /**
     * Register side effects for backgroundMaterial.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBackgroundMaterial(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import backgroundMaterial.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Class used to represent data loading progression
     */
    export class SceneLoaderFlags {
        private static _ForceFullSceneLoadingForIncremental;
        private static _ShowLoadingScreen;
        private static _CleanBoneMatrixWeights;
        private static _LoggingLevel;
        /**
         * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data
         */
        static get ForceFullSceneLoadingForIncremental(): boolean;
        static set ForceFullSceneLoadingForIncremental(value: boolean);
        /**
         * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene
         */
        static get ShowLoadingScreen(): boolean;
        static set ShowLoadingScreen(value: boolean);
        /**
         * Defines the current logging level (while loading the scene)
         * @ignorenaming
         */
        static get loggingLevel(): number;
        static set loggingLevel(value: number);
        /**
         * Gets or set a boolean indicating if matrix weights must be cleaned upon loading
         */
        static get CleanBoneMatrixWeights(): boolean;
        static set CleanBoneMatrixWeights(value: boolean);
    }


    /**
     * Type used for the success callback of ImportMesh
     */
    export type SceneLoaderSuccessCallback = (meshes: AbstractMesh[], particleSystems: IParticleSystem[], skeletons: Skeleton[], animationGroups: AnimationGroup[], transformNodes: TransformNode[], geometries: Geometry[], lights: Light[], spriteManagers: ISpriteManager[]) => void;
    /**
     * Interface used for the result of ImportMeshAsync
     */
    export interface ISceneLoaderAsyncResult {
        /**
         * The array of loaded meshes
         */
        readonly meshes: AbstractMesh[];
        /**
         * The array of loaded particle systems
         */
        readonly particleSystems: IParticleSystem[];
        /**
         * The array of loaded skeletons
         */
        readonly skeletons: Skeleton[];
        /**
         * The array of loaded animation groups
         */
        readonly animationGroups: AnimationGroup[];
        /**
         * The array of loaded transform nodes
         */
        readonly transformNodes: TransformNode[];
        /**
         * The array of loaded geometries
         */
        readonly geometries: Geometry[];
        /**
         * The array of loaded lights
         */
        readonly lights: Light[];
        /**
         * The array of loaded sprite managers
         */
        readonly spriteManagers: ISpriteManager[];
    }
    /**
     * Interface used to represent data loading progression
     */
    export interface ISceneLoaderProgressEvent {
        /**
         * Defines if data length to load can be evaluated
         */
        readonly lengthComputable: boolean;
        /**
         * Defines the loaded data length
         */
        readonly loaded: number;
        /**
         * Defines the data length to load
         */
        readonly total: number;
    }
    /**
     * Interface used by SceneLoader plugins to define supported file extensions
     */
    export interface ISceneLoaderPluginExtensions {
        /**
         * Defines the list of supported extensions
         */
        readonly [extension: string]: {
            readonly isBinary: boolean;
            readonly mimeType?: string;
        };
    }
    /**
     * Metadata for a SceneLoader plugin that must also be provided by a plugin factory
     */
    export interface ISceneLoaderPluginMetadata {
        /**
         * The friendly name of the plugin.
         */
        readonly name: string;
        /**
         * The file extensions supported by the plugin.
         */
        readonly extensions: string | ISceneLoaderPluginExtensions;
        /**
         * The callback that returns true if the data can be directly loaded.
         * @param data string containing the file data
         * @returns if the data can be loaded directly
         */
        canDirectLoad?(data: string): boolean;
    }
    /**
     * Interface used by SceneLoader plugin factory
     */
    export interface ISceneLoaderPluginFactory extends ISceneLoaderPluginMetadata {
        /**
         * Function called to create a new plugin
         * @param options plugin options that were passed to the SceneLoader operation
         * @returns the new plugin
         */
        createPlugin(options: SceneLoaderPluginOptions): ISceneLoaderPlugin | ISceneLoaderPluginAsync | Promise<ISceneLoaderPlugin | ISceneLoaderPluginAsync>;
    }
    /**
     * Interface used to define the base of ISceneLoaderPlugin and ISceneLoaderPluginAsync
     */
    export interface ISceneLoaderPluginBase extends ISceneLoaderPluginMetadata {
        /**
         * The callback called when loading from a url.
         * @param scene scene loading this url
         * @param fileOrUrl file or url to load
         * @param rootUrl root url to use to load assets
         * @param onSuccess callback called when the file successfully loads
         * @param onProgress callback called while file is loading (if the server supports this mode)
         * @param useArrayBuffer defines a boolean indicating that date must be returned as ArrayBuffer
         * @param onError callback called when the file fails to load
         * @param name defines the name of the file when loading a binary file
         * @returns a file request object
         */
        loadFile?(scene: Scene, fileOrUrl: File | string | ArrayBufferView, rootUrl: string, onSuccess: (data: unknown, responseURL?: string) => void, onProgress?: (ev: ISceneLoaderProgressEvent) => void, useArrayBuffer?: boolean, onError?: (request?: WebRequest, exception?: LoadFileError) => void, name?: string): Nullable<IFileRequest>;
        /**
         * The callback that returns the data to pass to the plugin if the data can be directly loaded.
         * @param scene scene loading this data
         * @param data string containing the data
         * @returns data to pass to the plugin
         */
        directLoad?(scene: Scene, data: string): unknown | Promise<unknown>;
        /**
         * The callback that allows custom handling of the root url based on the response url.
         * @param rootUrl the original root url
         * @param responseURL the response url if available
         * @returns the new root url
         */
        rewriteRootURL?(rootUrl: string, responseURL?: string): string;
    }
    /**
     * Interface used to define a SceneLoader plugin
     */
    export interface ISceneLoaderPlugin extends ISceneLoaderPluginBase {
        /**
         * Import meshes into a scene.
         * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
         * @param scene The scene to import into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param meshes The meshes array to import into
         * @param particleSystems The particle systems array to import into
         * @param skeletons The skeletons array to import into
         * @param onError The callback when import fails
         * @returns True if successful or false otherwise
         */
        importMesh(meshesNames: string | readonly string[] | null | undefined, scene: Scene, data: unknown, rootUrl: string, meshes: AbstractMesh[], particleSystems: IParticleSystem[], skeletons: Skeleton[], onError?: (message: string, exception?: any) => void): boolean;
        /**
         * Load into a scene.
         * @param scene The scene to load into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param onError The callback when import fails
         * @returns True if successful or false otherwise
         */
        load(scene: Scene, data: unknown, rootUrl: string, onError?: (message: string, exception?: any) => void): boolean;
        /**
         * Load into an asset container.
         * @param scene The scene to load into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param onError The callback when import fails
         * @returns The loaded asset container
         */
        loadAssetContainer(scene: Scene, data: unknown, rootUrl: string, onError?: (message: string, exception?: any) => void): AssetContainer;
    }
    /**
     * Interface used to define an async SceneLoader plugin
     */
    export interface ISceneLoaderPluginAsync extends ISceneLoaderPluginBase {
        /**
         * Import meshes into a scene.
         * @param meshesNames An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
         * @param scene The scene to import into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param onProgress The callback when the load progresses
         * @param fileName Defines the name of the file to load
         * @returns The loaded objects (e.g. meshes, particle systems, skeletons, animation groups, etc.)
         */
        importMeshAsync(meshesNames: string | readonly string[] | null | undefined, scene: Scene, data: unknown, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<ISceneLoaderAsyncResult>;
        /**
         * Load into a scene.
         * @param scene The scene to load into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param onProgress The callback when the load progresses
         * @param fileName Defines the name of the file to load
         * @returns Nothing
         */
        loadAsync(scene: Scene, data: unknown, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<void>;
        /**
         * Load into an asset container.
         * @param scene The scene to load into
         * @param data The data to import
         * @param rootUrl The root url for scene and resources
         * @param onProgress The callback when the load progresses
         * @param fileName Defines the name of the file to load
         * @returns The loaded asset container
         */
        loadAssetContainerAsync(scene: Scene, data: unknown, rootUrl: string, onProgress?: (event: ISceneLoaderProgressEvent) => void, fileName?: string): Promise<AssetContainer>;
    }
    /**
     * Mode that determines how to handle old animation groups before loading new ones.
     */
    export enum SceneLoaderAnimationGroupLoadingMode {
        /**
         * Reset all old animations to initial state then dispose them.
         */
        Clean = 0,
        /**
         * Stop all old animations.
         */
        Stop = 1,
        /**
         * Restart old animations from first frame.
         */
        Sync = 2,
        /**
         * Old animations remains untouched.
         */
        NoSync = 3
    }
    /**
     * Defines internal only plugin members.
     */
    interface ISceneLoaderPluginInternal {
        /**
         * An optional observable to notify when the plugin is disposed
         */
        readonly onDisposeObservable: Observable<void>;
    }
    /**
     * Defines a plugin registered by the SceneLoader
     */
    interface IRegisteredPlugin {
        /**
         * Defines the plugin to use
         */
        plugin: ((ISceneLoaderPlugin | ISceneLoaderPluginAsync) & Partial<ISceneLoaderPluginInternal>) | ISceneLoaderPluginFactory;
        /**
         * Defines if the plugin supports binary data
         */
        isBinary: boolean;
        mimeType?: string;
    }
    /**
     * Defines options for SceneLoader plugins. This interface is extended by specific plugins.
     */
    export interface SceneLoaderPluginOptions extends Record<string, Record<string, unknown> | undefined> {
    }
    /**
     * Adds default/implicit options to plugin specific options.
     */
    type DefaultPluginOptions<BasePluginOptions> = {
        /**
         * Defines if the plugin is enabled
         */
        enabled?: boolean;
    } & BasePluginOptions;
    export type PluginOptions = ISceneLoaderOptions["pluginOptions"];
    type SceneSource = string | File | ArrayBufferView;
    /**
     * Defines common options for loading operations performed by SceneLoader.
     */
    interface ISceneLoaderOptions {
        /**
         * A string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         */
        rootUrl?: string;
        /**
         * A callback with a progress event for each file being loaded
         */
        onProgress?: (event: ISceneLoaderProgressEvent) => void;
        /**
         * The extension used to determine the plugin
         */
        pluginExtension?: string;
        /**
         * Defines the filename, if the data is binary
         */
        name?: string;
        /**
         * Defines options for the registered plugins
         */
        pluginOptions?: {
            [Plugin in keyof SceneLoaderPluginOptions]?: {
                [Option in keyof DefaultPluginOptions<SceneLoaderPluginOptions[Plugin]>]: DefaultPluginOptions<SceneLoaderPluginOptions[Plugin]>[Option];
            };
        };
    }
    /**
     * Defines options for ImportMeshAsync.
     */
    export interface ImportMeshOptions extends ISceneLoaderOptions {
        /**
         * An array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
         */
        meshNames?: string | readonly string[] | null | undefined;
    }
    /**
     * Defines options for LoadAsync.
     */
    export interface LoadOptions extends ISceneLoaderOptions {
    }
    /**
     * Defines options for AppendAsync.
     */
    export interface AppendOptions extends ISceneLoaderOptions {
    }
    /**
     * Defines options for LoadAssetContainerAsync.
     */
    export interface LoadAssetContainerOptions extends ISceneLoaderOptions {
    }
    /**
     * Defines options for ImportAnimationsAsync.
     */
    export interface ImportAnimationsOptions extends ISceneLoaderOptions {
        /**
         * When true, animations are cleaned before importing new ones. Animations are appended otherwise
         */
        overwriteAnimations?: boolean;
        /**
         * Defines how to handle old animations groups before importing new ones
         */
        animationGroupLoadingMode?: SceneLoaderAnimationGroupLoadingMode;
        /**
         * defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         */
        targetConverter?: Nullable<(target: unknown) => unknown>;
    }
    /**
     * Adds a new plugin to the list of registered plugins
     * @param plugin defines the plugin to add
     */
    export function RegisterSceneLoaderPlugin(plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory): void;
    /**
     * Adds a new plugin to the list of registered plugins
     * @deprecated Please use {@link RegisterSceneLoaderPlugin} instead.
     * @param plugin defines the plugin to add
     */
    export function registerSceneLoaderPlugin(plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory): void;
    /**
     * Gets metadata for all currently registered scene loader plugins.
     * @returns An array where each entry has metadata for a single scene loader plugin.
     */
    export function GetRegisteredSceneLoaderPluginMetadata(): DeepImmutable<Array<Pick<ISceneLoaderPluginMetadata, "name"> & {
        /**
         * The extensions supported by the plugin.
         */
        extensions: ({
            /**
             * The file extension.
             */
            extension: string;
        } & ISceneLoaderPluginExtensions[string])[];
    }>>;
    /**
     * Import meshes into a scene
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene the instance of BABYLON.Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups
     */
    export function ImportMeshAsync(source: SceneSource, scene: Scene, options?: ImportMeshOptions): Promise<ISceneLoaderAsyncResult>;
    /**
     * Load a scene
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param engine is the instance of BABYLON.Engine to use to create the scene
     * @param options an object that configures aspects of how the scene is loaded
     * @returns The loaded scene
     */
    export function LoadSceneAsync(source: SceneSource, engine: AbstractEngine, options?: LoadOptions): Promise<Scene>;
    /**
     * Load a scene
     * @deprecated Please use {@link LoadSceneAsync} instead.
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param engine is the instance of BABYLON.Engine to use to create the scene
     * @param options an object that configures aspects of how the scene is loaded
     * @returns The loaded scene
     */
    export function loadSceneAsync(source: SceneSource, engine: AbstractEngine, options?: LoadOptions): Promise<Scene>;
    /**
     * Append a scene
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of BABYLON.Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns A promise that resolves when the scene is appended
     */
    export function AppendSceneAsync(source: SceneSource, scene: Scene, options?: AppendOptions): Promise<void>;
    /**
     * Append a scene
     * @deprecated Please use {@link AppendSceneAsync} instead.
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of BABYLON.Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns A promise that resolves when the scene is appended
     */
    export function appendSceneAsync(source: SceneSource, scene: Scene, options?: AppendOptions): Promise<void>;
    /**
     * Load a scene into an asset container
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns The loaded asset container
     */
    export function LoadAssetContainerAsync(source: SceneSource, scene: Scene, options?: LoadAssetContainerOptions): Promise<AssetContainer>;
    /**
     * Load a scene into an asset container
     * @deprecated Please use {@link LoadAssetContainerAsync} instead.
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns The loaded asset container
     */
    export function loadAssetContainerAsync(source: SceneSource, scene: Scene, options?: LoadAssetContainerOptions): Promise<AssetContainer>;
    /**
     * Import animations from a file into a scene
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of BABYLON.Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns A promise that resolves when the animations are imported
     */
    export function ImportAnimationsAsync(source: SceneSource, scene: Scene, options?: ImportAnimationsOptions): Promise<void>;
    /**
     * Import animations from a file into a scene
     * @deprecated Please use {@link ImportAnimationsAsync} instead.
     * @param source a string that defines the name of the scene file, or starts with "data:" following by the stringified version of the scene, or a File object, or an ArrayBufferView
     * @param scene is the instance of BABYLON.Scene to append to
     * @param options an object that configures aspects of how the scene is loaded
     * @returns A promise that resolves when the animations are imported
     */
    export function importAnimationsAsync(source: SceneSource, scene: Scene, options?: ImportAnimationsOptions): Promise<void>;
    /**
     * Class used to load scene from various file formats using registered plugins
     * @see https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes
     * @deprecated The module level functions are more efficient for bundler tree shaking and allow plugin options to be passed through. Future improvements to scene loading will primarily be in the module level functions. The SceneLoader class will remain available, but it will be beneficial to prefer the module level functions.
     * @see {@link ImportMeshAsync}, {@link LoadSceneAsync}, {@link AppendSceneAsync}, {@link ImportAnimationsAsync}, {@link LoadAssetContainerAsync}
     */
    export class SceneLoader {
        /**
         * No logging while loading
         */
        static readonly NO_LOGGING = 0;
        /**
         * Minimal logging while loading
         */
        static readonly MINIMAL_LOGGING = 1;
        /**
         * Summary logging while loading
         */
        static readonly SUMMARY_LOGGING = 2;
        /**
         * Detailed logging while loading
         */
        static readonly DETAILED_LOGGING = 3;
        /**
         * Gets or sets a boolean indicating if entire scene must be loaded even if scene contains incremental data
         */
        static get ForceFullSceneLoadingForIncremental(): boolean;
        static set ForceFullSceneLoadingForIncremental(value: boolean);
        /**
         * Gets or sets a boolean indicating if loading screen must be displayed while loading a scene
         */
        static get ShowLoadingScreen(): boolean;
        static set ShowLoadingScreen(value: boolean);
        /**
         * Defines the current logging level (while loading the scene)
         * @ignorenaming
         */
        static get loggingLevel(): number;
        static set loggingLevel(value: number);
        /**
         * Gets or set a boolean indicating if matrix weights must be cleaned upon loading
         */
        static get CleanBoneMatrixWeights(): boolean;
        static set CleanBoneMatrixWeights(value: boolean);
        /**
         * Event raised when a plugin is used to load a scene
         */
        static readonly OnPluginActivatedObservable: Observable<ISceneLoaderPlugin | ISceneLoaderPluginAsync>;
        /**
         * Gets the default plugin (used to load Babylon files)
         * @returns the .babylon plugin
         */
        static GetDefaultPlugin(): IRegisteredPlugin | undefined;
        /**
         * Gets a plugin that can load the given extension
         * @param extension defines the extension to load
         * @returns a plugin or null if none works
         */
        static GetPluginForExtension(extension: string): ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory | undefined;
        /**
         * Gets a boolean indicating that the given extension can be loaded
         * @param extension defines the extension to load
         * @returns true if the extension is supported
         */
        static IsPluginForExtensionAvailable(extension: string): boolean;
        /**
         * Adds a new plugin to the list of registered plugins
         * @param plugin defines the plugin to add
         */
        static RegisterPlugin(plugin: ISceneLoaderPlugin | ISceneLoaderPluginAsync | ISceneLoaderPluginFactory): void;
        /**
         * Import meshes into a scene
         * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene the instance of BABYLON.Scene to append to
         * @param onSuccess a callback with a list of imported meshes, particleSystems, skeletons, and animationGroups when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the name of the file, if the data is binary
         * @param pluginOptions defines the options to use with the plugin
         * @deprecated Please use the module level {@link ImportMeshAsync} instead
         */
        static ImportMesh(meshNames: string | readonly string[] | null | undefined, rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onSuccess?: Nullable<SceneLoaderSuccessCallback>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string, pluginOptions?: PluginOptions): void;
        /**
         * Import meshes into a scene
         * @param meshNames an array of mesh names, a single mesh name, or empty string for all meshes that filter what meshes are imported
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene the instance of BABYLON.Scene to append to
         * @param onProgress a callback with a progress event for each file being loaded
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the name of the file
         * @returns The loaded list of imported meshes, particle systems, skeletons, and animation groups
         * @deprecated Please use the module level {@link ImportMeshAsync} instead
         */
        static ImportMeshAsync(meshNames: string | readonly string[] | null | undefined, rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, pluginExtension?: Nullable<string>, name?: string): Promise<ISceneLoaderAsyncResult>;
        /**
         * Load a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param engine is the instance of BABYLON.Engine to use to create the scene
         * @param onSuccess a callback with the scene when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @deprecated Please use the module level {@link LoadSceneAsync} instead
         */
        static Load(rootUrl: string, sceneFilename?: SceneSource, engine?: Nullable<AbstractEngine>, onSuccess?: Nullable<(scene: Scene) => void>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string): void;
        /**
         * Load a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param engine is the instance of BABYLON.Engine to use to create the scene
         * @param onProgress a callback with a progress event for each file being loaded
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @returns The loaded scene
         * @deprecated Please use the module level {@link LoadSceneAsync} instead
         */
        static LoadAsync(rootUrl: string, sceneFilename?: SceneSource, engine?: Nullable<AbstractEngine>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, pluginExtension?: Nullable<string>, name?: string): Promise<Scene>;
        /**
         * Append a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene is the instance of BABYLON.Scene to append to
         * @param onSuccess a callback with the scene when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the name of the file, if the data is binary
         * @deprecated Please use the module level {@link AppendSceneAsync} instead
         */
        static Append(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onSuccess?: Nullable<(scene: Scene) => void>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string): void;
        /**
         * Append a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene is the instance of BABYLON.Scene to append to
         * @param onProgress a callback with a progress event for each file being loaded
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the name of the file, if the data is binary
         * @returns The given scene
         * @deprecated Please use the module level {@link AppendSceneAsync} instead
         */
        static AppendAsync(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, pluginExtension?: Nullable<string>, name?: string): Promise<Scene>;
        /**
         * Load a scene into an asset container
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)
         * @param onSuccess a callback with the scene when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @deprecated Please use the module level {@link LoadAssetContainerAsync} instead
         */
        static LoadAssetContainer(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onSuccess?: Nullable<(assets: AssetContainer) => void>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string): void;
        /**
         * Load a scene into an asset container
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene (default: empty string)
         * @param scene is the instance of Scene to append to
         * @param onProgress a callback with a progress event for each file being loaded
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @returns The loaded asset container
         * @deprecated Please use the module level {@link LoadAssetContainerAsync} instead
         */
        static LoadAssetContainerAsync(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, pluginExtension?: Nullable<string>, name?: string): Promise<AssetContainer>;
        /**
         * Import animations from a file into a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)
         * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise
         * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones
         * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         * @param onSuccess a callback with the scene when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @deprecated Please use the module level {@link ImportAnimationsAsync} instead
         */
        static ImportAnimations(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, overwriteAnimations?: boolean, animationGroupLoadingMode?: SceneLoaderAnimationGroupLoadingMode, targetConverter?: Nullable<(target: any) => any>, onSuccess?: Nullable<(scene: Scene) => void>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string): void;
        /**
         * Import animations from a file into a scene
         * @param rootUrl a string that defines the root url for the scene and resources or the concatenation of rootURL and filename (e.g. http://example.com/test.glb)
         * @param sceneFilename a string that defines the name of the scene file or starts with "data:" following by the stringified version of the scene or a File object (default: empty string)
         * @param scene is the instance of BABYLON.Scene to append to (default: last created scene)
         * @param overwriteAnimations when true, animations are cleaned before importing new ones. Animations are appended otherwise
         * @param animationGroupLoadingMode defines how to handle old animations groups before importing new ones
         * @param targetConverter defines a function used to convert animation targets from loaded scene to current scene (default: search node by name)
         * @param onSuccess a callback with the scene when import succeeds
         * @param onProgress a callback with a progress event for each file being loaded
         * @param onError a callback with the scene, a message, and possibly an exception when import fails
         * @param pluginExtension the extension used to determine the plugin
         * @param name defines the filename, if the data is binary
         * @returns the updated scene with imported animations
         * @deprecated Please use the module level {@link ImportAnimationsAsync} instead
         */
        static ImportAnimationsAsync(rootUrl: string, sceneFilename?: SceneSource, scene?: Nullable<Scene>, overwriteAnimations?: boolean, animationGroupLoadingMode?: SceneLoaderAnimationGroupLoadingMode, targetConverter?: Nullable<(target: any) => any>, onSuccess?: Nullable<(scene: Scene) => void>, onProgress?: Nullable<(event: ISceneLoaderProgressEvent) => void>, onError?: Nullable<(scene: Scene, message: string, exception?: any) => void>, pluginExtension?: Nullable<string>, name?: string): Promise<Scene>;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Interface used to present a loading screen while loading a scene
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen
     */
    export interface ILoadingScreen {
        /**
         * Function called to display the loading screen
         */
        displayLoadingUI: () => void;
        /**
         * Function called to hide the loading screen
         */
        hideLoadingUI: () => void;
        /**
         * Gets or sets the color to use for the background
         */
        loadingUIBackgroundColor: string;
        /**
         * Gets or sets the text to display while loading
         */
        loadingUIText: string;
    }
    /**
     * Class used for the default loading screen
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/customLoadingScreen
     */
    export class DefaultLoadingScreen implements ILoadingScreen {
        private _renderingCanvas;
        private _loadingText;
        private _loadingDivBackgroundColor;
        private _engine;
        private _resizeObserver;
        private _isLoading;
        /**
         * Maps a loading `HTMLDivElement` to a tuple containing the associated `HTMLCanvasElement`
         * and its `DOMRect` (or `null` if not yet available).
         */
        private _loadingDivToRenderingCanvasMap;
        private _loadingTextDiv;
        private _style;
        /** Gets or sets the logo url to use for the default loading screen */
        static DefaultLogoUrl: string;
        /** Gets or sets the spinner url to use for the default loading screen */
        static DefaultSpinnerUrl: string;
        /**
         * Creates a new default loading screen
         * @param _renderingCanvas defines the canvas used to render the scene
         * @param _loadingText defines the default text to display
         * @param _loadingDivBackgroundColor defines the default background color
         */
        constructor(_renderingCanvas: HTMLCanvasElement, _loadingText?: string, _loadingDivBackgroundColor?: string);
        /**
         * Function called to display the loading screen
         */
        displayLoadingUI(): void;
        /**
         * Function called to hide the loading screen
         */
        hideLoadingUI(): void;
        /**
         * Gets or sets the text to display while loading
         */
        set loadingUIText(text: string);
        get loadingUIText(): string;
        /**
         * Gets or sets the color to use for the background
         */
        get loadingUIBackgroundColor(): string;
        set loadingUIBackgroundColor(color: string);
        /**
         * Checks if the layout of the canvas has changed by comparing the current layout
         * rectangle with the previous one.
         *
         * This function compares of the two `DOMRect` objects to determine if any of the layout dimensions have changed.
         * If the layout has changed or if there is no previous layout (i.e., `previousCanvasRect` is `null`),
         * it returns `true`. Otherwise, it returns `false`.
         *
         * @param previousCanvasRect defines the previously recorded `DOMRect` of the canvas, or `null` if no previous state exists.
         * @param currentCanvasRect defines the current `DOMRect` of the canvas to compare against the previous layout.
         * @returns `true` if the layout has changed, otherwise `false`.
         */
        private _isCanvasLayoutChanged;
        private _resizeLoadingUI;
    }
    /**
     * Register side effects for loadingScreen.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLoadingScreen(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import loadingScreen.pure for tree-shakeable, side-effect-free usage.
     */




    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * Defines how the parser contract is defined.
     * These parsers are used to parse a list of specific assets (like particle systems, etc..)
     */
    export type BabylonFileParser = (parsedData: any, scene: Scene, container: AssetContainer, rootUrl: string) => void;
    /**
     * Defines how the individual parser contract is defined.
     * These parser can parse an individual asset
     */
    export type IndividualBabylonFileParser = (parsedData: any, scene: Scene, rootUrl: string) => any;
    /**
     * Adds a parser in the list of available ones
     * @param name Defines the name of the parser
     * @param parser Defines the parser to add
     */
    export function AddParser(name: string, parser: BabylonFileParser): void;
    /**
     * Gets a general parser from the list of available ones
     * @param name Defines the name of the parser
     * @returns the requested parser or null
     */
    export function GetParser(name: string): Nullable<BabylonFileParser>;
    /**
     * Adds n individual parser in the list of available ones
     * @param name Defines the name of the parser
     * @param parser Defines the parser to add
     */
    export function AddIndividualParser(name: string, parser: IndividualBabylonFileParser): void;
    /**
     * Gets an individual parser from the list of available ones
     * @param name Defines the name of the parser
     * @returns the requested parser or null
     */
    export function GetIndividualParser(name: string): Nullable<IndividualBabylonFileParser>;
    /**
     * Parser json data and populate both a scene and its associated container object
     * @param jsonData Defines the data to parse
     * @param scene Defines the scene to parse the data for
     * @param container Defines the container attached to the parsing sequence
     * @param rootUrl Defines the root url of the data
     */
    export function Parse(jsonData: any, scene: Scene, container: AssetContainer, rootUrl: string): void;


    /** This file must only contain pure code and pure imports */
    /** @internal */
    export var _BabylonLoaderRegistered: boolean;
    /**
     * Helps setting up some configuration for the babylon file loader.
     */
    export class BabylonFileLoaderConfiguration {
        /**
         * The loader does not allow injecting custom physics engine into the plugins.
         * Unfortunately in ES6, we need to manually inject them into the plugin.
         * So you could set this variable to your engine import to make it work.
         */
        static LoaderInjectedPhysicsEngine: any;
    }
    export let TempMaterialIndexContainer: {
        [key: string]: Material;
    };
    export let TempMorphTargetManagerIndexContainer: {
        [key: string]: MorphTargetManager;
    };
    export let TempSkeletonIndexContainer: {
        [key: number]: Skeleton;
    };
    export var logOperation: (operation: string, producer: {
        file: string;
        name: string;
        version: string;
        exporter_version: string;
    }) => string;
    export const LoadDetailLevels: (scene: Scene, mesh: AbstractMesh) => void;
    export const FindMaterial: (materialId: any, scene: Scene) => Nullable<Material>;
    /**
     * @experimental
     * Loads an AssetContainer from a serialized Babylon scene.
     * @param scene The scene to load the asset container into.
     * @param serializedScene The serialized scene data. This can be either a JSON string, or an object (e.g. from a call to JSON.parse).
     * @param rootUrl The root URL for loading assets.
     * @returns The loaded AssetContainer.
     */
    export function LoadAssetContainerFromSerializedScene(scene: Scene, serializedScene: string | object, rootUrl: string): AssetContainer;
    export const LoadAssetContainer: (scene: Scene, data: string | object, rootUrl: string, onError?: (message: string, exception?: any) => void, addToScene?: boolean) => AssetContainer;
    /**
     * Register side effects for babylonFileLoader.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterBabylonFileLoader(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import babylonFileLoader.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A spot light is defined by a position, a direction, an angle, and an exponent.
     * These values define a cone of light starting from the position, emitting toward the direction.
     * The angle, in radians, defines the size (field of illumination) of the spotlight's conical beam,
     * and the exponent defines the speed of the decay of the light with distance (reach).
     * Documentation: https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
     */
    export class SpotLight extends ShadowLight {
        private _angle;
        private _innerAngle;
        /** @internal */
        _cosHalfAngle: number;
        /** @internal */
        _lightAngleScale: number;
        /** @internal */
        _lightAngleOffset: number;
        private _iesProfileTexture;
        /**
         * Gets or sets the IES profile texture used to create the spotlight
         * @see https://playground.babylonjs.com/#UIAXAU#1
         */
        get iesProfileTexture(): Nullable<BaseTexture>;
        set iesProfileTexture(value: Nullable<BaseTexture>);
        /**
         * Gets the cone angle of the spot light in Radians.
         */
        get angle(): number;
        /**
         * Sets the cone angle of the spot light in Radians.
         */
        set angle(value: number);
        /**
         * Only used in gltf falloff mode, this defines the angle where
         * the directional falloff will start before cutting at angle which could be seen
         * as outer angle.
         */
        get innerAngle(): number;
        /**
         * Only used in gltf falloff mode, this defines the angle where
         * the directional falloff will start before cutting at angle which could be seen
         * as outer angle.
         */
        set innerAngle(value: number);
        private _shadowAngleScale;
        /**
         * Allows scaling the angle of the light for shadow generation only.
         */
        get shadowAngleScale(): number;
        /**
         * Allows scaling the angle of the light for shadow generation only.
         */
        set shadowAngleScale(value: number);
        /**
         * The light decay speed with the distance from the emission spot.
         */
        exponent: number;
        private _projectionTextureMatrix;
        /**
         * Allows reading the projection texture
         */
        get projectionTextureMatrix(): Matrix;
        protected _projectionTextureLightNear: number;
        /**
         * Gets the near clip of the Spotlight for texture projection.
         */
        get projectionTextureLightNear(): number;
        /**
         * Sets the near clip of the Spotlight for texture projection.
         */
        set projectionTextureLightNear(value: number);
        protected _projectionTextureLightFar: number;
        /**
         * Gets the far clip of the Spotlight for texture projection.
         */
        get projectionTextureLightFar(): number;
        /**
         * Sets the far clip of the Spotlight for texture projection.
         */
        set projectionTextureLightFar(value: number);
        protected _projectionTextureUpDirection: Vector3;
        /**
         * Gets the Up vector of the Spotlight for texture projection.
         */
        get projectionTextureUpDirection(): Vector3;
        /**
         * Sets the Up vector of the Spotlight for texture projection.
         */
        set projectionTextureUpDirection(value: Vector3);
        private _projectionTexture;
        /**
         * Gets the projection texture of the light.
         */
        get projectionTexture(): Nullable<BaseTexture>;
        /**
         * Sets the projection texture of the light.
         */
        set projectionTexture(value: Nullable<BaseTexture>);
        private static _IsProceduralTexture;
        private static _IsTexture;
        private _projectionTextureViewLightDirty;
        private _projectionTextureProjectionLightDirty;
        private _projectionTextureDirty;
        private _projectionTextureViewTargetVector;
        private _projectionTextureViewLightMatrix;
        private _projectionTextureProjectionLightMatrix;
        /**
         * Gets or sets the light projection matrix as used by the projection texture
         */
        get projectionTextureProjectionLightMatrix(): Matrix;
        set projectionTextureProjectionLightMatrix(projection: Matrix);
        private _projectionTextureScalingMatrix;
        /**
         * Creates a SpotLight object in the scene. A spot light is a simply light oriented cone.
         * It can cast shadows.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The light friendly name
         * @param position The position of the spot light in the scene
         * @param direction The direction of the light in the scene
         * @param angle The cone angle of the light in Radians
         * @param exponent The light decay speed with the distance from the emission spot
         * @param scene The scene the lights belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, position: Vector3, direction: Vector3, angle: number, exponent: number, scene?: Scene, dontAddToScene?: boolean);
        /**
         * Returns the string "SpotLight".
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Returns the integer 2.
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        /**
         * Overrides the direction setter to recompute the projection texture view light Matrix.
         * @param value
         */
        protected _setDirection(value: Vector3): void;
        /**
         * Overrides the position setter to recompute the projection texture view light Matrix.
         * @param value
         */
        protected _setPosition(value: Vector3): void;
        /**
         * Sets the passed matrix "matrix" as perspective projection matrix for the shadows and the passed view matrix with the fov equal to the SpotLight angle and and aspect ratio of 1.0.
         * Returns the SpotLight.
         * @param matrix
         * @param viewMatrix
         * @param renderList
         */
        protected _setDefaultShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
        protected _computeProjectionTextureViewLightMatrix(): void;
        protected _computeProjectionTextureProjectionLightMatrix(): void;
        /**
         * Main function for light texture projection matrix computing.
         */
        protected _computeProjectionTextureMatrix(): void;
        protected _buildUniformLayout(): void;
        private _computeAngleValues;
        /**
         * Sets the passed Effect "effect" with the Light textures.
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The light
         */
        transferTexturesToEffect(effect: Effect, lightIndex: string): Light;
        /**
         * Sets the passed Effect object with the SpotLight transformed position (or position if not parented) and normalized direction.
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The spot light
         */
        transferToEffect(effect: Effect, lightIndex: string): SpotLight;
        transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): this;
        /**
         * Disposes the light and the associated resources.
         */
        dispose(): void;
        /**
         * Gets the minZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the min for
         * @returns the depth min z
         */
        getDepthMinZ(activeCamera: Nullable<Camera>): number;
        /**
         * Gets the maxZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the max for
         * @returns the depth max z
         */
        getDepthMaxZ(activeCamera: Nullable<Camera>): number;
        /**
         * Returns whether light related textures are ready to be used in the rendering
         * @override
         * @returns true if the light textures are ready
         */
        areLightTexturesReady(): boolean;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
    }
    /**
     * Register side effects for spotLight.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSpotLight(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import spotLight.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Interface describing all the common properties and methods a shadow light needs to implement.
     * This helps both the shadow generator and materials to generate the corresponding shadow maps
     * as well as binding the different shadow properties to the effects.
     */
    export interface IShadowLight extends Light {
        /**
         * The light id in the scene (used in scene.getLightById for instance)
         */
        id: string;
        /**
         * The position the shadow will be casted from.
         */
        position: Vector3;
        /**
         * In 2d mode (needCube being false), the direction used to cast the shadow.
         */
        direction: Vector3;
        /**
         * The transformed position. Position of the light in world space taking parenting in account.
         */
        transformedPosition: Vector3;
        /**
         * The transformed direction. Direction of the light in world space taking parenting in account.
         */
        transformedDirection: Vector3;
        /**
         * The friendly name of the light in the scene.
         */
        name: string;
        /**
         * Defines the shadow projection clipping minimum z value.
         */
        shadowMinZ: number;
        /**
         * Defines the shadow projection clipping maximum z value.
         */
        shadowMaxZ: number;
        /**
         * Computes the transformed information (transformedPosition and transformedDirection in World space) of the current light
         * @returns true if the information has been computed, false if it does not need to (no parenting)
         */
        computeTransformedInformation(): boolean;
        /**
         * Gets the scene the light belongs to.
         * @returns The scene
         */
        getScene(): Scene;
        /**
         * Callback defining a custom Projection Matrix Builder.
         * This can be used to override the default projection matrix computation.
         */
        customProjectionMatrixBuilder: (viewMatrix: Matrix, renderList: Array<AbstractMesh>, result: Matrix) => void;
        /**
         * Sets the shadow projection matrix in parameter to the generated projection matrix.
         * @param matrix The matrix to update with the projection information
         * @param viewMatrix The transform matrix of the light
         * @param renderList The list of mesh to render in the map
         * @returns The current light
         */
        setShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): IShadowLight;
        /**
         * Gets the current depth scale used in ESM.
         * @returns The scale
         */
        getDepthScale(): number;
        /**
         * Returns whether or not the shadow generation require a cube texture or a 2d texture.
         * @returns true if a cube texture needs to be use
         */
        needCube(): boolean;
        /**
         * Detects if the projection matrix requires to be recomputed this frame.
         * @returns true if it requires to be recomputed otherwise, false.
         */
        needProjectionMatrixCompute(): boolean;
        /**
         * Forces the shadow generator to recompute the projection matrix even if position and direction did not changed.
         */
        forceProjectionMatrixCompute(): void;
        /**
         * Get the direction to use to render the shadow map. In case of cube texture, the face index can be passed.
         * @param faceIndex The index of the face we are computed the direction to generate shadow
         * @returns The set direction in 2d mode otherwise the direction to the cubemap face if needCube() is true
         */
        getShadowDirection(faceIndex?: number): Vector3;
        /**
         * Gets the minZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the min for
         * @returns the depth min z
         */
        getDepthMinZ(activeCamera: Nullable<Camera>): number;
        /**
         * Gets the maxZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the max for
         * @returns the depth max z
         */
        getDepthMaxZ(activeCamera: Nullable<Camera>): number;
    }
    /**
     * Base implementation IShadowLight
     * It groups all the common behaviour in order to reduce duplication and better follow the DRY pattern.
     */
    export abstract class ShadowLight extends Light implements IShadowLight {
        protected abstract _setDefaultShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
        protected _position: Vector3;
        protected _setPosition(value: Vector3): void;
        /**
         * Sets the position the shadow will be casted from. Also use as the light position for both
         * point and spot lights.
         */
        get position(): Vector3;
        /**
         * Sets the position the shadow will be casted from. Also use as the light position for both
         * point and spot lights.
         */
        set position(value: Vector3);
        protected _direction: Vector3;
        protected _setDirection(value: Vector3): void;
        /**
         * In 2d mode (needCube being false), gets the direction used to cast the shadow.
         * Also use as the light direction on spot and directional lights.
         */
        get direction(): Vector3;
        /**
         * In 2d mode (needCube being false), sets the direction used to cast the shadow.
         * Also use as the light direction on spot and directional lights.
         */
        set direction(value: Vector3);
        protected _shadowMinZ: number;
        /**
         * Gets the shadow projection clipping minimum z value.
         */
        get shadowMinZ(): number;
        /**
         * Sets the shadow projection clipping minimum z value.
         */
        set shadowMinZ(value: number);
        protected _shadowMaxZ: number;
        /**
         * Sets the shadow projection clipping maximum z value.
         */
        get shadowMaxZ(): number;
        /**
         * Gets the shadow projection clipping maximum z value.
         */
        set shadowMaxZ(value: number);
        /**
         * Callback defining a custom Projection Matrix Builder.
         * This can be used to override the default projection matrix computation.
         */
        customProjectionMatrixBuilder: (viewMatrix: Matrix, renderList: Array<AbstractMesh>, result: Matrix) => void;
        /**
         * The transformed position. Position of the light in world space taking parenting in account. Needs to be computed by calling computeTransformedInformation.
         */
        transformedPosition: Vector3;
        /**
         * The transformed direction. Direction of the light in world space taking parenting in account.
         */
        transformedDirection: Vector3;
        private _needProjectionMatrixCompute;
        /**
         * Computes the transformed information (transformedPosition and transformedDirection in World space) of the current light
         * @returns true if the information has been computed, false if it does not need to (no parenting)
         */
        computeTransformedInformation(): boolean;
        /**
         * Return the depth scale used for the shadow map.
         * @returns the depth scale.
         */
        getDepthScale(): number;
        /**
         * Get the direction to use to render the shadow map. In case of cube texture, the face index can be passed.
         * @param faceIndex The index of the face we are computed the direction to generate shadow
         * @returns The set direction in 2d mode otherwise the direction to the cubemap face if needCube() is true
         */
        getShadowDirection(faceIndex?: number): Vector3;
        /**
         * If computeTransformedInformation has been called, returns the ShadowLight absolute position in the world. Otherwise, returns the local position.
         * @returns the position vector in world space
         */
        getAbsolutePosition(): Vector3;
        /**
         * Sets the ShadowLight direction toward the passed target.
         * @param target The point to target in local space
         * @returns the updated ShadowLight direction
         */
        setDirectionToTarget(target: Vector3): Vector3;
        /**
         * Returns the light rotation in euler definition.
         * @returns the x y z rotation in local space.
         */
        getRotation(): Vector3;
        /**
         * Returns whether or not the shadow generation require a cube texture or a 2d texture.
         * @returns true if a cube texture needs to be use
         */
        needCube(): boolean;
        /**
         * Detects if the projection matrix requires to be recomputed this frame.
         * @returns true if it requires to be recomputed otherwise, false.
         */
        needProjectionMatrixCompute(): boolean;
        /**
         * Forces the shadow generator to recompute the projection matrix even if position and direction did not changed.
         */
        forceProjectionMatrixCompute(): void;
        /** @internal */
        _initCache(): void;
        /** @internal */
        _isSynchronized(): boolean;
        /**
         * Computes the world matrix of the node
         * @param force defines if the cache version should be invalidated forcing the world matrix to be created from scratch
         * @returns the world matrix
         */
        computeWorldMatrix(force?: boolean): Matrix;
        /**
         * Gets the minZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the min for
         * @returns the depth min z
         */
        getDepthMinZ(activeCamera: Nullable<Camera>): number;
        /**
         * Gets the maxZ used for shadow according to both the scene and the light.
         * @param activeCamera The camera we are returning the max for
         * @returns the depth max z
         */
        getDepthMaxZ(activeCamera: Nullable<Camera>): number;
        /**
         * Sets the shadow projection matrix in parameter to the generated projection matrix.
         * @param matrix The matrix to updated with the projection information
         * @param viewMatrix The transform matrix of the light
         * @param renderList The list of mesh to render in the map
         * @returns The current light
         */
        setShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): IShadowLight;
        /** @internal */
        protected _syncParentEnabledState(): void;
        protected _viewMatrix: Matrix;
        protected _projectionMatrix: Matrix;
        /**
         * Returns the view matrix.
         * @param faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.
         * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).
         */
        getViewMatrix(faceIndex?: number): Nullable<Matrix>;
        /**
         * Returns the projection matrix.
         * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).
         * @param viewMatrix The view transform matrix of the light (optional).
         * @param renderList The list of meshes to take into account when calculating the projection matrix (optional).
         * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).
         */
        getProjectionMatrix(viewMatrix?: Matrix, renderList?: Array<AbstractMesh>): Nullable<Matrix>;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * A rectangular area light defined by an unique point in world space, a width and a height.
     * The light is emitted from the rectangular area in the -Z direction.
     */
    export class RectAreaLight extends AreaLight {
        private readonly _width;
        private readonly _height;
        protected readonly _pointTransformedPosition: Vector3;
        protected readonly _pointTransformedWidth: Vector3;
        protected readonly _pointTransformedHeight: Vector3;
        private _emissionTextureTexture;
        /**
         * Gets Rect Area Light emission texture. (Note: This texture needs pre-processing! Use AreaLightTextureTools to pre-process the texture).
         */
        get emissionTexture(): Nullable<BaseTexture>;
        /**
         * Sets Rect Area Light emission texture. (Note: This texture needs pre-processing! Use AreaLightTextureTools to pre-process the texture).
         */
        set emissionTexture(value: Nullable<BaseTexture>);
        /**
         * Rect Area Light width.
         */
        get width(): number;
        /**
         * Rect Area Light width.
         */
        set width(value: number);
        /**
         * Rect Area Light height.
         */
        get height(): number;
        /**
         * Rect Area Light height.
         */
        set height(value: number);
        /**
         * Creates a rectangular area light object.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The friendly name of the light
         * @param position The position of the area light.
         * @param width The width of the area light.
         * @param height The height of the area light.
         * @param scene The scene the light belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, position: Vector3, width: number, height: number, scene?: Scene, dontAddToScene?: boolean);
        /**
         * Returns the string "RectAreaLight"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Returns the integer 4.
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        protected _buildUniformLayout(): void;
        protected _computeTransformedInformation(): boolean;
        private static _IsTexture;
        /**
         * Sets the passed Effect "effect" with the PointLight transformed position (or position, if none) and passed name (string).
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The point light
         */
        transferToEffect(effect: Effect, lightIndex: string): RectAreaLight;
        transferTexturesToEffect(effect: Effect, lightIndex: string): Light;
        transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): this;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
    }
    /**
     * Register side effects for rectAreaLight.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterRectAreaLight(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import rectAreaLight.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * A point light is a light defined by an unique point in world space.
     * The light is emitted in every direction from this point.
     * A good example of a point light is a standard light bulb.
     * Documentation: https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
     */
    export class PointLight extends ShadowLight {
        private _shadowAngle;
        /**
         * Getter: In case of direction provided, the shadow will not use a cube texture but simulate a spot shadow as a fallback
         * This specifies what angle the shadow will use to be created.
         *
         * It default to 90 degrees to work nicely with the cube texture generation for point lights shadow maps.
         */
        get shadowAngle(): number;
        /**
         * Setter: In case of direction provided, the shadow will not use a cube texture but simulate a spot shadow as a fallback
         * This specifies what angle the shadow will use to be created.
         *
         * It default to 90 degrees to work nicely with the cube texture generation for point lights shadow maps.
         */
        set shadowAngle(value: number);
        /**
         * Gets the direction if it has been set.
         * In case of direction provided, the shadow will not use a cube texture but simulate a spot shadow as a fallback
         */
        get direction(): Vector3;
        /**
         * In case of direction provided, the shadow will not use a cube texture but simulate a spot shadow as a fallback
         */
        set direction(value: Vector3);
        /**
         * Creates a PointLight object from the passed name and position (Vector3) and adds it in the scene.
         * A PointLight emits the light in every direction.
         * It can cast shadows.
         * If the scene camera is already defined and you want to set your PointLight at the camera position, just set it :
         * ```javascript
         * var pointLight = new PointLight("pl", camera.position, scene);
         * ```
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The light friendly name
         * @param position The position of the point light in the scene
         * @param scene The scene the lights belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, position: Vector3, scene?: Scene, dontAddToScene?: boolean);
        /**
         * Returns the string "PointLight"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Returns the integer 0.
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        /**
         * Specifies whether or not the shadowmap should be a cube texture.
         * @returns true if the shadowmap needs to be a cube texture.
         */
        needCube(): boolean;
        /**
         * Returns a new Vector3 aligned with the PointLight cube system according to the passed cube face index (integer).
         * @param faceIndex The index of the face we are computed the direction to generate shadow
         * @returns The set direction in 2d mode otherwise the direction to the cubemap face if needCube() is true
         */
        getShadowDirection(faceIndex?: number): Vector3;
        /**
         * Sets the passed matrix "matrix" as a left-handed perspective projection matrix with the following settings :
         * - fov = PI / 2
         * - aspect ratio : 1.0
         * - z-near and far equal to the active camera minZ and maxZ.
         * Returns the PointLight.
         * @param matrix
         * @param viewMatrix
         * @param renderList
         */
        protected _setDefaultShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
        protected _buildUniformLayout(): void;
        /**
         * Sets the passed Effect "effect" with the PointLight transformed position (or position, if none) and passed name (string).
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The point light
         */
        transferToEffect(effect: Effect, lightIndex: string): PointLight;
        transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): this;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
    }
    /**
     * Register side effects for pointLight.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterPointLight(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import pointLight.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Class used to create a lighting volume from a directional light's shadow generator.
     */
    export class LightingVolume {
        private readonly _engine;
        private readonly _scene;
        private readonly _mesh;
        private readonly _copyTexture?;
        private readonly _uBuffer?;
        private readonly _buildFullVolume;
        private _name;
        private _cs?;
        private _cs2?;
        private _light?;
        private _fallbackTexture?;
        private _storageBuffer?;
        private _depthCopy?;
        private _readPixelPromise;
        private _readPixelAbortController;
        private _numFrames;
        private _firstUpdate;
        private _currentLightDirection;
        private _positions;
        private _indices;
        private _needFullUpdateUBO;
        private _currentShadowDepthTexture;
        private _shadowGenerator?;
        /**
         * The shadow generator used to create the lighting volume.
         */
        get shadowGenerator(): ShadowGenerator;
        set shadowGenerator(sg: ShadowGenerator);
        private _tesselation;
        /**
         * The tesselation level of the lighting volume.
         */
        get tesselation(): number;
        set tesselation(n: number);
        /**
         * The mesh used as a support for the lighting volume.
         * Note that this mesh is not automatically added to the scene's mesh array.
         * If you want to render it, you need to add it manually.
         */
        get mesh(): Mesh;
        private _frequency;
        /**
         * The frequency (in number of times you call updateMesh) at which the lighting volume is updated.
         */
        get frequency(): number;
        set frequency(value: number);
        /**
         * The name of the lighting volume.
         */
        get name(): string;
        set name(name: string);
        /**
         * Indicates whether this is the first update of the lighting volume.
         * If true, the volume has not yet been updated for the first time.
         */
        get firstUpdate(): boolean;
        /** @internal */
        _setComputeShaderFastMode(enabled: boolean): void;
        /**
         * Creates a new LightingVolume.
         * @param name The name of the lighting volume.
         * @param scene The scene the lighting volume belongs to.
         * @param shadowGenerator The shadow generator used to create the lighting volume. This is optional in the constructor, but must be set before calling updateMesh.
         * @param tesselation The tesselation level of the lighting volume (default: 64).
         */
        constructor(name: string, scene: Scene, shadowGenerator?: ShadowGenerator, tesselation?: number);
        /**
         * Checks if the lighting volume is ready to be updated.
         * @returns True if the volume is ready to be updated.
         */
        isReady(): boolean;
        /**
         * Updates the lighting volume mesh.
         * @param forceUpdate If true, forces the update even if the frequency condition is not met.
         */
        update(forceUpdate?: boolean): void;
        /**
         * Disposes the lighting volume and associated resources.
         */
        dispose(): void;
        private _needUpdateGeometry;
        private _createComputeShader;
        private _setComputeShaderInputs;
        private _createFallbackTextures;
        private _fallbackReadPixelAsync;
        private _fullUpdateUBO;
        private _createGeometry;
        private _updateGeometry;
        private _createIndices;
    }




    /** Defines the cross module constantsused by lights to avoid circular dependencies */
    export class LightConstants {
        /**
         * Falloff Default: light is falling off following the material specification:
         * standard material is using standard falloff whereas pbr material can request special falloff per materials.
         */
        static readonly FALLOFF_DEFAULT = 0;
        /**
         * Falloff Physical: light is falling off following the inverse squared distance law.
         */
        static readonly FALLOFF_PHYSICAL = 1;
        /**
         * Falloff gltf: light is falling off as described in the gltf moving to PBR document
         * to enhance interoperability with other engines.
         */
        static readonly FALLOFF_GLTF = 2;
        /**
         * Falloff Standard: light is falling off like in the standard material
         * to enhance interoperability with other materials.
         */
        static readonly FALLOFF_STANDARD = 3;
        /**
         * If every light affecting the material is in this lightmapMode,
         * material.lightmapTexture adds or multiplies
         * (depends on material.useLightmapAsShadowmap)
         * after every other light calculations.
         */
        static readonly LIGHTMAP_DEFAULT = 0;
        /**
         * material.lightmapTexture as only diffuse lighting from this light
         * adds only specular lighting from this light
         * adds dynamic shadows
         */
        static readonly LIGHTMAP_SPECULAR = 1;
        /**
         * material.lightmapTexture as only lighting
         * no light calculation from this light
         * only adds dynamic shadows from this light
         */
        static readonly LIGHTMAP_SHADOWSONLY = 2;
        /**
         * Each light type uses the default quantity according to its type:
         *      point/spot lights use luminous intensity
         *      directional lights use illuminance
         */
        static readonly INTENSITYMODE_AUTOMATIC = 0;
        /**
         * lumen (lm)
         */
        static readonly INTENSITYMODE_LUMINOUSPOWER = 1;
        /**
         * candela (lm/sr)
         */
        static readonly INTENSITYMODE_LUMINOUSINTENSITY = 2;
        /**
         * lux (lm/m^2)
         */
        static readonly INTENSITYMODE_ILLUMINANCE = 3;
        /**
         * nit (cd/m^2)
         */
        static readonly INTENSITYMODE_LUMINANCE = 4;
        /**
         * Light type var id of the point light.
         */
        static readonly LIGHTTYPEID_POINTLIGHT = 0;
        /**
         * Light type var id of the directional light.
         */
        static readonly LIGHTTYPEID_DIRECTIONALLIGHT = 1;
        /**
         * Light type var id of the spot light.
         */
        static readonly LIGHTTYPEID_SPOTLIGHT = 2;
        /**
         * Light type var id of the hemispheric light.
         */
        static readonly LIGHTTYPEID_HEMISPHERICLIGHT = 3;
        /**
         * Light type var id of the area light.
         */
        static readonly LIGHTTYPEID_RECT_AREALIGHT = 4;
        /**
         * Light type var id of the clustered light.
         */
        static readonly LIGHTTYPEID_CLUSTERED_CONTAINER = 5;
        /**
         * Sort function to order lights for rendering.
         * @param a First Light object to compare to second.
         * @param b Second Light object to compare first.
         * @returns -1 to reduce's a's index relative to be, 0 for no change, 1 to increase a's index relative to b.
         */
        static CompareLightsPriority(a: ISortableLight, b: ISortableLight): number;
    }
    /**
     * Defines the common interface of sortable lights
     */
    export interface ISortableLight {
        /**
         * Gets or sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching
         * the current shadow generator.
         */
        shadowEnabled: boolean;
        /**
         * Defines the rendering priority of the lights. It can help in case of fallback or number of lights
         * exceeding the number allowed of the materials.
         */
        renderPriority: number;
    }


    /**
     * Base class of all the lights in Babylon. It groups all the generic information about lights.
     * Lights are used, as you would expect, to affect how meshes are seen, in terms of both illumination and colour.
     * All meshes allow light to pass through them unless shadow generation is activated. The default number of lights allowed is four but this can be increased.
     */
    export abstract class Light extends Node implements ISortableLight {
        /**
         * Falloff Default: light is falling off following the material specification:
         * standard material is using standard falloff whereas pbr material can request special falloff per materials.
         */
        static readonly FALLOFF_DEFAULT = 0;
        /**
         * Falloff Physical: light is falling off following the inverse squared distance law.
         */
        static readonly FALLOFF_PHYSICAL = 1;
        /**
         * Falloff gltf: light is falling off as described in the gltf moving to PBR document
         * to enhance interoperability with other engines.
         */
        static readonly FALLOFF_GLTF = 2;
        /**
         * Falloff Standard: light is falling off like in the standard material
         * to enhance interoperability with other materials.
         */
        static readonly FALLOFF_STANDARD = 3;
        /**
         * If every light affecting the material is in this lightmapMode,
         * material.lightmapTexture adds or multiplies
         * (depends on material.useLightmapAsShadowmap)
         * after every other light calculations.
         */
        static readonly LIGHTMAP_DEFAULT = 0;
        /**
         * material.lightmapTexture as only diffuse lighting from this light
         * adds only specular lighting from this light
         * adds dynamic shadows
         */
        static readonly LIGHTMAP_SPECULAR = 1;
        /**
         * material.lightmapTexture as only lighting
         * no light calculation from this light
         * only adds dynamic shadows from this light
         */
        static readonly LIGHTMAP_SHADOWSONLY = 2;
        /**
         * Each light type uses the default quantity according to its type:
         *      point/spot lights use luminous intensity
         *      directional lights use illuminance
         */
        static readonly INTENSITYMODE_AUTOMATIC = 0;
        /**
         * lumen (lm)
         */
        static readonly INTENSITYMODE_LUMINOUSPOWER = 1;
        /**
         * candela (lm/sr)
         */
        static readonly INTENSITYMODE_LUMINOUSINTENSITY = 2;
        /**
         * lux (lm/m^2)
         */
        static readonly INTENSITYMODE_ILLUMINANCE = 3;
        /**
         * nit (cd/m^2)
         */
        static readonly INTENSITYMODE_LUMINANCE = 4;
        /**
         * Light type var id of the point light.
         */
        static readonly LIGHTTYPEID_POINTLIGHT = 0;
        /**
         * Light type var id of the directional light.
         */
        static readonly LIGHTTYPEID_DIRECTIONALLIGHT = 1;
        /**
         * Light type var id of the spot light.
         */
        static readonly LIGHTTYPEID_SPOTLIGHT = 2;
        /**
         * Light type var id of the hemispheric light.
         */
        static readonly LIGHTTYPEID_HEMISPHERICLIGHT = 3;
        /**
         * Light type var id of the area light.
         */
        static readonly LIGHTTYPEID_RECT_AREALIGHT = 4;
        /**
         * Diffuse gives the basic color to an object.
         */
        diffuse: Color3;
        /**
         * Specular produces a highlight color on an object.
         * Note: This is not affecting PBR materials.
         */
        specular: Color3;
        /**
         * Defines the falloff type for this light. This lets overriding how punctual light are
         * falling off base on range or angle.
         * This can be set to any values in Light.FALLOFF_x.
         *
         * Note: This is only useful for PBR Materials at the moment. This could be extended if required to
         * other types of materials.
         */
        falloffType: number;
        /**
         * Strength of the light.
         * Note: By default it is define in the framework own unit.
         * Note: In PBR materials the intensityMode can be use to chose what unit the intensity is defined in.
         */
        intensity: number;
        private _range;
        /** @internal */
        _inverseSquaredRange: number;
        /**
         * Defines how far from the source the light is impacting in scene units.
         * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.
         */
        get range(): number;
        /**
         * Defines how far from the source the light is impacting in scene units.
         * Note: Unused in PBR material as the distance light falloff is defined following the inverse squared falloff.
         */
        set range(value: number);
        /**
         * Cached photometric scale default to 1.0 as the automatic intensity mode defaults to 1.0 for every type
         * of light.
         */
        private _photometricScale;
        private _intensityMode;
        /**
         * Gets the photometric scale used to interpret the intensity.
         * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.
         */
        get intensityMode(): number;
        /**
         * Sets the photometric scale used to interpret the intensity.
         * This is only relevant with PBR Materials where the light intensity can be defined in a physical way.
         */
        set intensityMode(value: number);
        private _radius;
        /**
         * Gets the light radius used by PBR Materials to simulate soft area lights.
         */
        get radius(): number;
        /**
         * sets the light radius used by PBR Materials to simulate soft area lights.
         */
        set radius(value: number);
        private _renderPriority;
        /**
         * Defines the rendering priority of the lights. It can help in case of fallback or number of lights
         * exceeding the number allowed of the materials.
         */
        renderPriority: number;
        private _shadowEnabled;
        /**
         * Gets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching
         * the current shadow generator.
         */
        get shadowEnabled(): boolean;
        /**
         * Sets whether or not the shadows are enabled for this light. This can help turning off/on shadow without detaching
         * the current shadow generator.
         */
        set shadowEnabled(value: boolean);
        private _includedOnlyMeshes;
        /**
         * Gets the only meshes impacted by this light.
         */
        get includedOnlyMeshes(): AbstractMesh[];
        /**
         * Sets the only meshes impacted by this light.
         */
        set includedOnlyMeshes(value: AbstractMesh[]);
        private _excludedMeshes;
        /**
         * Gets the meshes not impacted by this light.
         */
        get excludedMeshes(): AbstractMesh[];
        /**
         * Sets the meshes not impacted by this light.
         */
        set excludedMeshes(value: AbstractMesh[]);
        private _excludeWithLayerMask;
        /**
         * Gets the layer id use to find what meshes are not impacted by the light.
         * Inactive if 0
         */
        get excludeWithLayerMask(): number;
        /**
         * Sets the layer id use to find what meshes are not impacted by the light.
         * Inactive if 0
         */
        set excludeWithLayerMask(value: number);
        private _includeOnlyWithLayerMask;
        /**
         * Gets the layer id use to find what meshes are impacted by the light.
         * Inactive if 0
         */
        get includeOnlyWithLayerMask(): number;
        /**
         * Sets the layer id use to find what meshes are impacted by the light.
         * Inactive if 0
         */
        set includeOnlyWithLayerMask(value: number);
        private _lightmapMode;
        /**
         * Gets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)
         */
        get lightmapMode(): number;
        /**
         * Sets the lightmap mode of this light (should be one of the constants defined by Light.LIGHTMAP_x)
         */
        set lightmapMode(value: number);
        /**
         * Returns the view matrix.
         * @param _faceIndex The index of the face for which we want to extract the view matrix. Only used for point light types.
         * @returns The view matrix. Can be null, if a view matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).
         */
        getViewMatrix(_faceIndex?: number): Nullable<Matrix>;
        /**
         * Returns the projection matrix.
         * Note that viewMatrix and renderList are optional and are only used by lights that calculate the projection matrix from a list of meshes (e.g. directional lights with automatic extents calculation).
         * @param _viewMatrix The view transform matrix of the light (optional).
         * @param _renderList The list of meshes to take into account when calculating the projection matrix (optional).
         * @returns The projection matrix. Can be null, if a projection matrix cannot be defined for the type of light considered (as for a hemispherical light, for example).
         */
        getProjectionMatrix(_viewMatrix?: Matrix, _renderList?: Array<AbstractMesh>): Nullable<Matrix>;
        /**
         * Shadow generators associated to the light.
         * @internal Internal use only.
         */
        _shadowGenerators: Nullable<Map<Nullable<Camera>, IShadowGenerator>>;
        /**
         * @internal Internal use only.
         */
        _excludedMeshesIds: string[];
        /**
         * @internal Internal use only.
         */
        _includedOnlyMeshesIds: string[];
        /**
         * The current light uniform buffer.
         * @internal Internal use only.
         */
        _uniformBuffer: UniformBuffer;
        /** @internal */
        _renderId: number;
        private _lastUseSpecular;
        /**
         * Used internally by ClusteredLight to sort lights
         * @internal
         */
        _currentViewDepth: number;
        /**
         * Used internally by ClusteredLightContainer to keep child lights out of mesh light source lists.
         * @internal
         */
        _clusteredContainer: Nullable<Light>;
        /**
         * Creates a Light object in the scene.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The friendly name of the light
         * @param scene The scene the light belongs too
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, scene?: Scene, dontAddToScene?: boolean);
        protected abstract _buildUniformLayout(): void;
        /**
         * Sets the passed Effect "effect" with the Light information.
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The light
         */
        abstract transferToEffect(effect: Effect, lightIndex: string): Light;
        /**
         * Sets the passed Effect "effect" with the Light textures.
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The light
         */
        transferTexturesToEffect(effect: Effect, lightIndex: string): Light;
        /**
         * Binds the lights information from the scene to the effect for the given mesh.
         * @param lightIndex Light index
         * @param scene The scene where the light belongs to
         * @param effect The effect we are binding the data to
         * @param useSpecular Defines if specular is supported
         * @param receiveShadows Defines if the effect (mesh) we bind the light for receives shadows
         */
        _bindLight(lightIndex: number, scene: Scene, effect: Effect, useSpecular: boolean, receiveShadows?: boolean): void;
        /**
         * Sets the passed Effect "effect" with the Light information.
         * @param effect The effect to update
         * @param lightDataUniformName The uniform used to store light data (position or direction)
         * @returns The light
         */
        abstract transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): Light;
        /**
         * Returns the string "Light".
         * @returns the class name
         */
        getClassName(): string;
        /** @internal */
        readonly _isLight = true;
        /**
         * Converts the light information to a readable string for debug purpose.
         * @param fullDetails Supports for multiple levels of logging within scene loading
         * @returns the human readable light info
         */
        toString(fullDetails?: boolean): string;
        /** @internal */
        protected _syncParentEnabledState(): void;
        /**
         * Set the enabled state of this node.
         * @param value - the new enabled state
         */
        setEnabled(value: boolean): void;
        /**
         * Returns the Light associated shadow generator if any.
         * @param camera Camera for which the shadow generator should be retrieved (default: null). If null, retrieves the default shadow generator
         * @returns the associated shadow generator.
         */
        getShadowGenerator(camera?: Nullable<Camera>): Nullable<IShadowGenerator>;
        /**
         * Returns all the shadow generators associated to this light
         * @returns
         */
        getShadowGenerators(): Nullable<Map<Nullable<Camera>, IShadowGenerator>>;
        /**
         * Returns a Vector3, the absolute light position in the World.
         * @returns the world space position of the light
         */
        getAbsolutePosition(): Vector3;
        /**
         * Specifies if the light will affect the passed mesh.
         * @param mesh The mesh to test against the light
         * @returns true the mesh is affected otherwise, false.
         */
        canAffectMesh(mesh: AbstractMesh): boolean;
        /**
         * Releases resources associated with this node.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * Returns the light type ID (integer).
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        /**
         * Returns the intensity scaled by the Photometric Scale according to the light type and intensity mode.
         * @returns the scaled intensity in intensity mode unit
         */
        getScaledIntensity(): number;
        /**
         * Returns a new Light object, named "name", from the current one.
         * @param name The name of the cloned light
         * @param newParent The parent of this light, if it has one
         * @returns the new created light
         */
        clone(name: string, newParent?: Nullable<Node>): Nullable<Light>;
        /**
         * Serializes the current light into a Serialization object.
         * @returns the serialized object.
         */
        serialize(): any;
        /**
         * Creates a new typed light from the passed type (integer) : point light = 0, directional light = 1, spot light = 2, hemispheric light = 3.
         * This new light is named "name" and added to the passed scene.
         * @param type Type according to the types available in Light.LIGHTTYPEID_x
         * @param name The friendly name of the light
         * @param scene The scene the new light will belong to
         * @returns the constructor function
         */
        static GetConstructorFromName(type: number, name: string, scene: Scene): Nullable<() => Light>;
        /**
         * Parses the passed "parsedLight" and returns a new instanced Light from this parsing.
         * @param parsedLight The JSON representation of the light
         * @param scene The scene to create the parsed light in
         * @returns the created light after parsing
         */
        static Parse(parsedLight: any, scene: Scene): Nullable<Light>;
        /**
         * Called after the light has been fully parsed and all base properties have been set.
         * Override in subclasses to handle custom serialized data.
         * @param _parsedLight The JSON representation of the light
         * @param _scene The scene the light belongs to
         */
        protected _onParsed(_parsedLight: any, _scene: Scene): void;
        private _hookArrayForExcluded;
        private _hookArrayForIncludedOnly;
        private _resyncMeshes;
        /**
         * Forces the meshes to update their light related information in their rendering used effects
         * @internal Internal Use Only
         */
        _markMeshesAsLightDirty(): void;
        /**
         * Recomputes the cached photometric scale if needed.
         */
        private _computePhotometricScale;
        /**
         * @returns the Photometric Scale according to the light type and intensity mode.
         */
        private _getPhotometricScale;
        /**
         * Reorder the light in the scene according to their defined priority.
         * @internal Internal Use Only
         */
        _reorderLightsInScene(): void;
        /**
         * Returns true when all texture resources used by this light are ready (e.g. projection textures).
         * Override in subclasses that use texture resources.
         * @returns true if all light textures are ready
         */
        areLightTexturesReady(): boolean;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        abstract prepareLightSpecificDefines(defines: any, lightIndex: number): void;
        /**
         * @internal
         */
        _isReady(): boolean;
    }




    /** This file must only contain pure code and pure imports */
    /**
     * The HemisphericLight simulates the ambient environment light,
     * so the passed direction is the light reflection direction, not the incoming direction.
     */
    export class HemisphericLight extends Light {
        /**
         * The groundColor is the light in the opposite direction to the one specified during creation.
         * You can think of the diffuse and specular light as coming from the centre of the object in the given direction and the groundColor light in the opposite direction.
         */
        groundColor: Color3;
        /**
         * The light reflection direction, not the incoming direction.
         */
        direction: Vector3;
        /**
         * Creates a HemisphericLight object in the scene according to the passed direction (Vector3).
         * The HemisphericLight simulates the ambient environment light, so the passed direction is the light reflection direction, not the incoming direction.
         * The HemisphericLight can't cast shadows.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The friendly name of the light
         * @param direction The direction of the light reflection
         * @param scene The scene the light belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, direction: Vector3, scene?: Scene, dontAddToScene?: boolean);
        protected _buildUniformLayout(): void;
        /**
         * Returns the string "HemisphericLight".
         * @returns The class name
         */
        getClassName(): string;
        /**
         * Sets the HemisphericLight direction towards the passed target (Vector3).
         * Returns the updated direction.
         * @param target The target the direction should point to
         * @returns The computed direction
         */
        setDirectionToTarget(target: Vector3): Vector3;
        /**
         * Returns the shadow generator associated to the light.
         * @returns Always null for hemispheric lights because it does not support shadows.
         */
        getShadowGenerator(): Nullable<IShadowGenerator>;
        /**
         * Sets the passed Effect object with the HemisphericLight normalized direction and color and the passed name (string).
         * @param _effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The hemispheric light
         */
        transferToEffect(_effect: Effect, lightIndex: string): HemisphericLight;
        transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): this;
        /**
         * Computes the world matrix of the node
         * @returns the world matrix
         */
        computeWorldMatrix(): Matrix;
        /**
         * Returns the integer 3.
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
    }
    /**
     * Register side effects for hemisphericLight.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterHemisphericLight(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import hemisphericLight.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A directional light is defined by a direction (what a surprise!).
     * The light is emitted from everywhere in the specified direction, and has an infinite range.
     * An example of a directional light is when a distance planet is lit by the apparently parallel lines of light from its sun. Light in a downward direction will light the top of an object.
     * Documentation: https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
     */
    export class DirectionalLight extends ShadowLight {
        private _shadowFrustumSize;
        /**
         * Fix frustum size for the shadow generation. This is disabled if the value is 0.
         */
        get shadowFrustumSize(): number;
        /**
         * Specifies a fix frustum size for the shadow generation.
         */
        set shadowFrustumSize(value: number);
        private _shadowOrthoScale;
        /**
         * Gets the shadow projection scale against the optimal computed one.
         * 0.1 by default which means that the projection window is increase by 10% from the optimal size.
         * This does not impact in fixed frustum size (shadowFrustumSize being set)
         */
        get shadowOrthoScale(): number;
        /**
         * Sets the shadow projection scale against the optimal computed one.
         * 0.1 by default which means that the projection window is increase by 10% from the optimal size.
         * This does not impact in fixed frustum size (shadowFrustumSize being set)
         */
        set shadowOrthoScale(value: number);
        /**
         * Automatically compute the projection matrix to best fit (including all the casters)
         * on each frame.
         */
        autoUpdateExtends: boolean;
        /**
         * Automatically compute the shadowMinZ and shadowMaxZ for the projection matrix to best fit (including all the casters)
         * on each frame. autoUpdateExtends must be set to true for this to work
         */
        autoCalcShadowZBounds: boolean;
        private _orthoLeft;
        private _orthoRight;
        private _orthoTop;
        private _orthoBottom;
        /**
         * Gets or sets the orthoLeft property used to build the light frustum
         */
        get orthoLeft(): number;
        set orthoLeft(left: number);
        /**
         * Gets or sets the orthoRight property used to build the light frustum
         */
        get orthoRight(): number;
        set orthoRight(right: number);
        /**
         * Gets or sets the orthoTop property used to build the light frustum
         */
        get orthoTop(): number;
        set orthoTop(top: number);
        /**
         * Gets or sets the orthoBottom property used to build the light frustum
         */
        get orthoBottom(): number;
        set orthoBottom(bottom: number);
        /**
         * Creates a DirectionalLight object in the scene, oriented towards the passed direction (Vector3).
         * The directional light is emitted from everywhere in the given direction.
         * It can cast shadows.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The friendly name of the light
         * @param direction The direction of the light
         * @param scene The scene the light belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, direction: Vector3, scene?: Scene, dontAddToScene?: boolean);
        /**
         * Returns the string "DirectionalLight".
         * @returns The class name
         */
        getClassName(): string;
        /**
         * Returns the integer 1.
         * @returns The light Type id as a constant defines in Light.LIGHTTYPEID_x
         */
        getTypeID(): number;
        /**
         * Sets the passed matrix "matrix" as projection matrix for the shadows cast by the light according to the passed view matrix.
         * Returns the DirectionalLight Shadow projection matrix.
         * @param matrix
         * @param viewMatrix
         * @param renderList
         */
        protected _setDefaultShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
        /**
         * Sets the passed matrix "matrix" as fixed frustum projection matrix for the shadows cast by the light according to the passed view matrix.
         * Returns the DirectionalLight Shadow projection matrix.
         * @param matrix
         */
        protected _setDefaultFixedFrustumShadowProjectionMatrix(matrix: Matrix): void;
        /**
         * Sets the passed matrix "matrix" as auto extend projection matrix for the shadows cast by the light according to the passed view matrix.
         * Returns the DirectionalLight Shadow projection matrix.
         * @param matrix
         * @param viewMatrix
         * @param renderList
         */
        protected _setDefaultAutoExtendShadowProjectionMatrix(matrix: Matrix, viewMatrix: Matrix, renderList: Array<AbstractMesh>): void;
        protected _buildUniformLayout(): void;
        /**
         * Sets the passed Effect object with the DirectionalLight transformed position (or position if not parented) and the passed name.
         * @param effect The effect to update
         * @param lightIndex The index of the light in the effect to update
         * @returns The directional light
         */
        transferToEffect(effect: Effect, lightIndex: string): DirectionalLight;
        transferToNodeMaterialEffect(effect: Effect, lightDataUniformName: string): Light;
        /**
         * Gets the minZ used for shadow according to both the scene and the light.
         *
         * Values are fixed on directional lights as it relies on an ortho projection hence the need to convert being
         * -1 and 1 to 0 and 1 doing (depth + min) / (min + max) -> (depth + 1) / (1 + 1) -> (depth * 0.5) + 0.5.
         * (when not using reverse depth buffer / NDC half Z range)
         * @param _activeCamera The camera we are returning the min for (not used)
         * @returns the depth min z
         */
        getDepthMinZ(_activeCamera: Nullable<Camera>): number;
        /**
         * Gets the maxZ used for shadow according to both the scene and the light.
         *
         * Values are fixed on directional lights as it relies on an ortho projection hence the need to convert being
         * -1 and 1 to 0 and 1 doing (depth + min) / (min + max) -> (depth + 1) / (1 + 1) -> (depth * 0.5) + 0.5.
         * (when not using reverse depth buffer / NDC half Z range)
         * @param _activeCamera The camera we are returning the max for
         * @returns the depth max z
         */
        getDepthMaxZ(_activeCamera: Nullable<Camera>): number;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
    }
    /**
     * Register side effects for directionalLight.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterDirectionalLight(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import directionalLight.pure for tree-shakeable, side-effect-free usage.
     */


        interface Scene {
            /**
             * @internal
             */
            _ltcTextures?: ILTCTextures;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Abstract Area Light class that servers as parent for all Area Lights implementations.
     * The light is emitted from the area in the -Z direction.
     */
    export abstract class AreaLight extends Light {
        /**
         * Area Light position.
         */
        position: Vector3;
        /**
         * Creates a area light object.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/lights_introduction
         * @param name The friendly name of the light
         * @param position The position of the area light.
         * @param scene The scene the light belongs to
         * @param dontAddToScene True to not add the light to the scene
         */
        constructor(name: string, position: Vector3, scene?: Scene, dontAddToScene?: boolean);
        transferTexturesToEffect(effect: Effect, lightIndex: string): Light;
        /**
         * Prepares the list of defines specific to the light type.
         * @param defines the list of defines
         * @param lightIndex defines the index of the light for the effect
         */
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
        _isReady(): boolean;
    }


    export type * from "./areaLight.types";


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the shadow generator component responsible to manage any shadow generators
     * in a given scene.
     */
    export class ShadowGeneratorSceneComponent implements ISceneSerializableComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "ShadowGenerator";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Serializes the component data to the specified json object
         * @param serializationObject The object to serialize to
         */
        serialize(serializationObject: any): void;
        /**
         * Adds all the elements from the container to the scene
         * @param container the container holding the elements
         */
        addFromContainer(container: IAssetContainer): void;
        /**
         * Removes all the elements in the container from the scene
         * @param container contains the elements to remove
         * @param dispose if the removed element should be disposed (default: false)
         */
        removeFromContainer(container: IAssetContainer, dispose?: boolean): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        dispose(): void;
        private _gatherRenderTargets;
    }
    /**
     * Register side effects for shadowGeneratorSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param shadowGeneratorClass The class of the shadow generator to register the component for
     */
    export function RegisterShadowGeneratorSceneComponent(shadowGeneratorClass: typeof ShadowGenerator): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import shadowGeneratorSceneComponent.pure for tree-shakeable, side-effect-free usage.
     * Note: RegisterShadowGeneratorSceneComponent is called from ShadowGenerator's constructor,
     * passing the ShadowGenerator class to avoid a circular dependency.
     */


    /**
     * Defines the options associated with the creation of a custom shader for a shadow generator.
     */
    export interface ICustomShaderOptions {
        /**
         * Gets or sets the custom shader name to use
         */
        shaderName: string;
        /**
         * The list of attribute names used in the shader
         */
        attributes?: string[];
        /**
         * The list of uniform names used in the shader
         */
        uniforms?: string[];
        /**
         * The list of sampler names used in the shader
         */
        samplers?: string[];
        /**
         * The list of defines used in the shader
         */
        defines?: string[];
    }
    /**
     * Interface to implement to create a shadow generator compatible with BJS.
     */
    export interface IShadowGenerator {
        /** Gets or set the id of the shadow generator. It will be the one from the light if not defined */
        id: string;
        /**
         * Specifies if the `ShadowGenerator` should be serialized, `true` to skip serialization.
         * Note a `ShadowGenerator` will not be serialized if its light has `doNotSerialize=true`
         */
        doNotSerialize?: boolean;
        /**
         * Gets the main RTT containing the shadow map (usually storing depth from the light point of view).
         * @returns The render target texture if present otherwise, null
         */
        getShadowMap(): Nullable<RenderTargetTexture>;
        /**
         * Determine whether the shadow generator is ready or not (mainly all effects and related post processes needs to be ready).
         * @param subMesh The submesh we want to render in the shadow map
         * @param useInstances Defines whether will draw in the map using instances
         * @param isTransparent Indicates that isReady is called for a transparent subMesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean, isTransparent: boolean): boolean;
        /**
         * Prepare all the defines in a material relying on a shadow map at the specified light index.
         * @param defines Defines of the material we want to update
         * @param lightIndex Index of the light in the enabled light list of the material
         */
        prepareDefines(defines: MaterialDefines, lightIndex: number): void;
        /**
         * Binds the shadow related information inside of an effect (information like near, far, darkness...
         * defined in the generator but impacting the effect).
         * It implies the uniforms available on the materials are the standard BJS ones.
         * @param lightIndex Index of the light in the enabled light list of the material owning the effect
         * @param effect The effect we are binding the information for
         */
        bindShadowLight(lightIndex: string, effect: Effect): void;
        /**
         * Gets the transformation matrix used to project the meshes into the map from the light point of view.
         * (eq to shadow projection matrix * light transform matrix)
         * @returns The transform matrix used to create the shadow map
         */
        getTransformMatrix(): Matrix;
        /**
         * Recreates the shadow map dependencies like RTT and post processes. This can be used during the switch between
         * Cube and 2D textures for instance.
         */
        recreateShadowMap(): void;
        /**
         * Forces all the attached effect to compile to enable rendering only once ready vs. lazily compiling effects.
         * @param onCompiled Callback triggered at the and of the effects compilation
         * @param options Sets of optional options forcing the compilation with different modes
         */
        forceCompilation(onCompiled?: (generator: IShadowGenerator) => void, options?: Partial<{
            useInstances: boolean;
        }>): void;
        /**
         * Forces all the attached effect to compile to enable rendering only once ready vs. lazily compiling effects.
         * @param options Sets of optional options forcing the compilation with different modes
         * @returns A promise that resolves when the compilation completes
         */
        forceCompilationAsync(options?: Partial<{
            useInstances: boolean;
        }>): Promise<void>;
        /**
         * Serializes the shadow generator setup to a json object.
         * @returns The serialized JSON object
         */
        serialize(): any;
        /**
         * Disposes the Shadow map and related Textures and effects.
         */
        dispose(): void;
    }
    /**
     * Default implementation IShadowGenerator.
     * This is the main object responsible of generating shadows in the framework.
     * Documentation: https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows
     * @see [WebGL](https://playground.babylonjs.com/#IFYDRS#0)
     * @see [WebGPU](https://playground.babylonjs.com/#IFYDRS#835)
     */
    export class ShadowGenerator implements IShadowGenerator {
        /**
         * Name of the shadow generator class
         */
        static CLASSNAME: string;
        /**
         * Force all the shadow generators to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Shadow generator mode None: no filtering applied.
         */
        static readonly FILTER_NONE = 0;
        /**
         * Shadow generator mode ESM: Exponential Shadow Mapping.
         * (http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf)
         */
        static readonly FILTER_EXPONENTIALSHADOWMAP = 1;
        /**
         * Shadow generator mode Poisson Sampling: Percentage Closer Filtering.
         * (Multiple Tap around evenly distributed around the pixel are used to evaluate the shadow strength)
         */
        static readonly FILTER_POISSONSAMPLING = 2;
        /**
         * Shadow generator mode ESM: Blurred Exponential Shadow Mapping.
         * (http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf)
         */
        static readonly FILTER_BLUREXPONENTIALSHADOWMAP = 3;
        /**
         * Shadow generator mode ESM: Exponential Shadow Mapping using the inverse of the exponential preventing
         * edge artifacts on steep falloff.
         * (http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf)
         */
        static readonly FILTER_CLOSEEXPONENTIALSHADOWMAP = 4;
        /**
         * Shadow generator mode ESM: Blurred Exponential Shadow Mapping using the inverse of the exponential preventing
         * edge artifacts on steep falloff.
         * (http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf)
         */
        static readonly FILTER_BLURCLOSEEXPONENTIALSHADOWMAP = 5;
        /**
         * Shadow generator mode PCF: Percentage Closer Filtering
         * benefits from Webgl 2 shadow samplers. Fallback to Poisson Sampling in Webgl 1
         * (https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch11.html)
         */
        static readonly FILTER_PCF = 6;
        /**
         * Shadow generator mode PCSS: Percentage Closering Soft Shadow.
         * benefits from Webgl 2 shadow samplers. Fallback to Poisson Sampling in Webgl 1
         * Contact Hardening
         */
        static readonly FILTER_PCSS = 7;
        /**
         * Reserved for PCF and PCSS
         * Highest Quality.
         *
         * Execute PCF on a 5*5 kernel improving a lot the shadow aliasing artifacts.
         *
         * Execute PCSS with 32 taps blocker search and 64 taps PCF.
         */
        static readonly QUALITY_HIGH = 0;
        /**
         * Reserved for PCF and PCSS
         * Good tradeoff for quality/perf cross devices
         *
         * Execute PCF on a 3*3 kernel.
         *
         * Execute PCSS with 16 taps blocker search and 32 taps PCF.
         */
        static readonly QUALITY_MEDIUM = 1;
        /**
         * Reserved for PCF and PCSS
         * The lowest quality but the fastest.
         *
         * Execute PCF on a 1*1 kernel.
         *
         * Execute PCSS with 16 taps blocker search and 16 taps PCF.
         */
        static readonly QUALITY_LOW = 2;
        /**
         * Defines the default alpha cutoff value used for transparent alpha tested materials.
         */
        static DEFAULT_ALPHA_CUTOFF: number;
        /** Gets or set the id of the shadow generator. It will be the one from the light if not defined */
        id: string;
        /** Gets or sets the custom shader name to use */
        customShaderOptions: ICustomShaderOptions;
        /** Gets or sets a custom function to allow/disallow rendering a sub mesh in the shadow map */
        customAllowRendering: (subMesh: SubMesh) => boolean;
        /**
         * Observable triggered before the shadow is rendered. Can be used to update internal effect state
         */
        onBeforeShadowMapRenderObservable: Observable<Effect>;
        /**
         * Observable triggered after the shadow is rendered. Can be used to restore internal effect state
         */
        onAfterShadowMapRenderObservable: Observable<Effect>;
        /**
         * Observable triggered before a mesh is rendered in the shadow map.
         * Can be used to update internal effect state (that you can get from the onBeforeShadowMapRenderObservable)
         */
        onBeforeShadowMapRenderMeshObservable: Observable<Mesh>;
        /**
         * Observable triggered after a mesh is rendered in the shadow map.
         * Can be used to update internal effect state (that you can get from the onAfterShadowMapRenderObservable)
         */
        onAfterShadowMapRenderMeshObservable: Observable<Mesh>;
        /**
         * Specifies if the `ShadowGenerator` should be serialized, `true` to skip serialization.
         * Note a `ShadowGenerator` will not be serialized if its light has `doNotSerialize=true`
         */
        doNotSerialize: boolean;
        protected _bias: number;
        /**
         * Gets the bias: offset applied on the depth preventing acnea (in light direction).
         */
        get bias(): number;
        /**
         * Sets the bias: offset applied on the depth preventing acnea (in light direction).
         */
        set bias(bias: number);
        protected _normalBias: number;
        /**
         * Gets the normalBias: offset applied on the depth preventing acnea (along side the normal direction and proportional to the light/normal angle).
         */
        get normalBias(): number;
        /**
         * Sets the normalBias: offset applied on the depth preventing acnea (along side the normal direction and proportional to the light/normal angle).
         */
        set normalBias(normalBias: number);
        protected _blurBoxOffset: number;
        /**
         * Gets the blur box offset: offset applied during the blur pass.
         * Only useful if useKernelBlur = false
         */
        get blurBoxOffset(): number;
        /**
         * Sets the blur box offset: offset applied during the blur pass.
         * Only useful if useKernelBlur = false
         */
        set blurBoxOffset(value: number);
        protected _blurScale: number;
        /**
         * Gets the blur scale: scale of the blurred texture compared to the main shadow map.
         * 2 means half of the size.
         */
        get blurScale(): number;
        /**
         * Sets the blur scale: scale of the blurred texture compared to the main shadow map.
         * 2 means half of the size.
         */
        set blurScale(value: number);
        protected _blurKernel: number;
        /**
         * Gets the blur kernel: kernel size of the blur pass.
         * Only useful if useKernelBlur = true
         */
        get blurKernel(): number;
        /**
         * Sets the blur kernel: kernel size of the blur pass.
         * Only useful if useKernelBlur = true
         */
        set blurKernel(value: number);
        protected _useKernelBlur: boolean;
        /**
         * Gets whether the blur pass is a kernel blur (if true) or box blur.
         * Only useful in filtered mode (useBlurExponentialShadowMap...)
         */
        get useKernelBlur(): boolean;
        /**
         * Sets whether the blur pass is a kernel blur (if true) or box blur.
         * Only useful in filtered mode (useBlurExponentialShadowMap...)
         */
        set useKernelBlur(value: boolean);
        protected _depthScale: number;
        /**
         * Gets the depth scale used in ESM mode.
         */
        get depthScale(): number;
        /**
         * Sets the depth scale used in ESM mode.
         * This can override the scale stored on the light.
         */
        set depthScale(value: number);
        protected _validateFilter(filter: number): number;
        protected _filter: number;
        /**
         * Gets the current mode of the shadow generator (normal, PCF, ESM...).
         * The returned value is a number equal to one of the available mode defined in ShadowMap.FILTER_x like _FILTER_NONE
         */
        get filter(): number;
        /**
         * Sets the current mode of the shadow generator (normal, PCF, ESM...).
         * The returned value is a number equal to one of the available mode defined in ShadowMap.FILTER_x like _FILTER_NONE
         */
        set filter(value: number);
        /**
         * Gets if the current filter is set to Poisson Sampling.
         */
        get usePoissonSampling(): boolean;
        /**
         * Sets the current filter to Poisson Sampling.
         */
        set usePoissonSampling(value: boolean);
        /**
         * Gets if the current filter is set to ESM.
         */
        get useExponentialShadowMap(): boolean;
        /**
         * Sets the current filter is to ESM.
         */
        set useExponentialShadowMap(value: boolean);
        /**
         * Gets if the current filter is set to filtered ESM.
         */
        get useBlurExponentialShadowMap(): boolean;
        /**
         * Gets if the current filter is set to filtered  ESM.
         */
        set useBlurExponentialShadowMap(value: boolean);
        /**
         * Gets if the current filter is set to "close ESM" (using the inverse of the
         * exponential to prevent steep falloff artifacts).
         */
        get useCloseExponentialShadowMap(): boolean;
        /**
         * Sets the current filter to "close ESM" (using the inverse of the
         * exponential to prevent steep falloff artifacts).
         */
        set useCloseExponentialShadowMap(value: boolean);
        /**
         * Gets if the current filter is set to filtered "close ESM" (using the inverse of the
         * exponential to prevent steep falloff artifacts).
         */
        get useBlurCloseExponentialShadowMap(): boolean;
        /**
         * Sets the current filter to filtered "close ESM" (using the inverse of the
         * exponential to prevent steep falloff artifacts).
         */
        set useBlurCloseExponentialShadowMap(value: boolean);
        /**
         * Gets if the current filter is set to "PCF" (percentage closer filtering).
         */
        get usePercentageCloserFiltering(): boolean;
        /**
         * Sets the current filter to "PCF" (percentage closer filtering).
         */
        set usePercentageCloserFiltering(value: boolean);
        protected _filteringQuality: number;
        /**
         * Gets the PCF or PCSS Quality.
         * Only valid if usePercentageCloserFiltering or usePercentageCloserFiltering is true.
         */
        get filteringQuality(): number;
        /**
         * Sets the PCF or PCSS Quality.
         * Only valid if usePercentageCloserFiltering or usePercentageCloserFiltering is true.
         */
        set filteringQuality(filteringQuality: number);
        /**
         * Gets if the current filter is set to "PCSS" (contact hardening).
         */
        get useContactHardeningShadow(): boolean;
        /**
         * Sets the current filter to "PCSS" (contact hardening).
         */
        set useContactHardeningShadow(value: boolean);
        protected _contactHardeningLightSizeUVRatio: number;
        /**
         * Gets the Light Size (in shadow map uv unit) used in PCSS to determine the blocker search area and the penumbra size.
         * Using a ratio helps keeping shape stability independently of the map size.
         *
         * It does not account for the light projection as it was having too much
         * instability during the light setup or during light position changes.
         *
         * Only valid if useContactHardeningShadow is true.
         */
        get contactHardeningLightSizeUVRatio(): number;
        /**
         * Sets the Light Size (in shadow map uv unit) used in PCSS to determine the blocker search area and the penumbra size.
         * Using a ratio helps keeping shape stability independently of the map size.
         *
         * It does not account for the light projection as it was having too much
         * instability during the light setup or during light position changes.
         *
         * Only valid if useContactHardeningShadow is true.
         */
        set contactHardeningLightSizeUVRatio(contactHardeningLightSizeUVRatio: number);
        protected _darkness: number;
        /** Gets or sets the actual darkness of a shadow */
        get darkness(): number;
        set darkness(value: number);
        /**
         * Returns the darkness value (float). This can only decrease the actual darkness of a shadow.
         * 0 means strongest and 1 would means no shadow.
         * @returns the darkness.
         */
        getDarkness(): number;
        /**
         * Sets the darkness value (float). This can only decrease the actual darkness of a shadow.
         * @param darkness The darkness value 0 means strongest and 1 would means no shadow.
         * @returns the shadow generator allowing fluent coding.
         */
        setDarkness(darkness: number): ShadowGenerator;
        protected _transparencyShadow: boolean;
        /** Gets or sets the ability to have transparent shadow */
        get transparencyShadow(): boolean;
        set transparencyShadow(value: boolean);
        /**
         * Sets the ability to have transparent shadow (boolean).
         * @param transparent True if transparent else False
         * @returns the shadow generator allowing fluent coding
         */
        setTransparencyShadow(transparent: boolean): ShadowGenerator;
        /**
         * Enables or disables shadows with varying strength based on the transparency
         * When it is enabled, the strength of the shadow is taken equal to mesh.visibility
         * If you enabled an alpha texture on your material, the alpha value red from the texture is also combined to compute the strength:
         *          mesh.visibility * alphaTexture.a
         * The texture used is the diffuse by default, but it can be set to the opacity by setting useOpacityTextureForTransparentShadow
         * Note that by definition transparencyShadow must be set to true for enableSoftTransparentShadow to work!
         */
        enableSoftTransparentShadow: boolean;
        /**
         * If this is true, use the opacity texture's alpha channel for transparent shadows instead of the diffuse one
         */
        useOpacityTextureForTransparentShadow: boolean;
        protected _shadowMap: Nullable<RenderTargetTexture>;
        protected _shadowMap2: Nullable<RenderTargetTexture>;
        /**
         * Gets the main RTT containing the shadow map (usually storing depth from the light point of view).
         * @returns The render target texture if present otherwise, null
         */
        getShadowMap(): Nullable<RenderTargetTexture>;
        /**
         * Gets the RTT used during rendering (can be a blurred version of the shadow map or the shadow map itself).
         * @returns The render target texture if the shadow map is present otherwise, null
         */
        getShadowMapForRendering(): Nullable<RenderTargetTexture>;
        /**
         * Gets the class name of that object
         * @returns "ShadowGenerator"
         */
        getClassName(): string;
        /**
         * Helper function to add a mesh and its descendants to the list of shadow casters.
         * @param mesh Mesh to add
         * @param includeDescendants boolean indicating if the descendants should be added. Default to true
         * @returns the Shadow Generator itself
         */
        addShadowCaster(mesh: AbstractMesh, includeDescendants?: boolean): ShadowGenerator;
        /**
         * Helper function to remove a mesh and its descendants from the list of shadow casters
         * @param mesh Mesh to remove
         * @param includeDescendants boolean indicating if the descendants should be removed. Default to true
         * @returns the Shadow Generator itself
         */
        removeShadowCaster(mesh: AbstractMesh, includeDescendants?: boolean): ShadowGenerator;
        /**
         * Controls the extent to which the shadows fade out at the edge of the frustum
         */
        frustumEdgeFalloff: number;
        protected _light: IShadowLight;
        /**
         * Returns the associated light object.
         * @returns the light generating the shadow
         */
        getLight(): IShadowLight;
        /** Shader language used by the generator */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this generator.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * If true the shadow map is generated by rendering the back face of the mesh instead of the front face.
         * This can help with self-shadowing as the geometry making up the back of objects is slightly offset.
         * It might on the other hand introduce peter panning.
         */
        forceBackFacesOnly: boolean;
        protected _camera: Nullable<Camera>;
        protected _getCamera(): Nullable<Camera>;
        protected _scene: Scene;
        protected _useRedTextureType: boolean;
        protected _lightDirection: Vector3;
        protected _usefullFloatFirst: boolean;
        protected _forceGLSL: boolean;
        protected _viewMatrix: Matrix;
        protected _projectionMatrix: Matrix;
        protected _transformMatrix: Matrix;
        protected _cachedPosition: Vector3;
        protected _cachedDirection: Vector3;
        protected _cachedDefines: string;
        protected _currentRenderId: number;
        protected _boxBlurPostprocess: Nullable<PostProcess>;
        protected _kernelBlurXPostprocess: Nullable<PostProcess>;
        protected _kernelBlurYPostprocess: Nullable<PostProcess>;
        protected _blurPostProcesses: PostProcess[];
        protected _mapSize: number;
        protected _currentFaceIndex: number;
        protected _currentFaceIndexCache: number;
        protected _textureType: number;
        protected _defaultTextureMatrix: Matrix;
        protected _storedUniqueId: Nullable<number>;
        protected _useUBO: boolean;
        protected _sceneUBOs: UniformBuffer[];
        protected _currentSceneUBO: UniformBuffer;
        protected _opacityTexture: Nullable<BaseTexture>;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * @internal
         * Used by the scene component parser to parse cascaded shadow generators without a direct import
         * (avoids circular dependency between shadowGeneratorSceneComponent and cascadedShadowGenerator).
         */
        static _CascadedShadowGeneratorParser: ((parsedShadowGenerator: any, scene: Scene) => ShadowGenerator) | null;
        /**
         * Gets or sets the size of the texture what stores the shadows
         */
        get mapSize(): number;
        set mapSize(size: number);
        /**
         * Gets or sets the light that is casting the shadows
         */
        get light(): IShadowLight;
        set light(light: IShadowLight);
        /**
         * Gets or sets a value indicating whether the shadow map should use full float texture type (instead of half float, which is the default).
         * Use this option when you need more precision (for self shadowing, for instance).
         */
        get useFloat32TextureType(): boolean;
        set useFloat32TextureType(useFloat32TextureType: boolean);
        /**
         * Gets or sets the camera associated with this shadow generator.
         * When null, the scene's active camera is used at render time.
         */
        get camera(): Nullable<Camera>;
        set camera(camera: Nullable<Camera>);
        /**
         * Gets or sets a value indicating whether the shadow map should use a red-channel-only texture format.
         * Using a single-channel format reduces memory usage when color data is not needed.
         */
        get useRedTextureFormat(): boolean;
        set useRedTextureFormat(useRedTextureFormat: boolean);
        /**
         * Creates a ShadowGenerator object.
         * A ShadowGenerator is the required tool to use the shadows.
         * Each light casting shadows needs to use its own ShadowGenerator.
         * Documentation : https://doc.babylonjs.com/features/featuresDeepDive/lights/shadows
         * @param mapSize The size of the texture what stores the shadows. Example : 1024.
         * @param light The light object generating the shadows.
         * @param usefullFloatFirst By default the generator will try to use half float textures but if you need precision (for self shadowing for instance), you can use this option to enforce full float texture.
         * @param camera Camera associated with this shadow generator (default: null). If null, takes the scene active camera at the time we need to access it
         * @param useRedTextureType Forces the generator to use a Red instead of a RGBA type for the shadow map texture format (default: false)
         * @param forceGLSL defines a boolean indicating if the shader must be compiled in GLSL even if we are using WebGPU
         */
        constructor(mapSize: number, light: IShadowLight, usefullFloatFirst?: boolean, camera?: Nullable<Camera>, useRedTextureType?: boolean, forceGLSL?: boolean);
        private _createInstance;
        protected _initializeGenerator(): void;
        protected _createTargetRenderTexture(): void;
        protected _initializeShadowMap(): void;
        private _shadersLoaded;
        private _initShaderSourceAsync;
        protected _initializeBlurRTTAndPostProcesses(): void;
        protected _renderForShadowMap(opaqueSubMeshes: SmartArray<SubMesh>, alphaTestSubMeshes: SmartArray<SubMesh>, transparentSubMeshes: SmartArray<SubMesh>, depthOnlySubMeshes: SmartArray<SubMesh>): void;
        protected _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect, mesh: AbstractMesh): void;
        protected _renderSubMeshForShadowMap(subMesh: SubMesh, isTransparent?: boolean): void;
        protected _applyFilterValues(): void;
        /**
         * Forces all the attached effect to compile to enable rendering only once ready vs. lazily compiling effects.
         * @param onCompiled Callback triggered at the and of the effects compilation
         * @param options Sets of optional options forcing the compilation with different modes
         */
        forceCompilation(onCompiled?: (generator: IShadowGenerator) => void, options?: Partial<{
            useInstances: boolean;
        }>): void;
        /**
         * Forces all the attached effect to compile to enable rendering only once ready vs. lazily compiling effects.
         * @param options Sets of optional options forcing the compilation with different modes
         * @returns A promise that resolves when the compilation completes
         */
        forceCompilationAsync(options?: Partial<{
            useInstances: boolean;
        }>): Promise<void>;
        protected _isReadyCustomDefines(defines: any, subMesh: SubMesh, useInstances: boolean): void;
        private _prepareShadowDefines;
        /**
         * Determine whether the shadow generator is ready or not (mainly all effects and related post processes needs to be ready).
         * @param subMesh The submesh we want to render in the shadow map
         * @param useInstances Defines whether will draw in the map using instances
         * @param isTransparent Indicates that isReady is called for a transparent subMesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean, isTransparent: boolean): boolean;
        /**
         * Prepare all the defines in a material relying on a shadow map at the specified light index.
         * @param defines Defines of the material we want to update
         * @param lightIndex Index of the light in the enabled light list of the material
         */
        prepareDefines(defines: any, lightIndex: number): void;
        /**
         * Binds the shadow related information inside of an effect (information like near, far, darkness...
         * defined in the generator but impacting the effect).
         * @param lightIndex Index of the light in the enabled light list of the material owning the effect
         * @param effect The effect we are binding the information for
         */
        bindShadowLight(lightIndex: string, effect: Effect): void;
        /**
         * Gets the view matrix used to render the shadow map.
         */
        get viewMatrix(): Matrix;
        /**
         * Gets the projection matrix used to render the shadow map.
         */
        get projectionMatrix(): Matrix;
        /**
         * Gets the transformation matrix used to project the meshes into the map from the light point of view.
         * (eq to shadow projection matrix * light transform matrix)
         * @returns The transform matrix used to create the shadow map
         */
        getTransformMatrix(): Matrix;
        /**
         * Recreates the shadow map dependencies like RTT and post processes. This can be used during the switch between
         * Cube and 2D textures for instance.
         */
        recreateShadowMap(): void;
        protected _disposeBlurPostProcesses(): void;
        protected _disposeRTTandPostProcesses(): void;
        protected _disposeSceneUBOs(): void;
        /**
         * Disposes the ShadowGenerator.
         * @param clearObservables Defines whether to clear the observables or not (true by default).
         * Returns nothing.
         */
        dispose(clearObservables?: boolean): void;
        /**
         * Serializes the shadow generator setup to a json object.
         * @returns The serialized JSON object
         */
        serialize(): any;
        /**
         * Parses a serialized ShadowGenerator and returns a new ShadowGenerator.
         * @param parsedShadowGenerator The JSON object to parse
         * @param scene The scene to create the shadow map for
         * @param constr A function that builds a shadow generator or undefined to create an instance of the default shadow generator
         * @returns The parsed shadow generator
         */
        static Parse(parsedShadowGenerator: any, scene: Scene, constr?: (mapSize: number, light: IShadowLight, camera: Nullable<Camera>) => ShadowGenerator): ShadowGenerator;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * A CSM implementation allowing casting shadows on large scenes.
     * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows
     * Based on: https://github.com/TheRealMJP/Shadows and https://johanmedestrom.wordpress.com/2016/03/18/opengl-cascaded-shadow-maps/
     */
    export class CascadedShadowGenerator extends ShadowGenerator {
        private static readonly _FrustumCornersNdcSpace;
        /**
         * Name of the CSM class
         */
        static CLASSNAME: string;
        /**
         * Defines the default number of cascades used by the CSM.
         */
        static readonly DEFAULT_CASCADES_COUNT = 4;
        /**
         * Defines the minimum number of cascades used by the CSM.
         */
        static MIN_CASCADES_COUNT: number;
        /**
         * Defines the maximum number of cascades used by the CSM.
         */
        static MAX_CASCADES_COUNT: number;
        protected _validateFilter(filter: number): number;
        /**
         * Gets or sets the actual darkness of the soft shadows while using PCSS filtering (value between 0. and 1.)
         */
        penumbraDarkness: number;
        private _numCascades;
        /**
         * Gets or set the number of cascades used by the CSM.
         */
        get numCascades(): number;
        set numCascades(value: number);
        /**
         * Sets this to true if you want that the edges of the shadows don't "swimm" / "shimmer" when rotating the camera.
         * The trade off is that you lose some precision in the shadow rendering when enabling this setting.
         */
        stabilizeCascades: boolean;
        private _freezeShadowCastersBoundingInfo;
        private _freezeShadowCastersBoundingInfoObservable;
        /**
         * Enables or disables the shadow casters bounding info computation.
         * If your shadow casters don't move, you can disable this feature.
         * If it is enabled, the bounding box computation is done every frame.
         */
        get freezeShadowCastersBoundingInfo(): boolean;
        set freezeShadowCastersBoundingInfo(freeze: boolean);
        private _scbiMin;
        private _scbiMax;
        protected _computeShadowCastersBoundingInfo(): void;
        protected _shadowCastersBoundingInfo: BoundingInfo;
        /**
         * Gets or sets the shadow casters bounding info.
         * If you provide your own shadow casters bounding info, first enable freezeShadowCastersBoundingInfo
         * so that the system won't overwrite the bounds you provide
         */
        get shadowCastersBoundingInfo(): BoundingInfo;
        set shadowCastersBoundingInfo(boundingInfo: BoundingInfo);
        protected _breaksAreDirty: boolean;
        protected _minDistance: number;
        protected _maxDistance: number;
        /**
         * Sets the minimal and maximal distances to use when computing the cascade breaks.
         *
         * The values of min / max are typically the depth zmin and zmax values of your scene, for a given frame.
         * If you don't know these values, simply leave them to their defaults and don't call this function.
         * @param min minimal distance for the breaks (default to 0.)
         * @param max maximal distance for the breaks (default to 1.)
         */
        setMinMaxDistance(min: number, max: number): void;
        /** Gets the minimal distance used in the cascade break computation */
        get minDistance(): number;
        /** Gets the maximal distance used in the cascade break computation */
        get maxDistance(): number;
        /**
         * Gets the class name of that object
         * @returns "CascadedShadowGenerator"
         */
        getClassName(): string;
        private _cascadeMinExtents;
        private _cascadeMaxExtents;
        /**
         * Gets a cascade minimum extents
         * @param cascadeIndex index of the cascade
         * @returns the minimum cascade extents
         */
        getCascadeMinExtents(cascadeIndex: number): Nullable<Vector3>;
        /**
         * Gets a cascade maximum extents
         * @param cascadeIndex index of the cascade
         * @returns the maximum cascade extents
         */
        getCascadeMaxExtents(cascadeIndex: number): Nullable<Vector3>;
        private _cascades;
        private _currentLayer;
        private _viewSpaceFrustumsZ;
        private _viewMatrices;
        private _projectionMatrices;
        private _transformMatrices;
        private _transformMatricesAsArray;
        private _tempTransformMatricesAsArray;
        private _frustumLengths;
        private _lightSizeUVCorrection;
        private _depthCorrection;
        private _frustumCornersWorldSpace;
        private _frustumCenter;
        private _shadowCameraPos;
        private _shadowMaxZ;
        /**
         * Gets the shadow max z distance. It's the limit beyond which shadows are not displayed.
         * It defaults to camera.maxZ
         */
        get shadowMaxZ(): number;
        /**
         * Sets the shadow max z distance.
         */
        set shadowMaxZ(value: number);
        protected _debug: boolean;
        /**
         * Gets or sets the debug flag.
         * When enabled, the cascades are materialized by different colors on the screen.
         */
        get debug(): boolean;
        set debug(dbg: boolean);
        private _depthClamp;
        /**
         * Gets or sets the depth clamping value.
         *
         * When enabled, it improves the shadow quality because the near z plane of the light frustum don't need to be adjusted
         * to account for the shadow casters far away.
         *
         * Note that this property is incompatible with PCSS filtering, so it won't be used in that case.
         */
        get depthClamp(): boolean;
        set depthClamp(value: boolean);
        private _cascadeBlendPercentage;
        /**
         * Gets or sets the percentage of blending between two cascades (value between 0. and 1.).
         * It defaults to 0.1 (10% blending).
         */
        get cascadeBlendPercentage(): number;
        set cascadeBlendPercentage(value: number);
        private _lambda;
        /**
         * Gets or set the lambda parameter.
         * This parameter is used to split the camera frustum and create the cascades.
         * It's a value between 0. and 1.: If 0, the split is a uniform split of the frustum, if 1 it is a logarithmic split.
         * For all values in-between, it's a linear combination of the uniform and logarithm split algorithm.
         */
        get lambda(): number;
        set lambda(value: number);
        /**
         * Gets the view matrix corresponding to a given cascade
         * @param cascadeNum cascade to retrieve the view matrix from
         * @returns the cascade view matrix
         */
        getCascadeViewMatrix(cascadeNum: number): Nullable<Matrix>;
        /**
         * Gets the projection matrix corresponding to a given cascade
         * @param cascadeNum cascade to retrieve the projection matrix from
         * @returns the cascade projection matrix
         */
        getCascadeProjectionMatrix(cascadeNum: number): Nullable<Matrix>;
        /**
         * Gets the transformation matrix corresponding to a given cascade
         * @param cascadeNum cascade to retrieve the transformation matrix from
         * @returns the cascade transformation matrix
         */
        getCascadeTransformMatrix(cascadeNum: number): Nullable<Matrix>;
        private _depthRenderer;
        /**
         * Sets the depth renderer to use when autoCalcDepthBounds is enabled.
         *
         * Note that if no depth renderer is set, a new one will be automatically created internally when necessary.
         *
         * You should call this function if you already have a depth renderer enabled in your scene, to avoid
         * doing multiple depth rendering each frame. If you provide your own depth renderer, make sure it stores linear depth!
         * @param depthRenderer The depth renderer to use when autoCalcDepthBounds is enabled. If you pass null or don't call this function at all, a depth renderer will be automatically created
         */
        setDepthRenderer(depthRenderer: Nullable<DepthRenderer>): void;
        private _depthReducer;
        private _autoCalcDepthBounds;
        /**
         * Gets or sets the autoCalcDepthBounds property.
         *
         * When enabled, a depth rendering pass is first performed (with an internally created depth renderer or with the one
         * you provide by calling setDepthRenderer). Then, a min/max reducing is applied on the depth map to compute the
         * minimal and maximal depth of the map and those values are used as inputs for the setMinMaxDistance() function.
         * It can greatly enhance the shadow quality, at the expense of more GPU works.
         * When using this option, you should increase the value of the lambda parameter, and even set it to 1 for best results.
         */
        get autoCalcDepthBounds(): boolean;
        set autoCalcDepthBounds(value: boolean);
        /**
         * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true
         * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...
         * Note that if you provided your own depth renderer through a call to setDepthRenderer, you are responsible
         * for setting the refresh rate on the renderer yourself!
         */
        get autoCalcDepthBoundsRefreshRate(): number;
        set autoCalcDepthBoundsRefreshRate(value: number);
        /**
         * Create the cascade breaks according to the lambda, shadowMaxZ and min/max distance properties, as well as the camera near and far planes.
         * This function is automatically called when updating lambda, shadowMaxZ and min/max distances, however you should call it yourself if
         * you change the camera near/far planes!
         */
        splitFrustum(): void;
        private _splitFrustum;
        private _computeMatrices;
        private _computeFrustumInWorldSpace;
        private _computeCascadeFrustum;
        protected _recreateSceneUBOs(): void;
        /**
         *  Support test.
         */
        static get IsSupported(): boolean;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Creates a Cascaded Shadow Generator object.
         * A ShadowGenerator is the required tool to use the shadows.
         * Each directional light casting shadows needs to use its own ShadowGenerator.
         * Documentation : https://doc.babylonjs.com/babylon101/cascadedShadows
         * @param mapSize The size of the texture what stores the shadows. Example : 1024.
         * @param light The directional light object generating the shadows.
         * @param usefulFloatFirst By default the generator will try to use half float textures but if you need precision (for self shadowing for instance), you can use this option to enforce full float texture.
         * @param camera Camera associated with this shadow generator (default: null). If null, takes the scene active camera at the time we need to access it
         * @param useRedTextureType Forces the generator to use a Red instead of a RGBA type for the shadow map texture format (default: true)
         */
        constructor(mapSize: number, light: DirectionalLight, usefulFloatFirst?: boolean, camera?: Nullable<Camera>, useRedTextureType?: boolean);
        protected _initializeGenerator(): void;
        protected _createTargetRenderTexture(): void;
        protected _initializeShadowMap(): void;
        protected _bindCustomEffectForRenderSubMeshForShadowMap(subMesh: SubMesh, effect: Effect): void;
        protected _isReadyCustomDefines(defines: any): void;
        /**
         * Prepare all the defines in a material relying on a shadow map at the specified light index.
         * @param defines Defines of the material we want to update
         * @param lightIndex Index of the light in the enabled light list of the material
         */
        prepareDefines(defines: any, lightIndex: number): void;
        /**
         * Binds the shadow related information inside of an effect (information like near, far, darkness...
         * defined in the generator but impacting the effect).
         * @param lightIndex Index of the light in the enabled light list of the material owning the effect
         * @param effect The effect we are binfing the information for
         */
        bindShadowLight(lightIndex: string, effect: Effect): void;
        /**
         * Gets the transformation matrix of the first cascade used to project the meshes into the map from the light point of view.
         * (eq to view projection * shadow projection matrices)
         * @returns The transform matrix used to create the shadow map
         */
        getTransformMatrix(): Matrix;
        /**
         * Disposes the ShadowGenerator.
         * Returns nothing.
         */
        dispose(): void;
        /**
         * Serializes the shadow generator setup to a json object.
         * @returns The serialized JSON object
         */
        serialize(): any;
        /**
         * Parses a serialized ShadowGenerator and returns a new ShadowGenerator.
         * @param parsedShadowGenerator The JSON object to parse
         * @param scene The scene to create the shadow map for
         * @returns The parsed shadow generator
         */
        static Parse(parsedShadowGenerator: any, scene: Scene): ShadowGenerator;
    }
    /**
     * Register side effects for cascadedShadowGenerator.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCascadedShadowGenerator(): void;




    /**
     * Linearly transformed cosine textures that are used in the Area Lights shaders.
     */
    export type ILTCTextures = {
        /**
         * Linearly transformed cosine texture BRDF Approximation.
         */
        LTC1: BaseTexture;
        /**
         * Linearly transformed cosine texture Fresnel Approximation.
         */
        LTC2: BaseTexture;
    };
    /**
     * Loads LTC texture data from Babylon.js CDN.
     * @returns Promise with data for LTC1 and LTC2 textures for area lights.
     */
    export function DecodeLTCTextureDataAsync(): Promise<Tuple<Uint16Array, 2>>;


    /**
     * Interface for IES texture data.
     */
    export interface IIESTextureData {
        /** The width of the texture */
        width: number;
        /** The height of the texture */
        height: number;
        /** The data of the texture */
        data: Float32Array;
    }
    /**
     * Generates IES data buffer from a string representing the IES data.
     * @param uint8Array defines the IES data
     * @returns the IES data buffer
     * @see https://ieslibrary.com/browse
     * @see https://playground.babylonjs.com/#UQGPDT#1
     */
    export function LoadIESData(uint8Array: Uint8Array): IIESTextureData;


    /** Pure barrel — re-exports only side-effect-free modules */




    /** This file must only contain pure code and pure imports */
    /**
     * A scene component required for running the clustering step in clustered lights
     */
    export class ClusteredLightingSceneComponent implements ISceneComponent {
        /**
         * The name of the component. Each component must have a unique name.
         */
        name: string;
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new scene component.
         * @param scene The scene the component belongs to
         */
        constructor(scene: Scene);
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Register the component to one instance of a scene.
         */
        register(): void;
        private _gatherActiveCameraRenderTargets;
    }
    /**
     * Register side effects for clusteredLightingSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param clusteredLightContainerClass The ClusteredLightContainer class to register the component for
     */
    export function RegisterClusteredLightingSceneComponent(clusteredLightContainerClass: typeof ClusteredLightContainer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import clusteredLightingSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * A special light that renders all its associated spot or point lights using a clustered or forward+ system.
     */
    export class ClusteredLightContainer extends Light {
        private static _GetEngineBatchSize;
        /**
         * Checks if the clustered lighting system supports the given light with its current parameters.
         * This will also check if the light's associated engine supports clustered lighting.
         *
         * @param light The light to test
         * @returns true if the light and its engine is supported
         */
        static IsLightSupported(light: Light): boolean;
        /** @internal */
        static _SceneComponentInitialization: (scene: Scene) => void;
        private readonly _batchSize;
        /**
         * True if clustered lighting is supported.
         */
        get isSupported(): boolean;
        private readonly _lights;
        /**
         * Gets the current list of lights added to this clustering system.
         */
        get lights(): readonly Light[];
        private _camera;
        private readonly _sortedLights;
        private _lightDataBuffer;
        private _lightDataTexture;
        private _lightDataRenderId;
        private _tileMaskBatches;
        private _tileMaskTexture;
        private _tileMaskBuffer;
        private _horizontalTiles;
        /**
         * The number of tiles in the horizontal direction to cluster lights into.
         * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.
         */
        get horizontalTiles(): number;
        set horizontalTiles(horizontal: number);
        private _verticalTiles;
        /**
         * The number of tiles in the vertical direction to cluster lights into.
         * A lower value will reduce memory and make the clustering step faster, while a higher value increases memory and makes the rendering step faster.
         */
        get verticalTiles(): number;
        set verticalTiles(vertical: number);
        private _sliceScale;
        private _sliceBias;
        private _sliceRanges;
        private _lastBoundLightIndex;
        private _depthSlices;
        /**
         * The number of slices to split the depth range by and cluster lights into.
         */
        get depthSlices(): number;
        set depthSlices(slices: number);
        private readonly _proxyMaterial;
        private readonly _proxyMesh;
        private _maxRange;
        private _minInverseSquaredRange;
        /**
         * This limits the range of all the added lights, so even lights with extreme ranges will still have bounds for clustering.
         */
        get maxRange(): number;
        set maxRange(range: number);
        /**
         * Creates a new clustered light system with an initial set of lights.
         *
         * @param name The name of the clustered light container
         * @param lights The initial set of lights to add
         * @param scene The scene the clustered light container belongs to
         */
        constructor(name: string, lights?: Light[], scene?: Scene);
        getClassName(): string;
        getTypeID(): number;
        /** @internal */
        _updateBatches(camera?: Nullable<Camera>): RenderTargetTexture;
        private _getSliceIndex;
        private _updateLightData;
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
        /**
         * Adds a light to the clustering system.
         * @param light The light to add
         */
        addLight(light: Light): void;
        /**
         * Removes a light from the clustering system.
         * @param light The light to remove
         * @returns the index where the light was in the light list
         */
        removeLight(light: Light): number;
        protected _buildUniformLayout(): void;
        transferToEffect(effect: Effect, lightIndex: string): Light;
        transferTexturesToEffect(effect: Effect, lightIndex: string): Light;
        /**
         * Transfers the effect to the node material effect
         * @param _effect the effect to transfer to
         * @returns the light
         */
        transferToNodeMaterialEffect(_effect: Effect): Light;
        prepareLightSpecificDefines(defines: any, lightIndex: number): void;
        /**
         * Returns whether this light is ready to be used
         * @returns true if the light is ready
         */
        _isReady(): boolean;
        /**
         * Serializes the ClusteredLightContainer to a JSON object, including all child lights.
         * @returns the serialized object
         */
        serialize(): any;
        protected _onParsed(parsedLight: any, scene: Scene): void;
    }
    /**
     * Register side effects for clusteredLightContainer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterClusteredLightContainer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import clusteredLightContainer.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


        interface Scene {
            /**
             * Removes the given lens flare system from this scene.
             * @param toRemove The lens flare system to remove
             * @returns The index of the removed lens flare system
             */
            removeLensFlareSystem(toRemove: LensFlareSystem): number;
            /**
             * Adds the given lens flare system to this scene
             * @param newLensFlareSystem The lens flare system to add
             */
            addLensFlareSystem(newLensFlareSystem: LensFlareSystem): void;
            /**
             * Gets a lens flare system using its name
             * @param name defines the name to look for
             * @returns the lens flare system or null if not found
             */
            getLensFlareSystemByName(name: string): Nullable<LensFlareSystem>;
            /**
             * Gets a lens flare system using its Id
             * @param id defines the Id to look for
             * @returns the lens flare system or null if not found
             * @deprecated Please use getLensFlareSystemById instead
             */
            getLensFlareSystemByID(id: string): Nullable<LensFlareSystem>;
            /**
             * Gets a lens flare system using its Id
             * @param id defines the Id to look for
             * @returns the lens flare system or null if not found
             */
            getLensFlareSystemById(id: string): Nullable<LensFlareSystem>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the lens flare scene component responsible to manage any lens flares
     * in a given scene.
     */
    export class LensFlareSystemSceneComponent implements ISceneSerializableComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "LensFlareSystem";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Adds all the elements from the container to the scene
         * @param container the container holding the elements
         */
        addFromContainer(container: IAssetContainer): void;
        /**
         * Removes all the elements in the container from the scene
         * @param container contains the elements to remove
         * @param dispose if the removed element should be disposed (default: false)
         */
        removeFromContainer(container: IAssetContainer, dispose?: boolean): void;
        /**
         * Serializes the component data to the specified json object
         * @param serializationObject The object to serialize to
         */
        serialize(serializationObject: any): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        private _draw;
    }
    /**
     * Register side effects for lensFlareSystemSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param lensFlareSystemClass The LensFlareSystem class to register the component for
     */
    export function RegisterLensFlareSystemSceneComponent(lensFlareSystemClass: typeof LensFlareSystem): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lensFlareSystemSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * This represents a Lens Flare System or the shiny effect created by the light reflection on the  camera lenses.
     * It is usually composed of several `lensFlare`.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
     */
    export class LensFlareSystem {
        /**
         * Define the name of the lens flare system
         */
        name: string;
        /**
         * Force all the lens flare systems to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * List of lens flares used in this system.
         */
        lensFlares: LensFlare[];
        /**
         * Define a limit from the border the lens flare can be visible.
         */
        borderLimit: number;
        /**
         * Define a viewport border we do not want to see the lens flare in.
         */
        viewportBorder: number;
        /**
         * Define a predicate which could limit the list of meshes able to occlude the effect.
         */
        meshesSelectionPredicate: (mesh: AbstractMesh) => boolean;
        /**
         * Restricts the rendering of the effect to only the camera rendering this layer mask.
         */
        layerMask: number;
        /** Gets the scene */
        get scene(): Scene;
        /** Shader language used by the system */
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this system.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Define the id of the lens flare system in the scene.
         * (equal to name by default)
         */
        id: string;
        private _scene;
        private _emitter;
        private _vertexBuffers;
        private _indexBuffer;
        private _positionX;
        private _positionY;
        private _isEnabled;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Instantiates a lens flare system.
         * This represents a Lens Flare System or the shiny effect created by the light reflection on the  camera lenses.
         * It is usually composed of several `lensFlare`.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
         * @param name Define the name of the lens flare system in the scene
         * @param emitter Define the source (the emitter) of the lens flares (it can be a camera, a light or a mesh).
         * @param scene Define the scene the lens flare system belongs to
         */
        constructor(
        /**
         * Define the name of the lens flare system
         */
        name: string, emitter: any, scene: Scene);
        /** @internal */
        _onShadersLoaded: Observable<void>;
        private _shadersLoaded;
        protected _initShaderSourceAsync(): Promise<void>;
        private _createIndexBuffer;
        /**
         * Define if the lens flare system is enabled.
         */
        get isEnabled(): boolean;
        set isEnabled(value: boolean);
        /**
         * Get the scene the effects belongs to.
         * @returns the scene holding the lens flare system
         */
        getScene(): Scene;
        /**
         * Get the emitter of the lens flare system.
         * It defines the source of the lens flares (it can be a camera, a light or a mesh).
         * @returns the emitter of the lens flare system
         */
        getEmitter(): any;
        /**
         * Set the emitter of the lens flare system.
         * It defines the source of the lens flares (it can be a camera, a light or a mesh).
         * @param newEmitter Define the new emitter of the system
         */
        setEmitter(newEmitter: any): void;
        /**
         * Get the lens flare system emitter position.
         * The emitter defines the source of the lens flares (it can be a camera, a light or a mesh).
         * @returns the position
         */
        getEmitterPosition(): Vector3;
        /**
         * @internal
         */
        computeEffectivePosition(globalViewport: Viewport): boolean;
        /** @internal */
        _isVisible(): boolean;
        /**
         * @internal
         */
        render(): boolean;
        /**
         * Rebuilds the lens flare system
         */
        rebuild(): void;
        /**
         * Dispose and release the lens flare with its associated resources.
         */
        dispose(): void;
        /**
         * Parse a lens flare system from a JSON representation
         * @param parsedLensFlareSystem Define the JSON to parse
         * @param scene Define the scene the parsed system should be instantiated in
         * @param rootUrl Define the rootUrl of the load sequence to easily find a load relative dependencies such as textures
         * @returns the parsed system
         */
        static Parse(parsedLensFlareSystem: any, scene: Scene, rootUrl: string): LensFlareSystem;
        /**
         * Serialize the current Lens Flare System into a JSON representation.
         * @returns the serialized JSON
         */
        serialize(): any;
    }


    /**
     * This represents one of the lens effect in a `lensFlareSystem`.
     * It controls one of the individual texture used in the effect.
     * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
     */
    export class LensFlare {
        /**
         * Define the size of the lens flare in the system (a floating value between 0 and 1)
         */
        size: number;
        /**
         * Define the position of the lens flare in the system. (a floating value between -1 and 1). A value of 0 is located on the emitter. A value greater than 0 is beyond the emitter and a value lesser than 0 is behind.
         */
        position: number;
        /**
         * Define the lens color.
         */
        color: Color3;
        /**
         * Define the lens texture.
         */
        texture: Nullable<Texture>;
        /**
         * Define the alpha mode to render this particular lens.
         */
        alphaMode: number;
        /** @internal */
        _drawWrapper: DrawWrapper;
        private _system;
        /**
         * Creates a new Lens Flare.
         * This represents one of the lens effect in a `lensFlareSystem`.
         * It controls one of the individual texture used in the effect.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
         * @param size Define the size of the lens flare (a floating value between 0 and 1)
         * @param position Define the position of the lens flare in the system. (a floating value between -1 and 1). A value of 0 is located on the emitter. A value greater than 0 is beyond the emitter and a value lesser than 0 is behind.
         * @param color Define the lens color
         * @param imgUrl Define the lens texture url
         * @param system Define the `lensFlareSystem` this flare is part of
         * @returns The newly created Lens Flare
         */
        static AddFlare(size: number, position: number, color: Color3, imgUrl: string, system: LensFlareSystem): LensFlare;
        /**
         * Instantiates a new Lens Flare.
         * This represents one of the lens effect in a `lensFlareSystem`.
         * It controls one of the individual texture used in the effect.
         * @see https://doc.babylonjs.com/features/featuresDeepDive/environment/lenseFlare
         * @param size Define the size of the lens flare in the system (a floating value between 0 and 1)
         * @param position Define the position of the lens flare in the system. (a floating value between -1 and 1). A value of 0 is located on the emitter. A value greater than 0 is beyond the emitter and a value lesser than 0 is behind.
         * @param color Define the lens color
         * @param imgUrl Define the lens texture url
         * @param system Define the `lensFlareSystem` this flare is part of
         */
        constructor(
        /**
         * Define the size of the lens flare in the system (a floating value between 0 and 1)
         */
        size: number, 
        /**
         * Define the position of the lens flare in the system. (a floating value between -1 and 1). A value of 0 is located on the emitter. A value greater than 0 is beyond the emitter and a value lesser than 0 is behind.
         */
        position: number, color: Color3, imgUrl: string, system: LensFlareSystem);
        /**
         * Dispose and release the lens flare with its associated resources.
         */
        dispose(): void;
    }




    /**
     * Selection outline layer options. This helps customizing the behaviour
     * of the selection outline layer.
     */
    export interface IThinSelectionOutlineLayerOptions extends IThinEffectLayerOptions {
        /**
         * Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        forceGLSL?: boolean;
        /**
         * Specifies whether the depth stored is the Z coordinate in camera space.
         */
        storeCameraSpaceZ?: boolean;
        /**
         * Outline method to use (default: Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL)
         *
         * @see {@link Constants.OUTLINELAYER_SAMPLING_TRIDIRECTIONAL}
         */
        outlineMethod?: number;
        /**
         * Whether to use depth when drawing selection outlines. Disable this to avoid depth renderer usage and draw selected outlines without depth clipping.
         */
        useDepthOcclusion?: boolean;
    }
    /**
     * @internal
     */
    export class ThinSelectionOutlineLayer extends ThinEffectLayer {
        /**
         * Effect Name of the layer.
         */
        static readonly EffectName = "SelectionOutlineLayer";
        /**
         * Name of the instance selection ID attribute
         * @internal
         */
        static readonly InstanceSelectionIdAttributeName = "instanceSelectionId";
        /**
         * The outline color
         */
        outlineColor: Color3;
        /**
         * The thickness of the edges
         */
        outlineThickness: number;
        /**
         * The occlusion threshold (default: 0.0001)
         */
        occlusionThreshold: number;
        private _occlusionStrength;
        private _useDepthOcclusion;
        /**
         * The strength of the occlusion effect (default: 0.8)
         */
        get occlusionStrength(): number;
        set occlusionStrength(value: number);
        /**
         * Whether to use depth when drawing selection outlines.
         * Disable this to avoid depth renderer usage; selected outlines will not be clipped by scene or selected geometry.
         */
        get useDepthOcclusion(): boolean;
        set useDepthOcclusion(value: boolean);
        private get _shouldUseComposeDepthOcclusion();
        /**
         * The width of the source texture
         */
        textureWidth: number;
        /**
         * The height of the source texture
         */
        textureHeight: number;
        /** @internal */
        _options: Required<IThinSelectionOutlineLayerOptions>;
        /** @internal */
        readonly _meshUniqueIdToSelectionId: number[];
        /** @internal */
        _selection: Nullable<AbstractMesh[]>;
        private _instancedBufferSources;
        private _nextSelectionId;
        /**
         * Instantiates a new selection outline Layer and references it to the scene..
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see IThinSelectionOutlineLayerOptions for more information)
         * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.
         */
        constructor(name: string, scene?: Scene, options?: Partial<IThinSelectionOutlineLayerOptions>, dontCheckIfReady?: boolean);
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        /** @internal */
        _internalIsSubMeshReady(subMesh: SubMesh, useInstances: boolean, _emissiveTexture: Nullable<BaseTexture>): boolean;
        protected _importShadersAsync(): Promise<void>;
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        getEffectName(): string;
        /** @internal */
        _createMergeEffect(): Effect;
        /** @internal */
        _createTextureAndPostProcesses(): void;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /** @internal */
        _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean;
        protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode?: boolean): void;
        /** @internal */
        _internalCompose(effect: Effect, _renderIndex: number): void;
        /** @internal */
        _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void;
        /**
         * Returns true if the layer contains information to display, otherwise false.
         * @returns true if the glow layer should be rendered
         */
        shouldRender(): boolean;
        /** @internal */
        _shouldRenderMesh(mesh: Mesh): boolean;
        /** @internal */
        _addCustomEffectDefines(defines: string[]): void;
        /**
         * Determine if a given mesh will be used in the current effect.
         * @param mesh mesh to test
         * @returns true if the mesh will be used
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /** @internal */
        _useMeshMaterial(_mesh: AbstractMesh): boolean;
        /**
         * Remove all the meshes currently referenced in the selection outline layer
         */
        clearSelection(): void;
        /**
         * Remove instanceSelectionId instanced buffer registration from a mesh,
         * including GPU resources (per-pass VBOs, vertex buffers, VAOs).
         * @param mesh - The mesh to clean up
         */
        private _cleanUpInstanceSelectionId;
        /**
         * Adds mesh or group of mesh to the current selection
         *
         * If a group of meshes is provided, they will outline as a single unit
         * @param meshOrGroup Meshes to add to the selection
         */
        addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void;
        /**
         * Free any resources and references associated to a mesh.
         * Internal use
         * @param mesh The mesh to free.
         * @internal
         */
        _disposeMesh(mesh: Mesh): void;
        /**
         * Dispose the effect layer and free resources.
         */
        dispose(): void;
    }


    /**
     * Highlight layer options. This helps customizing the behaviour
     * of the highlight layer.
     */
    export interface IThinHighlightLayerOptions extends IThinEffectLayerOptions {
        /**
         * Multiplication factor apply to the main texture size in the first step of the blur to reduce the size
         * of the picture to blur (the smaller the faster). Default: 0.5
         */
        blurTextureSizeRatio?: number;
        /**
         * How big in texel of the blur texture is the vertical blur. Default: 1
         */
        blurVerticalSize?: number;
        /**
         * How big in texel of the blur texture is the horizontal blur. Default: 1
         */
        blurHorizontalSize?: number;
        /**
         * Should we display highlight as a solid stroke? Default: false
         */
        isStroke?: boolean;
        /**
         * Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        forceGLSL?: boolean;
    }
    /**
     * Storage interface grouping all the information required for glowing a mesh.
     */
    interface IHighlightLayerMesh {
        /**
         * The glowy mesh
         */
        mesh: Mesh;
        /**
         * The color of the glow
         */
        color: Color3;
        /**
         * The mesh render callback use to insert stencil information
         */
        observerHighlight: Nullable<Observer<Mesh>>;
        /**
         * The mesh render callback use to come to the default behavior
         */
        observerDefault: Nullable<Observer<Mesh>>;
        /**
         * If it exists, the emissive color of the material will be used to generate the glow.
         * Else it falls back to the current color.
         */
        glowEmissiveOnly: boolean;
    }
    /**
     * Storage interface grouping all the information required for an excluded mesh.
     */
    interface IHighlightLayerExcludedMesh {
        /**
         * The glowy mesh
         */
        mesh: Mesh;
        /**
         * The mesh render callback use to prevent stencil use
         */
        beforeBind: Nullable<Observer<Mesh>>;
        /**
         * The mesh render callback use to restore previous stencil use
         */
        afterRender: Nullable<Observer<Mesh>>;
        /**
         * Current stencil state of the engine
         */
        stencilState: boolean;
    }
    /**
     * @internal
     */
    export class ThinHighlightLayer extends ThinEffectLayer {
        /**
         * Effect Name of the highlight layer.
         */
        static readonly EffectName = "HighlightLayer";
        /**
         * The neutral color used during the preparation of the glow effect.
         * This is black by default as the blend operation is a blend operation.
         */
        static NeutralColor: Color4;
        /**
         * Stencil value used for glowing meshes.
         */
        static GlowingMeshStencilReference: number;
        /**
         * Stencil value used for the other meshes in the scene.
         */
        static NormalMeshStencilReference: number;
        /**
         * Specifies whether or not the inner glow is ACTIVE in the layer.
         */
        innerGlow: boolean;
        /**
         * Specifies whether or not the outer glow is ACTIVE in the layer.
         */
        outerGlow: boolean;
        /**
         * Specifies the horizontal size of the blur.
         */
        set blurHorizontalSize(value: number);
        /**
         * Specifies the vertical size of the blur.
         */
        set blurVerticalSize(value: number);
        /**
         * Gets the horizontal size of the blur.
         */
        get blurHorizontalSize(): number;
        /**
         * Gets the vertical size of the blur.
         */
        get blurVerticalSize(): number;
        private _instanceGlowingMeshStencilReference;
        /** @internal */
        _options: Required<IThinHighlightLayerOptions>;
        private _downSamplePostprocess;
        private _horizontalBlurPostprocess;
        private _verticalBlurPostprocess;
        /** @internal */
        _meshes: Nullable<{
            [id: string]: Nullable<IHighlightLayerMesh>;
        }>;
        /** @internal */
        _excludedMeshes: Nullable<{
            [id: string]: Nullable<IHighlightLayerExcludedMesh>;
        }>;
        /** @internal */
        _mainObjectRendererRenderPassId: number;
        /**
         * Gets the stencil reference value used for the meshes rendered by the highlight layer.
         */
        get stencilReference(): number;
        /**
         * Number of stencil bits used by the highlight layer (default: 8).
         * The layer uses the numStencilBits highest bits of the stencil buffer.
         */
        numStencilBits: number;
        /**
         * Instantiates a new highlight Layer and references it to the scene..
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see IHighlightLayerOptions for more information)
         * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.
         */
        constructor(name: string, scene?: Scene, options?: Partial<IThinHighlightLayerOptions>, dontCheckIfReady?: boolean);
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        protected _importShadersAsync(): Promise<void>;
        getEffectName(): string;
        _numInternalDraws(): number;
        _createMergeEffect(): Effect;
        _createTextureAndPostProcesses(): void;
        needStencil(): boolean;
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean;
        _internalCompose(effect: Effect, renderIndex: number): void;
        _setEmissiveTextureAndColor(mesh: Mesh, _subMesh: SubMesh, material: Material): void;
        shouldRender(): boolean;
        _shouldRenderMesh(mesh: Mesh): boolean;
        _addCustomEffectDefines(defines: string[]): void;
        /**
         * Add a mesh in the exclusion list to prevent it to impact or being impacted by the highlight layer.
         * @param mesh The mesh to exclude from the highlight layer
         */
        addExcludedMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the exclusion list to let it impact or being impacted by the highlight layer.
         * @param mesh The mesh to highlight
         */
        removeExcludedMesh(mesh: Mesh): void;
        hasMesh(mesh: AbstractMesh): boolean;
        /**
         * Add a mesh in the highlight layer in order to make it glow with the chosen color.
         * @param mesh The mesh to highlight
         * @param color The color of the highlight
         * @param glowEmissiveOnly Extract the glow from the emissive texture
         */
        addMesh(mesh: Mesh, color: Color3, glowEmissiveOnly?: boolean): void;
        /**
         * Remove a mesh from the highlight layer in order to make it stop glowing.
         * @param mesh The mesh to highlight
         */
        removeMesh(mesh: Mesh): void;
        /**
         * Remove all the meshes currently referenced in the highlight layer
         */
        removeAllMeshes(): void;
        private _defaultStencilReference;
        _disposeMesh(mesh: Mesh): void;
        dispose(): void;
    }


    /**
     * Glow layer options. This helps customizing the behaviour
     * of the glow layer.
     */
    export interface IThinGlowLayerOptions extends IThinEffectLayerOptions {
        /**
         * How big is the kernel of the blur texture. Default: 32
         */
        blurKernelSize?: number;
        /**
         * Forces the merge step to be done in ldr (clamp values > 1). Default: false
         */
        ldrMerge?: boolean;
        /**
         * Exclude all meshes from the glow layer by default.
         * This is useful if you have dynamic meshes and you want to control them specifically and
         * make sure that there are no "leaking" glowing meshes.
         * Default: false
         */
        excludeByDefault?: boolean;
    }
    /**
     * @internal
     */
    export class ThinGlowLayer extends ThinEffectLayer {
        /**
         * Effect Name of the layer.
         */
        static readonly EffectName = "GlowLayer";
        /**
         * The default blur kernel size used for the glow.
         */
        static DefaultBlurKernelSize: number;
        /**
         * Gets the ldrMerge option.
         */
        get ldrMerge(): boolean;
        /**
         * Sets the kernel size of the blur.
         */
        set blurKernelSize(value: number);
        /**
         * Gets the kernel size of the blur.
         */
        get blurKernelSize(): number;
        /**
         * Sets the glow intensity.
         */
        set intensity(value: number);
        /**
         * Gets the glow intensity.
         */
        get intensity(): number;
        /** @internal */
        _options: Required<IThinGlowLayerOptions>;
        private _intensity;
        private _horizontalBlurPostprocess1;
        private _verticalBlurPostprocess1;
        private _horizontalBlurPostprocess2;
        private _verticalBlurPostprocess2;
        /** @internal */
        _includedOnlyMeshes: number[];
        /** @internal */
        _excludedMeshes: number[];
        private _meshesUsingTheirOwnMaterials;
        /**
         * Callback used to let the user override the color selection on a per mesh basis
         */
        customEmissiveColorSelector: (mesh: Mesh, subMesh: SubMesh, material: Material, result: Color4) => void;
        /**
         * Callback used to let the user override the texture selection on a per mesh basis
         */
        customEmissiveTextureSelector: (mesh: Mesh, subMesh: SubMesh, material: Material) => Texture;
        /** @internal */
        _renderPassId: number;
        /**
         * Instantiates a new glow Layer and references it to the scene.
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see IGlowLayerOptions for more information)
         * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.
         */
        constructor(name: string, scene?: Scene, options?: IThinGlowLayerOptions, dontCheckIfReady?: boolean);
        /**
         * Gets the class name of the thin glow layer
         * @returns the string with the class name of the glow layer
         */
        getClassName(): string;
        protected _importShadersAsync(): Promise<void>;
        getEffectName(): string;
        /** @internal */
        _internalShouldRender(): boolean;
        _createMergeEffect(): Effect;
        _createTextureAndPostProcesses(): void;
        private _getEffectiveBlurKernelSize;
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        _canRenderMesh(_mesh: AbstractMesh, _material: Material): boolean;
        _internalCompose(effect: Effect): void;
        _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;
        _shouldRenderMesh(mesh: Mesh): boolean;
        _addCustomEffectDefines(defines: string[]): void;
        /**
         * Add a mesh in the exclusion list to prevent it to impact or being impacted by the glow layer.
         * This will not have an effect if meshes are excluded by default (see setExcludedByDefault).
         * @param mesh The mesh to exclude from the glow layer
         */
        addExcludedMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the exclusion list to let it impact or being impacted by the glow layer.
         * This will not have an effect if meshes are excluded by default (see setExcludedByDefault).
         * @param mesh The mesh to remove
         */
        removeExcludedMesh(mesh: Mesh): void;
        /**
         * Add a mesh in the inclusion list to impact or being impacted by the glow layer.
         * @param mesh The mesh to include in the glow layer
         */
        addIncludedOnlyMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the Inclusion list to prevent it to impact or being impacted by the glow layer.
         * @param mesh The mesh to remove
         */
        removeIncludedOnlyMesh(mesh: Mesh): void;
        /**
         * Set the excluded by default option.
         * If true, all meshes will be excluded by default unless they are added to the inclusion list.
         * @param value The boolean value to set the excluded by default option to
         */
        setExcludedByDefault(value: boolean): void;
        hasMesh(mesh: AbstractMesh): boolean;
        _useMeshMaterial(mesh: AbstractMesh): boolean;
        /**
         * Add a mesh to be rendered through its own material and not with emissive only.
         * @param mesh The mesh for which we need to use its material
         */
        referenceMeshToUseItsOwnMaterial(mesh: AbstractMesh): void;
        /**
         * Remove a mesh from being rendered through its own material and not with emissive only.
         * @param mesh The mesh for which we need to not use its material
         * @param renderPassId The render pass id used when rendering the mesh
         */
        unReferenceMeshFromUsingItsOwnMaterial(mesh: AbstractMesh, renderPassId: number): void;
        /** @internal */
        _disposeMesh(mesh: Mesh): void;
    }


    /**
     * Special Glow Blur post process only blurring the alpha channel
     * It enforces keeping the most luminous color in the color channel.
     * @internal
     */
    export class ThinGlowBlurPostProcess extends EffectWrapper {
        direction: Vector2;
        kernel: number;
        /**
         * The fragment shader url
         */
        static readonly FragmentUrl = "glowBlurPostProcess";
        /**
         * The list of uniforms used by the effect
         */
        static readonly Uniforms: string[];
        constructor(name: string, engine: Nullable<AbstractEngine> | undefined, direction: Vector2, kernel: number, options?: EffectWrapperCreationOptions);
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        textureWidth: number;
        textureHeight: number;
        bind(): void;
    }
    /**
     * Effect layer options. This helps customizing the behaviour
     * of the effect layer.
     */
    export interface IThinEffectLayerOptions {
        /**
         * Multiplication factor apply to the canvas size to compute the render target size
         * used to generated the glowing objects (the smaller the faster). Default: 0.5
         */
        mainTextureRatio?: number;
        /**
         * Enforces a fixed size texture to ensure resize independent blur. Default: undefined
         */
        mainTextureFixedSize?: number;
        /**
         * The type of the main texture. Default: TEXTURETYPE_UNSIGNED_BYTE
         */
        mainTextureType?: number;
        /**
         * The format of the main texture. Default: TEXTUREFORMAT_RGBA
         */
        mainTextureFormat?: number;
        /**
         * Alpha blending mode used to apply the blur. Default depends of the implementation. Default: ALPHA_COMBINE
         */
        alphaBlendingMode?: number;
        /**
         * The camera attached to the layer. Default: null
         */
        camera?: Nullable<Camera>;
        /**
         * The rendering group to draw the layer in. Default: -1
         */
        renderingGroupId?: number;
    }
    /**
     * @internal
     */
    export class ThinEffectLayer {
        private _additionalImportShadersAsync?;
        private _vertexBuffers;
        private _indexBuffer;
        private _mergeDrawWrapper;
        protected _dontCheckIfReady: boolean;
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        /** @internal */
        _options: Required<IThinEffectLayerOptions>;
        protected _objectRenderer: ObjectRenderer;
        /** @internal */
        _shouldRender: boolean;
        /** @internal */
        _emissiveTextureAndColor: {
            texture: Nullable<BaseTexture>;
            color: Color4;
        };
        /** @internal */
        _effectIntensity: {
            [meshUniqueId: number]: number;
        };
        /** @internal */
        _postProcesses: EffectWrapper[];
        /**
         * Force all the effect layers to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * The name of the layer
         */
        name: string;
        /**
         * The clear color of the texture used to generate the glow map.
         */
        neutralColor: Color4;
        /**
         * Specifies whether the effect layer is enabled or not.
         */
        isEnabled: boolean;
        /**
         * Gets/sets the camera attached to the layer.
         */
        get camera(): Nullable<Camera>;
        set camera(camera: Nullable<Camera>);
        /**
         * Gets the rendering group id the layer should render in.
         */
        get renderingGroupId(): number;
        set renderingGroupId(renderingGroupId: number);
        /**
         * Specifies if the bounding boxes should be rendered normally or if they should undergo the effect of the layer
         */
        disableBoundingBoxesFromEffectLayer: boolean;
        /**
         * An event triggered when the effect layer has been disposed.
         */
        onDisposeObservable: Observable<ThinEffectLayer>;
        /**
         * An event triggered when the effect layer is about rendering the main texture with the glowy parts.
         */
        onBeforeRenderLayerObservable: Observable<ThinEffectLayer>;
        /**
         * An event triggered when the generated texture is being merged in the scene.
         */
        onBeforeComposeObservable: Observable<ThinEffectLayer>;
        /**
         * An event triggered when the mesh is rendered into the effect render target.
         */
        onBeforeRenderMeshToEffect: Observable<AbstractMesh>;
        /**
         * An event triggered after the mesh has been rendered into the effect render target.
         */
        onAfterRenderMeshToEffect: Observable<AbstractMesh>;
        /**
         * An event triggered when the generated texture has been merged in the scene.
         */
        onAfterComposeObservable: Observable<ThinEffectLayer>;
        /**
         * An event triggered when the layer is being blurred.
         */
        onBeforeBlurObservable: Observable<ThinEffectLayer>;
        /**
         * An event triggered when the layer has been blurred.
         */
        onAfterBlurObservable: Observable<ThinEffectLayer>;
        /**
         * Gets the object renderer used to render objects in the layer
         */
        get objectRenderer(): ObjectRenderer;
        protected _shaderLanguage: ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        private _materialForRendering;
        /**
         * Sets a specific material to be used to render a mesh/a list of meshes in the layer
         * @param mesh mesh or array of meshes
         * @param material material to use by the layer when rendering the mesh(es). If undefined is passed, the specific material created by the layer will be used.
         */
        setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material): void;
        /**
         * Gets the intensity of the effect for a specific mesh.
         * @param mesh The mesh to get the effect intensity for
         * @returns The intensity of the effect for the mesh
         */
        getEffectIntensity(mesh: AbstractMesh): number;
        /**
         * Sets the intensity of the effect for a specific mesh.
         * @param mesh The mesh to set the effect intensity for
         * @param intensity The intensity of the effect for the mesh
         */
        setEffectIntensity(mesh: AbstractMesh, intensity: number): void;
        /**
         * Instantiates a new effect Layer
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         * @param dontCheckIfReady Specifies if the layer should disable checking whether all the post processes are ready (default: false). To save performance, this should be set to true and you should call `isReady` manually before rendering to the layer.
         * @param _additionalImportShadersAsync Additional shaders to import when the layer is created
         */
        constructor(name: string, scene?: Scene, forceGLSL?: boolean, dontCheckIfReady?: boolean, _additionalImportShadersAsync?: (() => Promise<void>) | undefined);
        /** @internal */
        _shadersLoaded: boolean;
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        getEffectName(): string;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param _subMesh the mesh to check for
         * @param _useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        isReady(_subMesh: SubMesh, _useInstances: boolean): boolean;
        /**
         * Returns whether or not the layer needs stencil enabled during the mesh rendering.
         * @returns true if the effect requires stencil during the main canvas render pass.
         */
        needStencil(): boolean;
        /** @internal */
        _createMergeEffect(): Effect;
        /** @internal */
        _createTextureAndPostProcesses(): void;
        /** @internal */
        bindTexturesForCompose: (effect: Effect) => void;
        /** @internal */
        _internalCompose(_effect: Effect, _renderIndex: number): void;
        /** @internal */
        _setEmissiveTextureAndColor(_mesh: Mesh, _subMesh: SubMesh, _material: Material): void;
        /** @internal */
        _numInternalDraws(): number;
        /** @internal */
        _init(options: IThinEffectLayerOptions): void;
        private _generateIndexBuffer;
        private _generateVertexBuffer;
        protected _createObjectRenderer(): void;
        /** @internal */
        _addCustomEffectDefines(_defines: string[]): void;
        /** @internal */
        _internalIsSubMeshReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean;
        /** @internal */
        _isSubMeshReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean;
        protected _importShadersAsync(): Promise<void>;
        /** @internal */
        _internalIsLayerReady(): boolean;
        protected _disposeMergeEffects(): void;
        /**
         * Checks if the layer is ready to be used.
         * @returns true if the layer is ready to be used
         */
        isLayerReady(): boolean;
        /**
         * Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.
         * @returns true if the rendering was successful
         */
        compose(): boolean;
        /** @internal */
        _internalHasMesh(mesh: AbstractMesh): boolean;
        /**
         * Determine if a given mesh will be used in the current effect.
         * @param mesh mesh to test
         * @returns true if the mesh will be used
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /** @internal */
        _internalShouldRender(): boolean;
        /**
         * Returns true if the layer contains information to display, otherwise false.
         * @returns true if the glow layer should be rendered
         */
        shouldRender(): boolean;
        /** @internal */
        _shouldRenderMesh(_mesh: AbstractMesh): boolean;
        /** @internal */
        _internalCanRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        /** @internal */
        _canRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        protected _renderSubMesh(subMesh: SubMesh, enableAlphaMode?: boolean): void;
        /** @internal */
        _useMeshMaterial(_mesh: AbstractMesh): boolean;
        /** @internal */
        _rebuild(): void;
        /**
         * Dispose the effect layer and free resources.
         */
        dispose(): void;
    }


        interface Scene {
            /**
             * Return a the first selection outline layer of the scene with a given name.
             * @param name The name of the selection outline layer to look for.
             * @returns The selection outline layer if found otherwise null.
             */
            getSelectionOutlineLayerByName(name: string): Nullable<SelectionOutlineLayer>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Selection outline layer options. This helps customizing the behaviour
     * of the selection outline layer.
     */
    export interface ISelectionOutlineLayerOptions extends IThinSelectionOutlineLayerOptions {
        /**
         * Enable MSAA by choosing the number of samples. Default: 1
         */
        mainTextureSamples?: number;
    }
    /**
     * The selection outline layer Helps adding a outline effect around a mesh.
     *
     * Once instantiated in a scene, simply use the addMesh or removeMesh method to add or remove
     * outlined meshes to your scene.
     */
    export class SelectionOutlineLayer extends EffectLayer {
        /**
         * Effect Name of the selection outline layer.
         */
        static get EffectName(): string;
        /**
         * The outline color (default (1, 0.5, 0))
         */
        get outlineColor(): Color3;
        set outlineColor(value: Color3);
        /**
         * The thickness of the edges (default: 2.0)
         */
        get outlineThickness(): number;
        set outlineThickness(value: number);
        /**
         * The strength of the occlusion effect (default: 0.8)
         */
        get occlusionStrength(): number;
        set occlusionStrength(value: number);
        /**
         * The occlusion threshold (default: 0.01)
         */
        get occlusionThreshold(): number;
        set occlusionThreshold(value: number);
        /**
         * Whether to use depth when drawing selection outlines.
         * Disable this to avoid depth renderer usage; selected outlines will not be clipped by scene or selected geometry.
         */
        get useDepthOcclusion(): boolean;
        set useDepthOcclusion(value: boolean);
        private _options;
        protected readonly _thinEffectLayer: ThinSelectionOutlineLayer;
        /**
         * Instantiates a new selection outline Layer and references it to the scene..
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see ISelectionOutlineLayerOptions for more information)
         */
        constructor(name: string, scene?: Scene, options?: Partial<ISelectionOutlineLayerOptions>);
        private _enableDepthRenderer;
        /**
         * Checks if the layer is ready to render.
         * When selections are active and depth occlusion is enabled, this also
         * lazily creates the depth renderer and checks that its depth map is ready.
         * @returns true if the layer is ready
         */
        isLayerReady(): boolean;
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        getEffectName(): string;
        protected _numInternalDraws(): number;
        /**
         * Create the merge effect. This is the shader use to blit the information back
         * to the main canvas at the end of the scene rendering.
         * @returns The effect created
         */
        protected _createMergeEffect(): Effect;
        /**
         * Creates the render target textures and post processes used in the selection outline layer.
         */
        protected _createTextureAndPostProcesses(): void;
        /**
         * Creates the main texture for the effect layer.
         */
        protected _createMainTexture(): void;
        /**
         * @returns whether or not the layer needs stencil enabled during the mesh rendering.
         */
        needStencil(): boolean;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * Implementation specific of rendering the generating effect on the main canvas.
         * @param effect The effect used to render through
         * @param renderIndex
         */
        protected _internalRender(effect: Effect, renderIndex: number): void;
        /**
         * @returns true if the layer contains information to display, otherwise false.
         */
        shouldRender(): boolean;
        /**
         * Returns true if the mesh should render, otherwise false.
         * @param mesh The mesh to render
         * @returns true if it should render otherwise false
         */
        protected _shouldRenderMesh(mesh: Mesh): boolean;
        /**
         * Returns true if the mesh can be rendered, otherwise false.
         * @param mesh The mesh to render
         * @param material The material used on the mesh
         * @returns true if it can be rendered otherwise false
         */
        protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        /**
         * Adds specific effects defines.
         * @param defines The defines to add specifics to.
         */
        protected _addCustomEffectDefines(defines: string[]): void;
        /**
         * Sets the required values for both the emissive texture and and the main color.
         * @param mesh
         * @param subMesh
         * @param material
         */
        protected _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;
        /**
         * Determine if a given mesh will be highlighted by the current SelectionOutlineLayer
         * @param mesh mesh to test
         * @returns true if the mesh will be highlighted by the current SelectionOutlineLayer
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /**
         * Remove all the meshes currently referenced in the selection outline layer
         */
        clearSelection(): void;
        /**
         * Adds mesh or group of mesh to the current selection
         *
         * If a group of meshes is provided, they will outline as a single unit
         * @param meshOrGroup Meshes to add to the selection
         */
        addSelection(meshOrGroup: AbstractMesh | AbstractMesh[]): void;
        /**
         * Free any resources and references associated to a mesh.
         * Internal use
         * @param mesh The mesh to free.
         * @internal
         */
        _disposeMesh(mesh: Mesh): void;
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        /**
         * Serializes this SelectionOutline layer
         * @returns a serialized SelectionOutline layer object
         */
        serialize(): any;
        /**
         * Creates a SelectionOutline layer from parsed SelectionOutline layer data
         * @param parsedSelectionOutlineLayer defines the SelectionOutline layer data
         * @param scene defines the current scene
         * @param rootUrl defines the root URL containing the SelectionOutline layer information
         * @returns a parsed SelectionOutline layer
         */
        static Parse(parsedSelectionOutlineLayer: any, scene: Scene, rootUrl: string): SelectionOutlineLayer;
    }
    /**
     * Register side effects for selectionOutlineLayer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSelectionOutlineLayer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import selectionOutlineLayer.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Defines the layer scene component responsible to manage any layers
     * in a given scene.
     */
    export class LayerSceneComponent implements ISceneComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "Layer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        private _engine;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene?: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        private _draw;
        private _drawCameraPredicate;
        private _drawCameraBackground;
        private _drawCameraForegroundWithPostProcessing;
        private _drawCameraForegroundWithoutPostProcessing;
        private _drawRenderTargetPredicate;
        private _drawRenderTargetBackground;
        private _drawRenderTargetForegroundWithPostProcessing;
        private _drawRenderTargetForegroundWithoutPostProcessing;
        /**
         * Adds all the elements from the container to the scene
         * @param container the container holding the elements
         */
        addFromContainer(container: IAssetContainer): void;
        /**
         * Removes all the elements in the container from the scene
         * @param container contains the elements to remove
         * @param dispose if the removed element should be disposed (default: false)
         */
        removeFromContainer(container: IAssetContainer, dispose?: boolean): void;
    }


    /**
     * This represents a full screen 2d layer.
     * This can be useful to display a picture in the  background of your scene for instance.
     * @see https://www.babylonjs-playground.com/#08A2BS#1
     */
    export class Layer {
        /**
         * Define the name of the layer.
         */
        name: string;
        /**
         * Force all the layers to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static ForceGLSL: boolean;
        /**
         * Define the texture the layer should display.
         */
        texture: Nullable<BaseTexture>;
        /**
         * Is the layer in background or foreground.
         */
        isBackground: boolean;
        private _applyPostProcess;
        /**
         * Determines if the layer is drawn before (true) or after (false) post-processing.
         * If the layer is background, it is always before.
         */
        set applyPostProcess(value: boolean);
        get applyPostProcess(): boolean;
        /**
         * Define the color of the layer (instead of texture).
         */
        color: Color4;
        /**
         * Define the scale of the layer in order to zoom in out of the texture.
         */
        scale: Vector2;
        /**
         * Define an offset for the layer in order to shift the texture.
         */
        offset: Vector2;
        /**
         * Define the alpha blending mode used in the layer in case the texture or color has an alpha.
         */
        alphaBlendingMode: number;
        /**
         * Define if the layer should alpha test or alpha blend with the rest of the scene.
         * Alpha test will not mix with the background color in case of transparency.
         * It will either use the texture color or the background depending on the alpha value of the current pixel.
         */
        alphaTest: boolean;
        /**
         * Define a mask to restrict the layer to only some of the scene cameras.
         */
        layerMask: number;
        /**
         * Define the list of render target the layer is visible into.
         */
        renderTargetTextures: RenderTargetTexture[];
        /**
         * Define if the layer is only used in renderTarget or if it also
         * renders in the main frame buffer of the canvas.
         */
        renderOnlyInRenderTargetTextures: boolean;
        /**
         * Define if the colors of the layer should be generated in linear space (default: false)
         */
        convertToLinearSpace: boolean;
        /**
         * Define if the layer is enabled (ie. should be displayed). Default: true
         */
        isEnabled: boolean;
        private _scene;
        private _vertexBuffers;
        private _indexBuffer;
        private _drawWrapper;
        private _previousDefines;
        /**
         * An event triggered when the layer is disposed.
         */
        onDisposeObservable: Observable<Layer>;
        private _onDisposeObserver;
        /**
         * Back compatibility with callback before the onDisposeObservable existed.
         * The set callback will be triggered when the layer has been disposed.
         */
        set onDispose(callback: () => void);
        /**
         * An event triggered before rendering the scene
         */
        onBeforeRenderObservable: Observable<Layer>;
        private _onBeforeRenderObserver;
        /**
         * Back compatibility with callback before the onBeforeRenderObservable existed.
         * The set callback will be triggered just before rendering the layer.
         */
        set onBeforeRender(callback: () => void);
        /**
         * An event triggered after rendering the scene
         */
        onAfterRenderObservable: Observable<Layer>;
        private _onAfterRenderObserver;
        /**
         * Back compatibility with callback before the onAfterRenderObservable existed.
         * The set callback will be triggered just after rendering the layer.
         */
        set onAfterRender(callback: () => void);
        /** Shader language used by the material */
        private _shaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * Instantiates a new layer.
         * This represents a full screen 2d layer.
         * This can be useful to display a picture in the  background of your scene for instance.
         * @see https://www.babylonjs-playground.com/#08A2BS#1
         * @param name Define the name of the layer in the scene
         * @param imgUrl Define the url of the texture to display in the layer
         * @param scene Define the scene the layer belongs to
         * @param isBackground Defines whether the layer is displayed in front or behind the scene
         * @param color Defines a color for the layer
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         */
        constructor(
        /**
         * Define the name of the layer.
         */
        name: string, imgUrl: Nullable<string>, scene: Nullable<Scene>, isBackground?: boolean, color?: Color4, forceGLSL?: boolean);
        private _shadersLoaded;
        private _createIndexBuffer;
        /** @internal */
        _rebuild(): void;
        /**
         * Checks if the layer is ready to be rendered
         * @returns true if the layer is ready. False otherwise.
         */
        isReady(): boolean;
        /**
         * Renders the layer in the scene.
         */
        render(): void;
        /**
         * Disposes and releases the associated resources.
         */
        dispose(): void;
    }




        interface Scene {
            /**
             * Return a the first highlight layer of the scene with a given name.
             * @param name The name of the highlight layer to look for.
             * @returns The highlight layer if found otherwise null.
             */
            getHighlightLayerByName(name: string): Nullable<HighlightLayer>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Highlight layer options. This helps customizing the behaviour
     * of the highlight layer.
     */
    export interface IHighlightLayerOptions extends IThinHighlightLayerOptions {
        /**
         * Whether or not to generate a stencil buffer. Default: false
         */
        generateStencilBuffer?: boolean;
    }
    /**
     * The highlight layer Helps adding a glow effect around a mesh.
     *
     * Once instantiated in a scene, simply use the addMesh or removeMesh method to add or remove
     * glowy meshes to your scene.
     *
     * !!! THIS REQUIRES AN ACTIVE STENCIL BUFFER ON THE CANVAS !!!
     */
    export class HighlightLayer extends EffectLayer {
        /**
         * Effect Name of the highlight layer.
         */
        static readonly EffectName = "HighlightLayer";
        /**
         * The neutral color used during the preparation of the glow effect.
         * This is black by default as the blend operation is a blend operation.
         */
        static get NeutralColor(): Color4;
        static set NeutralColor(value: Color4);
        /**
         * Specifies whether or not the inner glow is ACTIVE in the layer.
         */
        get innerGlow(): boolean;
        set innerGlow(value: boolean);
        /**
         * Specifies whether or not the outer glow is ACTIVE in the layer.
         */
        get outerGlow(): boolean;
        set outerGlow(value: boolean);
        /**
         * Specifies the horizontal size of the blur.
         */
        set blurHorizontalSize(value: number);
        /**
         * Specifies the vertical size of the blur.
         */
        set blurVerticalSize(value: number);
        /**
         * Gets the horizontal size of the blur.
         */
        get blurHorizontalSize(): number;
        /**
         * Gets the vertical size of the blur.
         */
        get blurVerticalSize(): number;
        /**
         * Number of stencil bits used by the highlight layer (default: 8).
         * The layer uses the numStencilBits highest bits of the stencil buffer.
         */
        get numStencilBits(): number;
        set numStencilBits(value: number);
        /**
         * Gets the stencil reference value used for the meshes rendered by the highlight layer.
         */
        get stencilReference(): number;
        /**
         * An event triggered when the highlight layer is being blurred.
         */
        onBeforeBlurObservable: Observable<HighlightLayer>;
        /**
         * An event triggered when the highlight layer has been blurred.
         */
        onAfterBlurObservable: Observable<HighlightLayer>;
        private _options;
        protected readonly _thinEffectLayer: ThinHighlightLayer;
        private _downSamplePostprocess;
        private _horizontalBlurPostprocess;
        private _verticalBlurPostprocess;
        private _blurTexture;
        /**
         * Instantiates a new highlight Layer and references it to the scene..
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see IHighlightLayerOptions for more information)
         */
        constructor(name: string, scene?: Scene, options?: Partial<IHighlightLayerOptions>);
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        getEffectName(): string;
        protected _numInternalDraws(): number;
        /**
         * Create the merge effect. This is the shader use to blit the information back
         * to the main canvas at the end of the scene rendering.
         * @returns The effect created
         */
        protected _createMergeEffect(): Effect;
        /**
         * Creates the render target textures and post processes used in the highlight layer.
         */
        protected _createTextureAndPostProcesses(): void;
        /**
         * @returns whether or not the layer needs stencil enabled during the mesh rendering.
         */
        needStencil(): boolean;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * Implementation specific of rendering the generating effect on the main canvas.
         * @param effect The effect used to render through
         * @param renderIndex
         */
        protected _internalRender(effect: Effect, renderIndex: number): void;
        /**
         * @returns true if the layer contains information to display, otherwise false.
         */
        shouldRender(): boolean;
        /**
         * Returns true if the mesh should render, otherwise false.
         * @param mesh The mesh to render
         * @returns true if it should render otherwise false
         */
        protected _shouldRenderMesh(mesh: Mesh): boolean;
        /**
         * Returns true if the mesh can be rendered, otherwise false.
         * @param mesh The mesh to render
         * @param material The material used on the mesh
         * @returns true if it can be rendered otherwise false
         */
        protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        /**
         * Adds specific effects defines.
         * @param defines The defines to add specifics to.
         */
        protected _addCustomEffectDefines(defines: string[]): void;
        /**
         * Sets the required values for both the emissive texture and and the main color.
         * @param mesh
         * @param subMesh
         * @param material
         */
        protected _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;
        /**
         * Add a mesh in the exclusion list to prevent it to impact or being impacted by the highlight layer.
         * @param mesh The mesh to exclude from the highlight layer
         */
        addExcludedMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the exclusion list to let it impact or being impacted by the highlight layer.
         * @param mesh The mesh to highlight
         */
        removeExcludedMesh(mesh: Mesh): void;
        /**
         * Determine if a given mesh will be highlighted by the current HighlightLayer
         * @param mesh mesh to test
         * @returns true if the mesh will be highlighted by the current HighlightLayer
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /**
         * Add a mesh in the highlight layer in order to make it glow with the chosen color.
         * @param mesh The mesh to highlight
         * @param color The color of the highlight
         * @param glowEmissiveOnly Extract the glow from the emissive texture
         */
        addMesh(mesh: Mesh, color: Color3, glowEmissiveOnly?: boolean): void;
        /**
         * Remove a mesh from the highlight layer in order to make it stop glowing.
         * @param mesh The mesh to highlight
         */
        removeMesh(mesh: Mesh): void;
        /**
         * Remove all the meshes currently referenced in the highlight layer
         */
        removeAllMeshes(): void;
        /**
         * Free any resources and references associated to a mesh.
         * Internal use
         * @param mesh The mesh to free.
         * @internal
         */
        _disposeMesh(mesh: Mesh): void;
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        /**
         * Serializes this Highlight layer
         * @returns a serialized Highlight layer object
         */
        serialize(): any;
        /**
         * Creates a Highlight layer from parsed Highlight layer data
         * @param parsedHightlightLayer defines the Highlight layer data
         * @param scene defines the current scene
         * @param rootUrl defines the root URL containing the Highlight layer information
         * @returns a parsed Highlight layer
         */
        static Parse(parsedHightlightLayer: any, scene: Scene, rootUrl: string): HighlightLayer;
    }
    /**
     * Register side effects for highlightLayer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterHighlightLayer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import highlightLayer.pure for tree-shakeable, side-effect-free usage.
     */


        interface Scene {
            /**
             * Return the first glow layer of the scene with a given name.
             * @param name The name of the glow layer to look for.
             * @returns The glow layer if found otherwise null.
             */
            getGlowLayerByName(name: string): Nullable<GlowLayer>;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Glow layer options. This helps customizing the behaviour
     * of the glow layer.
     */
    export interface IGlowLayerOptions extends IThinGlowLayerOptions {
        /**
         * Enable MSAA by choosing the number of samples. Default: 1
         */
        mainTextureSamples?: number;
        /**
         * Whether or not to generate a stencil buffer. Default: false
         */
        generateStencilBuffer?: boolean;
    }
    /**
     * The glow layer Helps adding a glow effect around the emissive parts of a mesh.
     *
     * Once instantiated in a scene, by default, all the emissive meshes will glow.
     *
     * Documentation: https://doc.babylonjs.com/features/featuresDeepDive/mesh/glowLayer
     */
    export class GlowLayer extends EffectLayer {
        /**
         * Effect Name of the layer.
         */
        static get EffectName(): string;
        /**
         * The default blur kernel size used for the glow.
         */
        static DefaultBlurKernelSize: number;
        /**
         * The default texture size ratio used for the glow.
         */
        static DefaultTextureRatio: number;
        /**
         * Sets the kernel size of the blur.
         */
        set blurKernelSize(value: number);
        /**
         * Gets the kernel size of the blur.
         */
        get blurKernelSize(): number;
        /**
         * Sets the glow intensity.
         */
        set intensity(value: number);
        /**
         * Gets the glow intensity.
         */
        get intensity(): number;
        protected _options: IGlowLayerOptions;
        protected readonly _thinEffectLayer: ThinGlowLayer;
        private _horizontalBlurPostprocess1;
        private _verticalBlurPostprocess1;
        private _horizontalBlurPostprocess2;
        private _verticalBlurPostprocess2;
        private _blurTexture1;
        private _blurTexture2;
        private _postProcesses1;
        private _postProcesses2;
        /**
         * Callback used to let the user override the color selection on a per mesh basis
         */
        get customEmissiveColorSelector(): (mesh: Mesh, subMesh: SubMesh, material: Material, result: Color4) => void;
        set customEmissiveColorSelector(value: (mesh: Mesh, subMesh: SubMesh, material: Material, result: Color4) => void);
        /**
         * Callback used to let the user override the texture selection on a per mesh basis
         */
        get customEmissiveTextureSelector(): (mesh: Mesh, subMesh: SubMesh, material: Material) => Texture;
        set customEmissiveTextureSelector(value: (mesh: Mesh, subMesh: SubMesh, material: Material) => Texture);
        /**
         * Instantiates a new glow Layer and references it to the scene.
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param options Sets of none mandatory options to use with the layer (see IGlowLayerOptions for more information)
         */
        constructor(name: string, scene?: Scene, options?: Partial<IGlowLayerOptions>);
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        getEffectName(): string;
        /**
         * @internal
         * Create the merge effect. This is the shader use to blit the information back
         * to the main canvas at the end of the scene rendering.
         */
        protected _createMergeEffect(): Effect;
        /**
         * Creates the render target textures and post processes used in the glow layer.
         */
        protected _createTextureAndPostProcesses(): void;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * @returns whether or not the layer needs stencil enabled during the mesh rendering.
         */
        needStencil(): boolean;
        /**
         * Returns true if the mesh can be rendered, otherwise false.
         * @param mesh The mesh to render
         * @param material The material used on the mesh
         * @returns true if it can be rendered otherwise false
         */
        protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        /**
         * Implementation specific of rendering the generating effect on the main canvas.
         * @param effect The effect used to render through
         */
        protected _internalRender(effect: Effect): void;
        /**
         * Sets the required values for both the emissive texture and and the main color.
         * @param mesh
         * @param subMesh
         * @param material
         */
        protected _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;
        /**
         * Returns true if the mesh should render, otherwise false.
         * @param mesh The mesh to render
         * @returns true if it should render otherwise false
         */
        protected _shouldRenderMesh(mesh: Mesh): boolean;
        /**
         * Adds specific effects defines.
         * @param defines The defines to add specifics to.
         */
        protected _addCustomEffectDefines(defines: string[]): void;
        /**
         * Add a mesh in the exclusion list to prevent it to impact or being impacted by the glow layer.
         * This will not have an effect if meshes are excluded by default (see setExcludedByDefault).
         * @param mesh The mesh to exclude from the glow layer
         */
        addExcludedMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the exclusion list to let it impact or being impacted by the glow layer.
         * This will not have an effect if meshes are excluded by default (see setExcludedByDefault).
         * @param mesh The mesh to remove
         */
        removeExcludedMesh(mesh: Mesh): void;
        /**
         * Add a mesh in the inclusion list to impact or being impacted by the glow layer.
         * @param mesh The mesh to include in the glow layer
         */
        addIncludedOnlyMesh(mesh: Mesh): void;
        /**
         * Remove a mesh from the Inclusion list to prevent it to impact or being impacted by the glow layer.
         * @param mesh The mesh to remove
         */
        removeIncludedOnlyMesh(mesh: Mesh): void;
        /**
         * Set the excluded by default option.
         * If true, all meshes will be excluded by default unless they are added to the inclusion list.
         * @param value The boolean value to set the excluded by default option to
         */
        setExcludedByDefault(value: boolean): void;
        /**
         * Determine if a given mesh will be used in the glow layer
         * @param mesh The mesh to test
         * @returns true if the mesh will be highlighted by the current glow layer
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /**
         * Defines whether the current material of the mesh should be use to render the effect.
         * @param mesh defines the current mesh to render
         * @returns true if the material of the mesh should be use to render the effect
         */
        protected _useMeshMaterial(mesh: AbstractMesh): boolean;
        /**
         * Add a mesh to be rendered through its own material and not with emissive only.
         * @param mesh The mesh for which we need to use its material
         */
        referenceMeshToUseItsOwnMaterial(mesh: AbstractMesh): void;
        /**
         * Remove a mesh from being rendered through its own material and not with emissive only.
         * @param mesh The mesh for which we need to not use its material
         */
        unReferenceMeshFromUsingItsOwnMaterial(mesh: AbstractMesh): void;
        /**
         * Free any resources and references associated to a mesh.
         * Internal use
         * @param mesh The mesh to free.
         * @internal
         */
        _disposeMesh(mesh: Mesh): void;
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        /**
         * Serializes this glow layer
         * @returns a serialized glow layer object
         */
        serialize(): any;
        /**
         * Creates a Glow Layer from parsed glow layer data
         * @param parsedGlowLayer defines glow layer data
         * @param scene defines the current scene
         * @param rootUrl defines the root URL containing the glow layer information
         * @returns a parsed Glow Layer
         */
        static Parse(parsedGlowLayer: any, scene: Scene, rootUrl: string): GlowLayer;
    }
    /**
     * Register side effects for glowLayer.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGlowLayer(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import glowLayer.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the layer scene component responsible to manage any effect layers
     * in a given scene.
     */
    export class EffectLayerSceneComponent implements ISceneSerializableComponent {
        /**
         * The component name helpful to identify the component in the list of scene components.
         */
        readonly name = "EffectLayer";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        private _engine;
        private _renderEffects;
        private _needStencil;
        private _previousStencilState;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene?: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Serializes the component data to the specified json object
         * @param serializationObject The object to serialize to
         */
        serialize(serializationObject: any): void;
        /**
         * Adds all the elements from the container to the scene
         * @param container the container holding the elements
         */
        addFromContainer(container: IAssetContainer): void;
        /**
         * Removes all the elements in the container from the scene
         * @param container contains the elements to remove
         * @param dispose if the removed element should be disposed (default: false)
         */
        removeFromContainer(container: IAssetContainer, dispose?: boolean): void;
        /**
         * Disposes the component and the associated resources.
         */
        dispose(): void;
        private _isReadyForMesh;
        private _renderMainTexture;
        private _setStencil;
        private _setStencilBack;
        private _draw;
        private _drawCamera;
        private _drawRenderingGroup;
    }
    /**
     * Register side effects for effectLayerSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param effectLayerClass The EffectLayer class to register the component for
     */
    export function RegisterEffectLayerSceneComponent(effectLayerClass: typeof EffectLayer): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import effectLayerSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Effect layer options. This helps customizing the behaviour
     * of the effect layer.
     */
    export interface IEffectLayerOptions {
        /**
         * Multiplication factor apply to the canvas size to compute the render target size
         * used to generated the objects (the smaller the faster). Default: 0.5
         */
        mainTextureRatio: number;
        /**
         * Enforces a fixed size texture to ensure effect stability across devices. Default: undefined
         */
        mainTextureFixedSize?: number;
        /**
         * Alpha blending mode used to apply the blur. Default depends of the implementation. Default: ALPHA_COMBINE
         */
        alphaBlendingMode: number;
        /**
         * The camera attached to the layer. Default: null
         */
        camera: Nullable<Camera>;
        /**
         * The rendering group to draw the layer in. Default: -1
         */
        renderingGroupId: number;
        /**
         * The type of the main texture. Default: TEXTURETYPE_UNSIGNED_BYTE
         */
        mainTextureType: number;
        /**
         * The format of the main texture. Default: TEXTUREFORMAT_RGBA
         */
        mainTextureFormat: number;
        /**
         * Whether or not to generate a stencil buffer. Default: false
         */
        generateStencilBuffer: boolean;
    }
    /**
     * The effect layer Helps adding post process effect blended with the main pass.
     *
     * This can be for instance use to generate glow or highlight effects on the scene.
     *
     * The effect layer class can not be used directly and is intented to inherited from to be
     * customized per effects.
     */
    export abstract class EffectLayer {
        private _effectLayerOptions;
        protected _mainTextureCreatedSize: ISize;
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        protected _maxSize: number;
        protected _mainTextureDesiredSize: ISize;
        protected _mainTexture: RenderTargetTexture;
        protected get _shouldRender(): boolean;
        protected set _shouldRender(value: boolean);
        protected _postProcesses: PostProcess[];
        protected _textures: BaseTexture[];
        protected get _emissiveTextureAndColor(): {
            texture: Nullable<BaseTexture>;
            color: Color4;
        };
        protected set _emissiveTextureAndColor(value: {
            texture: Nullable<BaseTexture>;
            color: Color4;
        });
        protected get _effectIntensity(): {
            [meshUniqueId: number]: number;
        };
        protected set _effectIntensity(value: {
            [meshUniqueId: number]: number;
        });
        protected readonly _thinEffectLayer: ThinEffectLayer;
        private readonly _internalThinEffectLayer;
        /**
         * Force all the effect layers to compile to glsl even on WebGPU engines.
         * False by default. This is mostly meant for backward compatibility.
         */
        static get ForceGLSL(): boolean;
        static set ForceGLSL(value: boolean);
        /**
         * The unique id of the layer
         */
        readonly uniqueId: number;
        /**
         * The name of the layer
         */
        get name(): string;
        set name(value: string);
        /**
         * The clear color of the texture used to generate the glow map.
         */
        get neutralColor(): Color4;
        set neutralColor(value: Color4);
        /**
         * Specifies whether the highlight layer is enabled or not.
         */
        get isEnabled(): boolean;
        set isEnabled(value: boolean);
        /**
         * Gets the camera attached to the layer.
         */
        get camera(): Nullable<Camera>;
        /**
         * Gets the rendering group id the layer should render in.
         */
        get renderingGroupId(): number;
        set renderingGroupId(renderingGroupId: number);
        /**
         * Specifies if the bounding boxes should be rendered normally or if they should undergo the effect of the layer
         */
        get disableBoundingBoxesFromEffectLayer(): boolean;
        set disableBoundingBoxesFromEffectLayer(value: boolean);
        /**
         * An event triggered when the effect layer has been disposed.
         */
        onDisposeObservable: Observable<EffectLayer>;
        /**
         * An event triggered when the effect layer is about rendering the main texture with the glowy parts.
         */
        onBeforeRenderMainTextureObservable: Observable<EffectLayer>;
        /**
         * An event triggered when the generated texture is being merged in the scene.
         */
        onBeforeComposeObservable: Observable<EffectLayer>;
        /**
         * An event triggered when the mesh is rendered into the effect render target.
         */
        onBeforeRenderMeshToEffect: Observable<AbstractMesh>;
        /**
         * An event triggered after the mesh has been rendered into the effect render target.
         */
        onAfterRenderMeshToEffect: Observable<AbstractMesh>;
        /**
         * An event triggered when the generated texture has been merged in the scene.
         */
        onAfterComposeObservable: Observable<EffectLayer>;
        /**
         * An event triggered when the effect layer changes its size.
         */
        onSizeChangedObservable: Observable<EffectLayer>;
        /**
         * Gets the main texture where the effect is rendered
         */
        get mainTexture(): RenderTargetTexture;
        protected get _shaderLanguage(): ShaderLanguage;
        /**
         * Gets the shader language used in this material.
         */
        get shaderLanguage(): ShaderLanguage;
        /**
         * @internal
         */
        static _SceneComponentInitialization: (scene: Scene) => void;
        /**
         * Sets a specific material to be used to render a mesh/a list of meshes in the layer
         * @param mesh mesh or array of meshes
         * @param material material to use by the layer when rendering the mesh(es). If undefined is passed, the specific material created by the layer will be used.
         */
        setMaterialForRendering(mesh: AbstractMesh | AbstractMesh[], material?: Material): void;
        /**
         * Gets the intensity of the effect for a specific mesh.
         * @param mesh The mesh to get the effect intensity for
         * @returns The intensity of the effect for the mesh
         */
        getEffectIntensity(mesh: AbstractMesh): number;
        /**
         * Sets the intensity of the effect for a specific mesh.
         * @param mesh The mesh to set the effect intensity for
         * @param intensity The intensity of the effect for the mesh
         */
        setEffectIntensity(mesh: AbstractMesh, intensity: number): void;
        /**
         * Instantiates a new effect Layer and references it in the scene.
         * @param name The name of the layer
         * @param scene The scene to use the layer in
         * @param forceGLSL Use the GLSL code generation for the shader (even on WebGPU). Default is false
         * @param thinEffectLayer The thin instance of the effect layer (optional)
         */
        constructor(
        /** The Friendly of the effect in the scene */
        name: string, scene?: Scene, forceGLSL?: boolean, thinEffectLayer?: ThinEffectLayer);
        protected get _shadersLoaded(): boolean;
        protected set _shadersLoaded(value: boolean);
        /**
         * Get the effect name of the layer.
         * @returns The effect name
         */
        abstract getEffectName(): string;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @returns true if ready otherwise, false
         */
        abstract isReady(subMesh: SubMesh, useInstances: boolean): boolean;
        /**
         * Returns whether or not the layer needs stencil enabled during the mesh rendering.
         * @returns true if the effect requires stencil during the main canvas render pass.
         */
        abstract needStencil(): boolean;
        /**
         * Create the merge effect. This is the shader use to blit the information back
         * to the main canvas at the end of the scene rendering.
         * @returns The effect containing the shader used to merge the effect on the  main canvas
         */
        protected abstract _createMergeEffect(): Effect;
        /**
         * Creates the render target textures and post processes used in the effect layer.
         */
        protected abstract _createTextureAndPostProcesses(): void;
        /**
         * Implementation specific of rendering the generating effect on the main canvas.
         * @param effect The effect used to render through
         * @param renderNum Index of the _internalRender call (0 for the first time _internalRender is called, 1 for the second time, etc. _internalRender is called the number of times returned by _numInternalDraws())
         */
        protected abstract _internalRender(effect: Effect, renderIndex: number): void;
        /**
         * Sets the required values for both the emissive texture and and the main color.
         */
        protected abstract _setEmissiveTextureAndColor(mesh: Mesh, subMesh: SubMesh, material: Material): void;
        /**
         * Free any resources and references associated to a mesh.
         * Internal use
         * @param mesh The mesh to free.
         */
        abstract _disposeMesh(mesh: Mesh): void;
        /**
         * Serializes this layer (Glow or Highlight for example)
         * @returns a serialized layer object
         */
        abstract serialize?(): any;
        /**
         * Number of times _internalRender will be called. Some effect layers need to render the mesh several times, so they should override this method with the number of times the mesh should be rendered
         * @returns Number of times a mesh must be rendered in the layer
         */
        protected _numInternalDraws(): number;
        /**
         * Initializes the effect layer with the required options.
         * @param options Sets of none mandatory options to use with the layer (see IEffectLayerOptions for more information)
         */
        protected _init(options: Partial<IEffectLayerOptions>): void;
        /**
         * Sets the main texture desired size which is the closest power of two
         * of the engine canvas size.
         */
        private _setMainTextureSize;
        /**
         * Creates the main texture for the effect layer.
         */
        protected _createMainTexture(): void;
        /**
         * Adds specific effects defines.
         * @param defines The defines to add specifics to.
         */
        protected _addCustomEffectDefines(defines: string[]): void;
        /**
         * Checks for the readiness of the element composing the layer.
         * @param subMesh the mesh to check for
         * @param useInstances specify whether or not to use instances to render the mesh
         * @param emissiveTexture the associated emissive texture used to generate the glow
         * @returns true if ready otherwise, false
         */
        protected _isReady(subMesh: SubMesh, useInstances: boolean, emissiveTexture: Nullable<BaseTexture>): boolean;
        protected _importShadersAsync(): Promise<void>;
        protected _arePostProcessAndMergeReady(): boolean;
        /**
         * Checks if the layer is ready to be used.
         * @returns true if the layer is ready to be used
         */
        isLayerReady(): boolean;
        /**
         * Renders the glowing part of the scene by blending the blurred glowing meshes on top of the rendered scene.
         */
        render(): void;
        /**
         * Determine if a given mesh will be used in the current effect.
         * @param mesh mesh to test
         * @returns true if the mesh will be used
         */
        hasMesh(mesh: AbstractMesh): boolean;
        /**
         * Returns true if the layer contains information to display, otherwise false.
         * @returns true if the glow layer should be rendered
         */
        shouldRender(): boolean;
        /**
         * Returns true if the mesh should render, otherwise false.
         * @param mesh The mesh to render
         * @returns true if it should render otherwise false
         */
        protected _shouldRenderMesh(mesh: AbstractMesh): boolean;
        /**
         * Returns true if the mesh can be rendered, otherwise false.
         * @param mesh The mesh to render
         * @param material The material used on the mesh
         * @returns true if it can be rendered otherwise false
         */
        protected _canRenderMesh(mesh: AbstractMesh, material: Material): boolean;
        /**
         * Returns true if the mesh should render, otherwise false.
         * @returns true if it should render otherwise false
         */
        protected _shouldRenderEmissiveTextureForMesh(): boolean;
        /**
         * Defines whether the current material of the mesh should be use to render the effect.
         * @param mesh defines the current mesh to render
         * @returns true if the mesh material should be use
         */
        protected _useMeshMaterial(mesh: AbstractMesh): boolean;
        /**
         * Rebuild the required buffers.
         * @internal Internal use only.
         */
        _rebuild(): void;
        /**
         * Dispose only the render target textures and post process.
         */
        private _disposeTextureAndPostProcesses;
        /**
         * Dispose the highlight layer and free resources.
         */
        dispose(): void;
        /**
         * Gets the class name of the effect layer
         * @returns the string with the class name of the effect layer
         */
        getClassName(): string;
        /**
         * Creates an effect layer from parsed effect layer data
         * @param parsedEffectLayer defines effect layer data
         * @param scene defines the current scene
         * @param rootUrl defines the root URL containing the effect layer information
         * @returns a parsed effect Layer
         */
        static Parse(parsedEffectLayer: any, scene: Scene, rootUrl: string): EffectLayer;
    }


    /**
     * @internal
     **/
    export class _TimeToken {
        _startTimeQuery: Nullable<WebGLQuery>;
        _endTimeQuery: Nullable<WebGLQuery>;
        _timeElapsedQuery: Nullable<WebGLQuery>;
        _timeElapsedQueryEnded: boolean;
    }


    /**
     * This class can be used to get instrumentation data from a Babylon engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation
     */
    export class SceneInstrumentation implements IDisposable {
        /**
         * Defines the scene to instrument
         */
        scene: Scene;
        private _captureActiveMeshesEvaluationTime;
        private _activeMeshesEvaluationTime;
        private _captureRenderTargetsRenderTime;
        private _renderTargetsRenderTime;
        private _captureFrameTime;
        private _frameTime;
        private _captureRenderTime;
        private _renderTime;
        private _captureInterFrameTime;
        private _interFrameTime;
        private _captureParticlesRenderTime;
        private _particlesRenderTime;
        private _captureSpritesRenderTime;
        private _spritesRenderTime;
        private _capturePhysicsTime;
        private _physicsTime;
        private _captureAnimationsTime;
        private _animationsTime;
        private _captureCameraRenderTime;
        private _cameraRenderTime;
        private _onBeforeActiveMeshesEvaluationObserver;
        private _onAfterActiveMeshesEvaluationObserver;
        private _onBeforeRenderTargetsRenderObserver;
        private _onAfterRenderTargetsRenderObserver;
        private _onAfterRenderObserver;
        private _onBeforeDrawPhaseObserver;
        private _onAfterDrawPhaseObserver;
        private _onBeforeAnimationsObserver;
        private _onBeforeParticlesRenderingObserver;
        private _onAfterParticlesRenderingObserver;
        private _onBeforeSpritesRenderingObserver;
        private _onAfterSpritesRenderingObserver;
        private _onBeforePhysicsObserver;
        private _onAfterPhysicsObserver;
        private _onAfterAnimationsObserver;
        private _onBeforeCameraRenderObserver;
        private _onAfterCameraRenderObserver;
        private _disposed;
        /**
         * Gets the perf counter used for active meshes evaluation time
         */
        get activeMeshesEvaluationTimeCounter(): PerfCounter;
        /**
         * Gets the active meshes evaluation time capture status
         */
        get captureActiveMeshesEvaluationTime(): boolean;
        /**
         * Enable or disable the active meshes evaluation time capture
         */
        set captureActiveMeshesEvaluationTime(value: boolean);
        /**
         * Gets the perf counter used for render targets render time
         */
        get renderTargetsRenderTimeCounter(): PerfCounter;
        /**
         * Gets the render targets render time capture status
         */
        get captureRenderTargetsRenderTime(): boolean;
        /**
         * Enable or disable the render targets render time capture
         */
        set captureRenderTargetsRenderTime(value: boolean);
        /**
         * Gets the perf counter used for particles render time
         */
        get particlesRenderTimeCounter(): PerfCounter;
        /**
         * Gets the particles render time capture status
         */
        get captureParticlesRenderTime(): boolean;
        /**
         * Enable or disable the particles render time capture
         */
        set captureParticlesRenderTime(value: boolean);
        /**
         * Gets the perf counter used for sprites render time
         */
        get spritesRenderTimeCounter(): PerfCounter;
        /**
         * Gets the sprites render time capture status
         */
        get captureSpritesRenderTime(): boolean;
        /**
         * Enable or disable the sprites render time capture
         */
        set captureSpritesRenderTime(value: boolean);
        /**
         * Gets the perf counter used for physics time
         */
        get physicsTimeCounter(): PerfCounter;
        /**
         * Gets the physics time capture status
         */
        get capturePhysicsTime(): boolean;
        /**
         * Enable or disable the physics time capture
         */
        set capturePhysicsTime(value: boolean);
        /**
         * Gets the perf counter used for animations time
         */
        get animationsTimeCounter(): PerfCounter;
        /**
         * Gets the animations time capture status
         */
        get captureAnimationsTime(): boolean;
        /**
         * Enable or disable the animations time capture
         */
        set captureAnimationsTime(value: boolean);
        /**
         * Gets the perf counter used for frame time capture
         */
        get frameTimeCounter(): PerfCounter;
        /**
         * Gets the frame time capture status
         */
        get captureFrameTime(): boolean;
        /**
         * Enable or disable the frame time capture
         */
        set captureFrameTime(value: boolean);
        /**
         * Gets the perf counter used for inter-frames time capture
         */
        get interFrameTimeCounter(): PerfCounter;
        /**
         * Gets the inter-frames time capture status
         */
        get captureInterFrameTime(): boolean;
        /**
         * Enable or disable the inter-frames time capture
         */
        set captureInterFrameTime(value: boolean);
        /**
         * Gets the perf counter used for render time capture
         */
        get renderTimeCounter(): PerfCounter;
        /**
         * Gets the render time capture status
         */
        get captureRenderTime(): boolean;
        /**
         * Enable or disable the render time capture
         */
        set captureRenderTime(value: boolean);
        /**
         * Gets the perf counter used for camera render time capture
         */
        get cameraRenderTimeCounter(): PerfCounter;
        /**
         * Gets the camera render time capture status
         */
        get captureCameraRenderTime(): boolean;
        /**
         * Enable or disable the camera render time capture
         */
        set captureCameraRenderTime(value: boolean);
        /**
         * Gets the perf counter used for draw calls
         */
        get drawCallsCounter(): PerfCounter;
        /**
         * Instantiates a new scene instrumentation.
         * This class can be used to get instrumentation data from a Babylon engine
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#sceneinstrumentation
         * @param scene Defines the scene to instrument
         */
        constructor(
        /**
         * Defines the scene to instrument
         */
        scene: Scene);
        private _removeRenderTargetsObservers;
        private _removeRenderTimeObservers;
        /**
         * Dispose and release associated resources.
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * This class can be used to get instrumentation data from a Babylon engine
     * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation
     */
    export class EngineInstrumentation implements IDisposable {
        /**
         * Define the instrumented engine.
         */
        engine: AbstractEngine;
        private _captureGPUFrameTime;
        private _captureShaderCompilationTime;
        private _shaderCompilationTime;
        private _onBeginFrameObserver;
        private _onEndFrameObserver;
        private _onBeforeShaderCompilationObserver;
        private _onAfterShaderCompilationObserver;
        private _disposed;
        /**
         * Gets the perf counter used for GPU frame time
         */
        get gpuFrameTimeCounter(): PerfCounter;
        /**
         * Gets the GPU frame time capture status
         */
        get captureGPUFrameTime(): boolean;
        /**
         * Enable or disable the GPU frame time capture
         */
        set captureGPUFrameTime(value: boolean);
        /**
         * Gets the perf counter used for shader compilation time
         */
        get shaderCompilationTimeCounter(): PerfCounter;
        /**
         * Gets the shader compilation time capture status
         */
        get captureShaderCompilationTime(): boolean;
        /**
         * Enable or disable the shader compilation time capture
         */
        set captureShaderCompilationTime(value: boolean);
        /**
         * Instantiates a new engine instrumentation.
         * This class can be used to get instrumentation data from a Babylon engine
         * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation
         * @param engine Defines the engine to instrument
         */
        constructor(
        /**
         * Define the instrumented engine.
         */
        engine: AbstractEngine);
        /**
         * Dispose and release associated resources.
         */
        dispose(): void;
    }


    /**
     * Class used to manage all inputs for the scene.
     */
    export class InputManager {
        /** The distance in pixel that you have to move to prevent some events */
        static DragMovementThreshold: number;
        /** Time in milliseconds to wait to raise long press events if button is still pressed */
        static LongPressDelay: number;
        /** Time in milliseconds with two consecutive clicks will be considered as a double click */
        static DoubleClickDelay: number;
        /**
         * This flag will modify the behavior so that, when true, a click will happen if and only if
         * another click DOES NOT happen within the DoubleClickDelay time frame.  If another click does
         * happen within that time frame, the first click will not fire an event and and a double click will occur.
         */
        static ExclusiveDoubleClickMode: boolean;
        /** This is a defensive check to not allow control attachment prior to an already active one. If already attached, previous control is unattached before attaching the new one. */
        private _alreadyAttached;
        private _alreadyAttachedTo;
        private _onPointerMove;
        private _onPointerDown;
        private _onPointerUp;
        private _initClickEvent;
        private _initActionManager;
        private _delayedSimpleClick;
        private _meshPickProceed;
        private _previousButtonPressed;
        private _currentPickResult;
        private _previousPickResult;
        private _activePointerIds;
        /** Tracks the count of used slots in _activePointerIds for perf */
        private _activePointerIdsCount;
        private _doubleClickOccured;
        private _isSwiping;
        private _swipeButtonPressed;
        private _skipPointerTap;
        private _isMultiTouchGesture;
        private _pointerOverMesh;
        private _pickedDownMesh;
        private _pickedUpMesh;
        private _pointerX;
        private _pointerY;
        private _unTranslatedPointerX;
        private _unTranslatedPointerY;
        private _startingPointerPosition;
        private _previousStartingPointerPosition;
        private _startingPointerTime;
        private _previousStartingPointerTime;
        private _pointerCaptures;
        private _meshUnderPointerId;
        private _movePointerInfo;
        private _cameraObserverCount;
        private _delayedClicks;
        private _onKeyDown;
        private _onKeyUp;
        private _scene;
        private _deviceSourceManager;
        _originMouseEvent: IMouseEvent;
        /**
         * Creates a new InputManager
         * @param scene - defines the hosting scene
         */
        constructor(scene?: Scene);
        /**
         * Gets the mesh that is currently under the pointer
         * @returns Mesh that the pointer is pointer is hovering over
         */
        get meshUnderPointer(): Nullable<AbstractMesh>;
        /**
         * When using more than one pointer (for example in XR) you can get the mesh under the specific pointer
         * @param pointerId - the pointer id to use
         * @returns The mesh under this pointer id or null if not found
         */
        getMeshUnderPointerByPointerId(pointerId: number): Nullable<AbstractMesh>;
        /**
         * Gets the pointer coordinates in 2D without any translation (ie. straight out of the pointer event)
         * @returns Vector with X/Y values directly from pointer event
         */
        get unTranslatedPointer(): Vector2;
        /**
         * Gets or sets the current on-screen X position of the pointer
         * @returns Translated X with respect to screen
         */
        get pointerX(): number;
        set pointerX(value: number);
        /**
         * Gets or sets the current on-screen Y position of the pointer
         * @returns Translated Y with respect to screen
         */
        get pointerY(): number;
        set pointerY(value: number);
        private _updatePointerPosition;
        private _processPointerMove;
        /** @internal */
        _setRayOnPointerInfo(pickInfo: Nullable<PickingInfo>, event: IMouseEvent): void;
        /** @internal */
        _addCameraPointerObserver(observer: (p: PointerInfo, s: EventState) => void, mask?: number): Nullable<Observer<PointerInfo>>;
        /** @internal */
        _removeCameraPointerObserver(observer: Observer<PointerInfo>): boolean;
        private _checkForPicking;
        private _checkPrePointerObservable;
        /** @internal */
        _pickMove(evt: IPointerEvent): PickingInfo;
        private _setCursorAndPointerOverMesh;
        /**
         * Use this method to simulate a pointer move on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult - pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         */
        simulatePointerMove(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void;
        /**
         * Use this method to simulate a pointer down on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult - pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         */
        simulatePointerDown(pickResult: PickingInfo, pointerEventInit?: PointerEventInit): void;
        private _processPointerDown;
        /**
         * @internal
         * @internals Boolean if delta for pointer exceeds drag movement threshold
         */
        _isPointerSwiping(): boolean;
        /**
         * Use this method to simulate a pointer up on a mesh
         * The pickResult parameter can be obtained from a scene.pick or scene.pickWithRay
         * @param pickResult - pickingInfo of the object wished to simulate pointer event on
         * @param pointerEventInit - pointer event state to be used when simulating the pointer event (eg. pointer id for multitouch)
         * @param doubleTap - indicates that the pointer up event should be considered as part of a double click (false by default)
         */
        simulatePointerUp(pickResult: PickingInfo, pointerEventInit?: PointerEventInit, doubleTap?: boolean): void;
        private _processPointerUp;
        /**
         * Gets a boolean indicating if the current pointer event is captured (meaning that the scene has already handled the pointer down)
         * @param pointerId - defines the pointer id to use in a multi-touch scenario (0 by default)
         * @returns true if the pointer was captured
         */
        isPointerCaptured(pointerId?: number): boolean;
        /**
         * Attach events to the canvas (To handle actionManagers triggers and raise onPointerMove, onPointerDown and onPointerUp
         * @param attachUp - defines if you want to attach events to pointerup
         * @param attachDown - defines if you want to attach events to pointerdown
         * @param attachMove - defines if you want to attach events to pointermove
         * @param elementToAttachTo - defines the target DOM element to attach to (will use the canvas by default)
         */
        attachControl(attachUp?: boolean, attachDown?: boolean, attachMove?: boolean, elementToAttachTo?: Nullable<HTMLElement>): void;
        /**
         * Detaches all event handlers
         */
        detachControl(): void;
        /**
         * Set the value of meshUnderPointer for a given pointerId
         * @param mesh - defines the mesh to use
         * @param pointerId - optional pointer id when using more than one pointer. Defaults to 0
         * @param pickResult - optional pickingInfo data used to find mesh
         * @param evt - optional pointer event
         */
        setPointerOverMesh(mesh: Nullable<AbstractMesh>, pointerId?: number, pickResult?: Nullable<PickingInfo>, evt?: IPointerEvent): void;
        /**
         * Gets the mesh under the pointer
         * @returns a Mesh or null if no mesh is under the pointer
         */
        getPointerOverMesh(): Nullable<AbstractMesh>;
        /**
         * @param mesh - Mesh to invalidate
         * @internal
         */
        _invalidateMesh(mesh: AbstractMesh): void;
    }


    /**
     * Class used to store configuration data associated with pointer picking
     */
    export class PointerPickingConfiguration {
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer down event
         */
        pointerDownPredicate: (Mesh: AbstractMesh) => boolean;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer up event
         */
        pointerUpPredicate: (Mesh: AbstractMesh) => boolean;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer move event
         */
        pointerMovePredicate: (Mesh: AbstractMesh) => boolean;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer down event
         */
        pointerDownFastCheck: boolean;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer up event
         */
        pointerUpFastCheck: boolean;
        /**
         * Gets or sets a predicate used to select candidate meshes for a pointer move event
         */
        pointerMoveFastCheck: boolean;
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer move event occurs.
         */
        skipPointerMovePicking: boolean;
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer down event occurs.
         */
        skipPointerDownPicking: boolean;
        /**
         * Gets or sets a boolean indicating if the user want to entirely skip the picking phase when a pointer up event occurs.  Off by default.
         */
        skipPointerUpPicking: boolean;
    }


    /**
     * Display a 360/180 degree video on an approximately spherical surface, useful for VR applications or skyboxes.
     * As a subclass of TransformNode, this allow parenting to the camera or multiple videos with different locations in the scene.
     * This class achieves its effect with a VideoTexture and a correctly configured BackgroundMaterial on an inverted sphere.
     * Potential additions to this helper include zoom and and non-infinite distance rendering effects.
     */
    export class VideoDome extends TextureDome<VideoTexture> {
        /**
         * Define the video source as a Monoscopic panoramic 360 video.
         */
        static readonly MODE_MONOSCOPIC = 0;
        /**
         * Define the video source as a Stereoscopic TopBottom/OverUnder panoramic 360 video.
         */
        static readonly MODE_TOPBOTTOM = 1;
        /**
         * Define the video source as a Stereoscopic Side by Side panoramic 360 video.
         */
        static readonly MODE_SIDEBYSIDE = 2;
        /**
         * Get the video texture associated with this video dome
         */
        get videoTexture(): VideoTexture;
        /**
         * Get the video mode of this dome
         */
        get videoMode(): number;
        /**
         * Set the video mode of this dome.
         * @see textureMode
         */
        set videoMode(value: number);
        private _pointerObserver;
        private _textureObserver;
        protected _initTexture(urlsOrElement: string | string[] | HTMLVideoElement, scene: Scene, options: any): VideoTexture;
        /**
         * Releases resources associated with this node.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
    }


    /**
     * Display a 360/180 degree texture on an approximately spherical surface, useful for VR applications or skyboxes.
     * As a subclass of TransformNode, this allow parenting to the camera or multiple textures with different locations in the scene.
     * This class achieves its effect with a Texture and a correctly configured BackgroundMaterial on an inverted sphere.
     * Potential additions to this helper include zoom and and non-infinite distance rendering effects.
     */
    export abstract class TextureDome<T extends Texture> extends TransformNode {
        protected onError: Nullable<(message?: string, exception?: any) => void>;
        /**
         * Define the source as a Monoscopic panoramic 360/180.
         */
        static readonly MODE_MONOSCOPIC = 0;
        /**
         * Define the source as a Stereoscopic TopBottom/OverUnder panoramic 360/180.
         */
        static readonly MODE_TOPBOTTOM = 1;
        /**
         * Define the source as a Stereoscopic Side by Side panoramic 360/180.
         */
        static readonly MODE_SIDEBYSIDE = 2;
        private _halfDome;
        private _crossEye;
        protected _useDirectMapping: boolean;
        /**
         * The texture being displayed on the sphere
         */
        protected _texture: T;
        /**
         * Gets the texture being displayed on the sphere
         */
        get texture(): T;
        /**
         * Sets the texture being displayed on the sphere
         */
        set texture(newTexture: T);
        /**
         * The skybox material
         */
        protected _material: BackgroundMaterial;
        /**
         * The surface used for the dome
         */
        protected _mesh: Mesh;
        /**
         * Gets the mesh used for the dome.
         */
        get mesh(): Mesh;
        /**
         * A mesh that will be used to mask the back of the dome in case it is a 180 degree movie.
         */
        private _halfDomeMask;
        /**
         * The current fov(field of view) multiplier, 0.0 - 2.0. Defaults to 1.0. Lower values "zoom in" and higher values "zoom out".
         * Also see the options.resolution property.
         */
        get fovMultiplier(): number;
        set fovMultiplier(value: number);
        protected _textureMode: number;
        /**
         * Gets or set the current texture mode for the texture. It can be:
         * * TextureDome.MODE_MONOSCOPIC : Define the texture source as a Monoscopic panoramic 360.
         * * TextureDome.MODE_TOPBOTTOM  : Define the texture source as a Stereoscopic TopBottom/OverUnder panoramic 360.
         * * TextureDome.MODE_SIDEBYSIDE : Define the texture source as a Stereoscopic Side by Side panoramic 360.
         */
        get textureMode(): number;
        /**
         * Sets the current texture mode for the texture. It can be:
         * * TextureDome.MODE_MONOSCOPIC : Define the texture source as a Monoscopic panoramic 360.
         * * TextureDome.MODE_TOPBOTTOM  : Define the texture source as a Stereoscopic TopBottom/OverUnder panoramic 360.
         * * TextureDome.MODE_SIDEBYSIDE : Define the texture source as a Stereoscopic Side by Side panoramic 360.
         */
        set textureMode(value: number);
        /**
         * Is it a 180 degrees dome (half dome) or 360 texture (full dome)
         */
        get halfDome(): boolean;
        /**
         * Set the halfDome mode. If set, only the front (180 degrees) will be displayed and the back will be blacked out.
         */
        set halfDome(enabled: boolean);
        /**
         * Set the cross-eye mode. If set, images that can be seen when crossing eyes will render correctly
         */
        set crossEye(enabled: boolean);
        /**
         * Is it a cross-eye texture?
         */
        get crossEye(): boolean;
        /**
         * The background material of this dome.
         */
        get material(): BackgroundMaterial;
        /**
         * Oberserver used in Stereoscopic VR Mode.
         */
        private _onBeforeCameraRenderObserver;
        /**
         * Observable raised when an error occurred while loading the texture
         */
        onLoadErrorObservable: Observable<string>;
        /**
         * Observable raised when the texture finished loading
         */
        onLoadObservable: Observable<void>;
        /**
         * Create an instance of this class and pass through the parameters to the relevant classes- Texture, StandardMaterial, and Mesh.
         * @param name Element's name, child elements will append suffixes for their own names.
         * @param textureUrlOrElement defines the url(s) or the (video) HTML element to use
         * @param options An object containing optional or exposed sub element properties
         * @param options.resolution
         * @param options.clickToPlay
         * @param options.autoPlay
         * @param options.loop
         * @param options.size
         * @param options.poster
         * @param options.faceForward
         * @param options.useDirectMapping
         * @param options.halfDomeMode
         * @param options.crossEyeMode
         * @param options.generateMipMaps
         * @param options.mesh
         * @param scene
         * @param onError
         */
        constructor(name: string, textureUrlOrElement: string | string[] | HTMLVideoElement, options: {
            resolution?: number;
            clickToPlay?: boolean;
            autoPlay?: boolean;
            loop?: boolean;
            size?: number;
            poster?: string;
            faceForward?: boolean;
            useDirectMapping?: boolean;
            halfDomeMode?: boolean;
            crossEyeMode?: boolean;
            generateMipMaps?: boolean;
            mesh?: Mesh;
        }, scene: Scene, onError?: Nullable<(message?: string, exception?: any) => void>);
        protected abstract _initTexture(urlsOrElement: string | string[] | HTMLElement, scene: Scene, options: any): T;
        protected _changeTextureMode(value: number): void;
        /**
         * Releases resources associated with this node.
         * @param doNotRecurse Set to true to not recurse into each children (recurse into each children by default)
         * @param disposeMaterialAndTextures Set to true to also dispose referenced materials and textures (false by default)
         */
        dispose(doNotRecurse?: boolean, disposeMaterialAndTextures?: boolean): void;
    }


        interface Scene {
            /**
             * Creates a default light for the scene.
             * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/fastBuildWorld#create-default-light
             * @param replace has the default false, when true replaces the existing lights in the scene with a hemispheric light
             */
            createDefaultLight(replace?: boolean): void;
            /**
             * Creates a default camera for the scene.
             * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/fastBuildWorld#create-default-camera
             * @param createArcRotateCamera has the default false which creates a free camera, when true creates an arc rotate camera
             * @param replace has default false, when true replaces the active camera in the scene
             * @param attachCameraControls has default false, when true attaches camera controls to the canvas.
             */
            createDefaultCamera(createArcRotateCamera?: boolean, replace?: boolean, attachCameraControls?: boolean): void;
            /**
             * Creates a default camera and a default light.
             * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/fastBuildWorld#create-default-camera-or-light
             * @param createArcRotateCamera has the default false which creates a free camera, when true creates an arc rotate camera
             * @param replace has the default false, when true replaces the active camera/light in the scene
             * @param attachCameraControls has the default false, when true attaches camera controls to the canvas.
             */
            createDefaultCameraOrLight(createArcRotateCamera?: boolean, replace?: boolean, attachCameraControls?: boolean): void;
            /**
             * Creates a new sky box
             * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/fastBuildWorld#create-default-skybox
             * @param environmentTexture defines the texture to use as environment texture
             * @param pbr has default false which requires the StandardMaterial to be used, when true PBRMaterial must be used
             * @param scale defines the overall scale of the skybox
             * @param blur is only available when pbr is true, default is 0, no blur, maximum value is 1
             * @param setGlobalEnvTexture has default true indicating that scene.environmentTexture must match the current skybox texture
             * @returns a new mesh holding the sky box
             */
            createDefaultSkybox(environmentTexture?: BaseTexture, pbr?: boolean, scale?: number, blur?: number, setGlobalEnvTexture?: boolean): Nullable<Mesh>;
            /**
             * Creates a new environment
             * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/fastBuildWorld#create-default-environment
             * @param options defines the options you can use to configure the environment
             * @returns the new EnvironmentHelper
             */
            createDefaultEnvironment(options?: Partial<IEnvironmentHelperOptions>): Nullable<EnvironmentHelper>;
            /**
             * Creates a new VREXperienceHelper
             * @see https://doc.babylonjs.com/features/featuresDeepDive/cameras/webVRHelper
             * @param webVROptions defines the options used to create the new VREXperienceHelper
             * @deprecated Please use createDefaultXRExperienceAsync instead
             * @returns a new VREXperienceHelper
             */
            createDefaultVRExperience(webVROptions?: VRExperienceHelperOptions): VRExperienceHelper;
            /**
             * Creates a new WebXRDefaultExperience
             * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/introToWebXR
             * @param options experience options
             * @returns a promise for a new WebXRDefaultExperience
             */
            createDefaultXRExperienceAsync(options?: WebXRDefaultExperienceOptions): Promise<WebXRDefaultExperience>;
        }


    /** This file must only contain pure code and pure imports */
    /** @internal */
    export var _forceSceneHelpersToBundle: boolean;
    /**
     * Register side effects for sceneHelpers.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterSceneHelpers(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import sceneHelpers.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Display a 360 degree photo on an approximately spherical surface, useful for VR applications or skyboxes.
     * As a subclass of TransformNode, this allow parenting to the camera with different locations in the scene.
     * This class achieves its effect with a Texture and a correctly configured BackgroundMaterial on an inverted sphere.
     * Potential additions to this helper include zoom and and non-infinite distance rendering effects.
     */
    export class PhotoDome extends TextureDome<Texture> {
        /**
         * Define the image as a Monoscopic panoramic 360 image.
         */
        static readonly MODE_MONOSCOPIC = 0;
        /**
         * Define the image as a Stereoscopic TopBottom/OverUnder panoramic 360 image.
         */
        static readonly MODE_TOPBOTTOM = 1;
        /**
         * Define the image as a Stereoscopic Side by Side panoramic 360 image.
         */
        static readonly MODE_SIDEBYSIDE = 2;
        /**
         * Gets or sets the texture being displayed on the sphere
         */
        get photoTexture(): Texture;
        /**
         * sets the texture being displayed on the sphere
         */
        set photoTexture(value: Texture);
        /**
         * Gets the current video mode for the video. It can be:
         * * TextureDome.MODE_MONOSCOPIC : Define the texture source as a Monoscopic panoramic 360.
         * * TextureDome.MODE_TOPBOTTOM  : Define the texture source as a Stereoscopic TopBottom/OverUnder panoramic 360.
         * * TextureDome.MODE_SIDEBYSIDE : Define the texture source as a Stereoscopic Side by Side panoramic 360.
         */
        get imageMode(): number;
        /**
         * Sets the current video mode for the video. It can be:
         * * TextureDome.MODE_MONOSCOPIC : Define the texture source as a Monoscopic panoramic 360.
         * * TextureDome.MODE_TOPBOTTOM  : Define the texture source as a Stereoscopic TopBottom/OverUnder panoramic 360.
         * * TextureDome.MODE_SIDEBYSIDE : Define the texture source as a Stereoscopic Side by Side panoramic 360.
         */
        set imageMode(value: number);
        protected _initTexture(urlsOrElement: string, scene: Scene, options: any): Texture;
    }


    /**
     * Evaluates a specified specular power value to determine the appropriate roughness value,
     * based on a pre-defined cubic bezier curve with specular on the abscissa axis (x-axis)
     * and roughness on the ordinant axis (y-axis)
     * @param specularPower specular power of standard material
     * @param p0 first control point
     * @param p1 second control point
     * @param p2 third control point
     * @param p3 fourth control point
     * @returns Number representing the roughness value
     */
    export function SpecularPowerToRoughness(specularPower: number, p0?: Vector2, p1?: Vector2, p2?: Vector2, p3?: Vector2): number;




    /**
     * Represents the different options available during the creation of
     * a Environment helper.
     *
     * This can control the default ground, skybox and image processing setup of your scene.
     */
    export interface IEnvironmentHelperOptions {
        /**
         * Specifies whether or not to create a ground.
         * True by default.
         */
        createGround: boolean;
        /**
         * Specifies the ground size.
         * 15 by default.
         */
        groundSize: number;
        /**
         * The texture used on the ground for the main color.
         * Comes from the BabylonJS CDN by default.
         *
         * Remarks: Can be either a texture or a url.
         */
        groundTexture: string | BaseTexture;
        /**
         * The color mixed in the ground texture by default.
         * BabylonJS clearColor by default.
         */
        groundColor: Color3;
        /**
         * Specifies the ground opacity.
         * 1 by default.
         */
        groundOpacity: number;
        /**
         * Enables the ground to receive shadows.
         * True by default.
         */
        enableGroundShadow: boolean;
        /**
         * Helps preventing the shadow to be fully black on the ground.
         * 0.5 by default.
         */
        groundShadowLevel: number;
        /**
         * Creates a mirror texture attach to the ground.
         * false by default.
         */
        enableGroundMirror: boolean;
        /**
         * Specifies the ground mirror size ratio.
         * 0.3 by default as the default kernel is 64.
         */
        groundMirrorSizeRatio: number;
        /**
         * Specifies the ground mirror blur kernel size.
         * 64 by default.
         */
        groundMirrorBlurKernel: number;
        /**
         * Specifies the ground mirror visibility amount.
         * 1 by default
         */
        groundMirrorAmount: number;
        /**
         * Specifies the ground mirror reflectance weight.
         * This uses the standard weight of the background material to setup the fresnel effect
         * of the mirror.
         * 1 by default.
         */
        groundMirrorFresnelWeight: number;
        /**
         * Specifies the ground mirror Falloff distance.
         * This can helps reducing the size of the reflection.
         * 0 by Default.
         */
        groundMirrorFallOffDistance: number;
        /**
         * Specifies the ground mirror texture type.
         * Unsigned Int by Default.
         */
        groundMirrorTextureType: number;
        /**
         * Specifies a bias applied to the ground vertical position to prevent z-fighting with
         * the shown objects.
         */
        groundYBias: number;
        /**
         * Specifies whether or not to create a skybox.
         * True by default.
         */
        createSkybox: boolean;
        /**
         * Specifies the skybox size.
         * 20 by default.
         */
        skyboxSize: number;
        /**
         * The texture used on the skybox for the main color.
         * Comes from the BabylonJS CDN by default.
         *
         * Remarks: Can be either a texture or a url.
         */
        skyboxTexture: string | BaseTexture;
        /**
         * The color mixed in the skybox texture by default.
         * BabylonJS clearColor by default.
         */
        skyboxColor: Color3;
        /**
         * The background rotation around the Y axis of the scene.
         * This helps aligning the key lights of your scene with the background.
         * 0 by default.
         */
        backgroundYRotation: number;
        /**
         * Compute automatically the size of the elements to best fit with the scene.
         */
        sizeAuto: boolean;
        /**
         * Default position of the rootMesh if autoSize is not true.
         */
        rootPosition: Vector3;
        /**
         * Sets up the image processing in the scene.
         * true by default.
         */
        setupImageProcessing: boolean;
        /**
         * The texture used as your environment texture in the scene.
         * Comes from the BabylonJS CDN by default and in use if setupImageProcessing is true.
         *
         * Remarks: Can be either a texture or a url.
         */
        environmentTexture: string | BaseTexture;
        /**
         * The value of the exposure to apply to the scene.
         * 0.6 by default if setupImageProcessing is true.
         */
        cameraExposure: number;
        /**
         * The value of the contrast to apply to the scene.
         * 1.6 by default if setupImageProcessing is true.
         */
        cameraContrast: number;
        /**
         * Specifies whether or not tonemapping should be enabled in the scene.
         * true by default if setupImageProcessing is true.
         */
        toneMappingEnabled: boolean;
    }
    /**
     * The EnvironmentHelper class can be used to add a fully featured non-expensive background to your scene.
     * It includes by default a skybox and a ground relying on the BackgroundMaterial.
     * It also helps with the default setup of your ImageProcessingConfiguration.
     */
    export class EnvironmentHelper {
        /**
         * Default ground texture URL.
         */
        private static _GroundTextureCDNUrl;
        /**
         * Default skybox texture URL.
         */
        private static _SkyboxTextureCDNUrl;
        /**
         * Default environment texture URL.
         */
        private static _EnvironmentTextureCDNUrl;
        /**
         * Creates the default options for the helper.
         * @param scene The scene the environment helper belongs to.
         * @returns default options for the helper.
         */
        private static _GetDefaultOptions;
        private _rootMesh;
        /**
         * Gets the root mesh created by the helper.
         */
        get rootMesh(): Mesh;
        private _skybox;
        /**
         * Gets the skybox created by the helper.
         */
        get skybox(): Nullable<Mesh>;
        private _skyboxTexture;
        /**
         * Gets the skybox texture created by the helper.
         */
        get skyboxTexture(): Nullable<BaseTexture>;
        private _skyboxMaterial;
        /**
         * Gets the skybox material created by the helper.
         */
        get skyboxMaterial(): Nullable<BackgroundMaterial>;
        private _ground;
        /**
         * Gets the ground mesh created by the helper.
         */
        get ground(): Nullable<Mesh>;
        private _groundTexture;
        /**
         * Gets the ground texture created by the helper.
         */
        get groundTexture(): Nullable<BaseTexture>;
        private _groundMirror;
        /**
         * Gets the ground mirror created by the helper.
         */
        get groundMirror(): Nullable<MirrorTexture>;
        /**
         * Gets the ground mirror render list to helps pushing the meshes
         * you wish in the ground reflection.
         */
        get groundMirrorRenderList(): Nullable<AbstractMesh[]>;
        private _groundMaterial;
        /**
         * Gets the ground material created by the helper.
         */
        get groundMaterial(): Nullable<BackgroundMaterial>;
        /**
         * Stores the creation options.
         */
        private readonly _scene;
        private _options;
        /**
         * This observable will be notified with any error during the creation of the environment,
         * mainly texture creation errors.
         */
        onErrorObservable: Observable<{
            message?: string;
            exception?: any;
        }>;
        /**
         * constructor
         * @param options Defines the options we want to customize the helper
         * @param scene The scene to add the material to
         */
        constructor(options: Partial<IEnvironmentHelperOptions>, scene: Scene);
        /**
         * Updates the environment according to the new options
         * @param options options to configure the helper (IEnvironmentHelperOptions)
         */
        updateOptions(options: Partial<IEnvironmentHelperOptions>): void;
        /**
         * Sets the primary color of all the available elements.
         * @param color the main color to affect to the ground and the background
         */
        setMainColor(color: Color3): void;
        /**
         * Setup the image processing according to the specified options.
         */
        private _setupImageProcessing;
        /**
         * Setup the environment texture according to the specified options.
         */
        private _setupEnvironmentTexture;
        /**
         * Setup the background according to the specified options.
         */
        private _setupBackground;
        /**
         * Get the scene sizes according to the setup.
         * @returns the different ground and skybox sizes.
         */
        private _getSceneSize;
        /**
         * Setup the ground according to the specified options.
         * @param sceneSize
         */
        private _setupGround;
        /**
         * Setup the ground material according to the specified options.
         */
        private _setupGroundMaterial;
        /**
         * Setup the ground diffuse texture according to the specified options.
         */
        private _setupGroundDiffuseTexture;
        /**
         * Setup the ground mirror texture according to the specified options.
         * @param sceneSize
         */
        private _setupGroundMirrorTexture;
        /**
         * Setup the ground to receive the mirror texture.
         */
        private _setupMirrorInGroundMaterial;
        /**
         * Setup the skybox according to the specified options.
         * @param sceneSize
         */
        private _setupSkybox;
        /**
         * Setup the skybox material according to the specified options.
         */
        private _setupSkyboxMaterial;
        /**
         * Setup the skybox reflection texture according to the specified options.
         */
        private _setupSkyboxReflectionTexture;
        private _errorHandler;
        /**
         * Dispose all the elements created by the Helper.
         */
        dispose(): void;
    }


    /**
     * Interface for a spatial audio gizmo.
     */
    export interface ISpatialAudioGizmo extends IGizmo {
        /** Event that fires each time the gizmo is clicked. */
        onClickedObservable: Observable<AbstractSoundSource>;
        /** The sound source the gizmo is attached to. */
        soundSource: Nullable<AbstractSoundSource>;
        /** The material used to render the gizmo. */
        readonly material: StandardMaterial;
    }
    /**
     * Gizmo that visualizes the position and orientation of a v2 spatial sound source.
     */
    export class SpatialAudioGizmo extends Gizmo implements ISpatialAudioGizmo {
        private static readonly _Scale;
        protected _soundSource: Nullable<AbstractSoundSource>;
        protected _audioMesh: Mesh;
        protected _material: StandardMaterial;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /** Event that fires each time the gizmo is clicked. */
        readonly onClickedObservable: Observable<AbstractSoundSource>;
        /**
         * Creates a SpatialAudioGizmo.
         * @param gizmoLayer The utility layer the gizmo will be added to.
         */
        constructor(gizmoLayer?: UtilityLayerRenderer);
        /**
         * The sound source the gizmo is attached to.
         */
        get soundSource(): Nullable<AbstractSoundSource>;
        set soundSource(soundSource: Nullable<AbstractSoundSource>);
        /**
         * Gets the material used to render the gizmo.
         */
        get material(): StandardMaterial;
        /**
         * @internal
         * Mirrors the attached mesh to the sound source's spatial position and rotation.
         */
        protected _update(): void;
        /**
         * Disposes of the gizmo.
         */
        dispose(): void;
        private static _CreateSpeakerMesh;
    }


    /**
     * Interface for scale gizmo
     */
    export interface IScaleGizmo extends IGizmo {
        /** True when the mouse pointer is dragging a gizmo mesh */
        readonly isDragging: boolean;
        /** Internal gizmo used for interactions on the x axis */
        xGizmo: IAxisScaleGizmo;
        /** Internal gizmo used for interactions on the y axis */
        yGizmo: IAxisScaleGizmo;
        /** Internal gizmo used for interactions on the z axis */
        zGizmo: IAxisScaleGizmo;
        /** Internal gizmo used to scale all axis equally*/
        uniformScaleGizmo: IAxisScaleGizmo;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /** Incremental snap scaling. When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,... */
        incrementalSnap: boolean;
        /** Sensitivity factor for dragging */
        sensitivity: number;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        hoverMaterial: StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        disableMaterial: StandardMaterial;
    }
    /**
     * Additional options for the scale gizmo
     */
    export interface ScaleGizmoOptions {
        /**
         * Additional transform applied to the gizmo.
         * @See Gizmo.additionalTransformNode for more detail
         */
        additionalTransformNode?: TransformNode;
    }
    /**
     * Gizmo that enables scaling a mesh along 3 axis
     */
    export class ScaleGizmo extends Gizmo implements IScaleGizmo {
        /**
         * Internal gizmo used for interactions on the x axis
         */
        xGizmo: IAxisScaleGizmo;
        /**
         * Internal gizmo used for interactions on the y axis
         */
        yGizmo: IAxisScaleGizmo;
        /**
         * Internal gizmo used for interactions on the z axis
         */
        zGizmo: IAxisScaleGizmo;
        /**
         * Internal gizmo used to scale all axis equally
         */
        uniformScaleGizmo: IAxisScaleGizmo;
        protected _meshAttached: Nullable<AbstractMesh>;
        protected _nodeAttached: Nullable<Node>;
        protected _snapDistance: number;
        protected _incrementalSnap: boolean;
        protected _uniformScalingMesh: Mesh;
        protected _octahedron: Mesh;
        protected _sensitivity: number;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverMaterial: StandardMaterial;
        protected _disableMaterial: StandardMaterial;
        protected _observables: Observer<PointerInfo>[];
        /** Node Caching for quick lookup */
        protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        get hoverMaterial(): StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        get disableMaterial(): StandardMaterial;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        get attachedMesh(): Nullable<AbstractMesh>;
        set attachedMesh(mesh: Nullable<AbstractMesh>);
        get attachedNode(): Nullable<Node>;
        set attachedNode(node: Nullable<Node>);
        set updateScale(value: boolean);
        get updateScale(): boolean;
        /**
         * True when the mouse pointer is hovering a gizmo mesh
         */
        get isHovered(): boolean;
        /**
         * True when the mouse pointer is dragging a gizmo mesh
         */
        get isDragging(): boolean;
        get additionalTransformNode(): TransformNode | undefined;
        set additionalTransformNode(transformNode: TransformNode | undefined);
        /**
         * Creates a ScaleGizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param thickness display gizmo axis thickness
         * @param gizmoManager
         * @param options More options
         */
        constructor(gizmoLayer?: UtilityLayerRenderer, thickness?: number, gizmoManager?: GizmoManager, options?: ScaleGizmoOptions);
        /**
         * @internal
         * Create Geometry for Gizmo
         */
        protected _createUniformScaleMesh(): AxisScaleGizmo;
        set updateGizmoRotationToMatchAttachedMesh(value: boolean);
        get updateGizmoRotationToMatchAttachedMesh(): boolean;
        set anchorPoint(value: GizmoAnchorPoint);
        get anchorPoint(): GizmoAnchorPoint;
        /**
         * Orientation that the gizmo will be displayed with.
         * When set null, default value will be used (Quaternion(0, 0, 0, 1))
         */
        get customRotationQuaternion(): Nullable<Quaternion>;
        set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>);
        /**
         * Set the coordinate system to use. By default it's local.
         * But it's possible for a user to tweak so its local for translation and world for rotation.
         * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`
         */
        set coordinatesMode(coordinatesMode: GizmoCoordinatesMode);
        /**
         * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        set snapDistance(value: number);
        get snapDistance(): number;
        /**
         * Incremental snap scaling (default is false). When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,...
         */
        set incrementalSnap(value: boolean);
        get incrementalSnap(): boolean;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        set scaleRatio(value: number);
        get scaleRatio(): number;
        /**
         * Sensitivity factor for dragging (Default: 1)
         */
        set sensitivity(value: number);
        get sensitivity(): number;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Get the cache set with addToAxisCache for a specific mesh
         * @param mesh Axis gizmo mesh
         * @returns Gizmo axis definition used for reactive gizmo UI
         */
        getAxisCache(mesh: Mesh): GizmoAxisCache | undefined;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
    }


    /**
     * Interface for rotation gizmo
     */
    export interface IRotationGizmo extends IGizmo {
        /** True when the mouse pointer is dragging a gizmo mesh */
        readonly isDragging: boolean;
        /** Internal gizmo used for interactions on the x axis */
        xGizmo: IPlaneRotationGizmo;
        /** Internal gizmo used for interactions on the y axis */
        yGizmo: IPlaneRotationGizmo;
        /** Internal gizmo used for interactions on the z axis */
        zGizmo: IPlaneRotationGizmo;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /** Custom sensitivity value for the drag strength */
        sensitivity: number;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
    }
    /**
     * Options for each individual plane rotation gizmo contained within RotationGizmo
     * @since 5.0.0
     */
    export interface PlaneRotationGizmoOptions {
        /**
         * Color to use for the plane rotation gizmo
         */
        color?: Color3;
    }
    /**
     * Additional options for each rotation gizmo
     */
    export interface RotationGizmoOptions {
        /**
         * When set, the gizmo will always appear the same size no matter where the camera is (default: true)
         */
        updateScale?: boolean;
        /**
         * Specific options for xGizmo
         */
        xOptions?: PlaneRotationGizmoOptions;
        /**
         * Specific options for yGizmo
         */
        yOptions?: PlaneRotationGizmoOptions;
        /**
         * Specific options for zGizmo
         */
        zOptions?: PlaneRotationGizmoOptions;
        /**
         * Additional transform applied to the gizmo.
         * @See Gizmo.additionalTransformNode for more detail
         */
        additionalTransformNode?: TransformNode;
    }
    /**
     * Gizmo that enables rotating a mesh along 3 axis
     */
    export class RotationGizmo extends Gizmo implements IRotationGizmo {
        /**
         * Internal gizmo used for interactions on the x axis
         */
        xGizmo: IPlaneRotationGizmo;
        /**
         * Internal gizmo used for interactions on the y axis
         */
        yGizmo: IPlaneRotationGizmo;
        /**
         * Internal gizmo used for interactions on the z axis
         */
        zGizmo: IPlaneRotationGizmo;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        protected _meshAttached: Nullable<AbstractMesh>;
        protected _nodeAttached: Nullable<Node>;
        protected _observables: Observer<PointerInfo>[];
        protected _sensitivity: number;
        /** Node Caching for quick lookup */
        protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
        get attachedMesh(): Nullable<AbstractMesh>;
        set attachedMesh(mesh: Nullable<AbstractMesh>);
        get attachedNode(): Nullable<Node>;
        set attachedNode(node: Nullable<Node>);
        protected _checkBillboardTransform(): void;
        /**
         * Sensitivity factor for dragging (Default: 1)
         */
        set sensitivity(value: number);
        get sensitivity(): number;
        /**
         * True when the mouse pointer is hovering a gizmo mesh
         */
        get isHovered(): boolean;
        /**
         * True when the mouse pointer is dragging a gizmo mesh
         */
        get isDragging(): boolean;
        get additionalTransformNode(): TransformNode | undefined;
        set additionalTransformNode(transformNode: TransformNode | undefined);
        /**
         * Creates a RotationGizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param tessellation Amount of tessellation to be used when creating rotation circles
         * @param useEulerRotation Use and update Euler angle instead of quaternion
         * @param thickness display gizmo axis thickness
         * @param gizmoManager Gizmo manager
         * @param options More options
         */
        constructor(gizmoLayer?: UtilityLayerRenderer, tessellation?: number, useEulerRotation?: boolean, thickness?: number, gizmoManager?: GizmoManager, options?: RotationGizmoOptions);
        /**
         * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)
         * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation
         */
        set updateGizmoRotationToMatchAttachedMesh(value: boolean);
        get updateGizmoRotationToMatchAttachedMesh(): boolean;
        set updateGizmoPositionToMatchAttachedMesh(value: boolean);
        get updateGizmoPositionToMatchAttachedMesh(): boolean;
        set anchorPoint(value: GizmoAnchorPoint);
        get anchorPoint(): GizmoAnchorPoint;
        /**
         * Set the coordinate system to use. By default it's local.
         * But it's possible for a user to tweak so its local for translation and world for rotation.
         * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`
         */
        set coordinatesMode(coordinatesMode: GizmoCoordinatesMode);
        set updateScale(value: boolean);
        get updateScale(): boolean;
        /**
         * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        set snapDistance(value: number);
        get snapDistance(): number;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        set scaleRatio(value: number);
        get scaleRatio(): number;
        /**
         * Orientation that the gizmo will be displayed with.
         * When set null, default value will be used (Quaternion(0, 0, 0, 1))
         */
        get customRotationQuaternion(): Nullable<Quaternion>;
        set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>);
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
        /**
         * CustomMeshes are not supported by this gizmo
         */
        setCustomMesh(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Interface for position gizmo
     */
    export interface IPositionGizmo extends IGizmo {
        /** Internal gizmo used for interactions on the x axis */
        xGizmo: IAxisDragGizmo;
        /** Internal gizmo used for interactions on the y axis */
        yGizmo: IAxisDragGizmo;
        /** Internal gizmo used for interactions on the z axis */
        zGizmo: IAxisDragGizmo;
        /** Internal gizmo used for interactions on the yz plane */
        xPlaneGizmo: IPlaneDragGizmo;
        /** Internal gizmo used for interactions on the xz plane */
        yPlaneGizmo: IPlaneDragGizmo;
        /** Internal gizmo used for interactions on the xy plane */
        zPlaneGizmo: IPlaneDragGizmo;
        /** True when the mouse pointer is dragging a gizmo mesh */
        readonly isDragging: boolean;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        /**
         * If the planar drag gizmo is enabled
         * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.
         */
        planarGizmoEnabled: boolean;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
    }
    /**
     * Additional options for the position gizmo
     */
    export interface PositionGizmoOptions {
        /**
         * Additional transform applied to the gizmo.
         * @See Gizmo.additionalTransformNode for more detail
         */
        additionalTransformNode?: TransformNode;
    }
    /**
     * Gizmo that enables dragging a mesh along 3 axis
     */
    export class PositionGizmo extends Gizmo implements IPositionGizmo {
        /**
         * Internal gizmo used for interactions on the x axis
         */
        xGizmo: IAxisDragGizmo;
        /**
         * Internal gizmo used for interactions on the y axis
         */
        yGizmo: IAxisDragGizmo;
        /**
         * Internal gizmo used for interactions on the z axis
         */
        zGizmo: IAxisDragGizmo;
        /**
         * Internal gizmo used for interactions on the yz plane
         */
        xPlaneGizmo: IPlaneDragGizmo;
        /**
         * Internal gizmo used for interactions on the xz plane
         */
        yPlaneGizmo: IPlaneDragGizmo;
        /**
         * Internal gizmo used for interactions on the xy plane
         */
        zPlaneGizmo: IPlaneDragGizmo;
        /**
         * protected variables
         */
        protected _meshAttached: Nullable<AbstractMesh>;
        protected _nodeAttached: Nullable<Node>;
        protected _snapDistance: number;
        protected _observables: Observer<PointerInfo>[];
        /** Node Caching for quick lookup */
        protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
        /** Fires an event when any of it's sub gizmos are dragged */
        onDragStartObservable: Observable<DragStartEndEvent>;
        /** Fires an event when any of it's sub gizmos are being dragged */
        onDragObservable: Observable<DragEvent>;
        /** Fires an event when any of it's sub gizmos are released from dragging */
        onDragEndObservable: Observable<DragStartEndEvent>;
        /**
         * If set to true, planar drag is enabled
         */
        protected _planarGizmoEnabled: boolean;
        get attachedMesh(): Nullable<AbstractMesh>;
        set attachedMesh(mesh: Nullable<AbstractMesh>);
        get attachedNode(): Nullable<Node>;
        set attachedNode(node: Nullable<Node>);
        /**
         * True when the mouse pointer is hovering a gizmo mesh
         */
        get isHovered(): boolean;
        get isDragging(): boolean;
        get additionalTransformNode(): TransformNode | undefined;
        set additionalTransformNode(transformNode: TransformNode | undefined);
        /**
         * Creates a PositionGizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param thickness display gizmo axis thickness
         * @param gizmoManager
         * @param options More options
         */
        constructor(gizmoLayer?: UtilityLayerRenderer, thickness?: number, gizmoManager?: GizmoManager, options?: PositionGizmoOptions);
        /**
         * If the planar drag gizmo is enabled
         * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.
         */
        set planarGizmoEnabled(value: boolean);
        get planarGizmoEnabled(): boolean;
        /**
         * Orientation that the gizmo will be displayed with.
         * When set null, default value will be used (Quaternion(0, 0, 0, 1))
         */
        get customRotationQuaternion(): Nullable<Quaternion>;
        set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>);
        /**
         * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)
         * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation
         */
        set updateGizmoRotationToMatchAttachedMesh(value: boolean);
        get updateGizmoRotationToMatchAttachedMesh(): boolean;
        set updateGizmoPositionToMatchAttachedMesh(value: boolean);
        get updateGizmoPositionToMatchAttachedMesh(): boolean;
        set anchorPoint(value: GizmoAnchorPoint);
        get anchorPoint(): GizmoAnchorPoint;
        /**
         * Set the coordinate system to use. By default it's local.
         * But it's possible for a user to tweak so its local for translation and world for rotation.
         * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`
         */
        set coordinatesMode(coordinatesMode: GizmoCoordinatesMode);
        set updateScale(value: boolean);
        get updateScale(): boolean;
        /**
         * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        set snapDistance(value: number);
        get snapDistance(): number;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        set scaleRatio(value: number);
        get scaleRatio(): number;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param mesh Axis gizmo mesh
         * @param cache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
        /**
         * CustomMeshes are not supported by this gizmo
         */
        setCustomMesh(): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Interface for plane rotation gizmo
     */
    export interface IPlaneRotationGizmo extends IGizmo {
        /** Drag behavior responsible for the gizmos dragging interactions */
        dragBehavior: PointerDragBehavior;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /** Sensitivity factor for dragging */
        sensitivity: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in angle
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /** Accumulated relative angle value for rotation on the axis. */
        angle: number;
        /** If the gizmo is enabled */
        isEnabled: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse */
        hoverMaterial: StandardMaterial;
        /** Color used to render the drag angle sector when gizmo is rotated with mouse */
        rotationColor: Color3;
        /** Material used to render when gizmo is disabled. typically grey. */
        disableMaterial: StandardMaterial;
    }
    /**
     * Single plane rotation gizmo
     */
    export class PlaneRotationGizmo extends Gizmo implements IPlaneRotationGizmo {
        /**
         * Drag behavior responsible for the gizmos dragging interactions
         */
        dragBehavior: PointerDragBehavior;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /**
         * Rotation distance in radians that the gizmo will snap to (Default: 0)
         */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in angle
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /**
         * The maximum angle between the camera and the rotation allowed for interaction
         * If a rotation plane appears 'flat', a lower value allows interaction.
         */
        static MaxDragAngle: number;
        /**
         * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs
         */
        angle: number;
        /**
         * Custom sensitivity value for the drag strength
         */
        sensitivity: number;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse */
        get hoverMaterial(): StandardMaterial;
        /** Color used to render the drag angle sector when gizmo is rotated with mouse */
        set rotationColor(color: Color3);
        /** Material used to render when gizmo is disabled. typically grey. */
        get disableMaterial(): StandardMaterial;
        protected _isEnabled: boolean;
        protected _parent: Nullable<RotationGizmo>;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverMaterial: StandardMaterial;
        protected _disableMaterial: StandardMaterial;
        protected _gizmoMesh: Mesh;
        protected _rotationDisplayPlane: Mesh;
        protected _dragging: boolean;
        protected _angles: Vector3;
        protected static _RotationGizmoVertexShader: string;
        protected static _RotationGizmoFragmentShader: string;
        protected _rotationShaderMaterial: ShaderMaterial;
        /**
         * Creates a PlaneRotationGizmo
         * @param planeNormal The normal of the plane which the gizmo will be able to rotate on
         * @param color The color of the gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param tessellation Amount of tessellation to be used when creating rotation circles
         * @param parent
         * @param useEulerRotation Use and update Euler angle instead of quaternion
         * @param thickness display gizmo axis thickness
         * @param hoverColor The color of the gizmo when hovering over and dragging
         * @param disableColor The Color of the gizmo when its disabled
         */
        constructor(planeNormal: Vector3, color?: Color3, gizmoLayer?: UtilityLayerRenderer, tessellation?: number, parent?: Nullable<RotationGizmo>, useEulerRotation?: boolean, thickness?: number, hoverColor?: Color3, disableColor?: Color3);
        /**
         * @internal
         * Create Geometry for Gizmo
         * @param parentMesh
         * @param thickness
         * @param tessellation
         * @returns
         */
        protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number): {
            rotationMesh: Mesh;
            collider: Mesh;
        };
        protected _attachedNodeChanged(value: Nullable<Node>): void;
        /**
         * If the gizmo is enabled
         */
        set isEnabled(value: boolean);
        get isEnabled(): boolean;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
    }




    /**
     * Interface for plane drag gizmo
     */
    export interface IPlaneDragGizmo extends IGizmo {
        /** Drag behavior responsible for the gizmos dragging interactions */
        dragBehavior: PointerDragBehavior;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /** If the gizmo is enabled */
        isEnabled: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse */
        hoverMaterial: StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey. */
        disableMaterial: StandardMaterial;
    }
    /**
     * Single plane drag gizmo
     */
    export class PlaneDragGizmo extends Gizmo implements IPlaneDragGizmo {
        /**
         * Drag behavior responsible for the gizmos dragging interactions
         */
        dragBehavior: PointerDragBehavior;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /**
         * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        protected _gizmoMesh: TransformNode;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverMaterial: StandardMaterial;
        protected _disableMaterial: StandardMaterial;
        protected _isEnabled: boolean;
        protected _parent: Nullable<PositionGizmo>;
        protected _dragging: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        get hoverMaterial(): StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        get disableMaterial(): StandardMaterial;
        /**
         * @internal
         */
        static _CreatePlane(scene: Scene, material: StandardMaterial): TransformNode;
        /**
         * Creates a PlaneDragGizmo
         * @param dragPlaneNormal The axis normal to which the gizmo will be able to drag on
         * @param color The color of the gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param parent
         * @param hoverColor The color of the gizmo when hovering over and dragging
         * @param disableColor The Color of the gizmo when its disabled
         */
        constructor(dragPlaneNormal: Vector3, color?: Color3, gizmoLayer?: UtilityLayerRenderer, parent?: Nullable<PositionGizmo>, hoverColor?: Color3, disableColor?: Color3);
        protected _attachedNodeChanged(value: Nullable<Node>): void;
        /**
         * If the gizmo is enabled
         */
        set isEnabled(value: boolean);
        get isEnabled(): boolean;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
    }


    /**
     * Interface for light gizmo
     */
    export interface ILightGizmo extends IGizmo {
        /** Event that fires each time the gizmo is clicked */
        onClickedObservable: Observable<Light>;
        /** The light that the gizmo is attached to */
        light: Nullable<Light>;
        /** The material used to render the light gizmo */
        readonly material: StandardMaterial;
    }
    /**
     * Gizmo that enables viewing a light
     */
    export class LightGizmo extends Gizmo implements ILightGizmo {
        protected _lightMesh: Mesh;
        protected _material: StandardMaterial;
        protected _cachedPosition: Vector3;
        protected _cachedForward: Vector3;
        protected _attachedMeshParent: TransformNode;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /**
         * Event that fires each time the gizmo is clicked
         */
        onClickedObservable: Observable<Light>;
        /**
         * Creates a LightGizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         */
        constructor(gizmoLayer?: UtilityLayerRenderer);
        protected _light: Nullable<Light>;
        /**
         * Override attachedNode because lightgizmo only support attached mesh
         * It will return the attached mesh (if any) and setting an attached node will log
         * a warning
         */
        get attachedNode(): Nullable<Node>;
        set attachedNode(value: Nullable<Node>);
        /**
         * The light that the gizmo is attached to
         */
        set light(light: Nullable<Light>);
        get light(): Nullable<Light>;
        /**
         * Gets the material used to render the light gizmo
         */
        get material(): StandardMaterial;
        /**
         * @internal
         * returns mesh forward
         */
        protected _getMeshForward(): Vector3;
        /**
         * @internal
         * Updates the gizmo to match the attached mesh's position/rotation
         */
        protected _update(): void;
        private static _Scale;
        /**
         * Creates the lines for a light mesh
         * @param levels
         * @param scene
         * @returns the light lines mesh
         */
        private static _CreateLightLines;
        /**
         * Disposes of the light gizmo
         */
        dispose(): void;
        private static _CreateHemisphericLightMesh;
        private static _CreatePointLightMesh;
        private static _CreateSpotLightMesh;
        private static _CreateDirectionalLightMesh;
    }




    /**
     * Helps set up gizmos in the scene to rotate/scale/position nodes
     */
    export class GizmoManager implements IDisposable {
        private _scene;
        /**
         * Gizmos created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time
         */
        gizmos: {
            positionGizmo: Nullable<IPositionGizmo>;
            rotationGizmo: Nullable<IRotationGizmo>;
            scaleGizmo: Nullable<IScaleGizmo>;
            boundingBoxGizmo: Nullable<IBoundingBoxGizmo>;
        };
        /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */
        clearGizmoOnEmptyPointerEvent: boolean;
        /** When true (default), picking to attach a new mesh is enabled. This works in sync with inspector autopicking. */
        enableAutoPicking: boolean;
        /** Fires an event when the manager is attached to a mesh */
        onAttachedToMeshObservable: Observable<Nullable<AbstractMesh>>;
        /** Fires an event when the manager is attached to a node */
        onAttachedToNodeObservable: Observable<Nullable<Node>>;
        protected _gizmosEnabled: {
            positionGizmo: boolean;
            rotationGizmo: boolean;
            scaleGizmo: boolean;
            boundingBoxGizmo: boolean;
        };
        protected _pointerObservers: Observer<PointerInfo>[];
        protected _attachedMesh: Nullable<AbstractMesh>;
        protected _attachedNode: Nullable<Node>;
        protected _boundingBoxColor: Color3;
        protected _defaultUtilityLayer: UtilityLayerRenderer;
        protected _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;
        protected _thickness: number;
        protected _scaleRatio: number;
        protected _coordinatesMode: GizmoCoordinatesMode;
        protected _additionalTransformNode?: TransformNode;
        /** Node Caching for quick lookup */
        private _gizmoAxisCache;
        /**
         * When bounding box gizmo is enabled, this can be used to track drag/end events
         */
        boundingBoxDragBehavior: SixDofDragBehavior;
        /**
         * Array of meshes which will have the gizmo attached when a pointer selected them. If null, all meshes are attachable. (Default: null)
         */
        attachableMeshes: Nullable<Array<AbstractMesh>>;
        /**
         * Array of nodes which will have the gizmo attached when a pointer selected them. If null, all nodes are attachable. (Default: null)
         */
        attachableNodes: Nullable<Array<Node>>;
        /**
         * If pointer events should perform attaching/detaching a gizmo, if false this can be done manually via attachToMesh/attachToNode. (Default: true)
         */
        usePointerToAttachGizmos: boolean;
        /**
         * Utility layer that the bounding box gizmo belongs to
         */
        get keepDepthUtilityLayer(): UtilityLayerRenderer;
        /**
         * Utility layer that all gizmos besides bounding box belong to
         */
        get utilityLayer(): UtilityLayerRenderer;
        /**
         * True when the mouse pointer is hovering a gizmo mesh
         */
        get isHovered(): boolean;
        /**
         * True when the mouse pointer is dragging a gizmo mesh
         */
        get isDragging(): boolean;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        set scaleRatio(value: number);
        get scaleRatio(): number;
        /**
         * Set the coordinate system to use. By default it's local.
         * But it's possible for a user to tweak so its local for translation and world for rotation.
         * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`
         */
        set coordinatesMode(coordinatesMode: GizmoCoordinatesMode);
        get coordinatesMode(): GizmoCoordinatesMode;
        /**
         * The mesh the gizmo's is attached to
         */
        get attachedMesh(): Nullable<AbstractMesh>;
        /**
         * The node the gizmo's is attached to
         */
        get attachedNode(): Nullable<Node>;
        /**
         * Additional transform node that will be used to transform all the gizmos
         */
        get additionalTransformNode(): TransformNode | undefined;
        /**
         * Instantiates a gizmo manager
         * @param _scene the scene to overlay the gizmos on top of
         * @param thickness display gizmo axis thickness
         * @param utilityLayer the layer where gizmos are rendered
         * @param keepDepthUtilityLayer the layer where occluded gizmos are rendered
         */
        constructor(_scene: Scene, thickness?: number, utilityLayer?: UtilityLayerRenderer, keepDepthUtilityLayer?: UtilityLayerRenderer);
        /**
         * @internal
         * Subscribes to pointer down events, for attaching and detaching mesh
         * @param scene The scene layer the observer will be added to
         * @returns the pointer observer
         */
        private _attachToMeshPointerObserver;
        /**
         * Attaches a set of gizmos to the specified mesh
         * @param mesh The mesh the gizmo's should be attached to
         */
        attachToMesh(mesh: Nullable<AbstractMesh>): void;
        /**
         * Attaches a set of gizmos to the specified node
         * @param node The node the gizmo's should be attached to
         */
        attachToNode(node: Nullable<Node>): void;
        /**
         * If the position gizmo is enabled
         */
        set positionGizmoEnabled(value: boolean);
        get positionGizmoEnabled(): boolean;
        /**
         * If the rotation gizmo is enabled
         */
        set rotationGizmoEnabled(value: boolean);
        get rotationGizmoEnabled(): boolean;
        /**
         * If the scale gizmo is enabled
         */
        set scaleGizmoEnabled(value: boolean);
        get scaleGizmoEnabled(): boolean;
        /**
         * If the boundingBox gizmo is enabled
         */
        set boundingBoxGizmoEnabled(value: boolean);
        get boundingBoxGizmoEnabled(): boolean;
        /**
         * Sets the additional transform applied to all the gizmos.
         * @See Gizmo.additionalTransformNode for more detail
         */
        set additionalTransformNode(node: TransformNode | undefined);
        private _setAdditionalTransformNode;
        /**
         * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation
         * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI
         */
        addToAxisCache(gizmoAxisCache: Map<Mesh, GizmoAxisCache>): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /**
         * Disposes of the gizmo manager
         */
        dispose(): void;
    }


    /**
     * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI
     */
    export interface GizmoAxisCache {
        /** Mesh used to render the Gizmo */
        gizmoMeshes: Mesh[];
        /** Mesh used to detect user interaction with Gizmo */
        colliderMeshes: Mesh[];
        /** Material used to indicate color of gizmo mesh */
        material: StandardMaterial;
        /** Material used to indicate hover state of the Gizmo */
        hoverMaterial: StandardMaterial;
        /** Material used to indicate disabled state of the Gizmo */
        disableMaterial: StandardMaterial;
        /** Used to indicate Active state of the Gizmo */
        active: boolean;
        /** DragBehavior */
        dragBehavior: PointerDragBehavior;
    }
    /**
     * Anchor options where the Gizmo can be positioned in relation to its anchored node
     */
    export enum GizmoAnchorPoint {
        /** The origin of the attached node */
        Origin = 0,
        /** The pivot point of the attached node */
        Pivot = 1
    }
    /**
     * Coordinates mode: Local or World. Defines how axis is aligned: either on world axis or transform local axis
     */
    export enum GizmoCoordinatesMode {
        World = 0,
        Local = 1
    }
    /**
     * Interface for basic gizmo
     */
    export interface IGizmo extends IDisposable {
        /** True when the mouse pointer is hovered a gizmo mesh */
        readonly isHovered: boolean;
        /** The root mesh of the gizmo */
        _rootMesh: Mesh;
        /** Ratio for the scale of the gizmo */
        scaleRatio: number;
        /**
         * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)
         * * When set, interactions will be enabled
         */
        attachedMesh: Nullable<AbstractMesh>;
        /**
         * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)
         * * When set, interactions will be enabled
         */
        attachedNode: Nullable<Node>;
        /**
         * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)
         */
        updateGizmoRotationToMatchAttachedMesh: boolean;
        /** The utility layer the gizmo will be added to */
        gizmoLayer: UtilityLayerRenderer;
        /**
         * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)
         */
        updateGizmoPositionToMatchAttachedMesh: boolean;
        /**
         * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.
         * (Default: GizmoAnchorPoint.Origin)
         */
        anchorPoint: GizmoAnchorPoint;
        /**
         * Set the coordinate mode to use. By default it's local.
         */
        coordinatesMode: GizmoCoordinatesMode;
        /**
         * When set, the gizmo will always appear the same size no matter where the camera is (default: true)
         */
        updateScale: boolean;
        /**
         * Orientation that the gizmo will be displayed with.
         * When set null, default value will be used (Quaternion(0, 0, 0, 1))
         */
        customRotationQuaternion: Nullable<Quaternion>;
        /**
         * Disposes and replaces the current meshes in the gizmo with the specified mesh
         * @param mesh The mesh to replace the default mesh of the gizmo
         */
        setCustomMesh(mesh: Mesh): void;
        /**
         * Additional transform applied to the gizmo.
         * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.
         * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.
         */
        additionalTransformNode?: TransformNode | undefined;
    }
    /**
     * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.
     */
    export class Gizmo implements IGizmo {
        /** [Object] The utility layer the gizmo will be added to */
        gizmoLayer: UtilityLayerRenderer;
        /**
         * The root mesh of the gizmo
         */
        _rootMesh: Mesh;
        protected _attachedMesh: Nullable<AbstractMesh>;
        protected _attachedNode: Nullable<Node>;
        protected _customRotationQuaternion: Nullable<Quaternion>;
        protected _additionalTransformNode?: TransformNode;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        protected _scaleRatio: number;
        /**
         * boolean updated by pointermove when a gizmo mesh is hovered
         */
        protected _isHovered: boolean;
        /**
         * When enabled, any gizmo operation will preserve scaling sign. Default is off.
         * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)
         */
        static PreserveScaling: boolean;
        /**
         * There are 2 ways to preserve scaling: using mesh scaling or absolute scaling. Depending of hierarchy, non uniform scaling and LH or RH coordinates. One is preferable than the other.
         * If the scaling to be preserved is the local scaling, then set this value to false.
         * Default is true which means scaling to be preserved is absolute one (with hierarchy applied)
         */
        static UseAbsoluteScaling: boolean;
        /**
         * Ratio for the scale of the gizmo (Default: 1)
         */
        set scaleRatio(value: number);
        get scaleRatio(): number;
        /**
         * True when the mouse pointer is hovered a gizmo mesh
         */
        get isHovered(): boolean;
        /**
         * If a custom mesh has been set (Default: false)
         */
        protected _customMeshSet: boolean;
        /**
         * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)
         * * When set, interactions will be enabled
         */
        get attachedMesh(): Nullable<AbstractMesh>;
        set attachedMesh(value: Nullable<AbstractMesh>);
        /**
         * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)
         * * When set, interactions will be enabled
         */
        get attachedNode(): Nullable<Node>;
        set attachedNode(value: Nullable<Node>);
        /**
         * Disposes and replaces the current meshes in the gizmo with the specified mesh
         * @param mesh The mesh to replace the default mesh of the gizmo
         */
        setCustomMesh(mesh: Mesh): void;
        /**
         * Additional transform applied to the gizmo.
         * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.
         * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.
         */
        get additionalTransformNode(): TransformNode | undefined;
        set additionalTransformNode(value: TransformNode | undefined);
        protected _updateGizmoRotationToMatchAttachedMesh: boolean;
        protected _updateGizmoPositionToMatchAttachedMesh: boolean;
        protected _anchorPoint: GizmoAnchorPoint;
        protected _updateScale: boolean;
        protected _coordinatesMode: GizmoCoordinatesMode;
        /**
         * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)
         * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation
         */
        set updateGizmoRotationToMatchAttachedMesh(value: boolean);
        get updateGizmoRotationToMatchAttachedMesh(): boolean;
        /**
         * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)
         */
        set updateGizmoPositionToMatchAttachedMesh(value: boolean);
        get updateGizmoPositionToMatchAttachedMesh(): boolean;
        /**
         * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.
         * (Default: GizmoAnchorPoint.Origin)
         */
        set anchorPoint(value: GizmoAnchorPoint);
        get anchorPoint(): GizmoAnchorPoint;
        /**
         * Set the coordinate system to use. By default it's local.
         * But it's possible for a user to tweak so its local for translation and world for rotation.
         * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`
         */
        set coordinatesMode(coordinatesMode: GizmoCoordinatesMode);
        get coordinatesMode(): GizmoCoordinatesMode;
        /**
         * When set, the gizmo will always appear the same size no matter where the camera is (default: true)
         */
        set updateScale(value: boolean);
        get updateScale(): boolean;
        protected _interactionsEnabled: boolean;
        protected _attachedNodeChanged(value: Nullable<Node>): void;
        protected _beforeRenderObserver: Nullable<Observer<Scene>>;
        private _rightHandtoLeftHandMatrix;
        /**
         * Creates a gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         */
        constructor(
        /** [Object] The utility layer the gizmo will be added to */
        gizmoLayer?: UtilityLayerRenderer);
        /**
         * Orientation that the gizmo will be displayed with.
         * When set null, default value will be used (Quaternion(0, 0, 0, 1))
         */
        get customRotationQuaternion(): Nullable<Quaternion>;
        set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>);
        /**
         * Updates the gizmo to match the attached mesh's position/rotation
         */
        protected _update(): void;
        /**
         * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end)
         * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation.
         * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix.
         * @param transform local transform that needs to be transform by the pivot inverse matrix
         * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix
         * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix
         */
        protected _handlePivotMatrixInverse(transform: TransformNode, localMatrix: Matrix, result: Matrix): void;
        /**
         * computes the rotation/scaling/position of the transform once the Node world matrix has changed.
         */
        protected _matrixChanged(): void;
        /**
         * refresh gizmo mesh material
         * @param gizmoMeshes
         * @param material material to apply
         */
        protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial): void;
        /**
         * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI
         * @returns {Observer<PointerInfo>} pointerObserver
         */
        static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo>;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
    }


    /**
     * Interface for camera gizmo
     */
    export interface ICameraGizmo extends IGizmo {
        /** Event that fires each time the gizmo is clicked */
        onClickedObservable: Observable<Camera>;
        /** A boolean indicating if frustum lines must be rendered */
        displayFrustum: boolean;
        /** The camera that the gizmo is attached to */
        camera: Nullable<Camera>;
        /** The material used to render the camera gizmo */
        readonly material: StandardMaterial;
    }
    /**
     * Gizmo that enables viewing a camera
     */
    export class CameraGizmo extends Gizmo implements ICameraGizmo {
        protected _cameraMesh: Mesh;
        protected _cameraLinesMesh: Mesh;
        protected _material: StandardMaterial;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        private _frustumLinesColor?;
        /**
         * Event that fires each time the gizmo is clicked
         */
        onClickedObservable: Observable<Camera>;
        /**
         * Creates a CameraGizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param gizmoColor Camera mesh color. Default is Gray
         * @param frustumLinesColor Frustum lines color. Default is White
         */
        constructor(gizmoLayer?: UtilityLayerRenderer, gizmoColor?: Color3, frustumLinesColor?: Color3);
        protected _camera: Nullable<Camera>;
        /** Gets or sets a boolean indicating if frustum lines must be rendered (true by default) */
        get displayFrustum(): boolean;
        set displayFrustum(value: boolean);
        /**
         * The camera that the gizmo is attached to
         */
        set camera(camera: Nullable<Camera>);
        get camera(): Nullable<Camera>;
        /**
         * Gets the material used to render the camera gizmo
         */
        get material(): StandardMaterial;
        /**
         * @internal
         * Updates the gizmo to match the attached mesh's position/rotation
         */
        protected _update(): void;
        private static _Scale;
        private _invProjection;
        /**
         * Disposes and replaces the current camera mesh in the gizmo with the specified mesh
         * @param mesh The mesh to replace the default mesh of the camera gizmo
         */
        setCustomMesh(mesh: Mesh): void;
        /**
         * Disposes of the camera gizmo
         */
        dispose(): void;
        private static _CreateCameraMesh;
        private static _CreateCameraFrustum;
    }


    /**
     * Interface for bounding box gizmo
     */
    export interface IBoundingBoxGizmo extends IGizmo {
        /**
         * If child meshes should be ignored when calculating the bounding box. This should be set to true to avoid perf hits with heavily nested meshes.
         */
        ignoreChildren: boolean;
        /**
         * Returns true if a descendant should be included when computing the bounding box. When null, all descendants are included. If ignoreChildren is set this will be ignored.
         */
        includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean>;
        /** The size of the rotation anchors attached to the bounding box */
        rotationSphereSize: number;
        /** The size of the scale boxes attached to the bounding box */
        scaleBoxSize: number;
        /**
         * If set, the rotation anchors and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size
         * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true
         */
        fixedDragMeshScreenSize: boolean;
        /**
         * If set, the rotation anchors and scale boxes will increase in size based on the size of the bounding box
         * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true
         */
        fixedDragMeshBoundsSize: boolean;
        /**
         * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true
         */
        fixedDragMeshScreenSizeDistanceFactor: number;
        /** True when a rotation anchor or scale box or a attached mesh is dragged */
        readonly isDragging: boolean;
        /** Fired when a rotation anchor or scale box is dragged */
        onDragStartObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /** Fired when the gizmo mesh hovering starts*/
        onHoverStartObservable: Observable<void>;
        /** Fired when the gizmo mesh hovering ends*/
        onHoverEndObservable: Observable<void>;
        /** Fired when a scale box is dragged */
        onScaleBoxDragObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /** Fired when a scale box drag is ended */
        onScaleBoxDragEndObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /** Fired when a rotation anchor is dragged */
        onRotationSphereDragObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /** Fired when a rotation anchor drag is ended */
        onRotationSphereDragEndObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /** Relative bounding box pivot used when scaling the attached node. */
        scalePivot: Nullable<Vector3>;
        /** Scale factor vector used for masking some axis */
        axisFactor: Vector3;
        /** Scale factor scalar affecting all axes' drag speed */
        scaleDragSpeed: number;
        /**
         * Sets the color of the bounding box gizmo
         * @param color the color to set
         */
        setColor(color: Color3): void;
        /** Returns an array containing all boxes used for scaling (in increasing x, y and z orders) */
        getScaleBoxes(): AbstractMesh[];
        /** Updates the bounding box information for the Gizmo */
        updateBoundingBox(): void;
        /**
         * Enables rotation on the specified axis and disables rotation on the others
         * @param axis The list of axis that should be enabled (eg. "xy" or "xyz")
         */
        setEnabledRotationAxis(axis: string): void;
        /**
         * Enables/disables scaling
         * @param enable if scaling should be enabled
         * @param homogeneousScaling defines if scaling should only be homogeneous
         */
        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
        /** Enables a pointer drag behavior on the bounding box of the gizmo */
        enableDragBehavior(): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        hoverMaterial: StandardMaterial;
        /** Drag distance in babylon units that the gizmo will snap scaling to when dragged */
        scalingSnapDistance: number;
        /** Drag distance in babylon units that the gizmo will snap rotation to when dragged */
        rotationSnapDistance: number;
    }
    /**
     * Dragging operation in observable
     */
    export enum DragOperation {
        Rotation = 0,
        Scaling = 1
    }
    /**
     * Bounding box gizmo
     */
    export class BoundingBoxGizmo extends Gizmo implements IBoundingBoxGizmo {
        protected _lineBoundingBox: TransformNode;
        protected _rotateAnchorsParent: TransformNode;
        protected _scaleBoxesParent: TransformNode;
        protected _boundingDimensions: Vector3;
        protected _renderObserver: Nullable<Observer<Scene>>;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        protected _scaleDragSpeed: number;
        protected _rotateAnchorsDragBehaviors: Array<PointerDragBehavior>;
        protected _scaleBoxesDragBehaviors: Array<PointerDragBehavior>;
        /**
         * boolean updated when a rotation anchor or scale box is dragged
         */
        protected _dragging: boolean;
        private _tmpQuaternion;
        private _tmpVector;
        private _tmpRotationMatrix;
        private _incrementalStartupValue;
        private _incrementalAnchorStartupValue;
        private _isCenterScaleModeActive;
        private _centerScaleKeyObserver;
        /**
         * If child meshes should be ignored when calculating the bounding box. This should be set to true to avoid perf hits with heavily nested meshes (Default: false)
         */
        ignoreChildren: boolean;
        /**
         * Returns true if a descendant should be included when computing the bounding box. When null, all descendants are included. If ignoreChildren is set this will be ignored. (Default: null)
         */
        includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean>;
        /**
         * The size of the rotation anchors attached to the bounding box (Default: 0.1)
         */
        rotationSphereSize: number;
        /**
         * The size of the scale boxes attached to the bounding box (Default: 0.1)
         */
        scaleBoxSize: number;
        /**
         * If set, the rotation anchors and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size (Default: false)
         * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true
         */
        fixedDragMeshScreenSize: boolean;
        /**
         * If set, the rotation anchors and scale boxes will increase in size based on the size of the bounding box
         * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true
         */
        fixedDragMeshBoundsSize: boolean;
        /**
         * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true (default: 10)
         */
        fixedDragMeshScreenSizeDistanceFactor: number;
        /**
         * Drag distance in babylon units that the gizmo will snap scaling to when dragged
         */
        scalingSnapDistance: number;
        /**
         * Drag distance in babylon units that the gizmo will snap rotation to when dragged
         */
        rotationSnapDistance: number;
        /**
         * Fired when a rotation anchor or scale box is dragged
         */
        onDragStartObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /**
         * Fired when the gizmo mesh hovering starts
         */
        onHoverStartObservable: Observable<void>;
        /**
         * Fired when the gizmo mesh hovering ends
         */
        onHoverEndObservable: Observable<void>;
        /**
         * Fired when a scale box is dragged
         */
        onScaleBoxDragObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /**
         * Fired when a scale box drag is ended
         */
        onScaleBoxDragEndObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /**
         * Fired when a rotation anchor is dragged
         */
        onRotationSphereDragObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /**
         * Fired when a rotation anchor drag is ended
         */
        onRotationSphereDragEndObservable: Observable<{
            dragOperation: DragOperation;
            dragAxis: Vector3;
        }>;
        /**
         * Relative bounding box pivot used when scaling the attached node. When null object with scale from the opposite corner. 0.5,0.5,0.5 for center and 0.5,0,0.5 for bottom (Default: null)
         */
        scalePivot: Nullable<Vector3>;
        /**
         * Scale factor used for masking some axis
         */
        protected _axisFactor: Vector3;
        /**
         * Incremental snap scaling (default is false). When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,...
         */
        incrementalSnap: boolean;
        /**
         * Sets the axis factor
         * @param factor the Vector3 value
         */
        set axisFactor(factor: Vector3);
        /**
         * Gets the axis factor
         * @returns the Vector3 factor value
         */
        get axisFactor(): Vector3;
        /**
         * Sets scale drag speed value
         * @param value the new speed value
         */
        set scaleDragSpeed(value: number);
        /**
         * Gets scale drag speed
         * @returns the scale speed number
         */
        get scaleDragSpeed(): number;
        /**
         * Mesh used as a pivot to rotate the attached node
         */
        protected _anchorMesh: TransformNode;
        protected _existingMeshScale: Vector3;
        protected _dragMesh: Nullable<Mesh>;
        protected _pointerDragBehavior: PointerDragBehavior;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverColoredMaterial: StandardMaterial;
        protected _cornerMesh: Nullable<Mesh>;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        get hoverMaterial(): StandardMaterial;
        /**
         * Get the pointerDragBehavior
         */
        get pointerDragBehavior(): PointerDragBehavior;
        /** True when a rotation anchor or scale box or a attached mesh is dragged */
        get isDragging(): boolean;
        /**
         * Sets the color of the bounding box gizmo
         * @param color the color to set
         */
        setColor(color: Color3): void;
        /**
         * Creates an BoundingBoxGizmo
         * @param color The color of the gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         */
        constructor(color?: Color3, gizmoLayer?: UtilityLayerRenderer);
        protected _getCornerMesh(gizmoLayer: UtilityLayerRenderer): Mesh;
        /**
         * returns true if the combination of non uniform scaling and rotation of the attached mesh is not supported
         * In that case, the matrix is skewed and the bounding box gizmo will not work correctly
         * @returns True if the combination is not supported, otherwise false.
         */
        protected _hasInvalidNonUniformScaling(): boolean;
        protected _attachedNodeChanged(value: Nullable<AbstractMesh>): void;
        protected _selectNode(selectedMesh: Nullable<Mesh>): void;
        protected _unhoverMeshOnTouchUp(pointerInfo: Nullable<PointerInfo>, selectedMesh: AbstractMesh): void;
        /**
         * returns an array containing all boxes used for scaling (in increasing x, y and z orders)
         * @returns array of scaling boxes
         */
        getScaleBoxes(): AbstractMesh[];
        /**
         * Updates the bounding box information for the Gizmo
         */
        updateBoundingBox(): void;
        protected _updateRotationAnchors(): void;
        protected _updateScaleBoxes(): void;
        /**
         * Enables rotation on the specified axis and disables rotation on the others
         * @param axis The list of axis that should be enabled (eg. "xy" or "xyz")
         */
        setEnabledRotationAxis(axis: string): void;
        /**
         * Enables/disables scaling
         * @param enable if scaling should be enabled
         * @param homogeneousScaling defines if scaling should only be homogeneous
         */
        setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;
        protected _updateDummy(): void;
        /**
         * Enables a pointer drag behavior on the bounding box of the gizmo
         */
        enableDragBehavior(): void;
        /**
         * Force release the drag action by code
         */
        releaseDrag(): void;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
        /**
         * Makes a mesh not pickable and wraps the mesh inside of a bounding box mesh that is pickable. (This is useful to avoid picking within complex geometry)
         * @param mesh the mesh to wrap in the bounding box mesh and make not pickable
         * @returns the bounding box mesh with the passed in mesh as a child
         */
        static MakeNotPickableAndWrapInBoundingBox(mesh: Mesh): Mesh;
        /**
         * CustomMeshes are not supported by this gizmo
         */
        setCustomMesh(): void;
    }


    /**
     * Interface for axis scale gizmo
     */
    export interface IAxisScaleGizmo extends IGizmo {
        /** Drag behavior responsible for the gizmos dragging interactions */
        dragBehavior: PointerDragBehavior;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /** Incremental snap scaling. When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,... */
        incrementalSnap: boolean;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /** If the scaling operation should be done on all axis */
        uniformScaling: boolean;
        /** Custom sensitivity value for the drag strength */
        sensitivity: number;
        /** The magnitude of the drag strength (scaling factor) */
        dragScale: number;
        /** If the gizmo is enabled */
        isEnabled: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        hoverMaterial: StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        disableMaterial: StandardMaterial;
    }
    /**
     * Single axis scale gizmo
     */
    export class AxisScaleGizmo extends Gizmo implements IAxisScaleGizmo {
        /**
         * Drag behavior responsible for the gizmos dragging interactions
         */
        dragBehavior: PointerDragBehavior;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /**
         * Scale distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /**
         * If the scaling operation should be done on all axis (default: false)
         */
        uniformScaling: boolean;
        /**
         * Custom sensitivity value for the drag strength
         */
        sensitivity: number;
        /**
         * The magnitude of the drag strength (scaling factor)
         */
        dragScale: number;
        /**
         * The minimal absolute scale per component. can be positive or negative but never smaller.
         */
        static MinimumAbsoluteScale: number;
        /**
         * Incremental snap scaling (default is false). When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,...
         */
        incrementalSnap: boolean;
        protected _isEnabled: boolean;
        protected _parent: Nullable<ScaleGizmo>;
        protected _gizmoMesh: Mesh;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverMaterial: StandardMaterial;
        protected _disableMaterial: StandardMaterial;
        protected _dragging: boolean;
        private _tmpVector;
        private _incrementalStartupValue;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        get hoverMaterial(): StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        get disableMaterial(): StandardMaterial;
        /**
         * Creates an AxisScaleGizmo
         * @param dragAxis The axis which the gizmo will be able to scale on
         * @param color The color of the gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param parent
         * @param thickness display gizmo axis thickness
         * @param hoverColor The color of the gizmo when hovering over and dragging
         * @param disableColor The Color of the gizmo when its disabled
         */
        constructor(dragAxis: Vector3, color?: Color3, gizmoLayer?: UtilityLayerRenderer, parent?: Nullable<ScaleGizmo>, thickness?: number, hoverColor?: Color3, disableColor?: Color3);
        /**
         * @internal
         * Create Geometry for Gizmo
         * @param parentMesh
         * @param thickness
         * @param isCollider
         * @returns the gizmo mesh
         */
        protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, isCollider?: boolean): {
            arrowMesh: Mesh;
            arrowTail: Mesh;
        };
        protected _attachedNodeChanged(value: Nullable<Node>): void;
        /**
         * If the gizmo is enabled
         */
        set isEnabled(value: boolean);
        get isEnabled(): boolean;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
        /**
         * Disposes and replaces the current meshes in the gizmo with the specified mesh
         * @param mesh The mesh to replace the default mesh of the gizmo
         * @param useGizmoMaterial If the gizmo's default material should be used (default: false)
         */
        setCustomMesh(mesh: Mesh, useGizmoMaterial?: boolean): void;
    }


    /**
     * Interface for axis drag gizmo
     */
    export interface IAxisDragGizmo extends IGizmo {
        /** Drag behavior responsible for the gizmos dragging interactions */
        dragBehavior: PointerDragBehavior;
        /** Drag distance in babylon units that the gizmo will snap to when dragged */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        /** If the gizmo is enabled */
        isEnabled: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        coloredMaterial: StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        hoverMaterial: StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        disableMaterial: StandardMaterial;
    }
    /**
     * Single axis drag gizmo
     */
    export class AxisDragGizmo extends Gizmo implements IAxisDragGizmo {
        /**
         * Drag behavior responsible for the gizmos dragging interactions
         */
        dragBehavior: PointerDragBehavior;
        protected _pointerObserver: Nullable<Observer<PointerInfo>>;
        /**
         * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)
         */
        snapDistance: number;
        /**
         * Event that fires each time the gizmo snaps to a new location.
         * * snapDistance is the change in distance
         */
        onSnapObservable: Observable<{
            snapDistance: number;
        }>;
        protected _isEnabled: boolean;
        protected _parent: Nullable<PositionGizmo>;
        protected _gizmoMesh: Mesh;
        protected _coloredMaterial: StandardMaterial;
        protected _hoverMaterial: StandardMaterial;
        protected _disableMaterial: StandardMaterial;
        protected _dragging: boolean;
        /** Default material used to render when gizmo is not disabled or hovered */
        get coloredMaterial(): StandardMaterial;
        /** Material used to render when gizmo is hovered with mouse*/
        get hoverMaterial(): StandardMaterial;
        /** Material used to render when gizmo is disabled. typically grey.*/
        get disableMaterial(): StandardMaterial;
        /**
         * @internal
         */
        static _CreateArrow(scene: Scene, material: StandardMaterial, thickness?: number, isCollider?: boolean): TransformNode;
        /**
         * @internal
         */
        static _CreateArrowInstance(scene: Scene, arrow: TransformNode): TransformNode;
        /**
         * Creates an AxisDragGizmo
         * @param dragAxis The axis which the gizmo will be able to drag on
         * @param color The color of the gizmo
         * @param gizmoLayer The utility layer the gizmo will be added to
         * @param parent
         * @param thickness display gizmo axis thickness
         * @param hoverColor The color of the gizmo when hovering over and dragging
         * @param disableColor The Color of the gizmo when its disabled
         */
        constructor(dragAxis: Vector3, color?: Color3, gizmoLayer?: UtilityLayerRenderer, parent?: Nullable<PositionGizmo>, thickness?: number, hoverColor?: Color3, disableColor?: Color3);
        protected _attachedNodeChanged(value: Nullable<Node>): void;
        /**
         * If the gizmo is enabled
         */
        set isEnabled(value: boolean);
        get isEnabled(): boolean;
        /**
         * Disposes of the gizmo
         */
        dispose(): void;
    }


    /**
     * Defines supported buttons for XBox360 compatible gamepads
     */
    export enum Xbox360Button {
        /** A */
        A = 0,
        /** B */
        B = 1,
        /** X */
        X = 2,
        /** Y */
        Y = 3,
        /** Left button */
        LB = 4,
        /** Right button */
        RB = 5,
        /** Back */
        Back = 8,
        /** Start */
        Start = 9,
        /** Left stick */
        LeftStick = 10,
        /** Right stick */
        RightStick = 11
    }
    /** Defines values for XBox360 DPad  */
    export enum Xbox360Dpad {
        /** Up */
        Up = 12,
        /** Down */
        Down = 13,
        /** Left */
        Left = 14,
        /** Right */
        Right = 15
    }
    /**
     * Defines a XBox360 gamepad
     */
    export class Xbox360Pad extends Gamepad {
        private _leftTrigger;
        private _rightTrigger;
        private _onlefttriggerchanged;
        private _onrighttriggerchanged;
        private _onbuttondown;
        private _onbuttonup;
        private _ondpaddown;
        private _ondpadup;
        /** Observable raised when a button is pressed */
        onButtonDownObservable: Observable<Xbox360Button>;
        /** Observable raised when a button is released */
        onButtonUpObservable: Observable<Xbox360Button>;
        /** Observable raised when a pad is pressed */
        onPadDownObservable: Observable<Xbox360Dpad>;
        /** Observable raised when a pad is released */
        onPadUpObservable: Observable<Xbox360Dpad>;
        private _buttonA;
        private _buttonB;
        private _buttonX;
        private _buttonY;
        private _buttonBack;
        private _buttonStart;
        private _buttonLb;
        private _buttonRb;
        private _buttonLeftStick;
        private _buttonRightStick;
        private _dPadUp;
        private _dPadDown;
        private _dPadLeft;
        private _dPadRight;
        private _isXboxOnePad;
        /**
         * Creates a new XBox360 gamepad object
         * @param id defines the id of this gamepad
         * @param index defines its index
         * @param gamepad defines the internal HTML gamepad object
         * @param xboxOne defines if it is a XBox One gamepad
         */
        constructor(id: string, index: number, gamepad: any, xboxOne?: boolean);
        /**
         * Defines the callback to call when left trigger is pressed
         * @param callback defines the callback to use
         */
        onlefttriggerchanged(callback: (value: number) => void): void;
        /**
         * Defines the callback to call when right trigger is pressed
         * @param callback defines the callback to use
         */
        onrighttriggerchanged(callback: (value: number) => void): void;
        /**
         * Gets the left trigger value
         */
        get leftTrigger(): number;
        /**
         * Sets the left trigger value
         */
        set leftTrigger(newValue: number);
        /**
         * Gets the right trigger value
         */
        get rightTrigger(): number;
        /**
         * Sets the right trigger value
         */
        set rightTrigger(newValue: number);
        /**
         * Defines the callback to call when a button is pressed
         * @param callback defines the callback to use
         */
        onbuttondown(callback: (buttonPressed: Xbox360Button) => void): void;
        /**
         * Defines the callback to call when a button is released
         * @param callback defines the callback to use
         */
        onbuttonup(callback: (buttonReleased: Xbox360Button) => void): void;
        /**
         * Defines the callback to call when a pad is pressed
         * @param callback defines the callback to use
         */
        ondpaddown(callback: (dPadPressed: Xbox360Dpad) => void): void;
        /**
         * Defines the callback to call when a pad is released
         * @param callback defines the callback to use
         */
        ondpadup(callback: (dPadReleased: Xbox360Dpad) => void): void;
        private _setButtonValue;
        private _setDpadValue;
        /**
         * Gets the value of the `A` button
         */
        get buttonA(): number;
        /**
         * Sets the value of the `A` button
         */
        set buttonA(value: number);
        /**
         * Gets the value of the `B` button
         */
        get buttonB(): number;
        /**
         * Sets the value of the `B` button
         */
        set buttonB(value: number);
        /**
         * Gets the value of the `X` button
         */
        get buttonX(): number;
        /**
         * Sets the value of the `X` button
         */
        set buttonX(value: number);
        /**
         * Gets the value of the `Y` button
         */
        get buttonY(): number;
        /**
         * Sets the value of the `Y` button
         */
        set buttonY(value: number);
        /**
         * Gets the value of the `Start` button
         */
        get buttonStart(): number;
        /**
         * Sets the value of the `Start` button
         */
        set buttonStart(value: number);
        /**
         * Gets the value of the `Back` button
         */
        get buttonBack(): number;
        /**
         * Sets the value of the `Back` button
         */
        set buttonBack(value: number);
        /**
         * Gets the value of the `Left` button
         */
        get buttonLB(): number;
        /**
         * Sets the value of the `Left` button
         */
        set buttonLB(value: number);
        /**
         * Gets the value of the `Right` button
         */
        get buttonRB(): number;
        /**
         * Sets the value of the `Right` button
         */
        set buttonRB(value: number);
        /**
         * Gets the value of the Left joystick
         */
        get buttonLeftStick(): number;
        /**
         * Sets the value of the Left joystick
         */
        set buttonLeftStick(value: number);
        /**
         * Gets the value of the Right joystick
         */
        get buttonRightStick(): number;
        /**
         * Sets the value of the Right joystick
         */
        set buttonRightStick(value: number);
        /**
         * Gets the value of D-pad up
         */
        get dPadUp(): number;
        /**
         * Sets the value of D-pad up
         */
        set dPadUp(value: number);
        /**
         * Gets the value of D-pad down
         */
        get dPadDown(): number;
        /**
         * Sets the value of D-pad down
         */
        set dPadDown(value: number);
        /**
         * Gets the value of D-pad left
         */
        get dPadLeft(): number;
        /**
         * Sets the value of D-pad left
         */
        set dPadLeft(value: number);
        /**
         * Gets the value of D-pad right
         */
        get dPadRight(): number;
        /**
         * Sets the value of D-pad right
         */
        set dPadRight(value: number);
        /**
         * Force the gamepad to synchronize with device values
         */
        update(): void;
        /**
         * Disposes the gamepad
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




        interface Scene {
            /** @internal */
            _gamepadManager: Nullable<GamepadManager>;
            /**
             * Gets the gamepad manager associated with the scene
             * @see https://doc.babylonjs.com/features/featuresDeepDive/input/gamepads
             */
            gamepadManager: GamepadManager;
        }
        /**
         * Interface representing a free camera inputs manager
         */
        interface FreeCameraInputsManager {
            /**
             * Adds gamepad input support to the FreeCameraInputsManager.
             * @returns the FreeCameraInputsManager
             */
            addGamepad(): FreeCameraInputsManager;
        }
        /**
         * Interface representing an arc rotate camera inputs manager
         */
        interface ArcRotateCameraInputsManager {
            /**
             * Adds gamepad input support to the ArcRotateCamera InputManager.
             * @returns the camera inputs manager
             */
            addGamepad(): ArcRotateCameraInputsManager;
        }


    /** This file must only contain pure code and pure imports */
    /**
     * Defines the gamepad scene component responsible to manage gamepads in a given scene
     */
    export class GamepadSystemSceneComponent implements ISceneComponent {
        /**
         * The component name helpfull to identify the component in the list of scene components.
         */
        readonly name = "Gamepad";
        /**
         * The scene the component belongs to.
         */
        scene: Scene;
        /**
         * Creates a new instance of the component for the given scene
         * @param scene Defines the scene to register the component in
         */
        constructor(scene: Scene);
        /**
         * Registers the component in a given scene
         */
        register(): void;
        /**
         * Rebuilds the elements related to this component in case of
         * context lost for instance.
         */
        rebuild(): void;
        /**
         * Disposes the component and the associated resources
         */
        dispose(): void;
    }
    /**
     * Register side effects for gamepadSceneComponent.
     * Safe to call multiple times; only the first call has an effect.
     * @param gamepadManagerClass The GamepadManager class to use for lazy instantiation
     */
    export function RegisterGamepadSceneComponent(gamepadManagerClass: typeof GamepadManager): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import gamepadSceneComponent.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Manager for handling gamepads
     */
    export class GamepadManager {
        private _scene?;
        private _babylonGamepads;
        private _oneGamepadConnected;
        /** @internal */
        _isMonitoring: boolean;
        private _gamepadEventSupported;
        private _gamepadSupport?;
        /**
         * observable to be triggered when the gamepad controller has been connected
         */
        onGamepadConnectedObservable: Observable<Gamepad>;
        /**
         * observable to be triggered when the gamepad controller has been disconnected
         */
        onGamepadDisconnectedObservable: Observable<Gamepad>;
        private _onGamepadConnectedEvent;
        private _onGamepadDisconnectedEvent;
        /**
         * Initializes the gamepad manager
         * @param _scene BabylonJS scene
         */
        constructor(_scene?: Scene | undefined);
        /**
         * The gamepads in the game pad manager
         */
        get gamepads(): Gamepad[];
        /**
         * Get the gamepad controllers based on type
         * @param type The type of gamepad controller
         * @returns Nullable gamepad
         */
        getGamepadByType(type?: number): Nullable<Gamepad>;
        /**
         * Disposes the gamepad manager
         */
        dispose(): void;
        private _addNewGamepad;
        private _startMonitoringGamepads;
        private _stopMonitoringGamepads;
        private _loggedErrors;
        /** @internal */
        _checkGamepadsStatus(): void;
        private _updateGamepadObjects;
    }


    /**
     * Represents a gamepad control stick position
     */
    export class StickValues {
        /**
         * The x component of the control stick
         */
        x: number;
        /**
         * The y component of the control stick
         */
        y: number;
        /**
         * Initializes the gamepad x and y control stick values
         * @param x The x component of the gamepad control stick value
         * @param y The y component of the gamepad control stick value
         */
        constructor(
        /**
         * The x component of the control stick
         */
        x: number, 
        /**
         * The y component of the control stick
         */
        y: number);
    }
    /**
     * An interface which manages callbacks for gamepad button changes
     */
    export interface GamepadButtonChanges {
        /**
         * Called when a gamepad has been changed
         */
        changed: boolean;
        /**
         * Called when a gamepad press event has been triggered
         */
        pressChanged: boolean;
        /**
         * Called when a touch event has been triggered
         */
        touchChanged: boolean;
        /**
         * Called when a value has changed
         */
        valueChanged: boolean;
    }
    /**
     * Represents a gamepad
     */
    export class Gamepad {
        /**
         * The id of the gamepad
         */
        id: string;
        /**
         * The index of the gamepad
         */
        index: number;
        /**
         * The browser gamepad
         */
        browserGamepad: any;
        /**
         * Specifies what type of gamepad this represents
         */
        type: number;
        private _leftStick;
        private _rightStick;
        /** @internal */
        _isConnected: boolean;
        private _leftStickAxisX;
        private _leftStickAxisY;
        private _rightStickAxisX;
        private _rightStickAxisY;
        /**
         * Triggered when the left control stick has been changed
         */
        private _onleftstickchanged;
        /**
         * Triggered when the right control stick has been changed
         */
        private _onrightstickchanged;
        /**
         * Represents a gamepad controller
         */
        static GAMEPAD: number;
        /**
         * Represents a generic controller
         */
        static GENERIC: number;
        /**
         * Represents an XBox controller
         */
        static XBOX: number;
        /**
         * Represents a pose-enabled controller
         */
        static POSE_ENABLED: number;
        /**
         * Represents an Dual Shock controller
         */
        static DUALSHOCK: number;
        /**
         * Specifies whether the left control stick should be Y-inverted
         */
        protected _invertLeftStickY: boolean;
        /**
         * Specifies if the gamepad has been connected
         */
        get isConnected(): boolean;
        /**
         * Initializes the gamepad
         * @param id The id of the gamepad
         * @param index The index of the gamepad
         * @param browserGamepad The browser gamepad
         * @param leftStickX The x component of the left joystick
         * @param leftStickY The y component of the left joystick
         * @param rightStickX The x component of the right joystick
         * @param rightStickY The y component of the right joystick
         */
        constructor(
        /**
         * The id of the gamepad
         */
        id: string, 
        /**
         * The index of the gamepad
         */
        index: number, 
        /**
         * The browser gamepad
         */
        browserGamepad: any, leftStickX?: number, leftStickY?: number, rightStickX?: number, rightStickY?: number);
        /**
         * Callback triggered when the left joystick has changed
         * @param callback callback to trigger
         */
        onleftstickchanged(callback: (values: StickValues) => void): void;
        /**
         * Callback triggered when the right joystick has changed
         * @param callback callback to trigger
         */
        onrightstickchanged(callback: (values: StickValues) => void): void;
        /**
         * Gets the left joystick
         */
        get leftStick(): StickValues;
        /**
         * Sets the left joystick values
         */
        set leftStick(newValues: StickValues);
        /**
         * Gets the right joystick
         */
        get rightStick(): StickValues;
        /**
         * Sets the right joystick value
         */
        set rightStick(newValues: StickValues);
        /**
         * Updates the gamepad joystick positions
         */
        update(): void;
        /**
         * Disposes the gamepad
         */
        dispose(): void;
    }
    /**
     * Represents a generic gamepad
     */
    export class GenericPad extends Gamepad {
        private _buttons;
        private _onbuttondown;
        private _onbuttonup;
        /**
         * Observable triggered when a button has been pressed
         */
        onButtonDownObservable: Observable<number>;
        /**
         * Observable triggered when a button has been released
         */
        onButtonUpObservable: Observable<number>;
        /**
         * Callback triggered when a button has been pressed
         * @param callback Called when a button has been pressed
         */
        onbuttondown(callback: (buttonPressed: number) => void): void;
        /**
         * Callback triggered when a button has been released
         * @param callback Called when a button has been released
         */
        onbuttonup(callback: (buttonReleased: number) => void): void;
        /**
         * Initializes the generic gamepad
         * @param id The id of the generic gamepad
         * @param index The index of the generic gamepad
         * @param browserGamepad The browser gamepad
         */
        constructor(id: string, index: number, browserGamepad: any);
        private _setButtonValue;
        /**
         * Updates the generic gamepad
         */
        update(): void;
        /**
         * Disposes the generic gamepad
         */
        dispose(): void;
    }


    /**
     * Defines supported buttons for DualShock compatible gamepads
     */
    export enum DualShockButton {
        /** Cross */
        Cross = 0,
        /** Circle */
        Circle = 1,
        /** Square */
        Square = 2,
        /** Triangle */
        Triangle = 3,
        /** L1 */
        L1 = 4,
        /** R1 */
        R1 = 5,
        /** Share */
        Share = 8,
        /** Options */
        Options = 9,
        /** Left stick */
        LeftStick = 10,
        /** Right stick */
        RightStick = 11
    }
    /** Defines values for DualShock DPad  */
    export enum DualShockDpad {
        /** Up */
        Up = 12,
        /** Down */
        Down = 13,
        /** Left */
        Left = 14,
        /** Right */
        Right = 15
    }
    /**
     * Defines a DualShock gamepad
     */
    export class DualShockPad extends Gamepad {
        private _leftTrigger;
        private _rightTrigger;
        private _onlefttriggerchanged;
        private _onrighttriggerchanged;
        private _onbuttondown;
        private _onbuttonup;
        private _ondpaddown;
        private _ondpadup;
        /** Observable raised when a button is pressed */
        onButtonDownObservable: Observable<DualShockButton>;
        /** Observable raised when a button is released */
        onButtonUpObservable: Observable<DualShockButton>;
        /** Observable raised when a pad is pressed */
        onPadDownObservable: Observable<DualShockDpad>;
        /** Observable raised when a pad is released */
        onPadUpObservable: Observable<DualShockDpad>;
        private _buttonCross;
        private _buttonCircle;
        private _buttonSquare;
        private _buttonTriangle;
        private _buttonShare;
        private _buttonOptions;
        private _buttonL1;
        private _buttonR1;
        private _buttonLeftStick;
        private _buttonRightStick;
        private _dPadUp;
        private _dPadDown;
        private _dPadLeft;
        private _dPadRight;
        /**
         * Creates a new DualShock gamepad object
         * @param id defines the id of this gamepad
         * @param index defines its index
         * @param gamepad defines the internal HTML gamepad object
         */
        constructor(id: string, index: number, gamepad: any);
        /**
         * Defines the callback to call when left trigger is pressed
         * @param callback defines the callback to use
         */
        onlefttriggerchanged(callback: (value: number) => void): void;
        /**
         * Defines the callback to call when right trigger is pressed
         * @param callback defines the callback to use
         */
        onrighttriggerchanged(callback: (value: number) => void): void;
        /**
         * Gets the left trigger value
         */
        get leftTrigger(): number;
        /**
         * Sets the left trigger value
         */
        set leftTrigger(newValue: number);
        /**
         * Gets the right trigger value
         */
        get rightTrigger(): number;
        /**
         * Sets the right trigger value
         */
        set rightTrigger(newValue: number);
        /**
         * Defines the callback to call when a button is pressed
         * @param callback defines the callback to use
         */
        onbuttondown(callback: (buttonPressed: DualShockButton) => void): void;
        /**
         * Defines the callback to call when a button is released
         * @param callback defines the callback to use
         */
        onbuttonup(callback: (buttonReleased: DualShockButton) => void): void;
        /**
         * Defines the callback to call when a pad is pressed
         * @param callback defines the callback to use
         */
        ondpaddown(callback: (dPadPressed: DualShockDpad) => void): void;
        /**
         * Defines the callback to call when a pad is released
         * @param callback defines the callback to use
         */
        ondpadup(callback: (dPadReleased: DualShockDpad) => void): void;
        private _setButtonValue;
        private _setDpadValue;
        /**
         * Gets the value of the `Cross` button
         */
        get buttonCross(): number;
        /**
         * Sets the value of the `Cross` button
         */
        set buttonCross(value: number);
        /**
         * Gets the value of the `Circle` button
         */
        get buttonCircle(): number;
        /**
         * Sets the value of the `Circle` button
         */
        set buttonCircle(value: number);
        /**
         * Gets the value of the `Square` button
         */
        get buttonSquare(): number;
        /**
         * Sets the value of the `Square` button
         */
        set buttonSquare(value: number);
        /**
         * Gets the value of the `Triangle` button
         */
        get buttonTriangle(): number;
        /**
         * Sets the value of the `Triangle` button
         */
        set buttonTriangle(value: number);
        /**
         * Gets the value of the `Options` button
         */
        get buttonOptions(): number;
        /**
         * Sets the value of the `Options` button
         */
        set buttonOptions(value: number);
        /**
         * Gets the value of the `Share` button
         */
        get buttonShare(): number;
        /**
         * Sets the value of the `Share` button
         */
        set buttonShare(value: number);
        /**
         * Gets the value of the `L1` button
         */
        get buttonL1(): number;
        /**
         * Sets the value of the `L1` button
         */
        set buttonL1(value: number);
        /**
         * Gets the value of the `R1` button
         */
        get buttonR1(): number;
        /**
         * Sets the value of the `R1` button
         */
        set buttonR1(value: number);
        /**
         * Gets the value of the Left joystick
         */
        get buttonLeftStick(): number;
        /**
         * Sets the value of the Left joystick
         */
        set buttonLeftStick(value: number);
        /**
         * Gets the value of the Right joystick
         */
        get buttonRightStick(): number;
        /**
         * Sets the value of the Right joystick
         */
        set buttonRightStick(value: number);
        /**
         * Gets the value of D-pad up
         */
        get dPadUp(): number;
        /**
         * Sets the value of D-pad up
         */
        set dPadUp(value: number);
        /**
         * Gets the value of D-pad down
         */
        get dPadDown(): number;
        /**
         * Sets the value of D-pad down
         */
        set dPadDown(value: number);
        /**
         * Gets the value of D-pad left
         */
        get dPadLeft(): number;
        /**
         * Sets the value of D-pad left
         */
        set dPadLeft(value: number);
        /**
         * Gets the value of D-pad right
         */
        get dPadRight(): number;
        /**
         * Sets the value of D-pad right
         */
        set dPadRight(value: number);
        /**
         * Force the gamepad to synchronize with device values
         */
        update(): void;
        /**
         * Disposes the gamepad
         */
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */




    /**
     * Looks for the main camera used by the frame graph.
     * By default, this is the camera used by the main object renderer task.
     * If no such task, we try to find a camera in either a geometry renderer or a utility layer renderer tasks.
     * @param frameGraph The frame graph to search in
     * @returns The main camera used by the frame graph, or null if not found
     */
    export function FindMainCamera(frameGraph: FrameGraph): Nullable<Camera>;
    /**
     * Looks for the main object renderer task in the frame graph.
     * By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.
     * If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).
     * @param frameGraph The frame graph to search in
     * @returns The main object renderer of the frame graph, or null if not found
     */
    export function FindMainObjectRenderer(frameGraph: FrameGraph): Nullable<FrameGraphObjectRendererTask>;
    /**
     * Creates a utility layer renderer compatible with the given frame graph.
     * @param frameFraph The frame graph to create the utility layer renderer for
     * @param handleEvents True if the utility layer renderer should handle events, false otherwise (default is true)
     * @returns The created utility layer renderer
     */
    export function CreateUtilityLayerRenderer(frameFraph: FrameGraph, handleEvents?: boolean): UtilityLayerRenderer;
    /**
     * Class used to host frame graph specific utilities
     */
    export var FrameGraphUtils: {
        /**
         * Looks for the main camera used by the frame graph.
         * We assume that the camera used by the the last rendering task in the graph is the main camera.
         * @param frameGraph The frame graph to search in
         * @returns The main camera used by the frame graph, or null if not found
         */
        FindMainCamera: typeof FindMainCamera;
        /**
         * Looks for the main object renderer task in the frame graph.
         * We assume that the last object renderer task that has an object list with meshes is the main object renderer.
         * @param frameGraph The frame graph to search in
         * @returns The main object renderer of the frame graph, or null if not found
         */
        FindMainObjectRenderer: typeof FindMainObjectRenderer;
        /**
         * Creates a utility layer renderer compatible with the given frame graph.
         * @param frameFraph The frame graph to create the utility layer renderer for
         * @param handleEvents True if the utility layer renderer should handle events, false otherwise
         * @returns The created utility layer renderer
         */
        CreateUtilityLayerRenderer: typeof CreateUtilityLayerRenderer;
    };


    /**
     * Represents a texture handle in the frame graph.
     */
    export type FrameGraphTextureHandle = number;
    /**
     * Represents a texture handle for the backbuffer color texture.
     */
    export var backbufferColorTextureHandle: FrameGraphTextureHandle;
    /**
     * Represents a texture handle for the backbuffer depth/stencil texture.
     */
    export var backbufferDepthStencilTextureHandle: FrameGraphTextureHandle;
    /**
     * Options used to describe a texture to be created in the frame graph.
     */
    export type FrameGraphTextureOptions = {
        /** Specifies if mipmaps must be created for the textures (default: false) */
        createMipMaps?: boolean;
        /** Defines sample count (default: 1) */
        samples?: number;
        /**
         * Define the type of the textures (of Constants.TEXTURE_2D, .TEXTURE_2D_ARRAY, .TEXTURE_CUBE_MAP, .TEXTURE_CUBE_MAP_ARRAY, .TEXTURE_3D).
         */
        targetTypes?: number[];
        /**
         * Define the number of layers of the textures (if applicable, given the corresponding targetType) (for Constants.TEXTURE_3D, .TEXTURE_2D_ARRAY, and .TEXTURE_CUBE_MAP_ARRAY)
         */
        layerCounts?: number[];
        /** Defines the type of the texture channels (UNSIGNED_BYTE, FLOAT, etc.) */
        types?: number[];
        /** Defines the format of the textures (RED, RG, RGB, RGBA, ALPHA...) */
        formats?: number[];
        /** Defines if sRGB format should be used for each of texture */
        useSRGBBuffers?: boolean[];
        /** Defines the creation flags of the textures (Constants.TEXTURE_CREATIONFLAG_STORAGE for storage textures, for eg) */
        creationFlags?: number[];
        /** Defines the names of the textures (used for debugging purpose) */
        labels?: string[];
    };
    /**
     * Options used to create a texture / list of textures in the frame graph.
     */
    export type FrameGraphTextureCreationOptions = {
        /** Size of the textures. If sizeIsPercentage is true, these are percentages relative to the screen size (100 = 100%) */
        size: TextureSize;
        /** Options used to create the textures */
        options: FrameGraphTextureOptions;
        /** If true, indicates that "size" is percentages relative to the screen size */
        sizeIsPercentage: boolean;
        /** Indicates that the texture is a history texture (default: false) */
        isHistoryTexture?: boolean;
    };
    /**
     * Represents a texture description in the frame graph.
     * This is basically the same thing than FrameGraphTextureCreationOptions, but the size is never in percentage and always in pixels.
     */
    export type FrameGraphTextureDescription = {
        /** Size of the texture */
        size: {
            width: number;
            height: number;
        };
        /** Options used to create the texture */
        options: FrameGraphTextureOptions;
    };
    /**
     * Defines a pass in the frame graph.
     */
    export interface IFrameGraphPass {
        /**
         * The name of the pass.
         */
        name: string;
        /**
         * Whether the pass is disabled.
         */
        disabled: boolean;
        /**
         * Initializes the pass.
         * This function is called once before the first execution of the pass.
         * @param func The function to initialize the pass.
         */
        setInitializeFunc(func: (context: FrameGraphContext) => void): void;
        /**
         * Sets the function to execute when the pass is executed
         * @param func The function to execute when the pass is executed
         */
        setExecuteFunc(func: (context: FrameGraphContext) => void): void;
        /** @internal */
        _initialize(): void;
        /** @internal */
        _execute(): void;
        /** @internal */
        _isValid(): Nullable<string>;
        /** @internal */
        _dispose(): void;
    }


    type HistoryTexture = {
        textures: Array<Nullable<InternalTexture>>;
        handles: Array<FrameGraphTextureHandle>;
        index: number;
        references: Array<{
            renderTargetWrapper: RenderTargetWrapper;
            textureIndex: number;
        }>;
    };
    type TextureLifespan = {
        firstTask: number;
        lastTask: number;
    };
    type TextureEntry = {
        texture: Nullable<InternalTexture>;
        name: string;
        creationOptions: FrameGraphTextureCreationOptions;
        namespace: FrameGraphTextureNamespace;
        textureIndex?: number;
        debug?: Texture;
        refHandle?: FrameGraphTextureHandle;
        textureDescriptionHash?: string;
        lifespan?: TextureLifespan;
        aliasHandle?: FrameGraphTextureHandle;
        historyTexture?: boolean;
    };
    enum FrameGraphTextureNamespace {
        Task = 0,
        Graph = 1,
        External = 2
    }
    /**
     * Manages the textures used by a frame graph
     */
    export class FrameGraphTextureManager {
        readonly engine: AbstractEngine;
        private readonly _debugTextures;
        private readonly _scene;
        private static _Counter;
        /** @internal */
        readonly _textures: Map<FrameGraphTextureHandle, TextureEntry>;
        /** @internal */
        readonly _historyTextures: Map<FrameGraphTextureHandle, HistoryTexture>;
        /** @internal */
        _isRecordingTask: boolean;
        /**
         * Gets or sets a boolean indicating if debug logs should be shown when applying texture allocation optimization (default: false)
         */
        showDebugLogsForTextureAllcationOptimization: boolean;
        private _backBufferTextureEntry;
        private _backBufferDepthStencilTextureEntry;
        private _backBufferTextureOverriden;
        /**
         * Constructs a new instance of the texture manager
         * @param engine The engine to use
         * @param _debugTextures If true, debug textures will be created so that they are visible in the inspector
         * @param _scene The scene the manager belongs to
         */
        constructor(engine: AbstractEngine, _debugTextures: boolean | undefined, _scene: Scene);
        /**
         * Checks if a handle is a backbuffer handle (color or depth/stencil)
         * @param handle The handle to check
         * @returns True if the handle is a backbuffer handle
         */
        isBackbuffer(handle: FrameGraphTextureHandle): boolean;
        /** @internal */
        _isBackbuffer(handle: FrameGraphTextureHandle): boolean;
        /**
         * Checks if a handle is a backbuffer color handle
         * @param handle The handle to check
         * @returns True if the handle is a backbuffer color handle
         */
        isBackbufferColor(handle: FrameGraphTextureHandle): boolean;
        /**
         * Checks if a handle is a backbuffer depth/stencil handle
         * @param handle The handle to check
         * @returns True if the handle is a backbuffer depth/stencil handle
         */
        isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean;
        /**
         * Checks if a handle is a history texture (or points to a history texture, for a dangling handle)
         * @param handle The handle to check
         * @param checkAllTextures If false (default), the function will check if the handle is the main handle of a history texture (the first handle of the history texture).
         *   If true, the function will also check if the handle is one of the other handles of a history texture.
         * @returns True if the handle is a history texture, otherwise false
         */
        isHistoryTexture(handle: FrameGraphTextureHandle, checkAllTextures?: boolean): boolean;
        /**
         * Gets the creation options of a texture
         * @param handle Handle of the texture
         * @param preserveHistoryTextureFlag If true, the isHistoryTexture flag in the returned creation options will be the same as when the texture was created (default: false)
         * @returns The creation options of the texture
         */
        getTextureCreationOptions(handle: FrameGraphTextureHandle, preserveHistoryTextureFlag?: boolean): FrameGraphTextureCreationOptions;
        /**
         * Gets the description of a texture
         * @param handle Handle of the texture
         * @returns The description of the texture
         */
        getTextureDescription(handle: FrameGraphTextureHandle): FrameGraphTextureDescription;
        /**
         * Gets a texture handle or creates a new texture if the handle is not provided.
         * If handle is not provided, newTextureName and creationOptions must be provided.
         * @param handle If provided, will simply return the handle
         * @param newTextureName Name of the new texture to create
         * @param creationOptions Options to use when creating the new texture
         * @returns The handle to the texture.
         */
        getTextureHandleOrCreateTexture(handle?: FrameGraphTextureHandle, newTextureName?: string, creationOptions?: FrameGraphTextureCreationOptions): FrameGraphTextureHandle;
        /**
         * Gets a texture from a handle.
         * Note that if the texture is a history texture, the read texture for the current frame will be returned, except if historyGetWriteTexture is true.
         * @param handle The handle of the texture
         * @param historyGetWriteTexture If true and the texture is a history texture, the write texture for the current frame will be returned (default: false)
         * @returns The texture or null if not found
         */
        getTextureFromHandle(handle: FrameGraphTextureHandle, historyGetWriteTexture?: boolean): Nullable<InternalTexture>;
        /**
         * Imports a texture into the texture manager
         * @param name Name of the texture
         * @param texture Texture to import
         * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.
         * @returns The handle to the texture
         */
        importTexture(name: string, texture: InternalTexture, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle;
        /**
         * Creates a new render target texture
         * If multiple textures are described in FrameGraphTextureCreationOptions, the handle of the first texture is returned, handle+1 is the handle of the second texture, etc.
         * @param name Name of the texture
         * @param creationOptions Options to use when creating the texture
         * @param handle Existing handle to use for the texture. If not provided (default), a new handle will be created.
         * @returns The handle to the texture
         */
        createRenderTargetTexture(name: string, creationOptions: FrameGraphTextureCreationOptions, handle?: FrameGraphTextureHandle): FrameGraphTextureHandle;
        /**
         * Creates a (frame graph) render target wrapper
         * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!
         * @param name Name of the render target wrapper
         * @param renderTargets Render target handles (textures) to use
         * @param renderTargetDepth Render target depth handle (texture) to use
         * @param depthReadOnly If true, the depth buffer will be read-only
         * @param stencilReadOnly If true, the stencil buffer will be read-only
         * @returns The created render target wrapper
         */
        createRenderTarget(name: string, renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[], renderTargetDepth?: FrameGraphTextureHandle, depthReadOnly?: boolean, stencilReadOnly?: boolean): FrameGraphRenderTarget;
        /**
         * Creates a handle which is not associated with any texture.
         * Call resolveDanglingHandle to associate the handle with a valid texture handle.
         * @returns The dangling handle
         */
        createDanglingHandle(): number;
        /**
         * Associates a texture with a dangling handle
         * @param danglingHandle The dangling handle
         * @param handle The handle to associate with the dangling handle (if not provided, a new texture handle will be created, using the newTextureName and creationOptions parameters)
         * @param newTextureName The name of the new texture to create (if handle is not provided)
         * @param creationOptions The options to use when creating the new texture (if handle is not provided)
         */
        resolveDanglingHandle(danglingHandle: FrameGraphTextureHandle, handle?: FrameGraphTextureHandle, newTextureName?: string, creationOptions?: FrameGraphTextureCreationOptions): void;
        /**
         * Gets the absolute dimensions of a texture.
         * @param size The size of the texture. Width and height must be expressed as a percentage of the screen size (100=100%)!
         * @param screenWidth The width of the screen (default: the width of the rendering canvas)
         * @param screenHeight The height of the screen (default: the height of the rendering canvas)
         * @returns The absolute dimensions of the texture
         */
        getAbsoluteDimensions(size: TextureSize, screenWidth?: number, screenHeight?: number): {
            width: number;
            height: number;
        };
        /**
         * Gets the absolute dimensions of a texture from its handle or creation options.
         * @param handleOrCreationOptions The handle or creation options of the texture
         * @returns The absolute dimensions of the texture
         */
        getTextureAbsoluteDimensions(handleOrCreationOptions: FrameGraphTextureHandle | FrameGraphTextureCreationOptions): {
            width: number;
            height: number;
        };
        /**
         * Calculates the total byte size of all textures used by the frame graph texture manager (including external textures)
         * @param optimizedSize True if the calculation should not factor in aliased textures
         * @param outputWidth The output width of the frame graph. Will be used to calculate the size of percentage-based textures
         * @param outputHeight The output height of the frame graph. Will be used to calculate the size of percentage-based textures
         * @returns The total size of all textures
         */
        computeTotalTextureSize(optimizedSize: boolean, outputWidth: number, outputHeight: number): number;
        /**
         * True if the back buffer texture has been overriden by a call to setBackBufferTexture
         */
        get backBufferTextureOverriden(): boolean;
        /**
         * Overrides the default back buffer color/depth-stencil textures used by the frame graph.
         * Note that if both textureCreationOptions and depthStencilTextureCreationOptions are provided,
         * the engine will use them to create the back buffer color and depth/stencil textures respectively.
         * In that case, width and height are ignored.
         * @param width The width of the back buffer color/depth-stencil texture (if 0, the engine's current back buffer color/depth-stencil texture width will be used)
         * @param height The height of the back buffer color/depth-stencil texture (if 0, the engine's current back buffer color/depth-stencil texture height will be used)
         * @param textureCreationOptions The color texture creation options (optional)
         * @param depthStencilTextureCreationOptions The depth/stencil texture creation options (optional)
         */
        setBackBufferTextures(width: number, height: number, textureCreationOptions?: FrameGraphTextureCreationOptions, depthStencilTextureCreationOptions?: FrameGraphTextureCreationOptions): void;
        /**
         * Resets the back buffer color/depth-stencil textures to the default (the engine's current back buffer textures)
         * It has no effect if setBackBufferTextures has not been called before.
         */
        resetBackBufferTextures(): void;
        /**
         * Returns true if the texture manager has at least one history texture
         */
        get hasHistoryTextures(): boolean;
        /** @internal */
        _dispose(): void;
        /** @internal */
        _allocateTextures(tasks?: FrameGraphTask[]): void;
        /** @internal */
        _releaseTextures(releaseAll?: boolean): void;
        /** @internal */
        _updateHistoryTextures(): void;
        private _addSystemTextures;
        private _createDebugTexture;
        private _freeEntry;
        private _createHandleForTexture;
        private _createTextureDescriptionHash;
        private _optimizeTextureAllocation;
        private _computeTextureLifespan;
        private _computeTextureLifespanForPasses;
        private _updateLifespan;
        /**
         * Clones a texture options
         * @param options The options to clone
         * @param textureIndex The index of the texture in the types, formats, etc array of FrameGraphTextureOptions. If not provided, all options are cloned.
         * @param preserveLabels True if the labels should be preserved (default: false)
         * @returns The cloned options
         */
        static CloneTextureOptions(options: FrameGraphTextureOptions, textureIndex?: number, preserveLabels?: boolean): FrameGraphTextureOptions;
        /**
         * Gets the texture block information.
         * @param type Type of the texture.
         * @param format Format of the texture.
         * @returns The texture block information. You can calculate the byte size of the texture by doing: Math.ceil(width / blockInfo.width) * Math.ceil(height / blockInfo.height) * blockInfo.length
         */
        private static _GetTextureBlockInformation;
    }


    /**
     * Base class for frame graph tasks that involve multi-target rendering.
     */
    export abstract class FrameGraphTaskMultiRenderTarget extends FrameGraphTask {
        private _outputLayerAndFaceIndices;
        private _layerAndFaceIndicesUpdated;
        /**
         * Sets the output layer and face indices for multi-target rendering.
         * @param indices The array of layer and face indices.
         */
        setOutputLayerAndFaceIndices(indices: LayerAndFaceIndex[]): void;
        protected _updateLayerAndFaceIndices(pass: FrameGraphRenderPass): void;
    }


    /**
     * Represents a task in a frame graph.
     */
    export abstract class FrameGraphTask {
        protected readonly _frameGraph: FrameGraph;
        private readonly _passes;
        private readonly _passesDisabled;
        protected _name: string;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(value: string);
        protected _disabled: boolean;
        /**
         * Whether the task is disabled.
         */
        get disabled(): boolean;
        set disabled(value: boolean);
        /**
         * Gets the passes of the task.
         */
        get passes(): IFrameGraphPass[];
        /**
         * Gets the disabled passes of the task.
         */
        get passesDisabled(): IFrameGraphPass[];
        /**
         * The (texture) dependencies of the task (optional).
         */
        dependencies?: Set<FrameGraphTextureHandle>;
        /**
         * Records the task in the frame graph. Use this function to add content (render passes, ...) to the task.
         * @param skipCreationOfDisabledPasses If true, the disabled passe(s) won't be created.
         */
        abstract record(skipCreationOfDisabledPasses?: boolean): void;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * This function is called once after the task has been added to the frame graph and before the frame graph is built for the first time.
         * This allows you to initialize asynchronous resources, which is not possible in the constructor.
         * @returns A promise that resolves when the initialization is complete.
         */
        initAsync(): Promise<unknown>;
        /**
         * An observable that is triggered after the textures have been allocated.
         */
        onTexturesAllocatedObservable: Observable<FrameGraphRenderContext>;
        /**
         * An observable that is triggered before the task is executed.
         */
        onBeforeTaskExecute: Observable<FrameGraphTask>;
        /**
         * An observable that is triggered after the task is executed.
         */
        onAfterTaskExecute: Observable<FrameGraphTask>;
        /**
         * Checks if the task is ready to be executed.
         * @returns True if the task is ready to be executed, else false.
         */
        isReady(): boolean;
        /**
         * Disposes of the task.
         */
        dispose(): void;
        /**
         * Constructs a new frame graph task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         */
        constructor(name: string, frameGraph: FrameGraph);
        /** @internal */
        _reset(): void;
        /** @internal */
        _addPass(pass: IFrameGraphPass, disabled: boolean): void;
        /** @internal */
        _checkTask(): void;
        /** @internal */
        _execute(): void;
        /** @internal */
        _initializePasses(): void;
        private _checkSameRenderTarget;
    }


    /**
     * @internal
     */
    export class FrameGraphRenderTarget {
        protected readonly _textureManager: FrameGraphTextureManager;
        protected readonly _renderTargets: FrameGraphTextureHandle[] | undefined;
        protected readonly _renderTargetDepth: FrameGraphTextureHandle | undefined;
        protected _renderTargetWrapper: RenderTargetWrapper | undefined;
        protected _isBackBuffer: boolean;
        readonly name: string;
        constructor(name: string, textureManager: FrameGraphTextureManager, renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[], renderTargetDepth?: FrameGraphTextureHandle);
        get renderTargetWrapper(): RenderTargetWrapper | undefined;
        equals(other: FrameGraphRenderTarget): boolean;
        dispose(): void;
    }


    /**
     * Frame graph context used render passes.
     */
    export class FrameGraphRenderContext extends FrameGraphContext {
        private readonly _effectRenderer;
        private readonly _effectRendererBack;
        private _currentRenderTarget;
        private _renderTargetIsBound;
        private readonly _copyTexture;
        private readonly _copyDepthTexture;
        private static _IsObjectRenderer;
        /** @internal */
        constructor(engine: AbstractEngine, textureManager: FrameGraphTextureManager, scene: Scene);
        /**
         * Checks whether a texture handle points to the backbuffer's color or depth texture
         * @param handle The handle to check
         * @returns True if the handle points to the backbuffer's color or depth texture, otherwise false
         */
        isBackbuffer(handle: FrameGraphTextureHandle): boolean;
        /**
         * Checks whether a texture handle points to the backbuffer's color texture
         * @param handle The handle to check
         * @returns True if the handle points to the backbuffer's color texture, otherwise false
         */
        isBackbufferColor(handle: FrameGraphTextureHandle): boolean;
        /**
         * Checks whether a texture handle points to the backbuffer's depth texture
         * @param handle The handle to check
         * @returns True if the handle points to the backbuffer's depth texture, otherwise false
         */
        isBackbufferDepthStencil(handle: FrameGraphTextureHandle): boolean;
        /**
         * Creates a (frame graph) render target wrapper
         * Note that renderTargets or renderTargetDepth can be undefined, but not both at the same time!
         * @param name Name of the render target wrapper
         * @param renderTargets Render target handles (textures) to use
         * @param renderTargetDepth Render target depth handle (texture) to use
         * @param depthReadOnly If true, the depth buffer will be read-only
         * @param stencilReadOnly If true, the stencil buffer will be read-only
         * @returns The created render target wrapper
         */
        createRenderTarget(name: string, renderTargets?: FrameGraphTextureHandle | FrameGraphTextureHandle[], renderTargetDepth?: FrameGraphTextureHandle, depthReadOnly?: boolean, stencilReadOnly?: boolean): FrameGraphRenderTarget;
        /**
         * Clears the current render buffer or the current render target (if any is set up)
         * @param color Defines the color to use
         * @param backBuffer Defines if the back buffer must be cleared
         * @param depth Defines if the depth buffer must be cleared
         * @param stencil Defines if the stencil buffer must be cleared
         * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)
         */
        clear(color: Nullable<IColor4Like>, backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue?: number): void;
        /**
         * Clears the color attachments of the current render target
         * @param color Defines the color to use
         * @param attachments The attachments to clear
         */
        clearColorAttachments(color: Nullable<IColor4Like>, attachments: number[]): void;
        /**
         * Clears all attachments (color(s) + depth/stencil) of the current render target
         * @param color Defines the color to use
         * @param attachments The attachments to clear
         * @param backBuffer Defines if the back buffer must be cleared
         * @param depth Defines if the depth buffer must be cleared
         * @param stencil Defines if the stencil buffer must be cleared
         * @param stencilClearValue Defines the value to use to clear the stencil buffer (default is 0)
         */
        clearAttachments(color: Nullable<IColor4Like>, attachments: number[], backBuffer: boolean, depth: boolean, stencil?: boolean, stencilClearValue?: number): void;
        /**
         * Binds the attachments to the current render target
         * @param attachments The attachments to bind
         */
        bindAttachments(attachments: number[]): void;
        /**
         * Generates mipmaps for the current render target
         * @param handle Optional handle of the texture to generate mipmaps for (if not provided, will generate mipmaps for all textures in the current render target)
         */
        generateMipMaps(handle?: FrameGraphTextureHandle): void;
        /**
         * Sets the texture sampling mode for a given texture handle
         * @param handle Handle of the texture to set the sampling mode for
         * @param samplingMode Sampling mode to set
         */
        setTextureSamplingMode(handle: FrameGraphTextureHandle, samplingMode: number): void;
        /**
         * Binds a texture handle to a given effect (resolves the handle to a texture and binds it to the effect)
         * @param effect The effect to bind the texture to
         * @param name The name of the texture in the effect
         * @param handle The handle of the texture to bind
         */
        bindTextureHandle(effect: Effect, name: string, handle: FrameGraphTextureHandle): void;
        /**
         * Applies a full-screen effect to the current render target
         * @param drawWrapper The draw wrapper containing the effect to apply
         * @param customBindings The custom bindings to use when applying the effect (optional)
         * @param stencilState The stencil state to use when applying the effect (optional)
         * @param disableColorWrite If true, color write will be disabled when applying the effect (optional)
         * @param drawBackFace If true, the fullscreen quad will be drawn as a back face (in CW - optional)
         * @param depthTest If true, depth testing will be enabled when applying the effect (default is false)
         * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.
         * @param alphaMode The alpha mode to use when applying the effect (default is ALPHA_DISABLE)
         * @returns True if the effect was applied, otherwise false (effect not ready)
         */
        applyFullScreenEffect(drawWrapper: DrawWrapper, customBindings?: () => void, stencilState?: IStencilState | IStencilStateProperties, disableColorWrite?: boolean, drawBackFace?: boolean, depthTest?: boolean, noViewport?: boolean, alphaMode?: number): boolean;
        /**
         * Copies a texture to the current render target
         * @param sourceTexture The source texture to copy from
         * @param forceCopyToBackbuffer If true, the copy will be done to the back buffer regardless of the current render target
         * @param noViewport If true, the current viewport will be left unchanged (optional). If false or undefined, the viewport will be set to the full render target size.
         * @param lodLevel The LOD level to use when copying the texture (default: 0).
         */
        copyTexture(sourceTexture: FrameGraphTextureHandle, forceCopyToBackbuffer?: boolean, noViewport?: boolean, lodLevel?: number): void;
        /**
         * Renders a RenderTargetTexture or a layer
         * @param object The RenderTargetTexture/Layer to render
         * @param viewportWidth The width of the viewport (optional for Layer, but mandatory for ObjectRenderer)
         * @param viewportHeight The height of the viewport (optional for Layer, but mandatory for ObjectRenderer)
         * @param restoreDefaultFramebuffer If true, the default framebuffer will be restored after rendering (default: false)
         */
        render(object: Layer | ObjectRenderer | UtilityLayerRenderer, viewportWidth?: number, viewportHeight?: number, restoreDefaultFramebuffer?: boolean): void;
        /**
         * Binds a render target texture so that upcoming draw calls will render to it
         * Note: it is a lazy operation, so the render target will only be bound when needed. This way, it is possible to call
         *   this method several times with different render targets without incurring the cost of binding if no draw calls are made
         * @param renderTarget The handle of the render target texture to bind (default: undefined, meaning "back buffer"). Pass an array for MRT rendering.
         * @param applyImmediately If true, the render target will be applied immediately (otherwise it will be applied at first use). Default is false (delayed application).
         */
        bindRenderTarget(renderTarget?: FrameGraphRenderTarget, applyImmediately?: boolean): void;
        /**
         * Restores the default framebuffer (back buffer) as the current render target
         */
        restoreDefaultFramebuffer(): void;
        /** @internal */
        _applyRenderTarget(): void;
        /** @internal */
        _isReady(): boolean;
        /** @internal */
        _dispose(): void;
    }


    /**
     * Structure used by the frame graph to reference objects.
     */
    export class FrameGraphObjectList {
        /**
         * The meshes in the object list.
         */
        meshes: Nullable<AbstractMesh[]>;
        /**
         * The particle systems in the object list.
         */
        particleSystems: Nullable<IParticleSystem[]>;
    }


    /**
     * Base class for frame graph context.
     */
    export class FrameGraphContext {
        protected readonly _engine: AbstractEngine;
        protected readonly _textureManager: FrameGraphTextureManager;
        protected readonly _scene: Scene;
        private _depthTest;
        private _depthWrite;
        /**
         * If true, debug markers will be enabled in the context.
         */
        enableDebugMarkers: boolean;
        /** @internal */
        constructor(_engine: AbstractEngine, _textureManager: FrameGraphTextureManager, _scene: Scene);
        /**
         * Renders a component without managing the render target.
         * Use this method when you have a component that handles its own rendering logic which is not fully integrated into the frame graph system.
         * @param component The component to render.
         * @param intermediateRendering If true, the scene's intermediate rendering flag will be set to true during the render call (default: true)
         */
        renderUnmanaged(component: {
            render: () => void;
        }, intermediateRendering?: boolean): void;
        /**
         * Gets a texture from a handle.
         * Note that if the texture is a history texture, the read texture for the current frame will be returned.
         * @param handle The handle of the texture
         * @returns The texture or null if not found
         */
        getTextureFromHandle(handle: FrameGraphTextureHandle): Nullable<InternalTexture>;
        /**
         * Pushes a debug group to the engine's debug stack.
         * @param name The name of the debug group
         */
        pushDebugGroup(name: string): void;
        /**
         * Pops a debug group from the engine's debug stack.
         */
        popDebugGroup(): void;
        /**
         * Inserts a debug marker in the engine's debug stack.
         * @param text The text of the debug marker
         */
        insertDebugMarker(text: string): void;
        /**
         * Saves the current depth states (depth testing and depth writing)
         */
        saveDepthStates(): void;
        /**
         * Restores the depth states saved by saveDepthStates
         */
        restoreDepthStates(): void;
        /**
         * Sets the depth states for the current render target
         * @param depthTest If true, depth testing is enabled
         * @param depthWrite If true, depth writing is enabled
         */
        setDepthStates(depthTest: boolean, depthWrite: boolean): void;
        /**
         * Sets the current viewport
         * @param viewport defines the viewport element to be used
         * @param requiredWidth defines the width required for rendering. If not provided, the width of the render texture is used.
         * @param requiredHeight defines the height required for rendering. If not provided the height of the render texture is used.
         */
        setViewport(viewport: IViewportLike, requiredWidth?: number, requiredHeight?: number): void;
    }


    /**
     * Class used to implement a frame graph
     */
    export class FrameGraph implements IDisposable {
        private readonly _linkedNodeRenderGraph;
        /**
         * Gets the texture manager used by the frame graph
         */
        readonly textureManager: FrameGraphTextureManager;
        private readonly _engine;
        private readonly _scene;
        private readonly _tasks;
        private readonly _passContext;
        private readonly _renderContext;
        private readonly _initAsyncPromises;
        private _currentProcessedTask;
        private _whenReadyAsyncCancel;
        private _importPromise;
        /**
         * Name of the frame graph
         */
        name: string;
        /**
         * Gets the unique id of the frame graph
         */
        readonly uniqueId: number;
        /**
         * Gets or sets a boolean indicating that texture allocation should be optimized (that is, reuse existing textures when possible to limit GPU memory usage) (default: true)
         */
        optimizeTextureAllocation: boolean;
        /**
         * Observable raised when the node render graph is built
         */
        onBuildObservable: Observable<FrameGraph>;
        /**
         * Gets the engine used by the frame graph
         */
        get engine(): AbstractEngine;
        /**
         * Gets the scene used by the frame graph
         */
        get scene(): Scene;
        /**
         * Gets the list of tasks in the frame graph
         */
        get tasks(): FrameGraphTask[];
        /**
         * Indicates whether the execution of the frame graph is paused (default is false)
         */
        pausedExecution: boolean;
        /**
         * Gets the node render graph linked to the frame graph (if any)
         * @returns the linked node render graph or null if none
         */
        getLinkedNodeRenderGraph(): Nullable<NodeRenderGraph>;
        /**
         * Constructs the frame graph
         * @param scene defines the scene the frame graph is associated with
         * @param debugTextures defines a boolean indicating that textures created by the frame graph should be visible in the inspector (default is false)
         * @param _linkedNodeRenderGraph defines the linked node render graph (if any)
         */
        constructor(scene: Scene, debugTextures?: boolean, _linkedNodeRenderGraph?: Nullable<NodeRenderGraph>);
        /**
         * Gets the class name of the frame graph
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a task by name
         * @param name Name of the task to get
         * @returns The task or undefined if not found
         */
        getTaskByName<T extends FrameGraphTask>(name: string): T | undefined;
        /**
         * Gets all tasks of a specific class name(s)
         * @param name Class name(s) of the task to get
         * @returns The list of tasks or an empty array if none found
         */
        getTasksByClassNames<T extends FrameGraphTask>(name: string | string[]): T[];
        /**
         * Gets all tasks of a specific type
         * @param taskType Type of the task(s) to get
         * @returns The list of tasks of the specified type
         */
        getTasksByType<T extends FrameGraphTask>(taskType: new (...args: any[]) => T): T[];
        /**
         * Gets all tasks of a specific type, based on their class name
         * @param taskClassName Class name(s) of the task(s) to get
         * @returns The list of tasks of the specified type
         */
        getTasksByClassName<T extends FrameGraphTask>(taskClassName: string | string[]): T[];
        /**
         * Adds a task to the frame graph
         * @param task Task to add
         */
        addTask(task: FrameGraphTask): void;
        /**
         * Adds a pass to a task. This method can only be called during a Task.record execution.
         * @param name The name of the pass
         * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)
         * @returns The render pass created
         */
        addPass(name: string, whenTaskDisabled?: boolean): FrameGraphPass<FrameGraphContext>;
        /**
         * Adds a render pass to a task. This method can only be called during a Task.record execution.
         * @param name The name of the pass
         * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)
         * @returns The render pass created
         */
        addRenderPass(name: string, whenTaskDisabled?: boolean): FrameGraphRenderPass;
        /**
         * Adds an object list pass to a task. This method can only be called during a Task.record execution.
         * @param name The name of the pass
         * @param whenTaskDisabled If true, the pass will be added to the list of passes to execute when the task is disabled (default is false)
         * @returns The object list pass created
         */
        addObjectListPass(name: string, whenTaskDisabled?: boolean): FrameGraphObjectListPass;
        private _addPass;
        /** @internal */
        _whenAsynchronousInitializationDoneAsync(): Promise<void>;
        /**
         * Builds the frame graph.
         * This method should be called after all tasks have been added to the frame graph (FrameGraph.addTask) and before the graph is executed (FrameGraph.execute).
         * @param waitForReadiness If true, the method will wait for the frame graph to be ready before returning (default is true)
         */
        buildAsync(waitForReadiness?: boolean): Promise<void>;
        /**
         * Checks if the frame graph is ready to be executed.
         * Note that you can use the whenReadyAsync method to wait for the frame graph to be ready.
         * @returns True if the frame graph is ready to be executed, else false
         */
        isReady(): boolean;
        /**
         * Returns a promise that resolves when the frame graph is ready to be executed.
         * In general, calling “await buildAsync()” should suffice, as this function also waits for readiness by default.
         * @param timeStep Time step in ms between retries (default is 16)
         * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 10000)
         * @returns The promise that resolves when the graph is ready
         */
        whenReadyAsync(timeStep?: number, maxTimeout?: number): Promise<void>;
        /**
         * Executes the frame graph.
         */
        execute(): void;
        /**
         * Clears the frame graph (remove the tasks and release the textures).
         * The frame graph can be built again after this method is called.
         */
        clear(): void;
        /**
         * Looks for the main camera used by the frame graph.
         * By default, this is the camera used by the main object renderer task.
         * If no such task, we try to find a camera in a utility layer renderer tasks.
         * @returns The main camera used by the frame graph, or null if not found
         */
        findMainCamera(): Nullable<Camera>;
        /**
         * Looks for the main object renderer task in the frame graph.
         * By default, this is the object/geometry renderer task with isMainObjectRenderer set to true.
         * If no such task, we return the last object/geometry renderer task that has an object list with meshes (or null if none found).
         * @returns The main object renderer of the frame graph, or null if not found
         */
        findMainObjectRenderer(): Nullable<FrameGraphObjectRendererTask>;
        /**
         * Disposes the frame graph
         */
        dispose(): void;
    }


    /**
     * Task which generates mipmaps for a texture.
     */
    export class FrameGraphGenerateMipMapsTask extends FrameGraphTask {
        /**
         * The texture to generate mipmaps for.
         */
        targetTexture: FrameGraphTextureHandle;
        /**
         * The output texture (same as targetTexture, but the handle may be different).
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * Constructs a new FrameGraphGenerateMipMapsTask.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        record(): void;
    }


    /**
     * Task used to copy a texture to another texture.
     */
    export class FrameGraphCopyToTextureTask extends FrameGraphTask {
        /**
         * The source texture to copy from.
         */
        sourceTexture: FrameGraphTextureHandle;
        /**
         * The target texture to copy to.
         */
        targetTexture: FrameGraphTextureHandle;
        /**
         * The viewport to use when doing the copy.
         * If set to null, the currently active viewport is used.
         * If undefined (default), the viewport is reset to a full screen viewport before performing the copy.
         */
        viewport?: Nullable<IViewportLike>;
        /**
         * The LOD level to copy from the source texture (default: 0).
         */
        lodLevel: number;
        /**
         * The output texture (same as targetTexture, but the handle may be different).
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * Constructs a new FrameGraphCopyToTextureTask.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        record(): void;
    }


    /**
     * Task which copies a texture to the backbuffer color texture.
     */
    export class FrameGraphCopyToBackbufferColorTask extends FrameGraphTask {
        /**
         * The source texture to copy to the backbuffer color texture.
         */
        sourceTexture: FrameGraphTextureHandle;
        getClassName(): string;
        record(): void;
    }


    /**
     * Task used to clear a texture.
     */
    export class FrameGraphClearTextureTask extends FrameGraphTaskMultiRenderTarget {
        /**
         * The color to clear the texture with.
         */
        color: Color4;
        /**
         * If the color should be cleared.
         */
        clearColor: boolean;
        /**
         * If the color should be converted to linear space (default: false).
         */
        convertColorToLinearSpace: boolean;
        /**
         * If the depth should be cleared.
         */
        clearDepth: boolean;
        /**
         * If the stencil should be cleared.
         */
        clearStencil: boolean;
        /**
         * The value to use to clear the stencil buffer (default: 0).
         */
        stencilValue: number;
        /**
         * The color texture to clear.
         */
        targetTexture?: FrameGraphTextureHandle | FrameGraphTextureHandle[];
        /**
         * The depth attachment texture to clear.
         */
        depthTexture?: FrameGraphTextureHandle;
        /**
         * The output texture (same as targetTexture, but the handle will be different).
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The output depth texture (same as depthTexture, but the handle will be different).
         */
        readonly outputDepthTexture: FrameGraphTextureHandle;
        /**
         * Constructs a new clear task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task used to render an utility layer.
     */
    export class FrameGraphUtilityLayerRendererTask extends FrameGraphTask {
        /**
         * The target texture of the task.
         */
        targetTexture: FrameGraphTextureHandle;
        private _camera;
        /**
         * The camera used to render the utility layer.
         */
        get camera(): Camera;
        set camera(value: Camera);
        /**
         * The output texture of the task.
         * This is the same texture as the target texture, but the handles are different!
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The utility layer renderer.
         */
        readonly layer: UtilityLayerRenderer;
        /**
         * Creates a new utility layer renderer task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param scene The scene the task belongs to.
         * @param handleEvents If the utility layer should handle events.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, handleEvents?: boolean);
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * Task used to generate shadows from a list of objects.
     */
    export class FrameGraphShadowGeneratorTask extends FrameGraphTask {
        /**
         * The object list that generates shadows.
         */
        objectList: FrameGraphObjectList;
        private _light;
        /**
         * The light to generate shadows from.
         */
        get light(): IShadowLight;
        set light(value: IShadowLight);
        private _camera;
        /**
         * Gets or sets the camera used to generate the shadow generator.
         */
        get camera(): Camera;
        set camera(camera: Camera);
        private _mapSize;
        /**
         * The size of the shadow map.
         */
        get mapSize(): number;
        set mapSize(value: number);
        private _useFloat32TextureType;
        /**
         * If true, the shadow map will use a 32 bits float texture type (else, 16 bits float is used if supported).
         */
        get useFloat32TextureType(): boolean;
        set useFloat32TextureType(value: boolean);
        private _useRedTextureFormat;
        /**
         * If true, the shadow map will use a red texture format (else, a RGBA format is used).
         */
        get useRedTextureFormat(): boolean;
        set useRedTextureFormat(value: boolean);
        private _bias;
        /**
         * The bias to apply to the shadow map.
         */
        get bias(): number;
        set bias(value: number);
        private _normalBias;
        /**
         * The normal bias to apply to the shadow map.
         */
        get normalBias(): number;
        set normalBias(value: number);
        private _darkness;
        /**
         * The darkness of the shadows.
         */
        get darkness(): number;
        set darkness(value: number);
        private _transparencyShadow;
        /**
         * Gets or sets the ability to have transparent shadow
         */
        get transparencyShadow(): boolean;
        set transparencyShadow(value: boolean);
        private _enableSoftTransparentShadow;
        /**
         * Enables or disables shadows with varying strength based on the transparency
         */
        get enableSoftTransparentShadow(): boolean;
        set enableSoftTransparentShadow(value: boolean);
        private _useOpacityTextureForTransparentShadow;
        /**
         * If this is true, use the opacity texture's alpha channel for transparent shadows instead of the diffuse one
         */
        get useOpacityTextureForTransparentShadow(): boolean;
        set useOpacityTextureForTransparentShadow(value: boolean);
        private _filter;
        /**
         * The filter to apply to the shadow map.
         */
        get filter(): number;
        set filter(value: number);
        private _filteringQuality;
        /**
         * The filtering quality to apply to the filter.
         */
        get filteringQuality(): number;
        set filteringQuality(value: number);
        /**
         * The shadow generator.
         */
        readonly shadowGenerator: ShadowGenerator;
        /**
         * The shadow map texture.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        protected _shadowGenerator: ShadowGenerator | undefined;
        protected _updateShadowMap(): void;
        protected _createShadowGeneratorInstance(): void;
        protected _createShadowGenerator(): boolean | undefined;
        isReady(): boolean;
        /**
         * Creates a new shadow generator task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /** Pure barrel — re-exports only side-effect-free modules */


    /**
     * Task used to render objects to a texture.
     */
    export class FrameGraphObjectRendererTask extends FrameGraphTaskMultiRenderTarget {
        /**
         * The target texture(s) where the objects will be rendered.
         */
        targetTexture: FrameGraphTextureHandle | FrameGraphTextureHandle[];
        /**
         * The depth attachment texture where the objects will be rendered (optional).
         */
        depthTexture?: FrameGraphTextureHandle;
        /**
         * The shadow generators used to render the objects (optional).
         */
        shadowGenerators?: FrameGraphShadowGeneratorTask[];
        private _camera;
        /**
         * Gets or sets the camera used to render the objects.
         */
        get camera(): Camera;
        set camera(camera: Camera);
        /**
         * The list of objects to render.
         */
        objectList: FrameGraphObjectList;
        /**
         * If depth testing should be enabled (default is true).
         */
        depthTest: boolean;
        /**
         * If depth writing should be enabled (default is true).
         */
        depthWrite: boolean;
        /**
         * If shadows should be disabled (default is false).
         */
        disableShadows: boolean;
        private _disableImageProcessing;
        /**
         * If image processing should be disabled (default is false).
         * false means that the default image processing configuration will be applied (the one from the scene)
         */
        get disableImageProcessing(): boolean;
        set disableImageProcessing(value: boolean);
        /**
         * Sets this property to true if this task is the main object renderer of the frame graph.
         * It will help to locate the main object renderer in the frame graph when multiple object renderers are used.
         * This is useful for the inspector to know which object renderer to use for additional rendering features like wireframe rendering or frustum light debugging.
         * It is also used to determine the main camera used by the frame graph: this is the camera used by the main object renderer.
         */
        isMainObjectRenderer: boolean;
        private _renderMeshes;
        /**
         * Defines if meshes should be rendered (default is true).
         */
        get renderMeshes(): boolean;
        set renderMeshes(value: boolean);
        private _renderDepthOnlyMeshes;
        /**
         * Defines if depth only meshes should be rendered (default is true). Always subject to the renderMeshes property, though.
         */
        get renderDepthOnlyMeshes(): boolean;
        set renderDepthOnlyMeshes(value: boolean);
        private _renderOpaqueMeshes;
        /**
         * Defines if opaque meshes should be rendered (default is true). Always subject to the renderMeshes property, though.
         */
        get renderOpaqueMeshes(): boolean;
        set renderOpaqueMeshes(value: boolean);
        private _renderAlphaTestMeshes;
        /**
         * Defines if alpha test meshes should be rendered (default is true). Always subject to the renderMeshes property, though.
         */
        get renderAlphaTestMeshes(): boolean;
        set renderAlphaTestMeshes(value: boolean);
        private _renderTransparentMeshes;
        /**
         * Defines if transparent meshes should be rendered (default is true). Always subject to the renderMeshes property, though.
         */
        get renderTransparentMeshes(): boolean;
        set renderTransparentMeshes(value: boolean);
        private _useOITForTransparentMeshes;
        /**
         * Defines if Order Independent Transparency should be used for transparent meshes (default is false).
         */
        get useOITForTransparentMeshes(): boolean;
        set useOITForTransparentMeshes(value: boolean);
        /**
         * Defines the number of passes to use for Order Independent Transparency (default is 5).
         */
        get oitPassCount(): number;
        set oitPassCount(value: number);
        private _renderParticles;
        /**
         * Defines if particles should be rendered (default is true).
         */
        get renderParticles(): boolean;
        set renderParticles(value: boolean);
        private _renderSprites;
        /**
         * Defines if sprites should be rendered (default is true).
         */
        get renderSprites(): boolean;
        set renderSprites(value: boolean);
        private _forceLayerMaskCheck;
        /**
         * Forces checking the layerMask property even if a custom list of meshes is provided (ie. if renderList is not undefined). Default is true.
         */
        get forceLayerMaskCheck(): boolean;
        set forceLayerMaskCheck(value: boolean);
        private _enableBoundingBoxRendering;
        /**
         * Enables the rendering of bounding boxes for meshes (still subject to Mesh.showBoundingBox or scene.forceShowBoundingBoxes). Default is true.
         */
        get enableBoundingBoxRendering(): boolean;
        set enableBoundingBoxRendering(value: boolean);
        private _enableOutlineRendering;
        /**
         * Enables the rendering of outlines/overlays for meshes (still subject to Mesh.renderOutline/Mesh.renderOverlay). Default is true.
         */
        get enableOutlineRendering(): boolean;
        set enableOutlineRendering(value: boolean);
        /**
         * If true, targetTexture will be resolved at the end of the render pass, if this/these texture(s) is/are MSAA (default: true)
         */
        resolveMSAAColors: boolean;
        /**
         * If true, depthTexture will be resolved at the end of the render pass, if this texture is provided and is MSAA (default: false).
         */
        resolveMSAADepth: boolean;
        /**
         * The output texture.
         * This texture will point to the same texture than the targetTexture property.
         * Note, however, that the handle itself will be different!
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The output depth attachment texture.
         * This texture will point to the same texture than the depthTexture property if it is set.
         * Note, however, that the handle itself will be different!
         */
        readonly outputDepthTexture: FrameGraphTextureHandle;
        /**
         * The object renderer used to render the objects.
         */
        get objectRenderer(): ObjectRenderer;
        get name(): string;
        set name(value: string);
        protected readonly _engine: AbstractEngine;
        protected readonly _scene: Scene;
        protected readonly _renderer: ObjectRenderer;
        protected readonly _oitRenderer: ThinDepthPeelingRenderer;
        protected _textureWidth: number;
        protected _textureHeight: number;
        protected _onBeforeRenderObservable: Nullable<Observer<number>>;
        protected _onAfterRenderObservable: Nullable<Observer<number>>;
        protected _externalObjectRenderer: boolean;
        protected _rtForOrderIndependentTransparency: FrameGraphRenderTarget;
        /**
         * Constructs a new object renderer task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param scene The scene the frame graph is associated with.
         * @param options The options of the object renderer.
         * @param existingObjectRenderer An existing object renderer to use (optional). If provided, the options parameter will be ignored.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: ObjectRendererOptions, existingObjectRenderer?: ObjectRenderer);
        isReady(): boolean;
        getClassName(): string;
        /**
         * Records the object renderer task into the frame graph.
         * @param skipCreationOfDisabledPasses defines whether disabled passes should be skipped
         * @param additionalExecute defines an optional callback executed by the pass
         * @returns the recorded render pass
         */
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
        dispose(): void;
        protected _resolveDanglingHandles(targetTextures: FrameGraphTextureHandle[]): void;
        protected _checkParameters(): void;
        protected _checkTextureCompatibility(targetTextures: FrameGraphTextureHandle[]): boolean;
        protected _getTargetHandles(): FrameGraphTextureHandle[];
        protected _prepareRendering(context: FrameGraphRenderContext, depthEnabled: boolean): Nullable<number[]>;
        protected _setLightsForShadow(): void;
        protected _renderTransparentMeshesWithOIT(transparentSubMeshes: SmartArray<SubMesh>, renderingGroup: RenderingGroup): void;
    }


    /** This file must only contain pure code and pure imports */
    /**
     * Composite task that owns the individual IBL shadows frame graph tasks.
     * The frame graph remains flat internally, but this task groups the pipeline
     * and owns the child task implementation details.
     */
    export class FrameGraphIblShadowsRendererTask extends FrameGraphTask {
        /** Final frame-graph texture handle produced by the task. */
        readonly outputTexture: FrameGraphTextureHandle;
        private readonly _voxelizationTask;
        private readonly _tracingTask;
        private readonly _spatialBlurTask;
        private readonly _accumulationTask;
        private _dependenciesResolved;
        private _shadowOpacity;
        private readonly _materialsWithRenderPlugin;
        private readonly _outputTextureReadyObservable;
        private _lastNotifiedOutputTexture;
        private _observedEnvironmentTexture;
        private _observedEnvironmentTextureUnsubscribe;
        private _lastImportedIcdfTexture;
        private _lastImportedEnvironmentTexture;
        private _lastImportedBlueNoiseTexture;
        private readonly _blueNoiseTexture;
        private _cameraViewChangedObserver;
        private _cdfTextureChangedObserver;
        private _cdfGeneratedObserver;
        private _environmentTextureChangedObserver;
        private _beforeRenderDependencyObserver;
        private _beforeRenderOutputReadyObserver;
        private _blueNoiseLoadObserver;
        private _texturesAllocatedObserver;
        private _voxelizationCompleteObserver;
        /**
         * Gets the class name.
         * @returns The class name.
         */
        getClassName(): string;
        get name(): string;
        set name(value: string);
        /**
         * Whether the task is disabled.
         */
        get disabled(): boolean;
        set disabled(value: boolean);
        /** Camera used by the tracing stage. */
        get camera(): Camera;
        /** Camera used by the tracing stage. */
        set camera(value: Camera);
        /** Object list used by voxelization. */
        get objectList(): FrameGraphObjectList;
        /** Object list used by voxelization. */
        set objectList(value: FrameGraphObjectList);
        /**
         * Depth texture handle used by tracing and blur.
         * This should be the screen-space depth of all objects in the scene
         * that will receive shadows.
         * It is important that this texture stores 32-bit depth values to avoid artifacts.
         */
        depthTexture: FrameGraphTextureHandle;
        /**
         * World-space normal texture handle used by tracing and blur.
         * This should store the world-space normals of all objects in the scene
         * that will receive shadows. Each component should be normalized to [0, 1] rather than [-1, 1].
         * Recommended to be 16-bit floating point though 8-bit unsigned byte can be used with minimal
         * loss in quality.
         */
        normalTexture: FrameGraphTextureHandle;
        /**
         * Position texture handle used by accumulation.
         * This should store the world-space position of all objects in the scene
         * that will receive shadows.
         * Should be stored as 16-bit floating point.
         */
        positionTexture: FrameGraphTextureHandle;
        /**
         * Velocity texture handle used by accumulation.
         * This should store the linear velocity per pixel of all objects in the scene
         * that will receive shadows.
         * Should be stored as 16-bit floating point.
         */
        velocityTexture: FrameGraphTextureHandle;
        /** Number of tracing sample directions. */
        get sampleDirections(): number;
        /** Number of tracing sample directions. */
        set sampleDirections(value: number);
        /** Whether traced shadows preserve environment color. */
        get coloredShadows(): boolean;
        /** Whether traced shadows preserve environment color. */
        set coloredShadows(value: boolean);
        /** Opacity of voxel-traced shadows. */
        get voxelShadowOpacity(): number;
        /** Opacity of voxel-traced shadows. */
        set voxelShadowOpacity(value: number);
        /** Opacity of screen-space shadows. */
        get ssShadowOpacity(): number;
        /** Opacity of screen-space shadows. */
        set ssShadowOpacity(value: number);
        /** Number of screen-space shadow samples. */
        get ssShadowSampleCount(): number;
        /** Number of screen-space shadow samples. */
        set ssShadowSampleCount(value: number);
        /** Stride used by screen-space shadow sampling. */
        get ssShadowStride(): number;
        /** Stride used by screen-space shadow sampling. */
        set ssShadowStride(value: number);
        /** Distance scale used by screen-space shadow tracing. */
        get ssShadowDistanceScale(): number;
        /** Distance scale used by screen-space shadow tracing. */
        set ssShadowDistanceScale(value: number);
        /** Thickness scale used by screen-space shadow tracing. */
        get ssShadowThicknessScale(): number;
        /** Thickness scale used by screen-space shadow tracing. */
        set ssShadowThicknessScale(value: number);
        /** Voxel tracing normal bias. */
        get voxelNormalBias(): number;
        /** Voxel tracing normal bias. */
        set voxelNormalBias(value: number);
        /** Voxel tracing direction bias. */
        get voxelDirectionBias(): number;
        /** Voxel tracing direction bias. */
        set voxelDirectionBias(value: number);
        /** Environment rotation in radians. */
        get envRotation(): number;
        /** Environment rotation in radians. */
        set envRotation(value: number);
        /** Temporal shadow remanence while moving. */
        get shadowRemanence(): number;
        /** Temporal shadow remanence while moving. */
        set shadowRemanence(value: number);
        /** Final material shadow opacity. */
        get shadowOpacity(): number;
        /** Final material shadow opacity. */
        set shadowOpacity(value: number);
        /** Voxelization resolution exponent. */
        get resolutionExp(): number;
        /** Voxelization resolution exponent. */
        set resolutionExp(value: number);
        /** Voxelization refresh rate. */
        get refreshRate(): number;
        /** Voxelization refresh rate. */
        set refreshRate(value: number);
        /** Whether tri-planar voxelization is used. */
        get triPlanarVoxelization(): boolean;
        /** Whether tri-planar voxelization is used. */
        set triPlanarVoxelization(value: boolean);
        /** Current world-space voxel grid size. */
        get voxelGridSize(): number;
        /** True when the accumulated output texture is ready. */
        get outputTextureReady(): boolean;
        /** Notifies when the accumulated output texture becomes ready. */
        get onOutputTextureReadyObservable(): Observable<InternalTexture>;
        /** Triggers a voxelization refresh on the next eligible frame. */
        updateVoxelization(): void;
        /** Recomputes the voxelization scene bounds from the current object list. */
        updateSceneBounds(): void;
        /** Resets temporal accumulation. */
        resetAccumulation(): void;
        /**
         * Adds one or more materials that should receive IBL shadows.
         * @param material The material or materials to register. If omitted, all scene materials are added.
         */
        addShadowReceivingMaterial(material?: Material | Material[]): void;
        /**
         * Removes one or more materials from IBL shadow reception.
         * @param material The material or materials to unregister.
         */
        removeShadowReceivingMaterial(material: Material | Material[]): void;
        /** Clears all registered shadow-receiving materials. */
        clearShadowReceivingMaterials(): void;
        /**
         * Adds one or more meshes to the voxelization object list.
         * @param mesh The mesh or meshes to add.
         */
        addShadowCastingMesh(mesh: Mesh | Mesh[]): void;
        /**
         * Removes one or more meshes from the voxelization object list.
         * @param mesh The mesh or meshes to remove.
         */
        removeShadowCastingMesh(mesh: Mesh | Mesh[]): void;
        /** Clears all shadow-casting meshes from the voxelization object list. */
        clearShadowCastingMeshes(): void;
        private _initAsyncCancel;
        initAsync(): Promise<unknown>;
        isReady(): boolean;
        /**
         * Records the parent task.
         * Child tasks record the actual passes.
         */
        record(): void;
        /**
         * Disposes the task and owned resources.
         */
        dispose(): void;
        /**
         * Creates a new IBL shadows composite task.
         * @param name The task name.
         * @param frameGraph The owning frame graph.
         */
        constructor(name: string, frameGraph: FrameGraph);
        private _disposeDependencyObservers;
        private _disposeObservers;
        private _setCamera;
        private _observeEnvironmentTexture;
        private _getEnvironmentTextureInternal;
        private _getAccumulationOutputTexture;
        private _notifyIfOutputTextureReady;
        private _applyMaterialPluginParameters;
        private _addShadowReceivingMaterialInternal;
        private readonly _onEnvironmentTextureLoaded;
        private _tryEnableShadowsTasks;
        private _initialize;
    }




    /**
     * Description of a texture used by the geometry renderer task.
     */
    export interface IFrameGraphGeometryRendererTextureDescription {
        /**
         * The type of the texture.
         * The value should be one of the Constants.PREPASS_XXX_TEXTURE_TYPE values.
         */
        type: number;
        /**
         * The type of the texture.
         */
        textureType: number;
        /**
         * The format of the texture.
         */
        textureFormat: number;
    }
    /**
     * Task used to render geometry to a set of textures.
     */
    export class FrameGraphGeometryRendererTask extends FrameGraphObjectRendererTask {
        /**
         * The size of the output textures (default is 100% of the back buffer texture size).
         */
        size: {
            width: number;
            height: number;
        };
        /**
         * Whether the size is a percentage of the back buffer size (default is true).
         */
        sizeIsPercentage: boolean;
        /**
         * The number of samples to use for the output textures (default is 1).
         */
        samples: number;
        private _reverseCulling;
        /**
         * Whether to reverse culling (default is false).
         */
        get reverseCulling(): boolean;
        set reverseCulling(value: boolean);
        /**
         * Indicates if a mesh shouldn't be rendered when its material has depth write disabled (default is true).
         */
        dontRenderWhenMaterialDepthWriteIsDisabled: boolean;
        private _disableDepthPrePass;
        /**
         * Indicates whether the depth pre-pass is disabled (default is true).
         * Materials that require depth pre-pass (Material.needDepthPrePass == true) don't work with the geometry renderer, that's why this setting is true by default.
         * However, if the geometry renderer doesn't generate any geometry textures but only renders to the main target texture, then depth pre-pass can be enabled.
         */
        get disableDepthPrePass(): boolean;
        set disableDepthPrePass(value: boolean);
        /**
         * The list of texture descriptions used by the geometry renderer task.
         */
        textureDescriptions: IFrameGraphGeometryRendererTextureDescription[];
        /**
         * The irradiance output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryIrradianceTexture: FrameGraphTextureHandle;
        /**
         * The depth (in view space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryViewDepthTexture: FrameGraphTextureHandle;
        /**
         * The normalized depth (in view space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         * The normalization is (d - near) / (far - near), where d is the depth value in view space and near and far are the near and far planes of the camera.
         */
        readonly geometryNormViewDepthTexture: FrameGraphTextureHandle;
        /**
         * The depth (in screen space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryScreenDepthTexture: FrameGraphTextureHandle;
        /**
         * The normal (in view space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryViewNormalTexture: FrameGraphTextureHandle;
        /**
         * The normal (in world space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryWorldNormalTexture: FrameGraphTextureHandle;
        /**
         * The position (in local space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryLocalPositionTexture: FrameGraphTextureHandle;
        /**
         * The position (in world space) output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryWorldPositionTexture: FrameGraphTextureHandle;
        /**
         * The albedo output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryAlbedoTexture: FrameGraphTextureHandle;
        /**
         * The reflectivity output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryReflectivityTexture: FrameGraphTextureHandle;
        /**
         * The velocity output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryVelocityTexture: FrameGraphTextureHandle;
        /**
         * The linear velocity output texture. Will point to a valid texture only if that texture has been requested in textureDescriptions!
         */
        readonly geometryLinearVelocityTexture: FrameGraphTextureHandle;
        /**
         * Gets or sets the name of the task.
         */
        get name(): string;
        set name(value: string);
        private _clearAttachmentsLayout;
        private _allAttachmentsLayout;
        /**
         * Constructs a new geometry renderer task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param scene The scene the frame graph is associated with.
         * @param options The options of the object renderer.
         * @param existingObjectRenderer An existing object renderer to use (optional). If provided, the options parameter will be ignored.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: ObjectRendererOptions, existingObjectRenderer?: ObjectRenderer);
        /**
         * Gets the list of excluded meshes from the velocity texture.
         */
        get excludedSkinnedMeshFromVelocityTexture(): AbstractMesh[];
        /**
         * Excludes the given skinned mesh from computing bones velocities.
         * Computing bones velocities can have a cost. The cost can be saved by calling this function and by passing the skinned mesh to ignore.
         * @param skinnedMesh The mesh containing the skeleton to ignore when computing the velocity map.
         */
        excludeSkinnedMeshFromVelocityTexture(skinnedMesh: AbstractMesh): void;
        /**
         * Removes the given skinned mesh from the excluded meshes to integrate bones velocities while rendering the velocity map.
         * @param skinnedMesh The mesh containing the skeleton that has been ignored previously.
         * @see excludeSkinnedMesh to exclude a skinned mesh from bones velocity computation.
         */
        removeExcludedSkinnedMeshFromVelocityTexture(skinnedMesh: AbstractMesh): void;
        getClassName(): string;
        /**
         * Records the geometry renderer task into the frame graph.
         * @param skipCreationOfDisabledPasses defines whether disabled passes should be skipped
         * @param additionalExecute defines an optional callback executed by the pass
         * @returns the recorded render pass
         */
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
        dispose(): void;
        protected _resolveDanglingHandles(_targetTextures: FrameGraphTextureHandle[]): void;
        protected _checkParameters(): void;
        protected _checkTextureCompatibility(targetTextures: FrameGraphTextureHandle[]): boolean;
        protected _getTargetHandles(): FrameGraphTextureHandle[];
        protected _prepareRendering(context: FrameGraphRenderContext, depthEnabled: boolean): number[];
        private _buildClearAttachmentsLayout;
        private _registerForRenderPassId;
    }


    /**
     * Task used to generate a cascaded shadow map from a list of objects.
     */
    export class FrameGraphCascadedShadowGeneratorTask extends FrameGraphShadowGeneratorTask {
        protected _shadowGenerator: CascadedShadowGenerator | undefined;
        /**
         * Checks if a shadow generator task is a cascaded shadow generator task.
         * @param task The task to check.
         * @returns True if the task is a cascaded shadow generator task, else false.
         */
        static IsCascadedShadowGenerator(task: FrameGraphShadowGeneratorTask): task is FrameGraphCascadedShadowGeneratorTask;
        /**
         * The depth texture used by the autoCalcDepthBounds feature (optional if autoCalcDepthBounds is set to false).
         * This texture is used to compute the min/max depth bounds of the scene to setup the cascaded shadow generator.
         * The texture should contain either “view,” “normalized view,” or “screen” depth values - if possible, connect “normalized view,” or “screen” for best performance.
         * Warning: Do not set a texture if you are not using the autoCalcDepthBounds feature, to avoid generating a depth texture that will not be used.
         */
        depthTexture?: FrameGraphTextureHandle;
        /**
         * The type of the depth texture used by the autoCalcDepthBounds feature.
         */
        depthTextureType: DepthTextureType;
        private _numCascades;
        /**
         * The number of cascades.
         */
        get numCascades(): number;
        set numCascades(value: number);
        private _debug;
        /**
         * Gets or sets a value indicating whether the shadow generator should display the cascades.
         */
        get debug(): boolean;
        set debug(value: boolean);
        private _stabilizeCascades;
        /**
         * Gets or sets a value indicating whether the shadow generator should stabilize the cascades.
         */
        get stabilizeCascades(): boolean;
        set stabilizeCascades(value: boolean);
        private _lambda;
        /**
         * Gets or sets the lambda parameter of the shadow generator.
         */
        get lambda(): number;
        set lambda(value: number);
        private _cascadeBlendPercentage;
        /**
         * Gets or sets the cascade blend percentage.
         */
        get cascadeBlendPercentage(): number;
        set cascadeBlendPercentage(value: number);
        private _depthClamp;
        /**
         * Gets or sets a value indicating whether the shadow generator should use depth clamping.
         */
        get depthClamp(): boolean;
        set depthClamp(value: boolean);
        private _autoCalcDepthBounds;
        /**
         * Gets or sets a value indicating whether the shadow generator should automatically calculate the depth bounds.
         */
        get autoCalcDepthBounds(): boolean;
        set autoCalcDepthBounds(value: boolean);
        private _currentAutoCalcDepthBoundsCounter;
        private _autoCalcDepthBoundsRefreshRate;
        /**
         * Defines the refresh rate of the min/max computation used when autoCalcDepthBounds is set to true
         * Use 0 to compute just once, 1 to compute on every frame, 2 to compute every two frames and so on...
         */
        get autoCalcDepthBoundsRefreshRate(): number;
        set autoCalcDepthBoundsRefreshRate(value: number);
        private _shadowMaxZ;
        /**
         * Gets or sets the maximum shadow Z value.
         */
        get shadowMaxZ(): number;
        set shadowMaxZ(value: number);
        protected readonly _thinMinMaxReducer: ThinMinMaxReducer;
        /**
         * Creates a new shadow generator task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        protected _createShadowGeneratorInstance(): void;
        protected _createShadowGenerator(): boolean | undefined;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * Task used to voxelize shadow casting objects for IBL shadows.
     * @internal
     */
    export class FrameGraphIblShadowsVoxelizationTask extends FrameGraphTask {
        /**
         * Observable raised when voxelization completes.
         */
        readonly onVoxelizationCompleteObservable: Observable<void>;
        /**
         * Input object list containing the meshes to voxelize.
         */
        objectList: FrameGraphObjectList;
        /**
         * World-space voxel grid size.
         */
        voxelGridSize: number;
        /**
         * Voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
         */
        private _resolutionExp;
        /**
         * Sets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
         */
        set resolutionExp(value: number);
        /**
         * Gets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
         */
        get resolutionExp(): number;
        /**
         * Enables tri-planar voxelization mode.
         */
        triPlanarVoxelization: boolean;
        /**
         * Indicates whether voxelization should be refreshed.
         */
        dirty: boolean;
        private _refreshRate;
        /**
         * Controls how often voxelization is refreshed.
         * - -1: manual only (requires setting `dirty = true`)
         * - 0: every frame
         * - 1: skip 1 frame between updates
         * - N: skip N frames between updates
         */
        get refreshRate(): number;
        set refreshRate(value: number);
        /**
         * World-to-voxel normalization matrix used by tracing.
         */
        readonly worldScaleMatrix: Matrix;
        /**
         * Output voxel grid texture handle.
         */
        readonly outputVoxelGridTexture: FrameGraphTextureHandle;
        private _voxelRenderer?;
        private _voxelRendererResolutionExp?;
        private _voxelRendererTriPlanar?;
        private _voxelizationCompleteObserver;
        private _voxelRTTextureHandle?;
        private _voxelGridTextureHandle?;
        private _frameCounter;
        /**
         * Creates a new voxelization task.
         * @param name The task name.
         * @param frameGraph The frame graph this task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        /**
         * Gets the class name.
         * @returns The class name.
         */
        getClassName(): string;
        /**
         * Checks whether the task has all required inputs.
         * @returns True when ready.
         */
        isReady(): boolean;
        /**
         * Requests a voxelization update on the next eligible frame.
         */
        requestVoxelizationUpdate(): void;
        /**
         * Recomputes voxel world bounds from the current object list and updates worldScaleMatrix.
         */
        updateSceneBounds(): void;
        /**
         * Records the voxelization passes.
         */
        record(): void;
        /**
         * Disposes internal resources.
         */
        dispose(): void;
        private _ensureVoxelRenderer;
        private _attachVoxelizationObserver;
        private _detachVoxelizationObserver;
        private _updateWorldScaleMatrix;
        private _updateOutputTextureHandlesFromRenderer;
    }


    /**
     * Task used to trace IBL shadows from a voxel grid.
     * @internal
     */
    export class FrameGraphIblShadowsTracingTask extends FrameGraphTask {
        camera?: Camera;
        voxelGridTexture?: FrameGraphTextureHandle;
        depthTexture?: FrameGraphTextureHandle;
        normalTexture?: FrameGraphTextureHandle;
        icdfTexture?: FrameGraphTextureHandle;
        environmentTexture?: FrameGraphTextureHandle;
        blueNoiseTexture?: FrameGraphTextureHandle;
        private _sampleDirections;
        get sampleDirections(): number;
        set sampleDirections(value: number);
        voxelShadowOpacity: number;
        ssShadowOpacity: number;
        private _ssShadowSampleCount;
        get ssShadowSampleCount(): number;
        set ssShadowSampleCount(value: number);
        private _ssShadowStride;
        get ssShadowStride(): number;
        set ssShadowStride(value: number);
        /** Scale factor applied to voxelGridSize / 2^resolutionExp to get the max SSS ray distance. */
        ssShadowDistanceScale: number;
        /** Scale factor applied to voxelGridSize to get the SSS surface thickness. */
        ssShadowThicknessScale: number;
        /** Voxelization task providing dynamic voxelGridSize and resolutionExp for SSS parameter derivation. */
        voxelizationTask?: FrameGraphIblShadowsVoxelizationTask;
        envRotation: number;
        voxelNormalBias: number;
        voxelDirectionBias: number;
        worldScaleMatrix: Matrix;
        readonly outputTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinCustomPostProcess;
        protected readonly _postProcessDrawWrapper: DrawWrapper;
        protected readonly _shadowParameters: Vector4;
        protected readonly _sssParameters: Vector4;
        protected readonly _opacityParameters: Vector4;
        protected readonly _voxelBiasParameters: Vector4;
        protected readonly _cameraInvView: Matrix;
        protected readonly _cameraInvProj: Matrix;
        protected readonly _cameraInvViewProjection: Matrix;
        protected _frameId: number;
        protected _coloredShadows: boolean;
        protected _currentDefines: string;
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        initAsync(): Promise<unknown>;
        get coloredShadows(): boolean;
        set coloredShadows(value: boolean);
        isReady(): boolean;
        record(): void;
        dispose(): void;
        protected _updateDefines(): void;
    }


    /**
     * Task used to spatially blur IBL shadows.
     * @internal
     */
    export class FrameGraphIblShadowsSpatialBlurTask extends FrameGraphTask {
        sourceTexture?: FrameGraphTextureHandle;
        depthTexture?: FrameGraphTextureHandle;
        normalTexture?: FrameGraphTextureHandle;
        /** Voxelization task providing the dynamic voxelGridSize used as worldScale. */
        voxelizationTask?: FrameGraphIblShadowsVoxelizationTask;
        readonly outputTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinCustomPostProcess;
        protected readonly _postProcessDrawWrapper: DrawWrapper;
        protected readonly _blurParameters: Vector4;
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        initAsync(): Promise<unknown>;
        isReady(): boolean;
        record(): void;
        dispose(): void;
    }


    /**
     * Task used to temporally accumulate IBL shadows.
     * @internal
     */
    export class FrameGraphIblShadowsAccumulationTask extends FrameGraphTask {
        sourceTexture?: FrameGraphTextureHandle;
        velocityTexture?: FrameGraphTextureHandle;
        positionTexture?: FrameGraphTextureHandle;
        private _remanence;
        get remanence(): number;
        set remanence(value: number);
        reset: boolean;
        isMoving: boolean;
        voxelGridSize: number;
        /** Voxelization task providing the runtime voxelGridSize used by the accumulation shader. */
        voxelizationTask?: FrameGraphIblShadowsVoxelizationTask;
        protected _accumulationHistoryTexture?: FrameGraphTextureHandle;
        protected _positionHistoryTexture?: FrameGraphTextureHandle;
        readonly outputTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinCustomPostProcess;
        protected readonly _postProcessDrawWrapper: DrawWrapper;
        protected readonly _accumulationParams: Vector4;
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        initAsync(): Promise<unknown>;
        isReady(): boolean;
        record(): void;
        dispose(): void;
    }


    /**
     * A frame graph task that performs volumetric lighting.
     */
    export class FrameGraphVolumetricLightingTask extends FrameGraphTask {
        /**
         * Returns whether volumetric lighting is supported by the engine.
         * @param engine The engine to check for volumetric lighting support.
         * @param enableExtinction Whether the extinction/dual-source blending path will be used.
         * @returns True if volumetric lighting is supported, false otherwise.
         */
        static IsSupported(engine: AbstractEngine, enableExtinction?: boolean): boolean;
        /**
         * The target texture to which the volumetric lighting will be applied.
         */
        targetTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use when blending the volumetric lighting texture with targetTexture.
         */
        sourceSamplingMode: number;
        /**
         * The depth texture used for volumetric lighting calculations.
         * It must be the depth texture used to generate targetTexture.
         */
        depthTexture: FrameGraphTextureHandle;
        private _camera;
        /**
         * The camera used for volumetric lighting calculations.
         */
        get camera(): Camera;
        set camera(value: Camera);
        /**
         * The mesh representing the lighting volume.
         * This is the mesh that will be rendered to create the volumetric lighting effect.
         */
        lightingVolumeMesh: FrameGraphObjectList;
        /**
         * The directional light used for volumetric lighting.
         */
        light: DirectionalLight;
        /**
         * The lighting volume texture (optional).
         * If not provided, a new texture will be created, with the same size, format and type as targetTexture.
         * This is the texture that will store the volumetric lighting information, before being blended to targetTexture.
         */
        lightingVolumeTexture?: FrameGraphTextureHandle;
        private _extinctionPhaseG;
        /**
         * The phase G parameter for the volumetric lighting effect (default: 0).
         * This parameter controls the anisotropy of the scattering.
         * A value of 0 means isotropic scattering, while a value of 1 means forward scattering and -1 means backward scattering.
         */
        get phaseG(): number;
        set phaseG(value: number);
        /**
         * Whether to enable extinction in the volumetric lighting effect (default: false).
         * Read-only property set in the constructor.
         */
        readonly enableExtinction: boolean;
        /**
         * The extinction coefficient for the volumetric lighting effect (default: (0, 0, 0) - no extinction).
         * This parameter controls how much light is absorbed and scattered as it travels through the medium.
         * Will only have an effect if enableExtinction is set to true in the constructor!
         */
        get extinction(): Vector3;
        set extinction(value: Vector3);
        private _lightPower;
        /**
         * The light power/color for the volumetric lighting effect (default: (1, 1, 1)).
         * This parameter controls the intensity and color of the light used for volumetric lighting.
         */
        get lightPower(): Color3;
        set lightPower(value: Color3);
        get name(): string;
        set name(name: string);
        /**
         * The output texture of the task. It will be the same as targetTexture.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        private readonly _clearLightingVolumeTextureTask;
        private readonly _renderLightingVolumeTask;
        private readonly _blendLightingVolumeTask;
        private _renderLightingVolumeMaterial;
        /**
         * Creates a new FrameGraphVolumetricLightingTask.
         * @param name The name of the task.
         * @param frameGraph The frame graph to which the task belongs.
         * @param enableExtinction Whether to enable extinction in the volumetric lighting effect (default: false). If you don't plan to set extinction to something different than (0, 0, 0), you can disable this to save some performance.
         */
        constructor(name: string, frameGraph: FrameGraph, enableExtinction?: boolean);
        initAsync(): Promise<unknown>;
        isReady(): boolean;
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): void;
        dispose(): void;
    }


    /**
     * @internal
     */
    class VolumetricLightingBlendVolumeThinPostProcess extends ThinPassPostProcess {
        camera: Camera;
        outputTextureWidth: number;
        outputTextureHeight: number;
        extinction: Vector3;
        enableExtinction: boolean;
        private _invProjection;
        protected _gatherImports(useWebGPU: boolean, list: Promise<any>[]): void;
        constructor(name: string, engine?: Nullable<AbstractEngine>, enableExtinction?: boolean, options?: EffectWrapperCreationOptions);
        bind(noDefaultBindings?: boolean): void;
    }
    /**
     * @internal
     */
    export class FrameGraphVolumetricLightingBlendVolumeTask extends FrameGraphPostProcessTask {
        readonly postProcess: VolumetricLightingBlendVolumeThinPostProcess;
        depthTexture: FrameGraphTextureHandle;
        camera: Camera;
        constructor(name: string, frameGraph: FrameGraph, enableExtinction?: boolean);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a tonemap post process.
     */
    export class FrameGraphTonemapTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinTonemapPostProcess;
        /**
         * Constructs a new tonemap task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the tonemap effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinTonemapPostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies a Temporal Anti-Aliasing post process.
     */
    export class FrameGraphTAATask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinTAAPostProcess;
        /**
         * The object renderer task used to render the scene objects.
         */
        objectRendererTask: FrameGraphObjectRendererTask;
        /**
         * The handle to the velocity texture. Only needed if postProcess.reprojectHistory is enabled.
         * Note that you must use the linear velocity texture!
         */
        velocityTexture?: FrameGraphTextureHandle;
        protected _onBeforeRenderSceneObserver: Observer<Scene>;
        protected _initRenderingObserver: Observer<ObjectRenderer>;
        /**
         * Constructs a new Temporal Anti-Aliasing task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the Temporal Anti-Aliasing effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinTAAPostProcess);
        getClassName(): string;
        record(): FrameGraphRenderPass;
        dispose(): void;
    }


    /**
     * @internal
     */
    export class FrameGraphSSRTask extends FrameGraphPostProcessTask {
        normalTexture: FrameGraphTextureHandle;
        depthTexture: FrameGraphTextureHandle;
        reflectivityTexture: FrameGraphTextureHandle;
        backDepthTexture?: FrameGraphTextureHandle;
        camera: Camera;
        readonly postProcess: ThinSSRPostProcess;
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinSSRPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a SSR post process.
     */
    export class FrameGraphSSRRenderingPipelineTask extends FrameGraphTask {
        /**
         * The source texture to apply the SSR effect on.
         */
        sourceTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the source texture.
         */
        sourceSamplingMode: number;
        /**
         * The alpha mode to use when applying the SSR effect.
         */
        get alphaMode(): number;
        set alphaMode(mode: number);
        /**
         * The normal texture used by the SSR effect.
         */
        normalTexture: FrameGraphTextureHandle;
        /**
         * The depth texture used by the SSR effect.
         */
        depthTexture: FrameGraphTextureHandle;
        /**
         * The back depth texture used by the SSR effect (optional).
         * This is used when automatic thickness computation is enabled.
         * The back depth texture is the depth texture of the scene rendered for the back side of the objects (that is, front faces are culled).
         */
        backDepthTexture?: FrameGraphTextureHandle;
        /**
         * The reflectivity texture used by the SSR effect
         */
        reflectivityTexture: FrameGraphTextureHandle;
        private _camera;
        /**
         * The camera used to render the scene.
         */
        get camera(): Camera;
        set camera(camera: Camera);
        /**
         * The target texture to render the SSR effect to.
         */
        targetTexture?: FrameGraphTextureHandle;
        /**
         * The output texture of the SSR effect.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The SSR Rendering pipeline.
         */
        readonly ssr: ThinSSRRenderingPipeline;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(name: string);
        /**
         * The texture type used by the different post processes created by SSR.
         * It's a read-only property. If you want to change it, you must recreate the task and pass the appropriate texture type to the constructor.
         */
        readonly textureType: number;
        private readonly _ssr;
        private readonly _ssrBlurX;
        private readonly _ssrBlurY;
        private readonly _ssrBlurCombiner;
        /**
         * Constructs a SSR rendering pipeline task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param textureType The texture type used by the different post processes created by SSR (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         */
        constructor(name: string, frameGraph: FrameGraph, textureType?: number);
        isReady(): boolean;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * @internal
     */
    export class FrameGraphSSRBlurTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinSSRBlurPostProcess;
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinSSRBlurPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * @internal
     */
    export class FrameGraphSSAO2Task extends FrameGraphPostProcessTask {
        depthTexture: FrameGraphTextureHandle;
        normalTexture: FrameGraphTextureHandle;
        camera: Camera;
        readonly postProcess: ThinSSAO2PostProcess;
        private _currentCameraMode;
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinSSAO2PostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a SSAO2 post process.
     */
    export class FrameGraphSSAO2RenderingPipelineTask extends FrameGraphTask {
        /**
         * The source texture to apply the SSAO2 effect on.
         */
        sourceTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the source texture.
         */
        sourceSamplingMode: number;
        /**
         * The alpha mode to use when applying the SSAO2 effect.
         */
        get alphaMode(): number;
        set alphaMode(mode: number);
        /**
         * The depth texture used by the SSAO2 effect (Z coordinate in camera view space).
         */
        depthTexture: FrameGraphTextureHandle;
        /**
         * The normal texture used by the SSAO2 effect (normal vector in camera view space).
         */
        normalTexture: FrameGraphTextureHandle;
        private _camera;
        /**
         * The camera used to render the scene.
         */
        get camera(): Camera;
        set camera(camera: Camera);
        /**
         * The target texture to render the SSAO2 effect to.
         */
        targetTexture?: FrameGraphTextureHandle;
        /**
         * The output texture of the SSAO2 effect.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The SSAO2 Rendering pipeline.
         */
        readonly ssao: ThinSSAO2RenderingPipeline;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(name: string);
        /**
         * The ratio between the SSAO texture size and the source texture size
         */
        readonly ratioSSAO: number;
        /**
         * The ratio between the SSAO blur texture size and the source texture size
         */
        readonly ratioBlur: number;
        /**
         * The texture type used by the different post processes created by SSAO2.
         * It's a read-only property. If you want to change it, you must recreate the task and pass the appropriate texture type to the constructor.
         */
        readonly textureType: number;
        private readonly _ssao;
        private readonly _ssaoBlurX;
        private readonly _ssaoBlurY;
        private readonly _ssaoCombine;
        /**
         * Constructs a SSAO2 rendering pipeline task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param ratioSSAO The ratio between the SSAO texture size and the source texture size
         * @param ratioBlur The ratio between the SSAO blur texture size and the source texture size
         * @param textureType The texture type used by the different post processes created by SSAO2 (default: Constants.TEXTURETYPE_UNSIGNED_BYTE)
         */
        constructor(name: string, frameGraph: FrameGraph, ratioSSAO: number, ratioBlur: number, textureType?: number);
        isReady(): boolean;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * @internal
     */
    export class FrameGraphSSAO2BlurTask extends FrameGraphPostProcessTask {
        private _isHorizontal;
        readonly postProcess: ThinSSAO2BlurPostProcess;
        depthTexture: FrameGraphTextureHandle;
        constructor(name: string, frameGraph: FrameGraph, _isHorizontal: boolean, thinPostProcess?: ThinSSAO2BlurPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a sharpen post process.
     */
    export class FrameGraphSharpenTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinSharpenPostProcess;
        /**
         * Constructs a new sharpen task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinSharpenPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a screen space curvature post process.
     */
    export class FrameGraphScreenSpaceCurvatureTask extends FrameGraphPostProcessTask {
        /**
         * The normal texture to use for the screen space curvature effect.
         * It must store normals in camera view space.
         */
        normalTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinScreenSpaceCurvaturePostProcess;
        /**
         * Constructs a new circle of confusion task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinScreenSpaceCurvaturePostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a post process.
     */
    export class FrameGraphPostProcessTask extends FrameGraphTask {
        /**
         * The source texture to apply the post process on.
         * It's allowed to be undefined if the post process does not require a source texture.
         * In that case, targetTexture must be provided.
         */
        sourceTexture?: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the source texture.
         */
        sourceSamplingMode: number;
        /**
         * The target texture to render the post process to.
         * If not supplied, a texture with the same configuration as the source texture will be created.
         */
        targetTexture?: FrameGraphTextureHandle;
        /**
         * The stencil state to use for the post process (optional).
         */
        stencilState?: IStencilStateProperties;
        /**
         * The depth attachment texture to use for the post process (optional).
         * Note that a post-process task never writes to the depth buffer: attaching a depth texture is only useful if you want to test against the depth/stencil aspect or write to the stencil buffer.
         */
        depthAttachmentTexture?: FrameGraphTextureHandle;
        /**
         * If true, the depth attachment will be read-only.
         * This means that the post process will not write to the depth buffer.
         * Setting depthReadOnly and stencilReadOnly to true is useful when you want to also be able to bind this same depth/stencil attachment to a shader.
         * Note that it will only work in WebGPU, as WebGL does not support read-only depth/stencil attachments.
         */
        depthReadOnly: boolean;
        /**
         * If true, the stencil attachment will be read-only.
         * This means that the post process will not write to the stencil buffer.
         * Setting depthReadOnly and stencilReadOnly to true is useful when you want to also be able to bind this same depth/stencil attachment to a shader.
         * Note that it will only work in WebGPU, as WebGL does not support read-only depth/stencil attachments.
         */
        stencilReadOnly: boolean;
        /**
         * If true, color write will be disabled when applying the post process.
         * This means that the post process will not write to the color buffer.
         */
        disableColorWrite: boolean;
        /**
         * If true, the post process will be generated by a back face full-screen quad (CW order).
         */
        drawBackFace: boolean;
        /**
         * If depth testing should be enabled (default is true).
         */
        depthTest: boolean;
        /**
         * The alpha mode to use when applying the post process (default is ALPHA_DISABLE).
         */
        get alphaMode(): number;
        set alphaMode(value: number);
        /**
         * The viewport to use when applying the post process.
         * If set to null, the currently active viewport is used.
         * If undefined (default), the viewport is reset to a full screen viewport before applying the post process.
         */
        viewport?: Nullable<IViewportLike>;
        /**
         * The output texture of the post process.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The output depth attachment texture.
         * This texture will point to the same texture than the depthAttachmentTexture property if it is set.
         * Note, however, that the handle itself will be different!
         */
        readonly outputDepthAttachmentTexture: FrameGraphTextureHandle;
        /**
         * The post process to apply.
         */
        readonly postProcess: EffectWrapper;
        /**
         * The draw wrapper used by the post process
         */
        get drawWrapper(): DrawWrapper;
        protected readonly _postProcessDrawWrapper: DrawWrapper;
        protected _sourceWidth: number;
        protected _sourceHeight: number;
        protected _outputWidth: number;
        protected _outputHeight: number;
        /**
         * Constructs a new post process task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param postProcess The post process to apply.
         */
        constructor(name: string, frameGraph: FrameGraph, postProcess: EffectWrapper);
        isReady(): boolean;
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
        dispose(): void;
    }


    /**
     * Task which applies a pass post process.
     */
    export class FrameGraphPassTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinPassPostProcess;
        /**
         * Constructs a new pass task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the pass effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinPassPostProcess);
        getClassName(): string;
    }
    /**
     * Task which applies a pass cube post process.
     */
    export class FrameGraphPassCubeTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinPassCubePostProcess;
        /**
         * Constructs a new pass cube task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the pass cube effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinPassCubePostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies a motion blur post process.
     */
    export class FrameGraphMotionBlurTask extends FrameGraphPostProcessTask {
        /**
         * The velocity texture to use for the motion blur effect.
         * Needed for object-based motion blur.
         */
        velocityTexture?: FrameGraphTextureHandle;
        /**
         * The (view) depth texture to use for the motion blur effect.
         * Needed for screen-based motion blur.
         */
        depthTexture?: FrameGraphTextureHandle;
        readonly postProcess: ThinMotionBlurPostProcess;
        /**
         * Constructs a new motion blur task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinMotionBlurPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies an image processing post process.
     */
    export class FrameGraphImageProcessingTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinImageProcessingPostProcess;
        /**
         * Constructs a new image processing task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinImageProcessingPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a grain post process.
     */
    export class FrameGraphGrainTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinGrainPostProcess;
        /**
         * Constructs a new grain task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the grain effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinGrainPostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies a FXAA post process.
     */
    export class FrameGraphFXAATask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinFXAAPostProcess;
        /**
         * Constructs a new FXAA task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the FXAA effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinFXAAPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a kernel filter post process.
     */
    export class FrameGraphFilterTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinFilterPostProcess;
        /**
         * Constructs a new filter task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the filter effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinFilterPostProcess);
        getClassName(): string;
    }


    /**
     * Task used to extract highlights from a scene.
     */
    export class FrameGraphExtractHighlightsTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinExtractHighlightsPostProcess;
        /**
         * Constructs a new extract highlights task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinExtractHighlightsPostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies a depth of field effect.
     */
    export class FrameGraphDepthOfFieldTask extends FrameGraphTask {
        /**
         * The source texture to apply the depth of field effect on.
         */
        sourceTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the source texture.
         */
        sourceSamplingMode: number;
        /**
         * The alpha mode to use when applying the depth of field effect.
         */
        get alphaMode(): number;
        set alphaMode(mode: number);
        /**
         * The depth texture to use for the depth of field effect.
         * Should store camera space depth (Z coordinate).
         */
        depthTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the depth texture.
         */
        depthSamplingMode: number;
        /**
         * The camera used to render the scene.
         */
        camera: Camera;
        /**
         * The target texture to render the depth of field effect to.
         */
        targetTexture?: FrameGraphTextureHandle;
        /**
         * The output texture of the depth of field effect.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The depth of field effect.
         */
        readonly depthOfField: ThinDepthOfFieldEffect;
        /**
         * Whether the depth of field effect is applied on HDR textures.
         * When true, the depth of field effect will use a higher precision texture format (half float or float). Else, it will use unsigned byte.
         */
        readonly hdr: boolean;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(name: string);
        private readonly _engine;
        private readonly _circleOfConfusion;
        private readonly _blurX;
        private readonly _blurY;
        private readonly _merge;
        private readonly _defaultPipelineTextureType;
        /**
         * Constructs a depth of field task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param blurLevel The blur level of the depth of field effect (default: ThinDepthOfFieldEffectBlurLevel.Low).
         * @param hdr Whether the depth of field effect is HDR.
         */
        constructor(name: string, frameGraph: FrameGraph, blurLevel?: ThinDepthOfFieldEffectBlurLevel, hdr?: boolean);
        isReady(): boolean;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * @internal
     */
    export class FrameGraphDepthOfFieldMergeTask extends FrameGraphPostProcessTask {
        circleOfConfusionTexture: FrameGraphTextureHandle;
        blurSteps: FrameGraphTextureHandle[];
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinDepthOfFieldMergePostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * @internal
     */
    export class FrameGraphDepthOfFieldBlurTask extends FrameGraphBlurTask {
        circleOfConfusionTexture: FrameGraphTextureHandle;
        circleOfConfusionSamplingMode: number;
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinDepthOfFieldBlurPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a custom post process.
     */
    export class FrameGraphCustomPostProcessTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinCustomPostProcess;
        /**
         * Observable triggered when bind is called for the post process.
         * Use this to set custom uniforms.
         */
        onApplyObservable: Observable<Effect>;
        /**
         * Constructs a new custom post process task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param options Options to configure the post process
         */
        constructor(name: string, frameGraph: FrameGraph, options: EffectWrapperCreationOptions);
        getClassName(): string;
    }


    /**
     * Task which applies a convolution post process.
     */
    export class FrameGraphConvolutionTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinConvolutionPostProcess;
        /**
         * Constructs a new convolution task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinConvolutionPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a color correction post process.
     */
    export class FrameGraphColorCorrectionTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinColorCorrectionPostProcess;
        /**
         * Constructs a new color correction task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param colorTableUrl The URL of the color table to use for the color correction effect.
         * @param thinPostProcess The thin post process to use for the color correction effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, colorTableUrl: string, thinPostProcess?: ThinColorCorrectionPostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies a circle of confusion post process.
     */
    export class FrameGraphCircleOfConfusionTask extends FrameGraphPostProcessTask {
        /**
         * The depth texture to use for the circle of confusion effect.
         * It must store camera space depth (Z coordinate)
         */
        depthTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the depth texture.
         */
        depthSamplingMode: number;
        /**
         * The camera to use for the circle of confusion effect.
         */
        camera: Camera;
        readonly postProcess: ThinCircleOfConfusionPostProcess;
        /**
         * Constructs a new circle of confusion task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task belongs to.
         * @param thinPostProcess The thin post process to use for the task. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinCircleOfConfusionPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a chromatic aberration post process.
     */
    export class FrameGraphChromaticAberrationTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinChromaticAberrationPostProcess;
        /**
         * Constructs a new chromatic aberration task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the chromatic aberration effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinChromaticAberrationPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a blur post process.
     */
    export class FrameGraphBlurTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinBlurPostProcess;
        /**
         * Constructs a new blur task.
         * @param name Name of the task.
         * @param frameGraph Frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the blur effect.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinBlurPostProcess);
        getClassName(): string;
        /**
         * Records the blur task into the frame graph.
         * @param skipCreationOfDisabledPasses defines whether disabled passes should be skipped
         * @param additionalExecute defines an optional callback executed by the pass
         * @param additionalBindings defines an optional callback used to bind extra resources
         * @returns the recorded render pass
         */
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }


    /**
     * Task which applies a bloom render effect.
     */
    export class FrameGraphBloomTask extends FrameGraphTask {
        /**
         * The source texture to apply the bloom effect on.
         */
        sourceTexture: FrameGraphTextureHandle;
        /**
         * The sampling mode to use for the source texture.
         */
        sourceSamplingMode: number;
        /**
         * The alpha mode to use when applying the bloom effect.
         */
        get alphaMode(): number;
        set alphaMode(mode: number);
        /**
         * The target texture to render the bloom effect to.
         * If not supplied, a texture with the same configuration as the source texture will be created.
         */
        targetTexture?: FrameGraphTextureHandle;
        /**
         * The output texture of the bloom effect.
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The bloom effect to apply.
         */
        readonly bloom: ThinBloomEffect;
        /**
         * Whether the bloom effect is HDR.
         * When true, the bloom effect will use a higher precision texture format (half float or float). Else, it will use unsigned byte.
         */
        readonly hdr: boolean;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(name: string);
        private readonly _downscale;
        private readonly _blurX;
        private readonly _blurY;
        private readonly _merge;
        private readonly _defaultPipelineTextureType;
        /**
         * Constructs a new bloom task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param weight Weight of the bloom effect.
         * @param kernel Kernel size of the bloom effect.
         * @param threshold Threshold of the bloom effect.
         * @param hdr Whether the bloom effect is HDR.
         * @param bloomScale The scale of the bloom effect. This value is multiplied by the source texture size to determine the bloom texture size.
         */
        constructor(name: string, frameGraph: FrameGraph, weight?: number, kernel?: number, threshold?: number, hdr?: boolean, bloomScale?: number);
        isReady(): boolean;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * @internal
     */
    export class FrameGraphBloomMergeTask extends FrameGraphPostProcessTask {
        blurTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinBloomMergePostProcess;
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinBloomMergePostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task which applies a black and white post process.
     */
    export class FrameGraphBlackAndWhiteTask extends FrameGraphPostProcessTask {
        readonly postProcess: ThinBlackAndWhitePostProcess;
        /**
         * Constructs a new black and white task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the black and white effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinBlackAndWhitePostProcess);
        getClassName(): string;
    }


    /**
     * Task which applies an anaglyph post process.
     */
    export class FrameGraphAnaglyphTask extends FrameGraphPostProcessTask {
        /**
         * The texture to use as the left texture.
         */
        leftTexture: FrameGraphTextureHandle;
        readonly postProcess: ThinAnaglyphPostProcess;
        /**
         * Constructs a new anaglyph task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the anaglyph effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinAnaglyphPostProcess);
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphRenderPass;
    }


    /**
     * Task used to create a lighting volume from a directional light's shadow generator.
     */
    export class FrameGraphLightingVolumeTask extends FrameGraphTask {
        /**
         * The shadow generator used to create the lighting volume.
         */
        shadowGenerator: FrameGraphShadowGeneratorTask;
        /**
         * The output object list containing the lighting volume mesh.
         * You can get the mesh by doing  outputMeshLightingVolume.meshes[0]
         */
        readonly outputMeshLightingVolume: FrameGraphObjectList;
        /**
         * The lighting volume created by this task.
         */
        readonly lightingVolume: LightingVolume;
        get name(): string;
        set name(name: string);
        /**
         * Creates a new FrameGraphLightingVolumeTask.
         * @param name Name of the task.
         * @param frameGraph The frame graph instance.
         */
        constructor(name: string, frameGraph: FrameGraph);
        isReady(): boolean;
        getClassName(): string;
        record(): void;
        dispose(): void;
    }


    /**
     * Task used to execute a custom function.
     */
    export class FrameGraphExecuteTask extends FrameGraphTask {
        /**
         * The function to execute.
         */
        func: (context: FrameGraphContext) => void;
        /**
         * The function to execute when the task is disabled (optional).
         */
        funcDisabled?: (context: FrameGraphContext) => void;
        /**
         * Custom readiness check (optional).
         */
        customIsReady?: () => boolean;
        isReady(): boolean;
        /**
         * Creates a new execute task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         */
        constructor(name: string, frameGraph: FrameGraph);
        getClassName(): string;
        record(): FrameGraphPass<FrameGraphContext>;
    }


    /**
     * Task used to cull objects that are not visible.
     */
    export class FrameGraphCullObjectsTask extends FrameGraphTask {
        /**
         * The object list to cull.
         */
        objectList: FrameGraphObjectList;
        /**
         * The camera to use for culling.
         */
        camera: Camera;
        /**
         * The output object list containing the culled objects.
         */
        readonly outputObjectList: FrameGraphObjectList;
        private readonly _scene;
        /**
         * Creates a new cull objects task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param scene The scene to cull objects from.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        getClassName(): string;
        record(): void;
    }


    /**
     * Task used to execute a compute shader (WebGPU only)
     */
    export class FrameGraphComputeShaderTask extends FrameGraphTask {
        private readonly _notSupported;
        private readonly _cs;
        private readonly _ubo;
        /**
         * Defines the dispatch size for the compute shader
         */
        dispatchSize: Vector3;
        /**
         * Defines an indirect dispatch buffer and offset.
         * If set, this will be used instead of the dispatchSize property and an indirect dispatch will be performed.
         * "offset" is the offset in the buffer where the workgroup counts are stored (default: 0)
         */
        indirectDispatch?: {
            buffer: StorageBuffer | DataBuffer;
            offset?: number;
        };
        /**
         * An optional execute function that will be called at the beginning of the task execution
         */
        execute?: (context: FrameGraphContext) => void;
        /**
         * Gets the compute shader used by the task
         */
        get computeShader(): ComputeShader;
        /**
         * Gets a uniform buffer created by a call to createUniformBuffer()
         * @param name Name of the uniform buffer
         * @returns The uniform buffer
         */
        getUniformBuffer(name: string): UniformBuffer;
        /**
         * Creates a new compute shader task.
         * @param name The name of the task.
         * @param frameGraph The frame graph the task belongs to.
         * @param shaderPath Defines the route to the shader code in one of three ways:
         *  * object: \{ compute: "custom" \}, used with ShaderStore.ShadersStoreWGSL["customComputeShader"]
         *  * object: \{ computeElement: "HTMLElementId" \}, used with shader code in script tags
         *  * object: \{ computeSource: "compute shader code string" \}, where the string contains the shader code
         *  * string: try first to find the code in ShaderStore.ShadersStoreWGSL[shaderPath + "ComputeShader"]. If not, assumes it is a file with name shaderPath.compute.fx in index.html folder.
         * @param options Define the options used to create the shader
         */
        constructor(name: string, frameGraph: FrameGraph, shaderPath: IComputeShaderPath | string, options?: Partial<IComputeShaderOptions>);
        isReady(): boolean;
        /**
         * Creates a uniform buffer and binds it to the shader
         * @param name Name of the uniform buffer
         * @param description Description of the uniform buffer: names and sizes (in floats) of the uniforms
         * @param autoUpdate If the UBO must be updated automatically before each dispatch (default: true)
         * @returns The created uniform buffer
         */
        createUniformBuffer(name: string, description: {
            [name: string]: number;
        }, autoUpdate?: boolean): UniformBuffer;
        /**
         * Binds a texture to the shader
         * @param name Binding name of the texture
         * @param texture Texture to bind
         * @param bindSampler Bind the sampler corresponding to the texture (default: true). The sampler will be bound just before the binding index of the texture
         */
        setTexture(name: string, texture: BaseTexture, bindSampler?: boolean): void;
        /**
         * Binds an internal texture to the shader
         * @param name Binding name of the texture
         * @param texture Texture to bind
         */
        setInternalTexture(name: string, texture: InternalTexture): void;
        /**
         * Binds a storage texture to the shader
         * @param name Binding name of the texture
         * @param texture Texture to bind
         */
        setStorageTexture(name: string, texture: BaseTexture): void;
        /**
         * Binds an external texture to the shader
         * @param name Binding name of the texture
         * @param texture Texture to bind
         */
        setExternalTexture(name: string, texture: ExternalTexture): void;
        /**
         * Binds a video texture to the shader (by binding the external texture attached to this video)
         * @param name Binding name of the texture
         * @param texture Texture to bind
         * @returns true if the video texture was successfully bound, else false. false will be returned if the current engine does not support external textures
         */
        setVideoTexture(name: string, texture: VideoTexture): boolean;
        /**
         * Binds a uniform buffer to the shader
         * @param name Binding name of the buffer
         * @param buffer Buffer to bind
         */
        setUniformBuffer(name: string, buffer: UniformBuffer | DataBuffer): void;
        /**
         * Binds a storage buffer to the shader
         * @param name Binding name of the buffer
         * @param buffer Buffer to bind
         */
        setStorageBuffer(name: string, buffer: StorageBuffer | DataBuffer): void;
        /**
         * Binds a texture sampler to the shader
         * @param name Binding name of the sampler
         * @param sampler Sampler to bind
         */
        setTextureSampler(name: string, sampler: TextureSampler): void;
        getClassName(): string;
        record(skipCreationOfDisabledPasses?: boolean): FrameGraphPass<FrameGraphContext>;
        dispose(): void;
    }


    /**
     * Task which applies a selection outline effect to a texture.
     */
    export class FrameGraphSelectionOutlineLayerTask extends FrameGraphBaseLayerTask {
        /**
         * The selection outline layer object. Use this object to update the selection outline layer properties (e.g. intensity, blur kernel size).
         */
        readonly layer: ThinSelectionOutlineLayer;
        /**
         * The depth texture to use when rendering the selection outline layer.
         * It must store the scene depth in camera view space Z, normalized or not.
         * If not normalized, the storeCameraSpaceZ option must be passed to the constructor.
         * Required only when layer.useDepthOcclusion is true and layer.occlusionStrength is greater than zero.
         */
        depthTexture: FrameGraphTextureHandle | undefined;
        /**
         * Constructs a new selection outline layer task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param scene The scene to render the selection outline layer in.
         * @param options Options for the selection outline layer.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: IThinSelectionOutlineLayerOptions);
        getClassName(): string;
        record(): void;
    }


    /**
     * Task which applies a highlight effect to a texture.
     */
    export class FrameGraphHighlightLayerTask extends FrameGraphBaseLayerTask {
        /**
         * The highlight layer object. Use this object to update the highlight layer properties.
         */
        readonly layer: ThinHighlightLayer;
        /**
         * Constructs a new highlight layer task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param scene The scene to render the highlight layer in.
         * @param options Options for the highlight layer.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: IThinHighlightLayerOptions);
        getClassName(): string;
        record(): void;
    }


    /**
     * Task which applies a glowing effect to a texture.
     */
    export class FrameGraphGlowLayerTask extends FrameGraphBaseLayerTask {
        /**
         * The glow layer object. Use this object to update the glow layer properties (e.g. intensity, blur kernel size).
         */
        readonly layer: ThinGlowLayer;
        /**
         * Constructs a new glow layer task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param scene The scene to render the glow layer in.
         * @param options Options for the glow layer.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, options?: IThinGlowLayerOptions);
        getClassName(): string;
    }


    /** @internal */
    export enum FrameGraphBaseLayerBlurType {
        None = "none",
        Standard = "standard",
        Glow = "glow"
    }
    class FrameGraphGlowBlurTask extends FrameGraphPostProcessTask {
        /**
         * The thin glow blur post process used by the task.
         */
        readonly postProcess: ThinGlowBlurPostProcess;
        /**
         * Constructs a new glow blur task.
         * @param name The name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param thinPostProcess The thin post process to use for the glow blur effect. If not provided, a new one will be created.
         */
        constructor(name: string, frameGraph: FrameGraph, thinPostProcess?: ThinGlowBlurPostProcess);
        /**
         * Gets the current class name.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Records the glow blur task into the frame graph.
         * @param skipCreationOfDisabledPasses defines whether disabled passes should be skipped
         * @param additionalExecute defines an optional callback executed by the pass
         * @param additionalBindings defines an optional callback used to bind extra resources
         * @returns the recorded render pass
         */
        record(skipCreationOfDisabledPasses?: boolean, additionalExecute?: (context: FrameGraphRenderContext) => void, additionalBindings?: (context: FrameGraphRenderContext) => void): FrameGraphRenderPass;
    }
    /**
     * @internal
     */
    export class FrameGraphBaseLayerTask extends FrameGraphTask {
        private _blurType;
        private _setRenderTargetDepth;
        private _notifyBlurObservable;
        private _setObjectList;
        /**
         * The target texture to apply the effect layer to.
         * The effect will be blended with the contents of this texture.
         */
        targetTexture: FrameGraphTextureHandle;
        /**
         * The object renderer task used to render the objects in the texture to which the layer will be applied.
         * This is needed because the layer may have to inject code in the rendering manager used by object renderer task.
         */
        objectRendererTask: FrameGraphObjectRendererTask;
        /**
         * The layer texture to render the effect into.
         * If not provided, a default texture will be created.
         */
        layerTexture?: FrameGraphTextureHandle;
        /**
         * The output texture of the task (same as targetTexture, but the handle will be different).
         */
        readonly outputTexture: FrameGraphTextureHandle;
        /**
         * The layer object. Use this object to update the layer properties.
         */
        readonly layer: ThinEffectLayer;
        /**
         * The name of the task.
         */
        get name(): string;
        set name(name: string);
        /**
         * Gets the object renderer used to render the layer.
         */
        get objectRendererForLayer(): FrameGraphObjectRendererTask;
        protected readonly _scene: Scene;
        protected readonly _engine: AbstractEngine;
        protected readonly _clearLayerTextureTask: FrameGraphClearTextureTask;
        protected readonly _objectRendererForLayerTask: FrameGraphObjectRendererTask;
        protected readonly _blurX: Array<FrameGraphBlurTask | FrameGraphGlowBlurTask>;
        protected readonly _blurY: Array<FrameGraphBlurTask | FrameGraphGlowBlurTask>;
        protected _layerTextureDimensions: {
            width: number;
            height: number;
        };
        private readonly _onBeforeBlurTask;
        private readonly _onAfterBlurTask;
        private _onBeforeObservableObserver;
        private _onBeforeObservableObserver2;
        private _onAfterObservableObserver;
        private _onAfterRenderingGroupObserver;
        /**
         * Constructs a new layer task.
         * @param name Name of the task.
         * @param frameGraph The frame graph this task is associated with.
         * @param scene The scene to render the layer in.
         * @param layer The layer.
         * @param numBlurPasses The number of blur passes applied by the layer.
         * @param _blurType The type of blur to use for the layer.
         * @param _setRenderTargetDepth If true, the task will set the render target depth.
         * @param _notifyBlurObservable If true, the task will notify before and after blurring occurs.
         * @param _setObjectList If true, the object list of the object renderer for the layer will be set to the object list of the object renderer task.
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, layer: ThinEffectLayer, numBlurPasses: number, _blurType?: FrameGraphBaseLayerBlurType, _setRenderTargetDepth?: boolean, _notifyBlurObservable?: boolean, _setObjectList?: boolean);
        /**
         * Checks whether the layer task is ready.
         * @returns true if the layer task is ready
         */
        isReady(): boolean;
        /**
         * Gets the current class name.
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Records the layer task into the frame graph.
         * @param _skipCreationOfDisabledPasses defines whether disabled passes should be skipped
         * @param additionalComposeBindings defines an optional callback used to bind extra compose resources
         */
        record(_skipCreationOfDisabledPasses?: boolean, additionalComposeBindings?: (context: FrameGraphRenderContext, effect: Effect) => void): void;
        private _clearAfterRenderingGroupObserver;
        /**
         * Disposes the layer task and its dependent tasks.
         */
        dispose(): void;
    }


    /**
     * Type used to define layer and face indices for multi-render target rendering scenarios.
     */
    export type LayerAndFaceIndex = {
        /** Index of the texture to update */
        targetIndex: number;
        /** Index of the layer to set (optional - not used if the texture is not an array or a 3D texture) */
        layerIndex?: number;
        /** Index of the cube face to set (optional - not used if the texture is not a cube texture) */
        faceIndex?: number;
    };
    /**
     * Render pass used to render objects.
     */
    export class FrameGraphRenderPass extends FrameGraphPass<FrameGraphRenderContext> {
        protected readonly _engine: AbstractEngine;
        protected _renderTarget: FrameGraphTextureHandle | FrameGraphTextureHandle[] | undefined;
        protected _renderTargetDepth: FrameGraphTextureHandle | undefined;
        protected _frameGraphRenderTarget: FrameGraphRenderTarget;
        protected _dependencies: Set<FrameGraphTextureHandle>;
        /**
         * Checks if a pass is a render pass.
         * @param pass The pass to check.
         * @returns True if the pass is a render pass, else false.
         */
        static IsRenderPass(pass: IFrameGraphPass): pass is FrameGraphRenderPass;
        /**
         * Gets the handle(s) of the render target(s) used by the render pass.
         */
        get renderTarget(): FrameGraphTextureHandle | FrameGraphTextureHandle[] | undefined;
        /**
         * Gets the handle of the render target depth used by the render pass.
         */
        get renderTargetDepth(): FrameGraphTextureHandle | undefined;
        /**
         * Gets the frame graph render target used by the render pass.
         */
        get frameGraphRenderTarget(): FrameGraphRenderTarget;
        /**
         * If true, the depth attachment will be read-only (may allow some optimizations in WebGPU)
         */
        depthReadOnly: boolean;
        /**
         * If true, the stencil attachment will be read-only (may allow some optimizations in WebGPU)
         */
        stencilReadOnly: boolean;
        /** @internal */
        constructor(name: string, parentTask: FrameGraphTask, context: FrameGraphRenderContext, engine: AbstractEngine);
        /**
         * Sets the render target(s) to use for rendering.
         * @param renderTargetHandle The render target to use for rendering, or an array of render targets to use for multi render target rendering.
         */
        setRenderTarget(renderTargetHandle?: FrameGraphTextureHandle | FrameGraphTextureHandle[]): void;
        /**
         * Sets the render target depth to use for rendering.
         * @param renderTargetHandle The render target depth to use for rendering.
         */
        setRenderTargetDepth(renderTargetHandle?: FrameGraphTextureHandle): void;
        /**
         * Adds dependencies to the render pass.
         * @param dependencies The dependencies to add.
         */
        addDependencies(dependencies?: FrameGraphTextureHandle | FrameGraphTextureHandle[]): void;
        /**
         * Collects the dependencies of the render pass.
         * @param dependencies The set of dependencies to update.
         */
        collectDependencies(dependencies: Set<FrameGraphTextureHandle>): void;
        /**
         * Sets the output layer and face indices for multi-render target rendering.
         * @param indices The array of layer and face indices.
         */
        setOutputLayerAndFaceIndices(indices: LayerAndFaceIndex[]): void;
        /** @internal */
        _initialize(): void;
        /** @internal */
        _execute(): void;
        /** @internal */
        _isValid(): Nullable<string>;
        /** @internal */
        _dispose(): void;
    }


    /**
     * Base class for a frame graph pass.
     */
    export class FrameGraphPass<T extends FrameGraphContext> implements IFrameGraphPass {
        name: string;
        protected readonly _parentTask: FrameGraphTask;
        protected readonly _context: T;
        private _executeFunc;
        private _initFunc?;
        /**
         * Whether the pass is disabled. Disabled passes will be skipped during execution.
         */
        disabled: boolean;
        /** @internal */
        constructor(name: string, _parentTask: FrameGraphTask, _context: T);
        /**
         * Initializes the pass.
         * This function is called once after the frame graph has been built
         * @param func The function to initialize the pass.
         */
        setInitializeFunc(func: (context: T) => void): void;
        /**
         * Sets the function to execute when the pass is executed
         * @param func The function to execute when the pass is executed
         */
        setExecuteFunc(func: (context: T) => void): void;
        /** @internal */
        _execute(): void;
        /** @internal */
        _initialize(): void;
        /** @internal */
        _isValid(): Nullable<string>;
        /** @internal */
        _dispose(): void;
    }


    /**
     * Object list pass used to generate a list of objects.
     */
    export class FrameGraphObjectListPass extends FrameGraphPass<FrameGraphContext> {
        protected readonly _engine: AbstractEngine;
        protected _objectList: FrameGraphObjectList;
        /**
         * Checks if a pass is an object list pass.
         * @param pass The pass to check.
         * @returns True if the pass is an object list pass, else false.
         */
        static IsObjectListPass(pass: IFrameGraphPass): pass is FrameGraphObjectListPass;
        /**
         * Gets the object list used by the pass.
         */
        get objectList(): FrameGraphObjectList;
        /**
         * Sets the object list to use for the pass.
         * @param objectList The object list to use for the pass.
         */
        setObjectList(objectList: FrameGraphObjectList): void;
        /** @internal */
        constructor(name: string, parentTask: FrameGraphTask, context: FrameGraphContext, engine: AbstractEngine);
        /** @internal */
        _isValid(): Nullable<string>;
    }


    /**
     * Defines a connection point to be used for points with a custom object type
     */
    export class NodeRenderGraphConnectionPointCustomObject<T extends NodeRenderGraphBlock> extends NodeRenderGraphConnectionPoint {
        _blockType: new (...args: any[]) => T;
        private _blockName;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         * @param _blockType
         * @param _blockName
         */
        constructor(name: string, ownerBlock: NodeRenderGraphBlock, direction: NodeRenderGraphConnectionPointDirection, _blockType: new (...args: any[]) => T, _blockName: string);
        checkCompatibilityState(connectionPoint: NodeRenderGraphConnectionPoint): NodeRenderGraphConnectionPointCompatibilityStates;
        createCustomInputBlock(): Nullable<[NodeRenderGraphBlock, string]>;
    }


    /**
     * Class used to store node based render graph build state
     */
    export class NodeRenderGraphBuildState {
        /** Gets or sets the build identifier */
        buildId: number;
        /** Gets or sets a boolean indicating that verbose mode is on */
        verbose: boolean;
        /**
         * Gets or sets the list of non connected mandatory inputs
         * @internal
         */
        _notConnectedNonOptionalInputs: NodeRenderGraphConnectionPoint[];
        /**
         * Emits console errors and exceptions if there is a failing check
         * @param errorObservable defines an Observable to send the error message
         * @returns true if all checks pass
         */
        emitErrors(errorObservable?: Nullable<Observable<string>>): boolean;
    }


    /**
     * Defines a connection point for a block
     */
    export class NodeRenderGraphConnectionPoint {
        private readonly _ownerBlock;
        private _connectedPoint;
        /** @internal */
        _acceptedConnectionPointType: Nullable<NodeRenderGraphConnectionPoint>;
        private _endpoints;
        private readonly _direction;
        private _type;
        /** @internal */
        _linkedConnectionSource: Nullable<NodeRenderGraphConnectionPoint>;
        /** @internal */
        _isMainLinkSource: boolean;
        /** @internal */
        _typeConnectionSource: Nullable<NodeRenderGraphConnectionPoint | (() => NodeRenderGraphConnectionPoint)>;
        /** @internal */
        _defaultConnectionPointType: Nullable<NodeRenderGraphBlockConnectionPointTypes>;
        /** Gets the direction of the point */
        get direction(): NodeRenderGraphConnectionPointDirection;
        /**
         * Checks if the value is a texture handle
         * @param value The value to check
         * @returns True if the value is a texture handle
         */
        static IsTextureHandle(value: NodeRenderGraphBlockConnectionPointValueType | undefined): boolean;
        /**
         * Checks if the value is a shadow generator task
         * @param value The value to check
         * @returns True if the value is a shadow generator
         */
        static IsShadowGenerator(value: NodeRenderGraphBlockConnectionPointValueType | undefined): boolean;
        /**
         * Checks if the value is a shadow light
         * @param value The value to check
         * @returns True if the value is a shadow light
         */
        static IsShadowLight(value: NodeRenderGraphBlockConnectionPointValueType | undefined): boolean;
        /**
         * The value stored in this connection point
         */
        value: NodeRenderGraphBlockConnectionPointValueType | undefined;
        /** Indicates that this connection point needs dual validation before being connected to another point */
        needDualDirectionValidation: boolean;
        /**
         * Gets or sets the additional types supported by this connection point
         */
        acceptedConnectionPointTypes: NodeRenderGraphBlockConnectionPointTypes[];
        /**
         * Gets or sets the additional types excluded by this connection point
         */
        excludedConnectionPointTypes: NodeRenderGraphBlockConnectionPointTypes[];
        /**
         * Observable triggered when this point is connected
         */
        onConnectionObservable: Observable<NodeRenderGraphConnectionPoint>;
        /**
         * Observable triggered when this point is disconnected
         */
        onDisconnectionObservable: Observable<NodeRenderGraphConnectionPoint>;
        /**
         * Gets or sets a boolean indicating that this connection point is exposed on a frame
         */
        isExposedOnFrame: boolean;
        /**
         * Gets or sets number indicating the position that the port is exposed to on a frame
         */
        exposedPortPosition: number;
        /**
         * Gets or sets the connection point type (default is Undefined)
         */
        get type(): NodeRenderGraphBlockConnectionPointTypes;
        set type(value: NodeRenderGraphBlockConnectionPointTypes);
        /**
         * Gets or sets the connection point name
         */
        name: string;
        /**
         * Gets or sets the connection point display name
         */
        displayName: string;
        /**
         * Gets or sets a boolean indicating that this connection point can be omitted
         */
        isOptional: boolean;
        /**
         * Gets a boolean indicating that the current point is connected to another NodeRenderGraphBlock
         */
        get isConnected(): boolean;
        /** Get the other side of the connection (if any) */
        get connectedPoint(): Nullable<NodeRenderGraphConnectionPoint>;
        /** Get the block that owns this connection point */
        get ownerBlock(): NodeRenderGraphBlock;
        /** Get the block connected on the other side of this connection (if any) */
        get sourceBlock(): Nullable<NodeRenderGraphBlock>;
        /** Get the block connected on the endpoints of this connection (if any) */
        get connectedBlocks(): Array<NodeRenderGraphBlock>;
        /** Gets the list of connected endpoints */
        get endpoints(): NodeRenderGraphConnectionPoint[];
        /** Gets a boolean indicating if that output point is connected to at least one input */
        get hasEndpoints(): boolean;
        /** Get the inner type (ie AutoDetect for instance instead of the inferred one) */
        get innerType(): NodeRenderGraphBlockConnectionPointTypes;
        /**
         * Creates a block suitable to be used as an input for this input point.
         * If null is returned, a block based on the point type will be created.
         * @returns The returned string parameter is the name of the output point of NodeRenderGraphBlock (first parameter of the returned array) that can be connected to the input
         */
        createCustomInputBlock(): Nullable<[NodeRenderGraphBlock, string]>;
        /**
         * Creates a new connection point
         * @param name defines the connection point name
         * @param ownerBlock defines the block hosting this connection point
         * @param direction defines the direction of the connection point
         */
        constructor(name: string, ownerBlock: NodeRenderGraphBlock, direction: NodeRenderGraphConnectionPointDirection);
        /**
         * Gets the current class name e.g. "NodeRenderGraphConnectionPoint"
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a boolean indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a boolean
         */
        canConnectTo(connectionPoint: NodeRenderGraphConnectionPoint): boolean;
        /**
         * Gets a number indicating if the current point can be connected to another point
         * @param connectionPoint defines the other connection point
         * @returns a number defining the compatibility state
         */
        checkCompatibilityState(connectionPoint: NodeRenderGraphConnectionPoint): NodeRenderGraphConnectionPointCompatibilityStates;
        /**
         * Connect this point to another connection point
         * @param connectionPoint defines the other connection point
         * @param ignoreConstraints defines if the system will ignore connection type constraints (default is false)
         * @returns the current connection point
         */
        connectTo(connectionPoint: NodeRenderGraphConnectionPoint, ignoreConstraints?: boolean): NodeRenderGraphConnectionPoint;
        /**
         * Disconnect this point from one of his endpoint
         * @param endpoint defines the other connection point
         * @returns the current connection point
         */
        disconnectFrom(endpoint: NodeRenderGraphConnectionPoint): NodeRenderGraphConnectionPoint;
        /**
         * Fills the list of excluded connection point types with all types other than those passed in the parameter
         * @param mask Types (ORed values of NodeRenderGraphBlockConnectionPointTypes) that are allowed, and thus will not be pushed to the excluded list
         */
        addExcludedConnectionPointFromAllowedTypes(mask: number): void;
        /**
         * Adds accepted connection point types
         * @param mask Types (ORed values of NodeRenderGraphBlockConnectionPointTypes) that are allowed to connect to this point
         */
        addAcceptedConnectionPointTypes(mask: number): void;
        /**
         * Serializes this point in a JSON representation
         * @param isInput defines if the connection point is an input (default is true)
         * @returns the serialized point object
         */
        serialize(isInput?: boolean): any;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /**
     * Defines a block that can be used inside a node render graph
     */
    export class NodeRenderGraphBlock {
        private _name;
        private _buildId;
        protected _isInput: boolean;
        protected _isTeleportOut: boolean;
        protected _isTeleportIn: boolean;
        protected _isDebug: boolean;
        protected _isUnique: boolean;
        protected _scene: Scene;
        protected _engine: AbstractEngine;
        protected _frameGraph: FrameGraph;
        protected _frameGraphTask?: FrameGraphTask;
        /**
         * Gets or sets the disable flag of the task associated with this block
         */
        get disabled(): boolean;
        set disabled(value: boolean);
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphTask | undefined;
        /**
         * Gets an observable raised when the block is built
         */
        onBuildObservable: Observable<NodeRenderGraphBlock>;
        /** @internal */
        _inputs: NodeRenderGraphConnectionPoint[];
        /** @internal */
        _outputs: NodeRenderGraphConnectionPoint[];
        /** @internal */
        _codeVariableName: string;
        /** @internal */
        _additionalConstructionParameters: Nullable<unknown[]>;
        /**
         * Gets the list of input points
         */
        get inputs(): NodeRenderGraphConnectionPoint[];
        /** Gets the list of output points */
        get outputs(): NodeRenderGraphConnectionPoint[];
        /**
         * Gets or sets the unique id of the node
         */
        uniqueId: number;
        /**
         * Gets or set the name of the block
         */
        get name(): string;
        set name(value: string);
        /**
         * Gets a boolean indicating if this block is an input
         */
        get isInput(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport out
         */
        get isTeleportOut(): boolean;
        /**
         * Gets a boolean indicating if this block is a teleport in
         */
        get isTeleportIn(): boolean;
        /**
         * Gets a boolean indicating if this block is a debug block
         */
        get isDebug(): boolean;
        /**
         * Gets a boolean indicating that this block can only be used once per node render graph
         */
        get isUnique(): boolean;
        /**
         * A free comment about the block
         */
        comments: string;
        /** Gets or sets a boolean indicating that this input can be edited from a collapsed frame */
        visibleOnFrame: boolean;
        /**
         * Gets the current class name e.g. "NodeRenderGraphBlock"
         * @returns the class name
         */
        getClassName(): string;
        protected _inputRename(name: string): string;
        protected _outputRename(name: string): string;
        /**
         * Checks if the current block is an ancestor of a given block
         * @param block defines the potential descendant block to check
         * @returns true if block is a descendant
         */
        isAnAncestorOf(block: NodeRenderGraphBlock): boolean;
        /**
         * Checks if the current block is an ancestor of a given type
         * @param type defines the potential type to check
         * @returns true if block is a descendant
         */
        isAnAncestorOfType(type: string): boolean;
        /**
         * Get the first descendant using a predicate
         * @param predicate defines the predicate to check
         * @returns descendant or null if none found
         */
        getDescendantOfPredicate(predicate: (block: NodeRenderGraphBlock) => boolean): Nullable<NodeRenderGraphBlock>;
        /**
         * Creates a new NodeRenderGraphBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         * @param _additionalConstructionParameters defines additional parameters to pass to the block constructor
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, ..._additionalConstructionParameters: unknown[]);
        /**
         * Register a new input. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param isOptional defines a boolean indicating that this input can be omitted
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerInput(name: string, type: NodeRenderGraphBlockConnectionPointTypes, isOptional?: boolean, point?: NodeRenderGraphConnectionPoint): this;
        /**
         * Register a new output. Must be called inside a block constructor
         * @param name defines the connection point name
         * @param type defines the connection point type
         * @param point an already created connection point. If not provided, create a new one
         * @returns the current block
         */
        registerOutput(name: string, type: NodeRenderGraphBlockConnectionPointTypes, point?: NodeRenderGraphConnectionPoint): this;
        protected _addDependenciesInput(additionalAllowedTypes?: number): NodeRenderGraphConnectionPoint;
        protected _buildBlock(_state: NodeRenderGraphBuildState): void;
        protected _customBuildStep(_state: NodeRenderGraphBuildState): void;
        protected _propagateInputValueToOutput(inputConnectionPoint: NodeRenderGraphConnectionPoint, outputConnectionPoint: NodeRenderGraphConnectionPoint): void;
        /**
         * Build the current node and generate the vertex data
         * @param state defines the current generation state
         * @returns true if already built
         */
        build(state: NodeRenderGraphBuildState): boolean;
        protected _getConnectedTextures(targetConnectedPoint: Nullable<NodeRenderGraphConnectionPoint>): number | number[] | undefined;
        protected _linkConnectionTypes(inputIndex0: number, inputIndex1: number, looseCoupling?: boolean): void;
        /**
         * Initialize the block and prepare the context for build
         */
        initialize(): void;
        /**
         * Lets the block try to connect some inputs automatically
         */
        autoConfigure(): void;
        /**
         * Find an input by its name
         * @param name defines the name of the input to look for
         * @returns the input or null if not found
         */
        getInputByName(name: string): NodeRenderGraphConnectionPoint | null;
        /**
         * Find an output by its name
         * @param name defines the name of the output to look for
         * @returns the output or null if not found
         */
        getOutputByName(name: string): NodeRenderGraphConnectionPoint | null;
        /**
         * Serializes this block in a JSON representation
         * @returns the serialized block object
         */
        serialize(): any;
        /**
         * @internal
         */
        _deserialize(serializationObject: any): void;
        private _deserializePortDisplayNamesAndExposedOnFrame;
        protected _dumpPropertiesCode(): string;
        /**
         * @internal
         */
        _dumpCodeForOutputConnections(alreadyDumped: NodeRenderGraphBlock[]): string;
        /**
         * @internal
         */
        _dumpCode(uniqueNames: string[], alreadyDumped: NodeRenderGraphBlock[]): string;
        /**
         * Clone the current block to a new identical block
         * @returns a copy of the current block
         */
        clone(): NodeRenderGraphBlock | null;
        /**
         * Release resources
         */
        dispose(): void;
    }


    /**
     * Defines a node render graph
     */
    export class NodeRenderGraph {
        private static _BuildIdGenerator;
        private _buildId;
        /** Define the Url to load node editor script */
        static EditorURL: string;
        /** Define the Url to load snippets */
        static SnippetUrl: string;
        /** Description of custom blocks to use in the node render graph editor */
        static CustomBlockDescriptions: INodeRenderGraphCustomBlockDescription[];
        private BJSNODERENDERGRAPHEDITOR;
        /** @returns the inspector from bundle or global */
        private _getGlobalNodeRenderGraphEditor;
        /**
         * Gets or sets data used by visual editor
         * @see https://nrge.babylonjs.com
         */
        editorData: any;
        /**
         * Gets an array of blocks that needs to be serialized even if they are not yet connected
         */
        attachedBlocks: NodeRenderGraphBlock[];
        /**
         * Observable raised before the node render graph is built
         */
        onBeforeBuildObservable: Observable<FrameGraph>;
        /**
         * Observable raised after the node render graph is built
         * Note that this is the same observable as the one in the underlying FrameGraph!
         */
        get onBuildObservable(): Observable<FrameGraph>;
        /**
         * Observable raised when an error is detected
         */
        onBuildErrorObservable: Observable<string>;
        /** Gets or sets the RenderGraphOutputBlock used to gather the final node render graph data */
        outputBlock: Nullable<NodeRenderGraphOutputBlock>;
        /**
         * Snippet ID if the graph was created from the snippet server
         */
        snippetId: string;
        /**
         * The name of the node render graph
         */
        name: string;
        /**
         * A free comment about the graph
         */
        comment: string;
        private readonly _engine;
        private readonly _scene;
        private readonly _resizeObserver;
        private readonly _frameGraph;
        private readonly _options;
        /**
         * Gets the frame graph used by this node render graph
         */
        get frameGraph(): FrameGraph;
        /**
         * Gets the scene used by this node render graph
         * @returns the scene used by this node render graph
         */
        getScene(): Scene;
        /**
         * Gets the options used to create this node render graph
         */
        get options(): Immutable<INodeRenderGraphCreateOptions>;
        /**
         * Creates a new node render graph
         * @param name defines the name of the node render graph
         * @param scene defines the scene to use to execute the graph
         * @param options defines the options to use when creating the graph
         */
        constructor(name: string, scene: Scene, options?: INodeRenderGraphCreateOptions);
        /**
         * Gets the current class name ("NodeRenderGraph")
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets a block by its name
         * @param name defines the name of the block to retrieve
         * @returns the required block or null if not found
         */
        getBlockByName<T extends NodeRenderGraphBlock>(name: string): Nullable<T>;
        /**
         * Get a block using a predicate
         * @param predicate defines the predicate used to find the good candidate
         * @returns the required block or null if not found
         */
        getBlockByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): Nullable<T>;
        /**
         * Get all blocks that match a predicate
         * @param predicate defines the predicate used to find the good candidate(s)
         * @returns the list of blocks found
         */
        getBlocksByPredicate<T extends NodeRenderGraphBlock>(predicate: (block: NodeRenderGraphBlock) => boolean): T[];
        /**
         * Gets the list of input blocks attached to this material
         * @returns an array of InputBlocks
         */
        getInputBlocks(): NodeRenderGraphInputBlock[];
        /**
         * Replaces a camera in all camera input blocks of this node render graph.
         * If the current camera is found in any input block, it is replaced by the new camera,
         * optionally updating the scene's pointer camera and rebuilding the graph.
         * @param currentCamera The camera to replace.
         * @param newCamera The new camera to assign to the matching input blocks.
         * @param updateCameraToUseForPointers If true (default), updates `scene.cameraToUseForPointers` to the new camera when a replacement occurs.
         * @param rebuildGraph If true (default), rebuilds the graph asynchronously after the replacement.
         * @returns A promise that resolves to true if at least one input block was updated, false otherwise.
         */
        replaceCameraAsync(currentCamera: Nullable<Camera>, newCamera: Camera, updateCameraToUseForPointers?: boolean, rebuildGraph?: boolean): Promise<boolean>;
        /**
         * Launch the node render graph editor
         * @param config Define the configuration of the editor
         * @returns a promise fulfilled when the node editor is visible
         */
        edit(config?: INodeRenderGraphEditorOptions): Promise<void>;
        /**
         * Creates the node editor window.
         * @param additionalConfig Additional configuration for the FGE
         */
        private _createNodeEditor;
        /**
         * Build the final list of blocks that will be executed by the "execute" method.
         * It also builds the underlying frame graph unless specified otherwise.
         * @param dontBuildFrameGraph If the underlying frame graph should not be built (default: false)
         * @param waitForReadiness If the method should wait for the frame graph to be ready before resolving (default: true). Note that this parameter has no effect if "dontBuildFrameGraph" is true.
         * @param setAsSceneFrameGraph If the built frame graph must be set as the scene's frame graph (default: true)
         */
        buildAsync(dontBuildFrameGraph?: boolean, waitForReadiness?: boolean, setAsSceneFrameGraph?: boolean): Promise<void>;
        private _autoFillExternalInputs;
        /**
         * Returns a promise that resolves when the node render graph is ready to be executed
         * This method must be called after the graph has been built (NodeRenderGraph.build called)!
         * @param timeStep Time step in ms between retries (default is 16)
         * @param maxTimeout Maximum time in ms to wait for the graph to be ready (default is 10000)
         * @returns The promise that resolves when the graph is ready
         */
        whenReadyAsync(timeStep?: number, maxTimeout?: number): Promise<void>;
        /**
         * Execute the graph (the graph must have been built before!)
         */
        execute(): void;
        private _initializeBlock;
        /**
         * Clear the current graph
         */
        clear(): void;
        /**
         * Remove a block from the current graph
         * @param block defines the block to remove
         */
        removeBlock(block: NodeRenderGraphBlock): void;
        /**
         * Clear the current graph and load a new one from a serialization object
         * @param source defines the JSON representation of the graph
         * @param merge defines whether or not the source must be merged or replace the current content
         */
        parseSerializedObject(source: any, merge?: boolean): void;
        private _restoreConnections;
        /**
         * Generate a string containing the code declaration required to create an equivalent of this node render graph
         * @returns a string
         */
        generateCode(): string;
        private _gatherBlocks;
        /**
         * Clear the current graph and set it to a default state
         */
        setToDefault(): void;
        /**
         * Makes a duplicate of the current node render graph.
         * Note that you should call buildAsync() on the returned graph to make it usable.
         * @param name defines the name to use for the new node render graph
         * @returns the new node render graph
         */
        clone(name: string): NodeRenderGraph;
        /**
         * Serializes this node render graph in a JSON representation
         * @param selectedBlocks defines the list of blocks to save (if null the whole node render graph will be saved)
         * @returns the serialized node render graph object
         */
        serialize(selectedBlocks?: NodeRenderGraphBlock[]): any;
        /**
         * Disposes the resources
         */
        dispose(): void;
        /**
         * Creates a new node render graph set to default basic configuration
         * @param name defines the name of the node render graph
         * @param scene defines the scene to use
         * @param nodeRenderGraphOptions defines options to use when creating the node render graph
         * @returns a new NodeRenderGraph
         */
        static CreateDefaultAsync(name: string, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions): Promise<NodeRenderGraph>;
        /**
         * Creates a node render graph from parsed graph data
         * @param source defines the JSON representation of the node render graph
         * @param scene defines the scene to use
         * @param nodeRenderGraphOptions defines options to use when creating the node render
         * @param skipBuild defines whether to skip building the node render graph (default is true)
         * @returns a new node render graph
         */
        static Parse(source: any, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions, skipBuild?: boolean): NodeRenderGraph;
        /**
         * Creates a node render graph from a snippet saved by the node render graph editor
         * @param snippetId defines the snippet to load
         * @param scene defines the scene to use
         * @param nodeRenderGraphOptions defines options to use when creating the node render graph
         * @param nodeRenderGraph defines a node render graph to update (instead of creating a new one)
         * @param skipBuild defines whether to skip building the node render graph (default is true)
         * @returns a promise that will resolve to the new node render graph
         */
        static ParseFromSnippetAsync(snippetId: string, scene: Scene, nodeRenderGraphOptions?: INodeRenderGraphCreateOptions, nodeRenderGraph?: NodeRenderGraph, skipBuild?: boolean): Promise<NodeRenderGraph>;
    }


    /**
     * Description of a custom block to be used in the node render graph editor
     */
    export interface INodeRenderGraphCustomBlockDescription {
        /** Block name. It will be used as the block name in the left menu of the editor. Spaces must be replaced by underscores in the name. */
        name: string;
        /** Description (tooltip) of the block. */
        description: string;
        /** Category of the block. Spaces must be replaced by underscores in the category name. */
        menu: string;
        /** Factory function to create the block. */
        factory: (frameGraph: FrameGraph, scene: Scene) => NodeRenderGraphBlock;
    }
    /**
     * Interface used to configure the node render graph editor
     */
    export interface INodeRenderGraphEditorOptions {
        /** Define the URL to load node editor script from */
        editorURL?: string;
        /** Additional configuration for the FGE */
        nodeRenderGraphEditorConfig?: {
            backgroundColor?: Color4;
            hostScene?: Scene;
            customBlockDescriptions?: INodeRenderGraphCustomBlockDescription[];
        };
    }
    /**
     * Options that can be passed to the node render graph build method
     */
    export interface INodeRenderGraphCreateOptions {
        /** If true, textures created by the node render graph will be visible in the inspector, for easier debugging (default: false) */
        debugTextures?: boolean;
        /** Rebuild the node render graph when the screen is resized (default: true) */
        rebuildGraphOnEngineResize?: boolean;
        /** Defines if the build should log activity (default: false) */
        verbose?: boolean;
        /** Defines if the autoConfigure method should be called when initializing blocks (default: false) */
        autoConfigure?: boolean;
        /** If true, external inputs like object lists and cameras will be filled with default values, taken from the scene. Note that external textures are not concerned (default: true). */
        autoFillExternalInputs?: boolean;
    }
    /**
     * Defines the kind of connection point for node render graph nodes
     */
    export enum NodeRenderGraphBlockConnectionPointTypes {
        /** General purpose texture */
        Texture = 1,
        /** Back buffer color texture */
        TextureBackBuffer = 2,
        /** Back buffer depth/stencil attachment */
        TextureBackBufferDepthStencilAttachment = 4,
        /** Depth/stencil attachment */
        TextureDepthStencilAttachment = 8,
        /** Depth (in view space) geometry texture */
        TextureViewDepth = 16,
        /** Normal (in view space) geometry texture */
        TextureViewNormal = 32,
        /** Albedo geometry texture */
        TextureAlbedo = 64,
        /** Reflectivity geometry texture */
        TextureReflectivity = 128,
        /** Position (in world space) geometry texture */
        TextureWorldPosition = 256,
        /** Velocity geometry texture */
        TextureVelocity = 512,
        /** Irradiance geometry texture */
        TextureIrradiance = 1024,
        /** Albedo (sqrt) geometry texture */
        TextureAlbedoSqrt = 2048,
        /** Depth (in screen space) geometry texture */
        TextureScreenDepth = 4096,
        /** Normal (in world space) geometry texture */
        TextureWorldNormal = 8192,
        /** Position (in local space) geometry texture */
        TextureLocalPosition = 16384,
        /** Linear velocity geometry texture */
        TextureLinearVelocity = 32768,
        /** Normalied depth (in view space) geometry texture */
        TextureNormalizedViewDepth = 65536,
        /** Bit field for all textures but back buffer depth/stencil */
        TextureAllButBackBufferDepthStencil = 1048571,
        /** Bit field for all textures but back buffer color and depth/stencil */
        TextureAllButBackBuffer = 1048569,
        /** Bit field for all textures */
        TextureAll = 1048575,
        /** Resource container */
        ResourceContainer = 1048576,
        /** Shadow generator */
        ShadowGenerator = 2097152,
        /** Light */
        ShadowLight = 4194304,
        /** Camera */
        Camera = 16777216,
        /** List of objects (meshes, particle systems, sprites) */
        ObjectList = 33554432,
        /** Detect type based on connection */
        AutoDetect = 268435456,
        /** Output type that will be defined by input type */
        BasedOnInput = 536870912,
        /** Undefined */
        Undefined = 1073741824,
        /** Custom object */
        Object = 2147483648,
        /** Bitmask of all types */
        All = 4294967295
    }
    /**
     * Enum used to define the compatibility state between two connection points
     */
    export enum NodeRenderGraphConnectionPointCompatibilityStates {
        /** Points are compatibles */
        Compatible = 0,
        /** Points are incompatible because of their types */
        TypeIncompatible = 1,
        /** Points are incompatible because they are in the same hierarchy **/
        HierarchyIssue = 2
    }
    /**
     * Defines the direction of a connection point
     */
    export enum NodeRenderGraphConnectionPointDirection {
        /** Input */
        Input = 0,
        /** Output */
        Output = 1
    }
    /**
     * Defines the type of a connection point value
     */
    export type NodeRenderGraphBlockConnectionPointValueType = FrameGraphTextureHandle | Camera | FrameGraphObjectList | IShadowLight | FrameGraphShadowGeneratorTask | FrameGraphObjectRendererTask;


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as a resource (textures, buffers) container
     */
    export class NodeRenderGraphResourceContainerBlock extends NodeRenderGraphBlock {
        /**
         * Creates a new NodeRenderGraphResourceContainerBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the resource0 component
         */
        get resource0(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource1 component
         */
        get resource1(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource2 component
         */
        get resource2(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource3 component
         */
        get resource3(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource4 component
         */
        get resource4(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource5 component
         */
        get resource5(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource6 component
         */
        get resource6(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the resource7 component
         */
        get resource7(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
    }
    /**
     * Register side effects for resourceContainerBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterResourceContainerBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import resourceContainerBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to generate the final graph
     */
    export class NodeRenderGraphOutputBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphCopyToBackbufferColorTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphCopyToBackbufferColorTask;
        /**
         * Create a new NodeRenderGraphOutputBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the texture input component
         */
        get texture(): NodeRenderGraphConnectionPoint;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
    }
    /**
     * Register side effects for outputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterOutputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import outputBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block that implements the lighting volume
     */
    export class NodeRenderGraphLightingVolumeBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphLightingVolumeTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphLightingVolumeTask;
        /**
         * Create a new NodeRenderGraphLightingVolumeBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /** Gets or sets the tesselation parameter */
        get tesselation(): number;
        set tesselation(value: number);
        /** Gets or sets the refresh frequency parameter */
        get frequency(): number;
        set frequency(value: number);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the shadow generator input component
         */
        get shadowGenerator(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
        protected _dumpPropertiesCode(): string;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for lightingVolumeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterLightingVolumeBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import lightingVolumeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    export type NodeRenderGraphValueType = InternalTexture | Camera | FrameGraphObjectList | IShadowLight;
    export type NodeRenderGraphInputCreationOptions = FrameGraphTextureCreationOptions;
    /**
     * Block used to expose an input value
     */
    export class NodeRenderGraphInputBlock extends NodeRenderGraphBlock {
        private _storedValue;
        private _type;
        /** Gets an observable raised when the value is changed */
        onValueChangedObservable: Observable<NodeRenderGraphInputBlock>;
        /** Indicates that the input is externally managed */
        isExternal: boolean;
        /** Gets or sets the options to create the input value */
        creationOptions: NodeRenderGraphInputCreationOptions;
        /**
         * Gets or sets the connection point type (default is Undefined)
         */
        get type(): NodeRenderGraphBlockConnectionPointTypes;
        /**
         * Creates a new NodeRenderGraphInputBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         * @param type defines the type of the input (can be set to NodeRenderGraphBlockConnectionPointTypes.Undefined)
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, type?: NodeRenderGraphBlockConnectionPointTypes);
        /**
         * Set the input block to its default value (based on its type)
         */
        setDefaultValue(): void;
        /**
         * Gets or sets the value of that point.
         */
        get value(): Nullable<NodeRenderGraphValueType>;
        set value(value: Nullable<NodeRenderGraphValueType>);
        /**
         * Gets the value as a specific type
         * @returns the value as a specific type
         */
        getTypedValue<T extends NodeRenderGraphValueType>(): T;
        /**
         * Gets the value as an internal texture
         * @returns The internal texture stored in value if value is an internal texture, otherwise null
         */
        getInternalTextureFromValue(): Nullable<InternalTexture>;
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
        /**
         * Check if the block is a texture of any type
         * @returns true if the block is a texture
         */
        isAnyTexture(): boolean;
        /**
         * Gets a boolean indicating that the connection point is the back buffer texture
         * @returns true if the connection point is the back buffer texture
         */
        isBackBuffer(): boolean;
        /**
         * Gets a boolean indicating that the connection point is a depth/stencil attachment texture
         * @returns true if the connection point is a depth/stencil attachment texture
         */
        isBackBufferDepthStencilAttachment(): boolean;
        /**
         * Check if the block is a camera
         * @returns true if the block is a camera
         */
        isCamera(): boolean;
        /**
         * Check if the block is an object list
         * @returns true if the block is an object list
         */
        isObjectList(): boolean;
        /**
         * Check if the block is a shadow light
         * @returns true if the block is a shadow light
         */
        isShadowLight(): boolean;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
        dispose(): void;
        protected _dumpPropertiesCode(): string;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for frameGraphNodeBlocksInputBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFrameGraphNodeBlocksInputBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import inputBlock.pure for tree-shakeable, side-effect-free usage.
     */




    /** This file must only contain pure code and pure imports */
    /**
     * Block used to execute a custom function in the frame graph
     */
    export class NodeRenderGraphExecuteBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphExecuteTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphExecuteTask;
        /**
         * Creates a new NodeRenderGraphExecuteBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets or sets the execute function
         */
        get func(): (context: FrameGraphContext) => void;
        set func(func: (context: FrameGraphContext) => void);
        /**
         * Gets or sets the execute when task disabled function
         */
        get funcDisabled(): ((context: FrameGraphContext) => void) | undefined;
        set funcDisabled(func: ((context: FrameGraphContext) => void) | undefined);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
    }
    /**
     * Register side effects for executeBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterExecuteBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import executeBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used as a pass through
     */
    export class NodeRenderGraphElbowBlock extends NodeRenderGraphBlock {
        /**
         * Creates a new NodeRenderGraphElbowBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the input component
         */
        get input(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
    }
    /**
     * Register side effects for frameGraphNodeBlocksElbowBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterFrameGraphNodeBlocksElbowBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import elbowBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block that culls a list of objects
     */
    export class NodeRenderGraphCullObjectsBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphCullObjectsTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphCullObjectsTask;
        /**
         * Create a new NodeRenderGraphCullObjectsBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the camera input component
         */
        get camera(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the objects input component
         */
        get objects(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
        protected _dumpPropertiesCode(): string;
        serialize(): any;
        _deserialize(serializationObject: any): void;
    }
    /**
     * Register side effects for cullObjectsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterCullObjectsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import cullObjectsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to execute a compute shader in the frame graph
     */
    export class NodeRenderGraphComputeShaderBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphComputeShaderTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphComputeShaderTask;
        /**
         * Creates a new NodeRenderGraphComputeShaderBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         * @param computeShaderPath defines the compute shader path or source
         * @param computeShaderOptions defines the compute shader options
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene, computeShaderPath?: string | IComputeShaderPath, computeShaderOptions?: IComputeShaderOptions);
        private _createTask;
        /**
         * Gets or sets the execute function
         */
        get shaderPath(): string | IComputeShaderPath;
        set shaderPath(path: string | IComputeShaderPath);
        /**
         * Gets or sets the execute when task disabled function
         */
        get shaderOptions(): IComputeShaderOptions;
        set shaderOptions(options: IComputeShaderOptions);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
    }
    /**
     * Register side effects for computeShaderBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterComputeShaderBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import computeShaderBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /**
     * Registers all layer node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphLayersBlocks(): void;
    /**
     * Registers all post-process node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphPostProcessesBlocks(): void;
    /**
     * Registers all rendering node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphRenderingBlocks(): void;
    /**
     * Registers all teleport node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphTeleportBlocks(): void;
    /**
     * Registers all texture node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphTexturesBlocks(): void;
    /**
     * Registers all core (root-level) node render graph blocks for deserialization.
     */
    export function RegisterNodeRenderGraphCoreBlocks(): void;
    /**
     * Registers all node render graph blocks for deserialization.
     * Call this function when you need to deserialize node render graphs from JSON/snippets.
     *
     * This is the tree-shakeable replacement for:
     * ```ts
     * import "@babylonjs/core/FrameGraph/Node/Blocks/index";
     * ```
     */
    export function RegisterAllNodeRenderGraphBlocks(): void;




    /** Pure barrel — re-exports only side-effect-free modules */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to generate mipmaps for a texture
     */
    export class NodeRenderGraphGenerateMipmapsBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphGenerateMipMapsTask;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphGenerateMipMapsTask;
        /**
         * Create a new NodeRenderGraphGenerateMipmapsBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        /**
         * Gets the current class name
         * @returns the class name
         */
        getClassName(): string;
        /**
         * Gets the target input component
         */
        get target(): NodeRenderGraphConnectionPoint;
        /**
         * Gets the output component
         */
        get output(): NodeRenderGraphConnectionPoint;
        protected _buildBlock(state: NodeRenderGraphBuildState): void;
    }
    /**
     * Register side effects for generateMipmapsBlock.
     * Safe to call multiple times; only the first call has an effect.
     */
    export function RegisterGenerateMipmapsBlock(): void;


    /**
     * Re-exports pure implementation and applies runtime side effects.
     * Import generateMipmapsBlock.pure for tree-shakeable, side-effect-free usage.
     */


    /** This file must only contain pure code and pure imports */
    /**
     * Block used to copy a texture
     */
    export class NodeRenderGraphCopyTextureBlock extends NodeRenderGraphBlock {
        protected _frameGraphTask: FrameGraphCopyToTextureTask;
        protected _useCurrentViewport: boolean;
        protected _useFullScreenViewport: boolean;
        protected _viewport: IViewportLike;
        /**
         * Gets the frame graph task associated with this block
         */
        get task(): FrameGraphCopyToTextureTask;
        /**
         * Create a new NodeRenderGraphCopyTextureBlock
         * @param name defines the block name
         * @param frameGraph defines the hosting frame graph
         * @param scene defines the hosting scene
         */
        constructor(name: string, frameGraph: FrameGraph, scene: Scene);
        private _setViewport;
        /** If true, the current viewport will be left unchanged. */
        get useCurrentViewport(): boolean;
        set useCurrentViewport(value: boolean);
        /** If true, a full screen viewport will be used. */
        get useFullScreenViewport(): boolean;
        set useFullScreenViewport(value: boolean);
        /** The viewport to use. */
        get viewport(): IViewportLike;
        set viewport(value: IViewportLike);
        /** The LOD level to copy from the source texture (default: 0). */
        get lodLevel(): number;
        set lodLevel(va