@zephyr3d/scene 0.9.22 → 0.9.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/joint_dynamics/collision.js +1 -7
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/constraints.js +2 -17
- package/dist/animation/joint_dynamics/constraints.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +2 -20
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +14 -60
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js +3 -3
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/app/app.js +23 -0
- package/dist/app/app.js.map +1 -1
- package/dist/app/scriptregistry.js +16 -53
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -0
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/model.js +22 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/blitter/bilateralblur.js +3 -1
- package/dist/blitter/bilateralblur.js.map +1 -1
- package/dist/blitter/blitter.js +3 -3
- package/dist/blitter/blitter.js.map +1 -1
- package/dist/camera/camera.js +398 -45
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/perspectivecamera.js +69 -2
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +9113 -8740
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/material/blinn.js +1 -1
- package/dist/material/blinn.js.map +1 -1
- package/dist/material/lambert.js +3 -3
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +8 -5
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +17 -10
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +1 -1
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -11
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/brdf.js +44 -12
- package/dist/material/mixins/pbr/brdf.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +149 -14
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/mtoon.js +7 -4
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/pbrblueprint.js +5 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +1 -1
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/pbrsg.js +1 -1
- package/dist/material/pbrsg.js.map +1 -1
- package/dist/material/shader/helper.js +512 -334
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +2 -2
- package/dist/material/skin.js.map +1 -1
- package/dist/material/terrain-cm.js +5 -5
- package/dist/material/terrain-cm.js.map +1 -1
- package/dist/material/water.js +6 -4
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +54 -4
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +41 -0
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/posteffect.js +35 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +7 -6
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/skinsss.js +3 -3
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssgi.js +988 -436
- package/dist/posteffect/ssgi.js.map +1 -1
- package/dist/posteffect/ssr.js +83 -45
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/sss.js +18 -15
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/posteffect/taa.js +5 -4
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +15 -3
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -2
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js +22 -16
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/drawable_mixin.js +8 -5
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +10 -5
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/envlight.js +298 -5
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gpu_picking.js +7 -5
- package/dist/render/gpu_picking.js.map +1 -1
- package/dist/render/hzb.js +28 -19
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +18 -4
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/render_queue.js +37 -4
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +8 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +20 -48
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/device_pool_allocator.js +18 -58
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
- package/dist/render/rendergraph/executor.js +89 -115
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +1 -1
- package/dist/render/rendergraph/frame_graph_context.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
- package/dist/render/rendergraph/history_resource_manager.js +74 -140
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +7 -5
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/rendergraph/render_context.js +19 -0
- package/dist/render/rendergraph/render_context.js.map +1 -0
- package/dist/render/rendergraph/render_pipeline.js +315 -0
- package/dist/render/rendergraph/render_pipeline.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +158 -141
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/scene_render_context.js +267 -0
- package/dist/render/rendergraph/scene_render_context.js.map +1 -0
- package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
- package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
- package/dist/render/rendergraph/types.js +19 -31
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/renderpass.js +3 -3
- package/dist/render/renderpass.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +7 -6
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/render/sky.js +257 -95
- package/dist/render/sky.js.map +1 -1
- package/dist/render/weightedblended_oit.js +4 -3
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/basesprite.js +2 -0
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +10 -0
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +61 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +178 -10
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/meshdrawable.js +89 -2
- package/dist/scene/meshdrawable.js.map +1 -1
- package/dist/scene/msdftext.js +2 -0
- package/dist/scene/msdftext.js.map +1 -1
- package/dist/scene/msdftextsprite.js +2 -0
- package/dist/scene/msdftextsprite.js.map +1 -1
- package/dist/scene/particlesys.js +2 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +34 -1
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/terrain-cm/grass.js +2 -1
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +2 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +2 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/atmosphere.js +5 -4
- package/dist/shaders/atmosphere.js.map +1 -1
- package/dist/shaders/fog.js +10 -3
- package/dist/shaders/fog.js.map +1 -1
- package/dist/shaders/shadow.js +149 -40
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shaders/ssgi_reprojection.js +118 -0
- package/dist/shaders/ssgi_reprojection.js.map +1 -0
- package/dist/shaders/ssr.js +322 -154
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/esm.js +10 -7
- package/dist/shadow/esm.js.map +1 -1
- package/dist/shadow/pcf_opt.js +12 -12
- package/dist/shadow/pcf_opt.js.map +1 -1
- package/dist/shadow/pcf_pd.js +12 -12
- package/dist/shadow/pcf_pd.js.map +1 -1
- package/dist/shadow/pcss.js +16 -11
- package/dist/shadow/pcss.js.map +1 -1
- package/dist/shadow/shadow_impl.js +29 -3
- package/dist/shadow/shadow_impl.js.map +1 -1
- package/dist/shadow/shadowmapper.js +5 -2
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shadow/ssm.js +13 -13
- package/dist/shadow/ssm.js.map +1 -1
- package/dist/shadow/vsm.js +7 -7
- package/dist/shadow/vsm.js.map +1 -1
- package/dist/utility/physical.js +74 -0
- package/dist/utility/physical.js.map +1 -0
- package/dist/utility/rendermipmap.js +2 -2
- package/dist/utility/rendermipmap.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +3 -1
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +3 -1
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +598 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +180 -9
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +43 -3
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +3 -1
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +3 -1
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +3 -1
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +2 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +70 -0
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +3 -1
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +3 -1
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +3 -0
- package/dist/utility/serialization/scene/text.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +3 -1
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/values.js +59 -65
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
package/dist/scene/light.js
CHANGED
|
@@ -4,6 +4,20 @@ import { BoundingBox } from '../utility/bounding_volume.js';
|
|
|
4
4
|
import { ShadowMapper } from '../shadow/shadowmapper.js';
|
|
5
5
|
import { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, LIGHT_TYPE_RECT } from '../values.js';
|
|
6
6
|
|
|
7
|
+
// Cutoff for auto-ranged physical lights; bounds clustered-culling radius.
|
|
8
|
+
const PHYSICAL_LIGHT_CUTOFF_LUX = 0.25;
|
|
9
|
+
/**
|
|
10
|
+
* Pack a light's color and intensity into the shader's `diffuseAndIntensity` vector.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* The color is stored as authored in both lighting modes, matching Filament, which keeps color and
|
|
14
|
+
* intensity strictly separate. Normalizing the color by its luminance (so the photometric value
|
|
15
|
+
* describes total light output regardless of hue) was tried and rejected: a saturated primary has a
|
|
16
|
+
* low Rec.709 luminance, so the division inflates its channels by up to ~13.8x and pushes them out
|
|
17
|
+
* of the half-float range.
|
|
18
|
+
*/ function makeColorIntensity(color, intensity) {
|
|
19
|
+
return new Vector4(color.x, color.y, color.z, intensity);
|
|
20
|
+
}
|
|
7
21
|
/**
|
|
8
22
|
* Base class for any kind of light node
|
|
9
23
|
* @public
|
|
@@ -214,7 +228,6 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
214
228
|
/** @internal */ _onTransformChanged(invalidateLocal) {
|
|
215
229
|
super._onTransformChanged(invalidateLocal);
|
|
216
230
|
this.invalidateUniforms();
|
|
217
|
-
// this._transformCallback(true, false);
|
|
218
231
|
}
|
|
219
232
|
/** Disposes the punctual light node */ onDispose() {
|
|
220
233
|
super.onDispose();
|
|
@@ -227,16 +240,28 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
227
240
|
* @public
|
|
228
241
|
*/ class DirectionalLight extends PunctualLight {
|
|
229
242
|
static _currentSunLight = new WeakMap();
|
|
243
|
+
_illuminance;
|
|
230
244
|
/**
|
|
231
245
|
* Creates an instance of directional light
|
|
232
246
|
* @param scene - The scene to which the light belongs
|
|
233
247
|
*/ constructor(scene){
|
|
234
248
|
super(scene, LIGHT_TYPE_DIRECTIONAL);
|
|
235
249
|
this.intensity = 10;
|
|
250
|
+
this._illuminance = 100000;
|
|
236
251
|
if (!DirectionalLight.getSunLight(scene)) {
|
|
237
252
|
DirectionalLight.setSunLight(scene, this);
|
|
238
253
|
}
|
|
239
254
|
}
|
|
255
|
+
/** Physical illuminance in lux. */ get illuminance() {
|
|
256
|
+
return this._illuminance;
|
|
257
|
+
}
|
|
258
|
+
set illuminance(val) {
|
|
259
|
+
const illuminance = Math.max(0, val);
|
|
260
|
+
if (illuminance !== this._illuminance) {
|
|
261
|
+
this._illuminance = illuminance;
|
|
262
|
+
this.invalidateUniforms();
|
|
263
|
+
}
|
|
264
|
+
}
|
|
240
265
|
static getSunLight(scene) {
|
|
241
266
|
return this._currentSunLight.get(scene)?.get() ?? null;
|
|
242
267
|
}
|
|
@@ -280,7 +305,8 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
280
305
|
const b = this.worldMatrix.getRow(2).scaleBy(-1);
|
|
281
306
|
this._positionRange = new Vector4(a.x, a.y, a.z, -1);
|
|
282
307
|
this._directionCutoff = new Vector4(b.x, b.y, b.z, 0);
|
|
283
|
-
|
|
308
|
+
const physical = this.scene?.lightingMode === 'physical';
|
|
309
|
+
this._diffuseIntensity = makeColorIntensity(this.color, physical ? this.illuminance : this.intensity);
|
|
284
310
|
this._extraParams = new Vector4(0, 0, 0, this.lightType);
|
|
285
311
|
}
|
|
286
312
|
}
|
|
@@ -292,6 +318,7 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
292
318
|
/** @internal */ _diffuseScale;
|
|
293
319
|
/** @internal */ _specularScale;
|
|
294
320
|
/** @internal */ _sourceRadius;
|
|
321
|
+
/** @internal Physical luminous intensity in candela. */ _luminousIntensity;
|
|
295
322
|
/**
|
|
296
323
|
* Creates an instance of point light
|
|
297
324
|
* @param scene - The scene to which the light belongs
|
|
@@ -301,6 +328,7 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
301
328
|
this._diffuseScale = 1;
|
|
302
329
|
this._specularScale = 1;
|
|
303
330
|
this._sourceRadius = 0;
|
|
331
|
+
this._luminousIntensity = 100;
|
|
304
332
|
this.invalidateBoundingVolume();
|
|
305
333
|
}
|
|
306
334
|
/** The range of the light */ get range() {
|
|
@@ -327,6 +355,30 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
327
355
|
set sourceRadius(val) {
|
|
328
356
|
this.setSourceRadius(val);
|
|
329
357
|
}
|
|
358
|
+
/** Physical luminous intensity in candela. */ get luminousIntensity() {
|
|
359
|
+
return this._luminousIntensity;
|
|
360
|
+
}
|
|
361
|
+
set luminousIntensity(val) {
|
|
362
|
+
const intensity = Math.max(0, val);
|
|
363
|
+
if (intensity !== this._luminousIntensity) {
|
|
364
|
+
this._luminousIntensity = intensity;
|
|
365
|
+
this.invalidateUniforms();
|
|
366
|
+
if (this._range <= 0) {
|
|
367
|
+
this.invalidateBoundingVolume();
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* One-sided luminous flux in lumen.
|
|
373
|
+
*
|
|
374
|
+
* @remarks
|
|
375
|
+
* Derived from {@link luminousIntensity} with Filament's point-light conversion, `Φ = 4π·I`.
|
|
376
|
+
*/ get luminousPower() {
|
|
377
|
+
return this._luminousIntensity * 4 * Math.PI;
|
|
378
|
+
}
|
|
379
|
+
set luminousPower(val) {
|
|
380
|
+
this.luminousIntensity = Math.max(0, val) / (4 * Math.PI);
|
|
381
|
+
}
|
|
330
382
|
/**
|
|
331
383
|
* Sets the range of the light
|
|
332
384
|
* @param val - The value to set
|
|
@@ -392,10 +444,16 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
392
444
|
/** @internal */ computeUniforms() {
|
|
393
445
|
const a = this.worldMatrix.getRow(3);
|
|
394
446
|
const b = this.worldMatrix.getRow(2);
|
|
395
|
-
const
|
|
447
|
+
const physical = this.scene?.lightingMode === 'physical';
|
|
448
|
+
const metersPerUnit = this.scene?.metersPerUnit ?? 1;
|
|
449
|
+
// diffuse/specular scales still multiply the shaded result, so the auto-derived influence
|
|
450
|
+
// radius has to account for them. SpotLight has no equivalent scales, hence no such factor.
|
|
451
|
+
const physicalScale = Math.max(this._diffuseScale, this._specularScale);
|
|
452
|
+
const range = this.range <= 0 ? physical ? Math.sqrt(Math.max(0, this.luminousIntensity * physicalScale) / PHYSICAL_LIGHT_CUTOFF_LUX) / metersPerUnit : 32 * Math.sqrt(Math.max(0.0001, this.intensity * physicalScale)) : this.range;
|
|
453
|
+
const resolvedIntensity = physical ? this.luminousIntensity / (metersPerUnit * metersPerUnit) : this.intensity;
|
|
396
454
|
this._positionRange = new Vector4(a.x, a.y, a.z, range);
|
|
397
455
|
this._directionCutoff = new Vector4(b.x, b.y, b.z, -1);
|
|
398
|
-
this._diffuseIntensity =
|
|
456
|
+
this._diffuseIntensity = makeColorIntensity(this.color, resolvedIntensity);
|
|
399
457
|
this._extraParams = new Vector4(this._diffuseScale, this._specularScale, this._sourceRadius, this.lightType);
|
|
400
458
|
}
|
|
401
459
|
}
|
|
@@ -403,8 +461,12 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
403
461
|
* Spot light
|
|
404
462
|
* @public
|
|
405
463
|
*/ class SpotLight extends PunctualLight {
|
|
464
|
+
/** @internal Smallest cone half-angle, matching Filament's 0.5 degree clamp. */ static MIN_CONE_ANGLE = 0.5 * Math.PI / 180;
|
|
406
465
|
/** @internal */ _range;
|
|
407
466
|
/** @internal */ _cutoff;
|
|
467
|
+
/** @internal Physical luminous intensity in candela. */ _luminousIntensity;
|
|
468
|
+
/** @internal Physical inner cone half-angle in radians. */ _innerConeAngle;
|
|
469
|
+
/** @internal Physical outer cone half-angle in radians. */ _outerConeAngle;
|
|
408
470
|
/**
|
|
409
471
|
* Creates an instance of spot light
|
|
410
472
|
* @param scene - The scene to which the light belongs
|
|
@@ -412,6 +474,9 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
412
474
|
super(scene, LIGHT_TYPE_SPOT);
|
|
413
475
|
this._range = 0;
|
|
414
476
|
this._cutoff = Math.cos(Math.PI / 4);
|
|
477
|
+
this._luminousIntensity = 1000;
|
|
478
|
+
this._innerConeAngle = Math.PI / 8;
|
|
479
|
+
this._outerConeAngle = Math.PI / 4;
|
|
415
480
|
this.invalidateBoundingVolume();
|
|
416
481
|
}
|
|
417
482
|
/** The range of the light */ get range() {
|
|
@@ -439,6 +504,73 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
439
504
|
set cutoff(val) {
|
|
440
505
|
this.setCutoff(val);
|
|
441
506
|
}
|
|
507
|
+
/** Physical luminous intensity in candela. */ get luminousIntensity() {
|
|
508
|
+
return this._luminousIntensity;
|
|
509
|
+
}
|
|
510
|
+
set luminousIntensity(val) {
|
|
511
|
+
const intensity = Math.max(0, val);
|
|
512
|
+
if (intensity !== this._luminousIntensity) {
|
|
513
|
+
this._luminousIntensity = intensity;
|
|
514
|
+
this.invalidateUniforms();
|
|
515
|
+
if (this._range <= 0) {
|
|
516
|
+
this.invalidateBoundingVolume();
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* One-sided luminous flux in lumen.
|
|
522
|
+
*
|
|
523
|
+
* @remarks
|
|
524
|
+
* Derived from {@link luminousIntensity} with Filament's focused-spot conversion,
|
|
525
|
+
* `Φ = I · 2π(1 - cos(θouter))`, so authoring in either unit stays consistent.
|
|
526
|
+
*/ get luminousPower() {
|
|
527
|
+
return this._luminousIntensity * SpotLight.luminousPowerPerIntensity(this._outerConeAngle);
|
|
528
|
+
}
|
|
529
|
+
set luminousPower(val) {
|
|
530
|
+
this.luminousIntensity = Math.max(0, val) / SpotLight.luminousPowerPerIntensity(this._outerConeAngle);
|
|
531
|
+
}
|
|
532
|
+
/** @internal Filament focused-spot conversion factor: 2π(1 - cos(θouter)). */ static luminousPowerPerIntensity(outerConeAngle) {
|
|
533
|
+
return Math.max(2 * Math.PI * (1 - Math.cos(outerConeAngle)), 1e-6);
|
|
534
|
+
}
|
|
535
|
+
/** Physical inner cone half-angle in radians. */ get innerConeAngle() {
|
|
536
|
+
return this._innerConeAngle;
|
|
537
|
+
}
|
|
538
|
+
set innerConeAngle(val) {
|
|
539
|
+
// Filament clamps to [0.5 degrees, outer]; the shader's scale/offset also guards inner == outer.
|
|
540
|
+
const angle = Math.max(SpotLight.MIN_CONE_ANGLE, Math.min(Math.abs(val), this._outerConeAngle));
|
|
541
|
+
if (angle !== this._innerConeAngle) {
|
|
542
|
+
this._innerConeAngle = angle;
|
|
543
|
+
this.invalidateUniforms();
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
/** Physical outer cone half-angle in radians. */ get outerConeAngle() {
|
|
547
|
+
return this._outerConeAngle;
|
|
548
|
+
}
|
|
549
|
+
set outerConeAngle(val) {
|
|
550
|
+
// Filament clamps both cone half-angles to [0.5 degrees, 90 degrees].
|
|
551
|
+
const angle = Math.max(SpotLight.MIN_CONE_ANGLE, Math.min(Math.abs(val), Math.PI * 0.5));
|
|
552
|
+
if (angle !== this._outerConeAngle) {
|
|
553
|
+
this._outerConeAngle = angle;
|
|
554
|
+
this._innerConeAngle = Math.min(this._innerConeAngle, angle);
|
|
555
|
+
this.invalidateUniforms();
|
|
556
|
+
this.invalidateBoundingVolume();
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* @internal
|
|
561
|
+
*
|
|
562
|
+
* Cone angle attenuation packed as `(scale, offset)` so the shader evaluates
|
|
563
|
+
* `saturate(cos(theta) * scale + offset)^2`, matching Filament's `getAngleAttenuation`.
|
|
564
|
+
* The `1/1024` floor keeps a degenerate `inner == outer` cone finite instead of dividing by zero.
|
|
565
|
+
*/ getAngleScaleOffset() {
|
|
566
|
+
const cosOuter = Math.cos(this._outerConeAngle);
|
|
567
|
+
const cosInner = Math.cos(Math.min(this._innerConeAngle, this._outerConeAngle));
|
|
568
|
+
const scale = 1 / Math.max(1 / 1024, cosInner - cosOuter);
|
|
569
|
+
return [
|
|
570
|
+
scale,
|
|
571
|
+
-cosOuter * scale
|
|
572
|
+
];
|
|
573
|
+
}
|
|
442
574
|
/**
|
|
443
575
|
* Sets the cutoff of the light
|
|
444
576
|
* @param val - The value to set
|
|
@@ -460,7 +592,7 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
460
592
|
}
|
|
461
593
|
/** @internal */ computeBoundingVolume() {
|
|
462
594
|
const bbox = new BoundingBox();
|
|
463
|
-
const cosCutoff = Math.cos(this._cutoff);
|
|
595
|
+
const cosCutoff = this.scene?.lightingMode === 'physical' ? Math.cos(this._outerConeAngle) : Math.cos(this._cutoff);
|
|
464
596
|
const range = this.positionAndRange.w;
|
|
465
597
|
const r = range / cosCutoff * Math.sqrt(1 - cosCutoff * cosCutoff);
|
|
466
598
|
bbox.minPoint = new Vector3(-r, -r, 0);
|
|
@@ -470,11 +602,18 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
470
602
|
/** @internal */ computeUniforms() {
|
|
471
603
|
const a = this.worldMatrix.getRow(3);
|
|
472
604
|
const b = this.worldMatrix.getRow(2).scaleBy(-1);
|
|
473
|
-
const
|
|
605
|
+
const physical = this.scene?.lightingMode === 'physical';
|
|
606
|
+
const metersPerUnit = this.scene?.metersPerUnit ?? 1;
|
|
607
|
+
const range = this.range <= 0 ? physical ? Math.sqrt(Math.max(0, this.luminousIntensity) / PHYSICAL_LIGHT_CUTOFF_LUX) / metersPerUnit : 32 * Math.sqrt(Math.max(0.0001, this.intensity)) : this.range;
|
|
608
|
+
const resolvedIntensity = physical ? this.luminousIntensity / (metersPerUnit * metersPerUnit) : this.intensity;
|
|
474
609
|
this._positionRange = new Vector4(a.x, a.y, a.z, range);
|
|
475
|
-
this._directionCutoff = new Vector4(b.x, b.y, b.z, this.cutoff);
|
|
476
|
-
this._diffuseIntensity =
|
|
477
|
-
|
|
610
|
+
this._directionCutoff = new Vector4(b.x, b.y, b.z, physical ? Math.cos(this.outerConeAngle) : this.cutoff);
|
|
611
|
+
this._diffuseIntensity = makeColorIntensity(this.color, resolvedIntensity);
|
|
612
|
+
const [angleScale, angleOffset] = physical ? this.getAngleScaleOffset() : [
|
|
613
|
+
0,
|
|
614
|
+
0
|
|
615
|
+
];
|
|
616
|
+
this._extraParams = new Vector4(angleScale, angleOffset, 0, this.lightType);
|
|
478
617
|
}
|
|
479
618
|
}
|
|
480
619
|
/**
|
|
@@ -484,6 +623,7 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
484
623
|
/** @internal */ _range;
|
|
485
624
|
/** @internal */ _width;
|
|
486
625
|
/** @internal */ _height;
|
|
626
|
+
/** @internal Physical luminance in cd/m². */ _luminance;
|
|
487
627
|
/**
|
|
488
628
|
* Creates an instance of rect light
|
|
489
629
|
* @param scene - The scene to which the light belongs
|
|
@@ -492,6 +632,7 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
492
632
|
this._range = 10;
|
|
493
633
|
this._width = 1;
|
|
494
634
|
this._height = 1;
|
|
635
|
+
this._luminance = 100;
|
|
495
636
|
this.invalidateBoundingVolume();
|
|
496
637
|
}
|
|
497
638
|
/** The range of the light */ get range() {
|
|
@@ -538,6 +679,32 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
538
679
|
set height(val) {
|
|
539
680
|
this.setHeight(val);
|
|
540
681
|
}
|
|
682
|
+
/** Physical luminance in cd/m² (nit). */ get luminance() {
|
|
683
|
+
return this._luminance;
|
|
684
|
+
}
|
|
685
|
+
set luminance(val) {
|
|
686
|
+
const luminance = Math.max(0, val);
|
|
687
|
+
if (luminance !== this._luminance) {
|
|
688
|
+
this._luminance = luminance;
|
|
689
|
+
this.invalidateUniforms();
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* One-sided Lambertian luminous flux in lumen.
|
|
694
|
+
*
|
|
695
|
+
* @remarks
|
|
696
|
+
* Derived from {@link luminance}: `phi = L * pi * area`. Named `luminousFlux` rather than
|
|
697
|
+
* `luminousPower` because an area light is authored by its luminance, with flux as the derived
|
|
698
|
+
* convenience; point and spot lights are the other way round.
|
|
699
|
+
*/ get luminousFlux() {
|
|
700
|
+
const metersPerUnit = this.scene?.metersPerUnit ?? 1;
|
|
701
|
+
return this.luminance * Math.PI * this.width * this.height * metersPerUnit * metersPerUnit;
|
|
702
|
+
}
|
|
703
|
+
set luminousFlux(val) {
|
|
704
|
+
const metersPerUnit = this.scene?.metersPerUnit ?? 1;
|
|
705
|
+
const area = this.width * this.height * metersPerUnit * metersPerUnit;
|
|
706
|
+
this.luminance = area > 0 ? Math.max(0, val) / (Math.PI * area) : 0;
|
|
707
|
+
}
|
|
541
708
|
/**
|
|
542
709
|
* Sets the height of the light
|
|
543
710
|
* @param val - The value to set
|
|
@@ -572,7 +739,8 @@ export abstract class AmbientLight extends BaseLight {
|
|
|
572
739
|
const axisY = this.worldMatrix.getRow(1).inplaceNormalize().scaleBy(this._height * 0.5);
|
|
573
740
|
this._positionRange = new Vector4(pos.x, pos.y, pos.z, this.range);
|
|
574
741
|
this._directionCutoff = new Vector4(axisX.x, axisX.y, axisX.z, 0);
|
|
575
|
-
|
|
742
|
+
const physical = this.scene?.lightingMode === 'physical';
|
|
743
|
+
this._diffuseIntensity = makeColorIntensity(this.color, physical ? this.luminance : this.intensity);
|
|
576
744
|
this._extraParams = new Vector4(axisY.x, axisY.y, axisY.z, this.lightType);
|
|
577
745
|
}
|
|
578
746
|
}
|
package/dist/scene/light.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"light.js","sources":["../../src/scene/light.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { ShadowMapper } from '../shadow/shadowmapper';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, LIGHT_TYPE_RECT } from '../values';\r\nimport type { Scene } from './scene';\r\n\r\n/**\r\n * Base class for any kind of light node\r\n * @public\r\n */\r\nexport abstract class BaseLight extends GraphNode {\r\n /** @internal */\r\n protected _type: number;\r\n /** @internal */\r\n protected _intensity: number;\r\n /** @internal */\r\n protected _positionRange: Nullable<Vector4>;\r\n /** @internal */\r\n protected _directionCutoff: Nullable<Vector4>;\r\n /** @internal */\r\n protected _diffuseIntensity: Nullable<Vector4>;\r\n /** @internal */\r\n protected _extraParams: Nullable<Vector4>;\r\n /**\r\n * Creates a light node\r\n * @param scene - The scene to which the light node belongs\r\n * @param type - Type of the light node\r\n */\r\n constructor(scene: Scene, type: number) {\r\n super(scene);\r\n this._intensity = 1;\r\n this._type = type;\r\n this._positionRange = null;\r\n this._directionCutoff = null;\r\n this._diffuseIntensity = null;\r\n this._extraParams = null;\r\n }\r\n /** Gets the light type */\r\n get lightType() {\r\n return this._type;\r\n }\r\n /** Intensity of the light */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this.setIntensity(val);\r\n }\r\n /**\r\n * Position and range of the light\r\n *\r\n * @remarks\r\n * Gets the position in world space of the light.\r\n * Light range is encoded into the W component.\r\n */\r\n get positionAndRange(): Immutable<Vector4> {\r\n if (!this._positionRange) {\r\n this.computeUniforms();\r\n }\r\n return this._positionRange!;\r\n }\r\n /**\r\n * Direction and cutoff of the light\r\n *\r\n * @remarks\r\n * Gets the direction in world space of the light\r\n * Light cutoff (for spot light only) is encoded into the W component.\r\n */\r\n get directionAndCutoff() {\r\n if (!this._directionCutoff) {\r\n this.computeUniforms();\r\n }\r\n return this._directionCutoff!;\r\n }\r\n /**\r\n * Color and intensity of the light\r\n *\r\n * @remarks\r\n * Gets the color of the light.\r\n * Light intensity is encoded into the W component.\r\n */\r\n get diffuseAndIntensity() {\r\n if (!this._diffuseIntensity) {\r\n this.computeUniforms();\r\n }\r\n return this._diffuseIntensity!;\r\n }\r\n /**\r\n * Extra parameters of the light\r\n *\r\n * @remarks\r\n * Custom data for advanced light types.\r\n */\r\n get extraParams() {\r\n if (!this._extraParams) {\r\n this.computeUniforms();\r\n }\r\n return this._extraParams!;\r\n }\r\n /**\r\n * View matrix of the light\r\n *\r\n * @remarks\r\n * The view matrix of the light is used to transform a point\r\n * from the world space to the light space.\r\n */\r\n get viewMatrix(): Immutable<Matrix4x4> {\r\n return this.invWorldMatrix;\r\n }\r\n /**\r\n * Sets the intensity of the light\r\n * @param val - Intensity of the light\r\n * @returns self\r\n */\r\n setIntensity(val: number) {\r\n if (this._intensity !== val) {\r\n this._intensity = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n invalidateUniforms() {\r\n this._positionRange = null;\r\n this._directionCutoff = null;\r\n this._diffuseIntensity = null;\r\n this._extraParams = null;\r\n }\r\n /** {@inheritDoc SceneNode.isLight} */\r\n isLight(): this is BaseLight {\r\n return true;\r\n }\r\n /** {@inheritDoc SceneNode.isPunctualLight} */\r\n isPunctualLight(): this is PunctualLight {\r\n return false;\r\n }\r\n /** returns true if this is a directional light */\r\n isDirectionLight(): this is DirectionalLight {\r\n return false;\r\n }\r\n /** returns true if this is a point light */\r\n isPointLight(): this is PointLight {\r\n return false;\r\n }\r\n /** returns true if this is a spot light */\r\n isSpotLight(): this is SpotLight {\r\n return false;\r\n }\r\n /** returns true if this is a rect light */\r\n isRectLight(): this is RectLight {\r\n return false;\r\n }\r\n /** @internal */\r\n abstract computeUniforms(): void;\r\n}\r\n\r\n/*\r\nexport abstract class AmbientLight extends BaseLight {\r\n constructor(scene: Scene, type: number) {\r\n super(scene, type);\r\n }\r\n isAmbientLight(): this is AmbientLight {\r\n return true;\r\n }\r\n}\r\n*/\r\n\r\n/**\r\n * Base class for any kind of puncual light\r\n * @public\r\n */\r\nexport class PunctualLight extends BaseLight {\r\n /** @internal */\r\n protected _color!: Vector4;\r\n /** @internal */\r\n protected _castShadow!: boolean;\r\n /** @internal */\r\n protected _shadowMapper!: ShadowMapper;\r\n /**\r\n * Creates an instance of punctual light\r\n * @param scene - The scene to which the punctual light belongs\r\n * @param type - The light type\r\n */\r\n constructor(scene: Scene, type: number) {\r\n super(scene, type);\r\n this.ensurePunctualState();\r\n }\r\n /** @internal */\r\n protected ensurePunctualState() {\r\n if (!this._color) {\r\n this._color = Vector4.one();\r\n }\r\n if (this._castShadow == null) {\r\n this._castShadow = false;\r\n }\r\n if (!this._shadowMapper) {\r\n this._shadowMapper = new ShadowMapper(this);\r\n }\r\n }\r\n /** Color of the light */\r\n get color() {\r\n this.ensurePunctualState();\r\n return this._color.clone();\r\n }\r\n set color(color) {\r\n this.setColor(color);\r\n }\r\n /**\r\n * Sets color of the light\r\n * @param color - The color to set\r\n * @returns self\r\n */\r\n setColor(color: Vector4 | Vector3) {\r\n this.ensurePunctualState();\r\n this._color.set(color);\r\n this.invalidateUniforms();\r\n return this;\r\n }\r\n /** Whether this light casts shadows */\r\n get castShadow() {\r\n this.ensurePunctualState();\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this.setCastShadow(b);\r\n }\r\n /**\r\n * Sets whether this light casts shadows\r\n * @param b - true if the light casts shadows\r\n * @returns self\r\n */\r\n setCastShadow(b: boolean): this {\r\n this.ensurePunctualState();\r\n if (this._castShadow !== !!b) {\r\n this._castShadow = !!b;\r\n if (this._castShadow && this.isDirectionLight() && !this.shadow.shadowRegion) {\r\n this.shadow.updateDirectionalShadowRegion(true);\r\n }\r\n }\r\n return this;\r\n }\r\n /** The shadow mapper for this light */\r\n get shadow() {\r\n this.ensurePunctualState();\r\n return this._shadowMapper;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isPunctualLight}\r\n * @override\r\n */\r\n isPunctualLight(): this is PunctualLight {\r\n return true;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.invalidateUniforms();\r\n // this._transformCallback(true, false);\r\n }\r\n /** Disposes the punctual light node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._shadowMapper?.dispose();\r\n }\r\n /** @internal */\r\n computeUniforms() {}\r\n}\r\n\r\n/**\r\n * Directional light\r\n * @public\r\n */\r\nexport class DirectionalLight extends PunctualLight {\r\n private static readonly _currentSunLight: WeakMap<Scene, DWeakRef<DirectionalLight>> = new WeakMap();\r\n /**\r\n * Creates an instance of directional light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_DIRECTIONAL);\r\n this.intensity = 10;\r\n if (!DirectionalLight.getSunLight(scene)) {\r\n DirectionalLight.setSunLight(scene, this);\r\n }\r\n }\r\n static getSunLight(scene: Scene) {\r\n return this._currentSunLight.get(scene)?.get() ?? null;\r\n }\r\n static setSunLight(scene: Scene, light: Nullable<DirectionalLight>) {\r\n if (light && scene !== light.scene) {\r\n throw new Error('setSunLight(): Light does not belongs to scene');\r\n }\r\n const ref = this._currentSunLight.get(scene);\r\n if (!ref) {\r\n this._currentSunLight.set(scene, new DWeakRef(light));\r\n } else {\r\n ref.set(light);\r\n }\r\n }\r\n /**\r\n * true if the light was defined as sun light\r\n *\r\n * @remarks\r\n * Only one directional light will be marked as sun light.\r\n **/\r\n get sunLight(): boolean {\r\n return DirectionalLight.getSunLight(this.scene!) === this;\r\n }\r\n set sunLight(val) {\r\n if (val) {\r\n DirectionalLight.setSunLight(this.scene!, this);\r\n } else if (DirectionalLight.getSunLight(this.scene!) === this) {\r\n DirectionalLight.setSunLight(this.scene!, null);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isDirectionLight}\r\n * @override\r\n */\r\n isDirectionLight(): this is DirectionalLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\r\n this._positionRange = new Vector4(a.x, a.y, a.z, -1);\r\n this._directionCutoff = new Vector4(b.x, b.y, b.z, 0);\r\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\r\n this._extraParams = new Vector4(0, 0, 0, this.lightType);\r\n }\r\n // adapt from DXSDK\r\n /*\r\n private _computeNearAndFar(\r\n frustumMin: Vector3,\r\n frustumMax: Vector3,\r\n aabbLightSpace: Vector3[]\r\n ): [number, number] {\r\n type Triangle = { pt: [Vector3, Vector3, Vector3]; culled: boolean };\r\n function dupTriangle(src: Triangle): Triangle {\r\n return {\r\n pt: [\r\n src.pt[0] ? new Vector3(src.pt[0]) : null,\r\n src.pt[1] ? new Vector3(src.pt[1]) : null,\r\n src.pt[2] ? new Vector3(src.pt[2]) : null\r\n ],\r\n culled: src.culled\r\n };\r\n }\r\n let nearPlane = Number.MAX_VALUE;\r\n let farPlane = -Number.MAX_VALUE;\r\n const triangleList: Triangle[] = Array.from({ length: 16 }).map((val) => ({\r\n pt: [null, null, null],\r\n culled: false\r\n }));\r\n let triangleCount = 1;\r\n triangleList[0].pt[0] = aabbLightSpace[0];\r\n triangleList[0].pt[1] = aabbLightSpace[1];\r\n triangleList[0].pt[2] = aabbLightSpace[2];\r\n const triIndices = [\r\n 0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 0, 2, 4, 2, 4, 6, 1, 3, 5, 3, 5, 7, 0, 1, 4, 1, 4, 5, 2, 3, 6, 3, 6,\r\n 7\r\n ];\r\n const pointPassesCollision: number[] = [0, 0, 0];\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n for (let i = 0; i < 12; i++) {\r\n triangleList[0].pt[0] = aabbLightSpace[triIndices[i * 3 + 0]];\r\n triangleList[0].pt[1] = aabbLightSpace[triIndices[i * 3 + 1]];\r\n triangleList[0].pt[2] = aabbLightSpace[triIndices[i * 3 + 2]];\r\n triangleList[0].culled = false;\r\n triangleCount = 1;\r\n for (let j = 0; j < 4; j++) {\r\n let edge: number, comp: number;\r\n if (j === 0) {\r\n edge = minx;\r\n comp = 0;\r\n } else if (j === 1) {\r\n edge = maxx;\r\n comp = 0;\r\n } else if (j === 2) {\r\n edge = miny;\r\n comp = 1;\r\n } else {\r\n edge = maxy;\r\n comp = 1;\r\n }\r\n let k = 0;\r\n while (k < triangleCount) {\r\n if (!triangleList[k].culled) {\r\n let insideVertCount = 0;\r\n let tempOrder: Vector3 = null;\r\n if (j === 0) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].x > minx) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else if (j === 1) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].x < maxx) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else if (j === 2) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].y > miny) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].y < maxy) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n }\r\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\r\n tempOrder = triangleList[k].pt[0];\r\n triangleList[k].pt[0] = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = tempOrder;\r\n pointPassesCollision[0] = 1;\r\n pointPassesCollision[1] = 0;\r\n }\r\n if (pointPassesCollision[2] && !pointPassesCollision[1]) {\r\n tempOrder = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = triangleList[k].pt[2];\r\n triangleList[k].pt[2] = tempOrder;\r\n pointPassesCollision[1] = 1;\r\n pointPassesCollision[2] = 0;\r\n }\r\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\r\n tempOrder = triangleList[k].pt[0];\r\n triangleList[k].pt[0] = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = tempOrder;\r\n pointPassesCollision[0] = 1;\r\n pointPassesCollision[1] = 0;\r\n }\r\n if (insideVertCount === 0) {\r\n triangleList[k].culled = true;\r\n } else if (insideVertCount === 1) {\r\n triangleList[k].culled = false;\r\n const v0Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[0]);\r\n const v0Tov2 = Vector3.sub(triangleList[k].pt[2], triangleList[k].pt[0]);\r\n const hitPointTimeRatio = edge - triangleList[k].pt[0][comp];\r\n const distanceAlongV1 = hitPointTimeRatio / v0Tov1[comp];\r\n const distanceAloneV2 = hitPointTimeRatio / v0Tov2[comp];\r\n v0Tov1.scaleBy(distanceAlongV1);\r\n v0Tov1.addBy(triangleList[k].pt[0]);\r\n v0Tov2.scaleBy(distanceAloneV2);\r\n v0Tov2.addBy(triangleList[k].pt[0]);\r\n triangleList[k].pt[1] = v0Tov2;\r\n triangleList[k].pt[2] = v0Tov1;\r\n } else if (insideVertCount === 2) {\r\n triangleList[triangleCount] = dupTriangle(triangleList[k + 1]);\r\n triangleList[k].culled = false;\r\n triangleList[k + 1].culled = false;\r\n const v2Tov0 = Vector3.sub(triangleList[k].pt[0], triangleList[k].pt[2]);\r\n const v2Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[2]);\r\n const hitPointTime_2_0 = edge - triangleList[k].pt[2][comp];\r\n const distanceAloneVec_2_0 = hitPointTime_2_0 / v2Tov0[comp];\r\n v2Tov0.scaleBy(distanceAloneVec_2_0);\r\n v2Tov0.addBy(triangleList[k].pt[2]);\r\n triangleList[k + 1].pt[0] = new Vector3(triangleList[k].pt[0]);\r\n triangleList[k + 1].pt[1] = new Vector3(triangleList[k].pt[1]);\r\n triangleList[k + 1].pt[2] = v2Tov0;\r\n const hitPointTime_2_1 = edge - triangleList[k].pt[2][comp];\r\n const distanceAloneVec_2_1 = hitPointTime_2_1 / v2Tov1[comp];\r\n v2Tov1.scaleBy(distanceAloneVec_2_1);\r\n v2Tov1.addBy(triangleList[k].pt[2]);\r\n triangleList[k].pt[0] = new Vector3(triangleList[k + 1].pt[1]);\r\n triangleList[k].pt[1] = new Vector3(triangleList[k + 1].pt[2]);\r\n triangleList[k].pt[2] = v2Tov1;\r\n triangleCount++;\r\n k++;\r\n } else {\r\n triangleList[k].culled = false;\r\n }\r\n }\r\n k++;\r\n }\r\n }\r\n for (let index = 0; index < triangleCount; index++) {\r\n if (!triangleList[index].culled) {\r\n for (let v = 0; v < 3; v++) {\r\n const z = triangleList[index].pt[v].z;\r\n if (nearPlane > z) {\r\n nearPlane = z;\r\n }\r\n if (farPlane < z) {\r\n farPlane = z;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return [nearPlane, farPlane];\r\n }\r\n */\r\n}\r\n\r\n/**\r\n * Point light\r\n * @public\r\n */\r\nexport class PointLight extends PunctualLight {\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _diffuseScale: number;\r\n /** @internal */\r\n protected _specularScale: number;\r\n /** @internal */\r\n protected _sourceRadius: number;\r\n /**\r\n * Creates an instance of point light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_POINT);\r\n this._range = 0;\r\n this._diffuseScale = 1;\r\n this._specularScale = 1;\r\n this._sourceRadius = 0;\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /** Diffuse scale of the point light */\r\n get diffuseScale() {\r\n return this._diffuseScale;\r\n }\r\n set diffuseScale(val: number) {\r\n this.setDiffuseScale(val);\r\n }\r\n /** Specular scale of the point light */\r\n get specularScale() {\r\n return this._specularScale;\r\n }\r\n set specularScale(val: number) {\r\n this.setSpecularScale(val);\r\n }\r\n /** Source radius of the point light */\r\n get sourceRadius() {\r\n return this._sourceRadius;\r\n }\r\n set sourceRadius(val: number) {\r\n this.setSourceRadius(val);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the diffuse scale of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setDiffuseScale(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._diffuseScale !== val) {\r\n this._diffuseScale = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the specular scale of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setSpecularScale(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._specularScale !== val) {\r\n this._specularScale = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the source radius of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setSourceRadius(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._sourceRadius !== val) {\r\n this._sourceRadius = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isPointLight}\r\n * @override\r\n */\r\n isPointLight(): this is PointLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const range = this.positionAndRange.w;\r\n const bbox = new BoundingBox();\r\n bbox.minPoint = new Vector3(-range, -range, -range);\r\n bbox.maxPoint = new Vector3(range, range, range);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2);\r\n const range =\r\n this.range <= 0\r\n ? 32 * Math.sqrt(Math.max(0.0001, this.intensity * Math.max(this._diffuseScale, this._specularScale)))\r\n : this.range;\r\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\r\n this._directionCutoff = new Vector4(b.x, b.y, b.z, -1);\r\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\r\n this._extraParams = new Vector4(\r\n this._diffuseScale,\r\n this._specularScale,\r\n this._sourceRadius,\r\n this.lightType\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Spot light\r\n * @public\r\n */\r\nexport class SpotLight extends PunctualLight {\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _cutoff: number;\r\n /**\r\n * Creates an instance of spot light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_SPOT);\r\n this._range = 0;\r\n this._cutoff = Math.cos(Math.PI / 4);\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The cutoff of the light */\r\n get cutoff() {\r\n return this._cutoff;\r\n }\r\n set cutoff(val: number) {\r\n this.setCutoff(val);\r\n }\r\n /**\r\n * Sets the cutoff of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setCutoff(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._cutoff !== val) {\r\n this._cutoff = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isSpotLight}\r\n * @override\r\n */\r\n isSpotLight(): this is SpotLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bbox = new BoundingBox();\r\n const cosCutoff = Math.cos(this._cutoff);\r\n const range = this.positionAndRange.w;\r\n const r = (range / cosCutoff) * Math.sqrt(1 - cosCutoff * cosCutoff);\r\n bbox.minPoint = new Vector3(-r, -r, 0);\r\n bbox.maxPoint = new Vector3(r, r, range);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\r\n const range = this.range <= 0 ? 32 * Math.sqrt(Math.max(0.0001, this.intensity)) : this.range;\r\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\r\n this._directionCutoff = new Vector4(b.x, b.y, b.z, this.cutoff);\r\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\r\n this._extraParams = new Vector4(0, 0, 0, this.lightType);\r\n }\r\n}\r\n\r\n/**\r\n * Rectangular area light\r\n * @public\r\n */\r\nexport class RectLight extends PunctualLight {\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _width: number;\r\n /** @internal */\r\n protected _height: number;\r\n /**\r\n * Creates an instance of rect light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_RECT);\r\n this._range = 10;\r\n this._width = 1;\r\n this._height = 1;\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The width of the light */\r\n get width() {\r\n return this._width;\r\n }\r\n set width(val: number) {\r\n this.setWidth(val);\r\n }\r\n /**\r\n * Sets the width of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setWidth(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._width !== val) {\r\n this._width = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The height of the light */\r\n get height() {\r\n return this._height;\r\n }\r\n set height(val: number) {\r\n this.setHeight(val);\r\n }\r\n /**\r\n * Sets the height of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setHeight(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._height !== val) {\r\n this._height = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isRectLight}\r\n * @override\r\n */\r\n isRectLight(): this is RectLight {\r\n return true;\r\n }\r\n /**\r\n * Rect light supports shadow in current pipeline\r\n */\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bbox = new BoundingBox();\r\n const r = this._range;\r\n bbox.minPoint = new Vector3(-r, -r, -r);\r\n bbox.maxPoint = new Vector3(r, r, r);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const pos = this.worldMatrix.getRow(3);\r\n const axisX = this.worldMatrix\r\n .getRow(0)\r\n .inplaceNormalize()\r\n .scaleBy(this._width * 0.5);\r\n const axisY = this.worldMatrix\r\n .getRow(1)\r\n .inplaceNormalize()\r\n .scaleBy(this._height * 0.5);\r\n this._positionRange = new Vector4(pos.x, pos.y, pos.z, this.range);\r\n this._directionCutoff = new Vector4(axisX.x, axisX.y, axisX.z, 0);\r\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\r\n this._extraParams = new Vector4(axisY.x, axisY.y, axisY.z, this.lightType);\r\n }\r\n}\r\n"],"names":["BaseLight","GraphNode","scene","type","_intensity","_type","_positionRange","_directionCutoff","_diffuseIntensity","_extraParams","lightType","intensity","val","setIntensity","positionAndRange","computeUniforms","directionAndCutoff","diffuseAndIntensity","extraParams","viewMatrix","invWorldMatrix","invalidateUniforms","isLight","isPunctualLight","isDirectionLight","isPointLight","isSpotLight","isRectLight","PunctualLight","ensurePunctualState","_color","Vector4","one","_castShadow","_shadowMapper","ShadowMapper","color","clone","setColor","set","castShadow","b","setCastShadow","shadow","shadowRegion","updateDirectionalShadowRegion","_onTransformChanged","invalidateLocal","onDispose","dispose","DirectionalLight","_currentSunLight","WeakMap","LIGHT_TYPE_DIRECTIONAL","getSunLight","setSunLight","get","light","Error","ref","DWeakRef","sunLight","computeBoundingVolume","a","worldMatrix","getRow","scaleBy","x","y","z","PointLight","LIGHT_TYPE_POINT","_range","_diffuseScale","_specularScale","_sourceRadius","invalidateBoundingVolume","range","setRange","diffuseScale","setDiffuseScale","specularScale","setSpecularScale","sourceRadius","setSourceRadius","w","bbox","BoundingBox","minPoint","Vector3","maxPoint","Math","sqrt","max","SpotLight","LIGHT_TYPE_SPOT","_cutoff","cos","PI","cutoff","setCutoff","cosCutoff","r","RectLight","LIGHT_TYPE_RECT","_width","_height","width","setWidth","height","setHeight","pos","axisX","inplaceNormalize","axisY"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"light.js","sources":["../../src/scene/light.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, DWeakRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { ShadowMapper } from '../shadow/shadowmapper';\r\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, LIGHT_TYPE_RECT } from '../values';\r\nimport type { Scene } from './scene';\r\n\r\n// Cutoff for auto-ranged physical lights; bounds clustered-culling radius.\r\nconst PHYSICAL_LIGHT_CUTOFF_LUX = 0.25;\r\n\r\n/**\r\n * Pack a light's color and intensity into the shader's `diffuseAndIntensity` vector.\r\n *\r\n * @remarks\r\n * The color is stored as authored in both lighting modes, matching Filament, which keeps color and\r\n * intensity strictly separate. Normalizing the color by its luminance (so the photometric value\r\n * describes total light output regardless of hue) was tried and rejected: a saturated primary has a\r\n * low Rec.709 luminance, so the division inflates its channels by up to ~13.8x and pushes them out\r\n * of the half-float range.\r\n */\r\nfunction makeColorIntensity(color: Vector4, intensity: number): Vector4 {\r\n return new Vector4(color.x, color.y, color.z, intensity);\r\n}\r\n\r\n/**\r\n * Base class for any kind of light node\r\n * @public\r\n */\r\nexport abstract class BaseLight extends GraphNode {\r\n /** @internal */\r\n protected _type: number;\r\n /** @internal */\r\n protected _intensity: number;\r\n /** @internal */\r\n protected _positionRange: Nullable<Vector4>;\r\n /** @internal */\r\n protected _directionCutoff: Nullable<Vector4>;\r\n /** @internal */\r\n protected _diffuseIntensity: Nullable<Vector4>;\r\n /** @internal */\r\n protected _extraParams: Nullable<Vector4>;\r\n /**\r\n * Creates a light node\r\n * @param scene - The scene to which the light node belongs\r\n * @param type - Type of the light node\r\n */\r\n constructor(scene: Scene, type: number) {\r\n super(scene);\r\n this._intensity = 1;\r\n this._type = type;\r\n this._positionRange = null;\r\n this._directionCutoff = null;\r\n this._diffuseIntensity = null;\r\n this._extraParams = null;\r\n }\r\n /** Gets the light type */\r\n get lightType() {\r\n return this._type;\r\n }\r\n /** Intensity of the light */\r\n get intensity() {\r\n return this._intensity;\r\n }\r\n set intensity(val) {\r\n this.setIntensity(val);\r\n }\r\n /**\r\n * Position and range of the light\r\n *\r\n * @remarks\r\n * Gets the position in world space of the light.\r\n * Light range is encoded into the W component.\r\n */\r\n get positionAndRange(): Immutable<Vector4> {\r\n if (!this._positionRange) {\r\n this.computeUniforms();\r\n }\r\n return this._positionRange!;\r\n }\r\n /**\r\n * Direction and cutoff of the light\r\n *\r\n * @remarks\r\n * Gets the direction in world space of the light\r\n * Light cutoff (for spot light only) is encoded into the W component.\r\n */\r\n get directionAndCutoff() {\r\n if (!this._directionCutoff) {\r\n this.computeUniforms();\r\n }\r\n return this._directionCutoff!;\r\n }\r\n /**\r\n * Color and intensity of the light\r\n *\r\n * @remarks\r\n * Gets the color of the light.\r\n * Light intensity is encoded into the W component.\r\n */\r\n get diffuseAndIntensity() {\r\n if (!this._diffuseIntensity) {\r\n this.computeUniforms();\r\n }\r\n return this._diffuseIntensity!;\r\n }\r\n /**\r\n * Extra parameters of the light\r\n *\r\n * @remarks\r\n * Custom data for advanced light types.\r\n */\r\n get extraParams() {\r\n if (!this._extraParams) {\r\n this.computeUniforms();\r\n }\r\n return this._extraParams!;\r\n }\r\n /**\r\n * View matrix of the light\r\n *\r\n * @remarks\r\n * The view matrix of the light is used to transform a point\r\n * from the world space to the light space.\r\n */\r\n get viewMatrix(): Immutable<Matrix4x4> {\r\n return this.invWorldMatrix;\r\n }\r\n /**\r\n * Sets the intensity of the light\r\n * @param val - Intensity of the light\r\n * @returns self\r\n */\r\n setIntensity(val: number) {\r\n if (this._intensity !== val) {\r\n this._intensity = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /** @internal */\r\n invalidateUniforms() {\r\n this._positionRange = null;\r\n this._directionCutoff = null;\r\n this._diffuseIntensity = null;\r\n this._extraParams = null;\r\n }\r\n /** {@inheritDoc SceneNode.isLight} */\r\n isLight(): this is BaseLight {\r\n return true;\r\n }\r\n /** {@inheritDoc SceneNode.isPunctualLight} */\r\n isPunctualLight(): this is PunctualLight {\r\n return false;\r\n }\r\n /** returns true if this is a directional light */\r\n isDirectionLight(): this is DirectionalLight {\r\n return false;\r\n }\r\n /** returns true if this is a point light */\r\n isPointLight(): this is PointLight {\r\n return false;\r\n }\r\n /** returns true if this is a spot light */\r\n isSpotLight(): this is SpotLight {\r\n return false;\r\n }\r\n /** returns true if this is a rect light */\r\n isRectLight(): this is RectLight {\r\n return false;\r\n }\r\n /** @internal */\r\n abstract computeUniforms(): void;\r\n}\r\n\r\n/*\r\nexport abstract class AmbientLight extends BaseLight {\r\n constructor(scene: Scene, type: number) {\r\n super(scene, type);\r\n }\r\n isAmbientLight(): this is AmbientLight {\r\n return true;\r\n }\r\n}\r\n*/\r\n\r\n/**\r\n * Base class for any kind of puncual light\r\n * @public\r\n */\r\nexport class PunctualLight extends BaseLight {\r\n /** @internal */\r\n protected _color!: Vector4;\r\n /** @internal */\r\n protected _castShadow!: boolean;\r\n /** @internal */\r\n protected _shadowMapper!: ShadowMapper;\r\n /**\r\n * Creates an instance of punctual light\r\n * @param scene - The scene to which the punctual light belongs\r\n * @param type - The light type\r\n */\r\n constructor(scene: Scene, type: number) {\r\n super(scene, type);\r\n this.ensurePunctualState();\r\n }\r\n /** @internal */\r\n protected ensurePunctualState() {\r\n if (!this._color) {\r\n this._color = Vector4.one();\r\n }\r\n if (this._castShadow == null) {\r\n this._castShadow = false;\r\n }\r\n if (!this._shadowMapper) {\r\n this._shadowMapper = new ShadowMapper(this);\r\n }\r\n }\r\n /** Color of the light */\r\n get color() {\r\n this.ensurePunctualState();\r\n return this._color.clone();\r\n }\r\n set color(color) {\r\n this.setColor(color);\r\n }\r\n /**\r\n * Sets color of the light\r\n * @param color - The color to set\r\n * @returns self\r\n */\r\n setColor(color: Vector4 | Vector3) {\r\n this.ensurePunctualState();\r\n this._color.set(color);\r\n this.invalidateUniforms();\r\n return this;\r\n }\r\n /** Whether this light casts shadows */\r\n get castShadow() {\r\n this.ensurePunctualState();\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this.setCastShadow(b);\r\n }\r\n /**\r\n * Sets whether this light casts shadows\r\n * @param b - true if the light casts shadows\r\n * @returns self\r\n */\r\n setCastShadow(b: boolean): this {\r\n this.ensurePunctualState();\r\n if (this._castShadow !== !!b) {\r\n this._castShadow = !!b;\r\n if (this._castShadow && this.isDirectionLight() && !this.shadow.shadowRegion) {\r\n this.shadow.updateDirectionalShadowRegion(true);\r\n }\r\n }\r\n return this;\r\n }\r\n /** The shadow mapper for this light */\r\n get shadow() {\r\n this.ensurePunctualState();\r\n return this._shadowMapper;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isPunctualLight}\r\n * @override\r\n */\r\n isPunctualLight(): this is PunctualLight {\r\n return true;\r\n }\r\n /** @internal */\r\n protected _onTransformChanged(invalidateLocal: boolean) {\r\n super._onTransformChanged(invalidateLocal);\r\n this.invalidateUniforms();\r\n }\r\n /** Disposes the punctual light node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._shadowMapper?.dispose();\r\n }\r\n /** @internal */\r\n computeUniforms() {}\r\n}\r\n\r\n/**\r\n * Directional light\r\n * @public\r\n */\r\nexport class DirectionalLight extends PunctualLight {\r\n private static readonly _currentSunLight: WeakMap<Scene, DWeakRef<DirectionalLight>> = new WeakMap();\r\n private _illuminance: number;\r\n /**\r\n * Creates an instance of directional light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_DIRECTIONAL);\r\n this.intensity = 10;\r\n this._illuminance = 100000;\r\n if (!DirectionalLight.getSunLight(scene)) {\r\n DirectionalLight.setSunLight(scene, this);\r\n }\r\n }\r\n /** Physical illuminance in lux. */\r\n get illuminance() {\r\n return this._illuminance;\r\n }\r\n set illuminance(val: number) {\r\n const illuminance = Math.max(0, val);\r\n if (illuminance !== this._illuminance) {\r\n this._illuminance = illuminance;\r\n this.invalidateUniforms();\r\n }\r\n }\r\n static getSunLight(scene: Scene) {\r\n return this._currentSunLight.get(scene)?.get() ?? null;\r\n }\r\n static setSunLight(scene: Scene, light: Nullable<DirectionalLight>) {\r\n if (light && scene !== light.scene) {\r\n throw new Error('setSunLight(): Light does not belongs to scene');\r\n }\r\n const ref = this._currentSunLight.get(scene);\r\n if (!ref) {\r\n this._currentSunLight.set(scene, new DWeakRef(light));\r\n } else {\r\n ref.set(light);\r\n }\r\n }\r\n /**\r\n * true if the light was defined as sun light\r\n *\r\n * @remarks\r\n * Only one directional light will be marked as sun light.\r\n **/\r\n get sunLight(): boolean {\r\n return DirectionalLight.getSunLight(this.scene!) === this;\r\n }\r\n set sunLight(val) {\r\n if (val) {\r\n DirectionalLight.setSunLight(this.scene!, this);\r\n } else if (DirectionalLight.getSunLight(this.scene!) === this) {\r\n DirectionalLight.setSunLight(this.scene!, null);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isDirectionLight}\r\n * @override\r\n */\r\n isDirectionLight(): this is DirectionalLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n return null;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\r\n this._positionRange = new Vector4(a.x, a.y, a.z, -1);\r\n this._directionCutoff = new Vector4(b.x, b.y, b.z, 0);\r\n const physical = this.scene?.lightingMode === 'physical';\r\n this._diffuseIntensity = makeColorIntensity(this.color, physical ? this.illuminance : this.intensity);\r\n this._extraParams = new Vector4(0, 0, 0, this.lightType);\r\n }\r\n // adapt from DXSDK\r\n /*\r\n private _computeNearAndFar(\r\n frustumMin: Vector3,\r\n frustumMax: Vector3,\r\n aabbLightSpace: Vector3[]\r\n ): [number, number] {\r\n type Triangle = { pt: [Vector3, Vector3, Vector3]; culled: boolean };\r\n function dupTriangle(src: Triangle): Triangle {\r\n return {\r\n pt: [\r\n src.pt[0] ? new Vector3(src.pt[0]) : null,\r\n src.pt[1] ? new Vector3(src.pt[1]) : null,\r\n src.pt[2] ? new Vector3(src.pt[2]) : null\r\n ],\r\n culled: src.culled\r\n };\r\n }\r\n let nearPlane = Number.MAX_VALUE;\r\n let farPlane = -Number.MAX_VALUE;\r\n const triangleList: Triangle[] = Array.from({ length: 16 }).map((val) => ({\r\n pt: [null, null, null],\r\n culled: false\r\n }));\r\n let triangleCount = 1;\r\n triangleList[0].pt[0] = aabbLightSpace[0];\r\n triangleList[0].pt[1] = aabbLightSpace[1];\r\n triangleList[0].pt[2] = aabbLightSpace[2];\r\n const triIndices = [\r\n 0, 1, 2, 1, 2, 3, 4, 5, 6, 5, 6, 7, 0, 2, 4, 2, 4, 6, 1, 3, 5, 3, 5, 7, 0, 1, 4, 1, 4, 5, 2, 3, 6, 3, 6,\r\n 7\r\n ];\r\n const pointPassesCollision: number[] = [0, 0, 0];\r\n const minx = frustumMin.x;\r\n const maxx = frustumMax.x;\r\n const miny = frustumMin.y;\r\n const maxy = frustumMax.y;\r\n for (let i = 0; i < 12; i++) {\r\n triangleList[0].pt[0] = aabbLightSpace[triIndices[i * 3 + 0]];\r\n triangleList[0].pt[1] = aabbLightSpace[triIndices[i * 3 + 1]];\r\n triangleList[0].pt[2] = aabbLightSpace[triIndices[i * 3 + 2]];\r\n triangleList[0].culled = false;\r\n triangleCount = 1;\r\n for (let j = 0; j < 4; j++) {\r\n let edge: number, comp: number;\r\n if (j === 0) {\r\n edge = minx;\r\n comp = 0;\r\n } else if (j === 1) {\r\n edge = maxx;\r\n comp = 0;\r\n } else if (j === 2) {\r\n edge = miny;\r\n comp = 1;\r\n } else {\r\n edge = maxy;\r\n comp = 1;\r\n }\r\n let k = 0;\r\n while (k < triangleCount) {\r\n if (!triangleList[k].culled) {\r\n let insideVertCount = 0;\r\n let tempOrder: Vector3 = null;\r\n if (j === 0) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].x > minx) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else if (j === 1) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].x < maxx) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else if (j === 2) {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].y > miny) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n } else {\r\n for (let t = 0; t < 3; t++) {\r\n if (triangleList[k].pt[t].y < maxy) {\r\n pointPassesCollision[t] = 1;\r\n } else {\r\n pointPassesCollision[t] = 0;\r\n }\r\n insideVertCount += pointPassesCollision[t];\r\n }\r\n }\r\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\r\n tempOrder = triangleList[k].pt[0];\r\n triangleList[k].pt[0] = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = tempOrder;\r\n pointPassesCollision[0] = 1;\r\n pointPassesCollision[1] = 0;\r\n }\r\n if (pointPassesCollision[2] && !pointPassesCollision[1]) {\r\n tempOrder = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = triangleList[k].pt[2];\r\n triangleList[k].pt[2] = tempOrder;\r\n pointPassesCollision[1] = 1;\r\n pointPassesCollision[2] = 0;\r\n }\r\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\r\n tempOrder = triangleList[k].pt[0];\r\n triangleList[k].pt[0] = triangleList[k].pt[1];\r\n triangleList[k].pt[1] = tempOrder;\r\n pointPassesCollision[0] = 1;\r\n pointPassesCollision[1] = 0;\r\n }\r\n if (insideVertCount === 0) {\r\n triangleList[k].culled = true;\r\n } else if (insideVertCount === 1) {\r\n triangleList[k].culled = false;\r\n const v0Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[0]);\r\n const v0Tov2 = Vector3.sub(triangleList[k].pt[2], triangleList[k].pt[0]);\r\n const hitPointTimeRatio = edge - triangleList[k].pt[0][comp];\r\n const distanceAlongV1 = hitPointTimeRatio / v0Tov1[comp];\r\n const distanceAloneV2 = hitPointTimeRatio / v0Tov2[comp];\r\n v0Tov1.scaleBy(distanceAlongV1);\r\n v0Tov1.addBy(triangleList[k].pt[0]);\r\n v0Tov2.scaleBy(distanceAloneV2);\r\n v0Tov2.addBy(triangleList[k].pt[0]);\r\n triangleList[k].pt[1] = v0Tov2;\r\n triangleList[k].pt[2] = v0Tov1;\r\n } else if (insideVertCount === 2) {\r\n triangleList[triangleCount] = dupTriangle(triangleList[k + 1]);\r\n triangleList[k].culled = false;\r\n triangleList[k + 1].culled = false;\r\n const v2Tov0 = Vector3.sub(triangleList[k].pt[0], triangleList[k].pt[2]);\r\n const v2Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[2]);\r\n const hitPointTime_2_0 = edge - triangleList[k].pt[2][comp];\r\n const distanceAloneVec_2_0 = hitPointTime_2_0 / v2Tov0[comp];\r\n v2Tov0.scaleBy(distanceAloneVec_2_0);\r\n v2Tov0.addBy(triangleList[k].pt[2]);\r\n triangleList[k + 1].pt[0] = new Vector3(triangleList[k].pt[0]);\r\n triangleList[k + 1].pt[1] = new Vector3(triangleList[k].pt[1]);\r\n triangleList[k + 1].pt[2] = v2Tov0;\r\n const hitPointTime_2_1 = edge - triangleList[k].pt[2][comp];\r\n const distanceAloneVec_2_1 = hitPointTime_2_1 / v2Tov1[comp];\r\n v2Tov1.scaleBy(distanceAloneVec_2_1);\r\n v2Tov1.addBy(triangleList[k].pt[2]);\r\n triangleList[k].pt[0] = new Vector3(triangleList[k + 1].pt[1]);\r\n triangleList[k].pt[1] = new Vector3(triangleList[k + 1].pt[2]);\r\n triangleList[k].pt[2] = v2Tov1;\r\n triangleCount++;\r\n k++;\r\n } else {\r\n triangleList[k].culled = false;\r\n }\r\n }\r\n k++;\r\n }\r\n }\r\n for (let index = 0; index < triangleCount; index++) {\r\n if (!triangleList[index].culled) {\r\n for (let v = 0; v < 3; v++) {\r\n const z = triangleList[index].pt[v].z;\r\n if (nearPlane > z) {\r\n nearPlane = z;\r\n }\r\n if (farPlane < z) {\r\n farPlane = z;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return [nearPlane, farPlane];\r\n }\r\n */\r\n}\r\n\r\n/**\r\n * Point light\r\n * @public\r\n */\r\nexport class PointLight extends PunctualLight {\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _diffuseScale: number;\r\n /** @internal */\r\n protected _specularScale: number;\r\n /** @internal */\r\n protected _sourceRadius: number;\r\n /** @internal Physical luminous intensity in candela. */\r\n protected _luminousIntensity: number;\r\n /**\r\n * Creates an instance of point light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_POINT);\r\n this._range = 0;\r\n this._diffuseScale = 1;\r\n this._specularScale = 1;\r\n this._sourceRadius = 0;\r\n this._luminousIntensity = 100;\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /** Diffuse scale of the point light */\r\n get diffuseScale() {\r\n return this._diffuseScale;\r\n }\r\n set diffuseScale(val: number) {\r\n this.setDiffuseScale(val);\r\n }\r\n /** Specular scale of the point light */\r\n get specularScale() {\r\n return this._specularScale;\r\n }\r\n set specularScale(val: number) {\r\n this.setSpecularScale(val);\r\n }\r\n /** Source radius of the point light */\r\n get sourceRadius() {\r\n return this._sourceRadius;\r\n }\r\n set sourceRadius(val: number) {\r\n this.setSourceRadius(val);\r\n }\r\n /** Physical luminous intensity in candela. */\r\n get luminousIntensity() {\r\n return this._luminousIntensity;\r\n }\r\n set luminousIntensity(val: number) {\r\n const intensity = Math.max(0, val);\r\n if (intensity !== this._luminousIntensity) {\r\n this._luminousIntensity = intensity;\r\n this.invalidateUniforms();\r\n if (this._range <= 0) {\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n }\r\n /**\r\n * One-sided luminous flux in lumen.\r\n *\r\n * @remarks\r\n * Derived from {@link luminousIntensity} with Filament's point-light conversion, `Φ = 4π·I`.\r\n */\r\n get luminousPower() {\r\n return this._luminousIntensity * 4 * Math.PI;\r\n }\r\n set luminousPower(val: number) {\r\n this.luminousIntensity = Math.max(0, val) / (4 * Math.PI);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the diffuse scale of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setDiffuseScale(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._diffuseScale !== val) {\r\n this._diffuseScale = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the specular scale of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setSpecularScale(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._specularScale !== val) {\r\n this._specularScale = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * Sets the source radius of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setSourceRadius(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._sourceRadius !== val) {\r\n this._sourceRadius = val;\r\n this.invalidateUniforms();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isPointLight}\r\n * @override\r\n */\r\n isPointLight(): this is PointLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const range = this.positionAndRange.w;\r\n const bbox = new BoundingBox();\r\n bbox.minPoint = new Vector3(-range, -range, -range);\r\n bbox.maxPoint = new Vector3(range, range, range);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2);\r\n const physical = this.scene?.lightingMode === 'physical';\r\n const metersPerUnit = this.scene?.metersPerUnit ?? 1;\r\n // diffuse/specular scales still multiply the shaded result, so the auto-derived influence\r\n // radius has to account for them. SpotLight has no equivalent scales, hence no such factor.\r\n const physicalScale = Math.max(this._diffuseScale, this._specularScale);\r\n const range =\r\n this.range <= 0\r\n ? physical\r\n ? Math.sqrt(Math.max(0, this.luminousIntensity * physicalScale) / PHYSICAL_LIGHT_CUTOFF_LUX) /\r\n metersPerUnit\r\n : 32 * Math.sqrt(Math.max(0.0001, this.intensity * physicalScale))\r\n : this.range;\r\n const resolvedIntensity = physical\r\n ? this.luminousIntensity / (metersPerUnit * metersPerUnit)\r\n : this.intensity;\r\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\r\n this._directionCutoff = new Vector4(b.x, b.y, b.z, -1);\r\n this._diffuseIntensity = makeColorIntensity(this.color, resolvedIntensity);\r\n this._extraParams = new Vector4(\r\n this._diffuseScale,\r\n this._specularScale,\r\n this._sourceRadius,\r\n this.lightType\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Spot light\r\n * @public\r\n */\r\nexport class SpotLight extends PunctualLight {\r\n /** @internal Smallest cone half-angle, matching Filament's 0.5 degree clamp. */\r\n private static readonly MIN_CONE_ANGLE = (0.5 * Math.PI) / 180;\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _cutoff: number;\r\n /** @internal Physical luminous intensity in candela. */\r\n protected _luminousIntensity: number;\r\n /** @internal Physical inner cone half-angle in radians. */\r\n protected _innerConeAngle: number;\r\n /** @internal Physical outer cone half-angle in radians. */\r\n protected _outerConeAngle: number;\r\n /**\r\n * Creates an instance of spot light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_SPOT);\r\n this._range = 0;\r\n this._cutoff = Math.cos(Math.PI / 4);\r\n this._luminousIntensity = 1000;\r\n this._innerConeAngle = Math.PI / 8;\r\n this._outerConeAngle = Math.PI / 4;\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The cutoff of the light */\r\n get cutoff() {\r\n return this._cutoff;\r\n }\r\n set cutoff(val: number) {\r\n this.setCutoff(val);\r\n }\r\n /** Physical luminous intensity in candela. */\r\n get luminousIntensity() {\r\n return this._luminousIntensity;\r\n }\r\n set luminousIntensity(val: number) {\r\n const intensity = Math.max(0, val);\r\n if (intensity !== this._luminousIntensity) {\r\n this._luminousIntensity = intensity;\r\n this.invalidateUniforms();\r\n if (this._range <= 0) {\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n }\r\n /**\r\n * One-sided luminous flux in lumen.\r\n *\r\n * @remarks\r\n * Derived from {@link luminousIntensity} with Filament's focused-spot conversion,\r\n * `Φ = I · 2π(1 - cos(θouter))`, so authoring in either unit stays consistent.\r\n */\r\n get luminousPower() {\r\n return this._luminousIntensity * SpotLight.luminousPowerPerIntensity(this._outerConeAngle);\r\n }\r\n set luminousPower(val: number) {\r\n this.luminousIntensity = Math.max(0, val) / SpotLight.luminousPowerPerIntensity(this._outerConeAngle);\r\n }\r\n /** @internal Filament focused-spot conversion factor: 2π(1 - cos(θouter)). */\r\n private static luminousPowerPerIntensity(outerConeAngle: number) {\r\n return Math.max(2 * Math.PI * (1 - Math.cos(outerConeAngle)), 1e-6);\r\n }\r\n /** Physical inner cone half-angle in radians. */\r\n get innerConeAngle() {\r\n return this._innerConeAngle;\r\n }\r\n set innerConeAngle(val: number) {\r\n // Filament clamps to [0.5 degrees, outer]; the shader's scale/offset also guards inner == outer.\r\n const angle = Math.max(SpotLight.MIN_CONE_ANGLE, Math.min(Math.abs(val), this._outerConeAngle));\r\n if (angle !== this._innerConeAngle) {\r\n this._innerConeAngle = angle;\r\n this.invalidateUniforms();\r\n }\r\n }\r\n /** Physical outer cone half-angle in radians. */\r\n get outerConeAngle() {\r\n return this._outerConeAngle;\r\n }\r\n set outerConeAngle(val: number) {\r\n // Filament clamps both cone half-angles to [0.5 degrees, 90 degrees].\r\n const angle = Math.max(SpotLight.MIN_CONE_ANGLE, Math.min(Math.abs(val), Math.PI * 0.5));\r\n if (angle !== this._outerConeAngle) {\r\n this._outerConeAngle = angle;\r\n this._innerConeAngle = Math.min(this._innerConeAngle, angle);\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /**\r\n * @internal\r\n *\r\n * Cone angle attenuation packed as `(scale, offset)` so the shader evaluates\r\n * `saturate(cos(theta) * scale + offset)^2`, matching Filament's `getAngleAttenuation`.\r\n * The `1/1024` floor keeps a degenerate `inner == outer` cone finite instead of dividing by zero.\r\n */\r\n private getAngleScaleOffset(): [number, number] {\r\n const cosOuter = Math.cos(this._outerConeAngle);\r\n const cosInner = Math.cos(Math.min(this._innerConeAngle, this._outerConeAngle));\r\n const scale = 1 / Math.max(1 / 1024, cosInner - cosOuter);\r\n return [scale, -cosOuter * scale];\r\n }\r\n /**\r\n * Sets the cutoff of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setCutoff(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._cutoff !== val) {\r\n this._cutoff = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isSpotLight}\r\n * @override\r\n */\r\n isSpotLight(): this is SpotLight {\r\n return true;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bbox = new BoundingBox();\r\n const cosCutoff =\r\n this.scene?.lightingMode === 'physical' ? Math.cos(this._outerConeAngle) : Math.cos(this._cutoff);\r\n const range = this.positionAndRange.w;\r\n const r = (range / cosCutoff) * Math.sqrt(1 - cosCutoff * cosCutoff);\r\n bbox.minPoint = new Vector3(-r, -r, 0);\r\n bbox.maxPoint = new Vector3(r, r, range);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const a = this.worldMatrix.getRow(3);\r\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\r\n const physical = this.scene?.lightingMode === 'physical';\r\n const metersPerUnit = this.scene?.metersPerUnit ?? 1;\r\n const range =\r\n this.range <= 0\r\n ? physical\r\n ? Math.sqrt(Math.max(0, this.luminousIntensity) / PHYSICAL_LIGHT_CUTOFF_LUX) / metersPerUnit\r\n : 32 * Math.sqrt(Math.max(0.0001, this.intensity))\r\n : this.range;\r\n const resolvedIntensity = physical\r\n ? this.luminousIntensity / (metersPerUnit * metersPerUnit)\r\n : this.intensity;\r\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\r\n this._directionCutoff = new Vector4(\r\n b.x,\r\n b.y,\r\n b.z,\r\n physical ? Math.cos(this.outerConeAngle) : this.cutoff\r\n );\r\n this._diffuseIntensity = makeColorIntensity(this.color, resolvedIntensity);\r\n const [angleScale, angleOffset] = physical ? this.getAngleScaleOffset() : [0, 0];\r\n this._extraParams = new Vector4(angleScale, angleOffset, 0, this.lightType);\r\n }\r\n}\r\n\r\n/**\r\n * Rectangular area light\r\n * @public\r\n */\r\nexport class RectLight extends PunctualLight {\r\n /** @internal */\r\n protected _range: number;\r\n /** @internal */\r\n protected _width: number;\r\n /** @internal */\r\n protected _height: number;\r\n /** @internal Physical luminance in cd/m². */\r\n protected _luminance: number;\r\n /**\r\n * Creates an instance of rect light\r\n * @param scene - The scene to which the light belongs\r\n */\r\n constructor(scene: Scene) {\r\n super(scene, LIGHT_TYPE_RECT);\r\n this._range = 10;\r\n this._width = 1;\r\n this._height = 1;\r\n this._luminance = 100;\r\n this.invalidateBoundingVolume();\r\n }\r\n /** The range of the light */\r\n get range() {\r\n return this._range;\r\n }\r\n set range(val: number) {\r\n this.setRange(val);\r\n }\r\n /**\r\n * Sets the range of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setRange(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._range !== val) {\r\n this._range = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The width of the light */\r\n get width() {\r\n return this._width;\r\n }\r\n set width(val: number) {\r\n this.setWidth(val);\r\n }\r\n /**\r\n * Sets the width of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setWidth(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._width !== val) {\r\n this._width = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /** The height of the light */\r\n get height() {\r\n return this._height;\r\n }\r\n set height(val: number) {\r\n this.setHeight(val);\r\n }\r\n /** Physical luminance in cd/m² (nit). */\r\n get luminance() {\r\n return this._luminance;\r\n }\r\n set luminance(val: number) {\r\n const luminance = Math.max(0, val);\r\n if (luminance !== this._luminance) {\r\n this._luminance = luminance;\r\n this.invalidateUniforms();\r\n }\r\n }\r\n /**\r\n * One-sided Lambertian luminous flux in lumen.\r\n *\r\n * @remarks\r\n * Derived from {@link luminance}: `phi = L * pi * area`. Named `luminousFlux` rather than\r\n * `luminousPower` because an area light is authored by its luminance, with flux as the derived\r\n * convenience; point and spot lights are the other way round.\r\n */\r\n get luminousFlux() {\r\n const metersPerUnit = this.scene?.metersPerUnit ?? 1;\r\n return this.luminance * Math.PI * this.width * this.height * metersPerUnit * metersPerUnit;\r\n }\r\n set luminousFlux(val: number) {\r\n const metersPerUnit = this.scene?.metersPerUnit ?? 1;\r\n const area = this.width * this.height * metersPerUnit * metersPerUnit;\r\n this.luminance = area > 0 ? Math.max(0, val) / (Math.PI * area) : 0;\r\n }\r\n /**\r\n * Sets the height of the light\r\n * @param val - The value to set\r\n * @returns self\r\n */\r\n setHeight(val: number) {\r\n val = val < 0 ? 0 : val;\r\n if (this._height !== val) {\r\n this._height = val;\r\n this.invalidateUniforms();\r\n this.invalidateBoundingVolume();\r\n }\r\n return this;\r\n }\r\n /**\r\n * {@inheritDoc BaseLight.isRectLight}\r\n * @override\r\n */\r\n isRectLight(): this is RectLight {\r\n return true;\r\n }\r\n /**\r\n * Rect light supports shadow in current pipeline\r\n */\r\n /** @internal */\r\n computeBoundingVolume() {\r\n const bbox = new BoundingBox();\r\n const r = this._range;\r\n bbox.minPoint = new Vector3(-r, -r, -r);\r\n bbox.maxPoint = new Vector3(r, r, r);\r\n return bbox;\r\n }\r\n /** @internal */\r\n computeUniforms() {\r\n const pos = this.worldMatrix.getRow(3);\r\n const axisX = this.worldMatrix\r\n .getRow(0)\r\n .inplaceNormalize()\r\n .scaleBy(this._width * 0.5);\r\n const axisY = this.worldMatrix\r\n .getRow(1)\r\n .inplaceNormalize()\r\n .scaleBy(this._height * 0.5);\r\n this._positionRange = new Vector4(pos.x, pos.y, pos.z, this.range);\r\n this._directionCutoff = new Vector4(axisX.x, axisX.y, axisX.z, 0);\r\n const physical = this.scene?.lightingMode === 'physical';\r\n this._diffuseIntensity = makeColorIntensity(this.color, physical ? this.luminance : this.intensity);\r\n this._extraParams = new Vector4(axisY.x, axisY.y, axisY.z, this.lightType);\r\n }\r\n}\r\n"],"names":["PHYSICAL_LIGHT_CUTOFF_LUX","makeColorIntensity","color","intensity","Vector4","x","y","z","BaseLight","GraphNode","scene","type","_intensity","_type","_positionRange","_directionCutoff","_diffuseIntensity","_extraParams","lightType","val","setIntensity","positionAndRange","computeUniforms","directionAndCutoff","diffuseAndIntensity","extraParams","viewMatrix","invWorldMatrix","invalidateUniforms","isLight","isPunctualLight","isDirectionLight","isPointLight","isSpotLight","isRectLight","PunctualLight","ensurePunctualState","_color","one","_castShadow","_shadowMapper","ShadowMapper","clone","setColor","set","castShadow","b","setCastShadow","shadow","shadowRegion","updateDirectionalShadowRegion","_onTransformChanged","invalidateLocal","onDispose","dispose","DirectionalLight","_currentSunLight","WeakMap","_illuminance","LIGHT_TYPE_DIRECTIONAL","getSunLight","setSunLight","illuminance","Math","max","get","light","Error","ref","DWeakRef","sunLight","computeBoundingVolume","a","worldMatrix","getRow","scaleBy","physical","lightingMode","PointLight","LIGHT_TYPE_POINT","_range","_diffuseScale","_specularScale","_sourceRadius","_luminousIntensity","invalidateBoundingVolume","range","setRange","diffuseScale","setDiffuseScale","specularScale","setSpecularScale","sourceRadius","setSourceRadius","luminousIntensity","luminousPower","PI","w","bbox","BoundingBox","minPoint","Vector3","maxPoint","metersPerUnit","physicalScale","sqrt","resolvedIntensity","SpotLight","MIN_CONE_ANGLE","LIGHT_TYPE_SPOT","_cutoff","cos","_innerConeAngle","_outerConeAngle","cutoff","setCutoff","luminousPowerPerIntensity","outerConeAngle","innerConeAngle","angle","min","abs","cosOuter","cosInner","scale","cosCutoff","r","angleScale","angleOffset","getAngleScaleOffset","RectLight","LIGHT_TYPE_RECT","_width","_height","_luminance","width","setWidth","height","setHeight","luminance","luminousFlux","area","pos","axisX","inplaceNormalize","axisY"],"mappings":"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"}
|