123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408 |
- import type { Nullable } from "../types";
- import type { Scene } from "../scene";
- import type { Matrix } from "../Maths/math.vector";
- import { Vector3 } from "../Maths/math.vector";
- import { Color3 } from "../Maths/math.color";
- import { Node } from "../node";
- import type { AbstractMesh } from "../Meshes/abstractMesh";
- import type { Effect } from "../Materials/effect";
- import { UniformBuffer } from "../Materials/uniformBuffer";
- import type { IShadowGenerator } from "./Shadows/shadowGenerator";
- import type { ISortableLight } from "./lightConstants";
- import type { Camera } from "../Cameras/camera";
- /**
- * 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 declare 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 const id of the point light.
- */
- static readonly LIGHTTYPEID_POINTLIGHT = 0;
- /**
- * Light type const id of the directional light.
- */
- static readonly LIGHTTYPEID_DIRECTIONALLIGHT = 1;
- /**
- * Light type const id of the spot light.
- */
- static readonly LIGHTTYPEID_SPOTLIGHT = 2;
- /**
- * Light type const id of the hemispheric light.
- */
- static readonly LIGHTTYPEID_HEMISPHERICLIGHT = 3;
- /**
- * 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;
- protected _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;
- /**
- * 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
- */
- constructor(name: string, scene?: Scene);
- 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>;
- 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;
- /**
- * 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;
- }
|