@babylonjs/loaders
Version:
For usage documentation please visit https://doc.babylonjs.com/features/featuresDeepDive/importers/loadingFileTypes/.
158 lines (157 loc) • 6.12 kB
TypeScript
import { type Nullable } from "@babylonjs/core/types.js";
import { type Material } from "@babylonjs/core/Materials/material.js";
import { type Scene } from "@babylonjs/core/scene.js";
import { type Texture } from "@babylonjs/core/Materials/Textures/texture.js";
import { Observable } from "@babylonjs/core/Misc/observable.js";
import { type Color4 } from "@babylonjs/core/Maths/math.color.js";
import { type IMaterialLoadingAdapter } from "../materialLoadingAdapter.js";
import { type GLTFLoader } from "../glTFLoader.js";
/**
* Describes a material class and its corresponding loading adapter.
* Passed to TransmissionHelper so it can classify and interact with materials
* independently of any specific loader instance.
*/
export interface ITransmissionHelperMaterialImpl {
/** The material class constructor */
materialClass: typeof Material;
/** The adapter class constructor */
adapterClass: new (material: Material) => IMaterialLoadingAdapter;
}
/**
* @internal
*/
export interface ITransmissionHelperHolder {
/** The transmission helper instance, if created on the scene */
_transmissionHelper: TransmissionHelper | undefined;
}
/**
* Options for the TransmissionHelper.
*/
export interface ITransmissionHelperOptions {
/**
* The size of the render buffers (default: 1024)
*/
renderSize: number;
/**
* The number of samples to use when generating the render target texture for opaque meshes (default: 4)
*/
samples: number;
/**
* Scale to apply when selecting the LOD level to sample the refraction texture (default: 1)
*/
lodGenerationScale: number;
/**
* Offset to apply when selecting the LOD level to sample the refraction texture (default: -4)
*/
lodGenerationOffset: number;
/**
* Type of the refraction render target texture (default: TEXTURETYPE_HALF_FLOAT)
*/
renderTargetTextureType: number;
/**
* Defines if the mipmaps for the refraction render target texture must be generated (default: true)
*/
generateMipmaps: boolean;
/**
* Clear color of the opaque texture. If not provided, use the scene clear color (which will be converted to linear space).
* If provided, should be in linear space
*/
clearColor?: Color4;
}
/**
* A class to handle setting up the rendering of opaque objects to be shown through transmissive objects.
* @internal
*/
export declare class TransmissionHelper {
/**
* Creates the default options for the helper.
* @returns the default options
*/
private static _GetDefaultOptions;
private readonly _scene;
private _options;
private _opaqueRenderTarget;
private _opaqueMeshesCache;
private _transparentMeshesCache;
private _materialObservers;
private readonly _materialImpls;
private readonly _adapterCache;
/**
* This observable will be notified with any error during the creation of the environment,
* mainly texture creation errors.
*/
onErrorObservable: Observable<{
message?: string;
exception?: any;
}>;
private _translucentMaterialIndices;
private _opaqueOnlySubMeshes;
private _savedSubMeshes;
/**
* constructor
* @param options Defines the options we want to customize the helper
* @param scene The scene to add the material to
*/
constructor(options: Partial<ITransmissionHelperOptions>, scene: Scene);
/**
* Registers a material implementation with the helper so it can classify and create
* adapters for materials of that type. Safe to call multiple times with the same
* implementation — duplicates are ignored.
* @param impl The material implementation to register
*/
addMaterialImpl(impl: ITransmissionHelperMaterialImpl): void;
/**
* Updates the helper options.
* @param options the options to update
*/
updateOptions(options: Partial<ITransmissionHelperOptions>): void;
/**
* @returns the opaque render target texture or null if not available.
*/
getOpaqueTarget(): Nullable<Texture>;
private _getOrCreateAdapter;
/**
* Classify a mesh's materials as transparent, opaque, or mixed.
* Sets the refraction background texture on any translucent materials found.
* For mixed MultiMaterial meshes, populates _translucentMaterialIndices so
* their translucent submeshes can be excluded from the opaque render target.
* @param mesh - The mesh to classify
* @returns 'transparent' if all materials are translucent, 'opaque' if none are, 'mixed' if both
*/
private _classifyMeshMaterials;
/**
* Rebuild the cached opaque-only submesh array for a mixed mesh.
* Called when classification changes so the per-frame swap is allocation-free.
* @param mesh - The mesh to rebuild for
* @param translucentIndices - Set of materialIndex values that are translucent
*/
private _rebuildOpaqueOnlySubMeshes;
private _addMesh;
private _removeMesh;
private _parseScene;
private _onMeshMaterialChanged;
/**
* @internal
* Check if the opaque render target has not been disposed and can still be used.
* @returns
*/
_isRenderTargetValid(): boolean;
/**
* @internal
* Setup the render targets according to the specified options.
*/
_setupRenderTargets(): void;
/**
* Dispose all the elements created by the Helper.
*/
dispose(): void;
}
/**
* Ensures a TransmissionHelper exists on the scene and has all of the loader's material
* implementations registered with it. Creates the helper if one does not yet exist on the
* scene, and recreates its render target if it has been disposed. Does nothing when the
* loader's parent has `dontUseTransmissionHelper` set.
* @param loader The glTF loader whose material implementations should be registered
* @param babylonMaterial A material belonging to the scene where the helper should live
*/
export declare function ensureTransmissionHelper(loader: GLTFLoader, babylonMaterial: Material): void;