@zephyr3d/scene 0.9.17 → 0.9.19
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 +8 -6
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/morphtargetgrouptrack.js +11 -3
- package/dist/animation/morphtargetgrouptrack.js.map +1 -1
- package/dist/app/scriptregistry.js +124 -6
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/index.d.ts +270 -7
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +11 -5
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mtoon.js +20 -2
- package/dist/material/mtoon.js.map +1 -1
- package/dist/material/shader/helper.js +21 -8
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/skin.js +4 -6
- package/dist/material/skin.js.map +1 -1
- package/dist/material/water.js +1 -1
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/bloom.js +177 -29
- package/dist/posteffect/bloom.js.map +1 -1
- package/dist/posteffect/compositor.js +111 -204
- package/dist/posteffect/compositor.js.map +1 -1
- package/dist/posteffect/motionblur.js +3 -0
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +79 -0
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/skinsss.js +10 -10
- package/dist/posteffect/skinsss.js.map +1 -1
- package/dist/posteffect/ssr.js +247 -16
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/posteffect/taa.js +121 -19
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/posteffect/tonemap.js +6 -6
- package/dist/posteffect/tonemap.js.map +1 -1
- package/dist/render/abuffer_oit.js +2 -1
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/envlight.js +6 -3
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/hzb.js +11 -4
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +7 -15
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/renderer.js +4 -3
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +78 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -0
- package/dist/render/rendergraph/executor.js +41 -11
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +495 -201
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/rendergraph.js +29 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/scene/light.js +146 -146
- package/dist/scene/light.js.map +1 -1
- package/dist/shaders/ssr.js +52 -21
- package/dist/shaders/ssr.js.map +1 -1
- package/dist/shadow/shadowmapper.js +95 -95
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/utility/misc.js +10 -1
- package/dist/utility/misc.js.map +1 -1
- package/dist/utility/serialization/manager.js +2 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +36 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/package.json +2 -2
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';\nimport { Vector3, Vector4, DWeakRef } from '@zephyr3d/base';\nimport { GraphNode } from './graph_node';\nimport { BoundingBox } from '../utility/bounding_volume';\nimport { ShadowMapper } from '../shadow/shadowmapper';\nimport { LIGHT_TYPE_DIRECTIONAL, LIGHT_TYPE_POINT, LIGHT_TYPE_SPOT, LIGHT_TYPE_RECT } from '../values';\nimport type { Scene } from './scene';\n\n/**\n * Base class for any kind of light node\n * @public\n */\nexport abstract class BaseLight extends GraphNode {\n /** @internal */\n protected _type: number;\n /** @internal */\n protected _intensity: number;\n /** @internal */\n protected _positionRange: Nullable<Vector4>;\n /** @internal */\n protected _directionCutoff: Nullable<Vector4>;\n /** @internal */\n protected _diffuseIntensity: Nullable<Vector4>;\n /** @internal */\n protected _extraParams: Nullable<Vector4>;\n /**\n * Creates a light node\n * @param scene - The scene to which the light node belongs\n * @param type - Type of the light node\n */\n constructor(scene: Scene, type: number) {\n super(scene);\n this._intensity = 1;\n this._type = type;\n this._positionRange = null;\n this._directionCutoff = null;\n this._diffuseIntensity = null;\n this._extraParams = null;\n }\n /** Gets the light type */\n get lightType() {\n return this._type;\n }\n /** Intensity of the light */\n get intensity() {\n return this._intensity;\n }\n set intensity(val) {\n this.setIntensity(val);\n }\n /**\n * Position and range of the light\n *\n * @remarks\n * Gets the position in world space of the light.\n * Light range is encoded into the W component.\n */\n get positionAndRange(): Immutable<Vector4> {\n if (!this._positionRange) {\n this.computeUniforms();\n }\n return this._positionRange!;\n }\n /**\n * Direction and cutoff of the light\n *\n * @remarks\n * Gets the direction in world space of the light\n * Light cutoff (for spot light only) is encoded into the W component.\n */\n get directionAndCutoff() {\n if (!this._directionCutoff) {\n this.computeUniforms();\n }\n return this._directionCutoff!;\n }\n /**\n * Color and intensity of the light\n *\n * @remarks\n * Gets the color of the light.\n * Light intensity is encoded into the W component.\n */\n get diffuseAndIntensity() {\n if (!this._diffuseIntensity) {\n this.computeUniforms();\n }\n return this._diffuseIntensity!;\n }\n /**\n * Extra parameters of the light\n *\n * @remarks\n * Custom data for advanced light types.\n */\n get extraParams() {\n if (!this._extraParams) {\n this.computeUniforms();\n }\n return this._extraParams!;\n }\n /**\n * View matrix of the light\n *\n * @remarks\n * The view matrix of the light is used to transform a point\n * from the world space to the light space.\n */\n get viewMatrix(): Immutable<Matrix4x4> {\n return this.invWorldMatrix;\n }\n /**\n * Sets the intensity of the light\n * @param val - Intensity of the light\n * @returns self\n */\n setIntensity(val: number) {\n if (this._intensity !== val) {\n this._intensity = val;\n this.invalidateUniforms();\n }\n return this;\n }\n /** @internal */\n invalidateUniforms() {\n this._positionRange = null;\n this._directionCutoff = null;\n this._diffuseIntensity = null;\n this._extraParams = null;\n }\n /** {@inheritDoc SceneNode.isLight} */\n isLight(): this is BaseLight {\n return true;\n }\n /** {@inheritDoc SceneNode.isPunctualLight} */\n isPunctualLight(): this is PunctualLight {\n return false;\n }\n /** returns true if this is a directional light */\n isDirectionLight(): this is DirectionalLight {\n return false;\n }\n /** returns true if this is a point light */\n isPointLight(): this is PointLight {\n return false;\n }\n /** returns true if this is a spot light */\n isSpotLight(): this is SpotLight {\n return false;\n }\n /** returns true if this is a rect light */\n isRectLight(): this is RectLight {\n return false;\n }\n /** @internal */\n abstract computeUniforms(): void;\n}\n\n/*\nexport abstract class AmbientLight extends BaseLight {\n constructor(scene: Scene, type: number) {\n super(scene, type);\n }\n isAmbientLight(): this is AmbientLight {\n return true;\n }\n}\n*/\n\n/**\n * Base class for any kind of puncual light\n * @public\n */\nexport class PunctualLight extends BaseLight {\n /** @internal */\n protected _color!: Vector4;\n /** @internal */\n protected _castShadow!: boolean;\n /** @internal */\n protected _shadowMapper!: ShadowMapper;\n /**\n * Creates an instance of punctual light\n * @param scene - The scene to which the punctual light belongs\n * @param type - The light type\n */\n constructor(scene: Scene, type: number) {\n super(scene, type);\n this.ensurePunctualState();\n }\n /** @internal */\n protected ensurePunctualState() {\n if (!this._color) {\n this._color = Vector4.one();\n }\n if (this._castShadow == null) {\n this._castShadow = false;\n }\n if (!this._shadowMapper) {\n this._shadowMapper = new ShadowMapper(this);\n }\n }\n /** Color of the light */\n get color() {\n this.ensurePunctualState();\n return this._color.clone();\n }\n set color(color) {\n this.setColor(color);\n }\n /**\n * Sets color of the light\n * @param color - The color to set\n * @returns self\n */\n setColor(color: Vector4 | Vector3) {\n this.ensurePunctualState();\n this._color.set(color);\n this.invalidateUniforms();\n return this;\n }\n /** Whether this light casts shadows */\n get castShadow() {\n this.ensurePunctualState();\n return this._castShadow;\n }\n set castShadow(b) {\n this.setCastShadow(b);\n }\n /**\n * Sets whether this light casts shadows\n * @param b - true if the light casts shadows\n * @returns self\n */\n setCastShadow(b: boolean): this {\n this.ensurePunctualState();\n if (this._castShadow !== !!b) {\n this._castShadow = !!b;\n if (this._castShadow && this.isDirectionLight() && !this.shadow.shadowRegion) {\n this.shadow.updateDirectionalShadowRegion(true);\n }\n }\n return this;\n }\n /** The shadow mapper for this light */\n get shadow() {\n this.ensurePunctualState();\n return this._shadowMapper;\n }\n /**\n * {@inheritDoc BaseLight.isPunctualLight}\n * @override\n */\n isPunctualLight(): this is PunctualLight {\n return true;\n }\n /** @internal */\n protected _onTransformChanged(invalidateLocal: boolean) {\n super._onTransformChanged(invalidateLocal);\n this.invalidateUniforms();\n // this._transformCallback(true, false);\n }\n /** Disposes the punctual light node */\n protected onDispose() {\n super.onDispose();\n this._shadowMapper?.dispose();\n }\n /** @internal */\n computeUniforms() {}\n}\n\n/**\n * Directional light\n * @public\n */\nexport class DirectionalLight extends PunctualLight {\n private static readonly _currentSunLight: WeakMap<Scene, DWeakRef<DirectionalLight>> = new WeakMap();\n /**\n * Creates an instance of directional light\n * @param scene - The scene to which the light belongs\n */\n constructor(scene: Scene) {\n super(scene, LIGHT_TYPE_DIRECTIONAL);\n this.intensity = 10;\n if (!DirectionalLight.getSunLight(scene)) {\n DirectionalLight.setSunLight(scene, this);\n }\n }\n static getSunLight(scene: Scene) {\n return this._currentSunLight.get(scene)?.get() ?? null;\n }\n static setSunLight(scene: Scene, light: Nullable<DirectionalLight>) {\n if (light && scene !== light.scene) {\n throw new Error('setSunLight(): Light does not belongs to scene');\n }\n const ref = this._currentSunLight.get(scene);\n if (!ref) {\n this._currentSunLight.set(scene, new DWeakRef(light));\n } else {\n ref.set(light);\n }\n }\n /**\n * true if the light was defined as sun light\n *\n * @remarks\n * Only one directional light will be marked as sun light.\n **/\n get sunLight(): boolean {\n return DirectionalLight.getSunLight(this.scene!) === this;\n }\n set sunLight(val) {\n if (val) {\n DirectionalLight.setSunLight(this.scene!, this);\n } else if (DirectionalLight.getSunLight(this.scene!) === this) {\n DirectionalLight.setSunLight(this.scene!, null);\n }\n }\n /**\n * {@inheritDoc BaseLight.isDirectionLight}\n * @override\n */\n isDirectionLight(): this is DirectionalLight {\n return true;\n }\n /** @internal */\n computeBoundingVolume() {\n return null;\n }\n /** @internal */\n computeUniforms() {\n const a = this.worldMatrix.getRow(3);\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\n this._positionRange = new Vector4(a.x, a.y, a.z, -1);\n this._directionCutoff = new Vector4(b.x, b.y, b.z, 0);\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\n this._extraParams = new Vector4(0, 0, 0, this.lightType);\n }\n // adapt from DXSDK\n /*\n private _computeNearAndFar(\n frustumMin: Vector3,\n frustumMax: Vector3,\n aabbLightSpace: Vector3[]\n ): [number, number] {\n type Triangle = { pt: [Vector3, Vector3, Vector3]; culled: boolean };\n function dupTriangle(src: Triangle): Triangle {\n return {\n pt: [\n src.pt[0] ? new Vector3(src.pt[0]) : null,\n src.pt[1] ? new Vector3(src.pt[1]) : null,\n src.pt[2] ? new Vector3(src.pt[2]) : null\n ],\n culled: src.culled\n };\n }\n let nearPlane = Number.MAX_VALUE;\n let farPlane = -Number.MAX_VALUE;\n const triangleList: Triangle[] = Array.from({ length: 16 }).map((val) => ({\n pt: [null, null, null],\n culled: false\n }));\n let triangleCount = 1;\n triangleList[0].pt[0] = aabbLightSpace[0];\n triangleList[0].pt[1] = aabbLightSpace[1];\n triangleList[0].pt[2] = aabbLightSpace[2];\n const triIndices = [\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,\n 7\n ];\n const pointPassesCollision: number[] = [0, 0, 0];\n const minx = frustumMin.x;\n const maxx = frustumMax.x;\n const miny = frustumMin.y;\n const maxy = frustumMax.y;\n for (let i = 0; i < 12; i++) {\n triangleList[0].pt[0] = aabbLightSpace[triIndices[i * 3 + 0]];\n triangleList[0].pt[1] = aabbLightSpace[triIndices[i * 3 + 1]];\n triangleList[0].pt[2] = aabbLightSpace[triIndices[i * 3 + 2]];\n triangleList[0].culled = false;\n triangleCount = 1;\n for (let j = 0; j < 4; j++) {\n let edge: number, comp: number;\n if (j === 0) {\n edge = minx;\n comp = 0;\n } else if (j === 1) {\n edge = maxx;\n comp = 0;\n } else if (j === 2) {\n edge = miny;\n comp = 1;\n } else {\n edge = maxy;\n comp = 1;\n }\n let k = 0;\n while (k < triangleCount) {\n if (!triangleList[k].culled) {\n let insideVertCount = 0;\n let tempOrder: Vector3 = null;\n if (j === 0) {\n for (let t = 0; t < 3; t++) {\n if (triangleList[k].pt[t].x > minx) {\n pointPassesCollision[t] = 1;\n } else {\n pointPassesCollision[t] = 0;\n }\n insideVertCount += pointPassesCollision[t];\n }\n } else if (j === 1) {\n for (let t = 0; t < 3; t++) {\n if (triangleList[k].pt[t].x < maxx) {\n pointPassesCollision[t] = 1;\n } else {\n pointPassesCollision[t] = 0;\n }\n insideVertCount += pointPassesCollision[t];\n }\n } else if (j === 2) {\n for (let t = 0; t < 3; t++) {\n if (triangleList[k].pt[t].y > miny) {\n pointPassesCollision[t] = 1;\n } else {\n pointPassesCollision[t] = 0;\n }\n insideVertCount += pointPassesCollision[t];\n }\n } else {\n for (let t = 0; t < 3; t++) {\n if (triangleList[k].pt[t].y < maxy) {\n pointPassesCollision[t] = 1;\n } else {\n pointPassesCollision[t] = 0;\n }\n insideVertCount += pointPassesCollision[t];\n }\n }\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\n tempOrder = triangleList[k].pt[0];\n triangleList[k].pt[0] = triangleList[k].pt[1];\n triangleList[k].pt[1] = tempOrder;\n pointPassesCollision[0] = 1;\n pointPassesCollision[1] = 0;\n }\n if (pointPassesCollision[2] && !pointPassesCollision[1]) {\n tempOrder = triangleList[k].pt[1];\n triangleList[k].pt[1] = triangleList[k].pt[2];\n triangleList[k].pt[2] = tempOrder;\n pointPassesCollision[1] = 1;\n pointPassesCollision[2] = 0;\n }\n if (pointPassesCollision[1] && !pointPassesCollision[0]) {\n tempOrder = triangleList[k].pt[0];\n triangleList[k].pt[0] = triangleList[k].pt[1];\n triangleList[k].pt[1] = tempOrder;\n pointPassesCollision[0] = 1;\n pointPassesCollision[1] = 0;\n }\n if (insideVertCount === 0) {\n triangleList[k].culled = true;\n } else if (insideVertCount === 1) {\n triangleList[k].culled = false;\n const v0Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[0]);\n const v0Tov2 = Vector3.sub(triangleList[k].pt[2], triangleList[k].pt[0]);\n const hitPointTimeRatio = edge - triangleList[k].pt[0][comp];\n const distanceAlongV1 = hitPointTimeRatio / v0Tov1[comp];\n const distanceAloneV2 = hitPointTimeRatio / v0Tov2[comp];\n v0Tov1.scaleBy(distanceAlongV1);\n v0Tov1.addBy(triangleList[k].pt[0]);\n v0Tov2.scaleBy(distanceAloneV2);\n v0Tov2.addBy(triangleList[k].pt[0]);\n triangleList[k].pt[1] = v0Tov2;\n triangleList[k].pt[2] = v0Tov1;\n } else if (insideVertCount === 2) {\n triangleList[triangleCount] = dupTriangle(triangleList[k + 1]);\n triangleList[k].culled = false;\n triangleList[k + 1].culled = false;\n const v2Tov0 = Vector3.sub(triangleList[k].pt[0], triangleList[k].pt[2]);\n const v2Tov1 = Vector3.sub(triangleList[k].pt[1], triangleList[k].pt[2]);\n const hitPointTime_2_0 = edge - triangleList[k].pt[2][comp];\n const distanceAloneVec_2_0 = hitPointTime_2_0 / v2Tov0[comp];\n v2Tov0.scaleBy(distanceAloneVec_2_0);\n v2Tov0.addBy(triangleList[k].pt[2]);\n triangleList[k + 1].pt[0] = new Vector3(triangleList[k].pt[0]);\n triangleList[k + 1].pt[1] = new Vector3(triangleList[k].pt[1]);\n triangleList[k + 1].pt[2] = v2Tov0;\n const hitPointTime_2_1 = edge - triangleList[k].pt[2][comp];\n const distanceAloneVec_2_1 = hitPointTime_2_1 / v2Tov1[comp];\n v2Tov1.scaleBy(distanceAloneVec_2_1);\n v2Tov1.addBy(triangleList[k].pt[2]);\n triangleList[k].pt[0] = new Vector3(triangleList[k + 1].pt[1]);\n triangleList[k].pt[1] = new Vector3(triangleList[k + 1].pt[2]);\n triangleList[k].pt[2] = v2Tov1;\n triangleCount++;\n k++;\n } else {\n triangleList[k].culled = false;\n }\n }\n k++;\n }\n }\n for (let index = 0; index < triangleCount; index++) {\n if (!triangleList[index].culled) {\n for (let v = 0; v < 3; v++) {\n const z = triangleList[index].pt[v].z;\n if (nearPlane > z) {\n nearPlane = z;\n }\n if (farPlane < z) {\n farPlane = z;\n }\n }\n }\n }\n }\n return [nearPlane, farPlane];\n }\n */\n}\n\n/**\n * Point light\n * @public\n */\nexport class PointLight extends PunctualLight {\n /** @internal */\n protected _range: number;\n /** @internal */\n protected _diffuseScale: number;\n /** @internal */\n protected _specularScale: number;\n /** @internal */\n protected _sourceRadius: number;\n /**\n * Creates an instance of point light\n * @param scene - The scene to which the light belongs\n */\n constructor(scene: Scene) {\n super(scene, LIGHT_TYPE_POINT);\n this._range = 0;\n this._diffuseScale = 1;\n this._specularScale = 1;\n this._sourceRadius = 0;\n this.invalidateBoundingVolume();\n }\n /** The range of the light */\n get range() {\n return this._range;\n }\n set range(val: number) {\n this.setRange(val);\n }\n /** Diffuse scale of the point light */\n get diffuseScale() {\n return this._diffuseScale;\n }\n set diffuseScale(val: number) {\n this.setDiffuseScale(val);\n }\n /** Specular scale of the point light */\n get specularScale() {\n return this._specularScale;\n }\n set specularScale(val: number) {\n this.setSpecularScale(val);\n }\n /** Source radius of the point light */\n get sourceRadius() {\n return this._sourceRadius;\n }\n set sourceRadius(val: number) {\n this.setSourceRadius(val);\n }\n /**\n * Sets the range of the light\n * @param val - The value to set\n * @returns self\n */\n setRange(val: number) {\n val = val < 0 ? 0 : val;\n if (this._range !== val) {\n this._range = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /**\n * Sets the diffuse scale of the light\n * @param val - The value to set\n * @returns self\n */\n setDiffuseScale(val: number) {\n val = val < 0 ? 0 : val;\n if (this._diffuseScale !== val) {\n this._diffuseScale = val;\n this.invalidateUniforms();\n }\n return this;\n }\n /**\n * Sets the specular scale of the light\n * @param val - The value to set\n * @returns self\n */\n setSpecularScale(val: number) {\n val = val < 0 ? 0 : val;\n if (this._specularScale !== val) {\n this._specularScale = val;\n this.invalidateUniforms();\n }\n return this;\n }\n /**\n * Sets the source radius of the light\n * @param val - The value to set\n * @returns self\n */\n setSourceRadius(val: number) {\n val = val < 0 ? 0 : val;\n if (this._sourceRadius !== val) {\n this._sourceRadius = val;\n this.invalidateUniforms();\n }\n return this;\n }\n /**\n * {@inheritDoc BaseLight.isPointLight}\n * @override\n */\n isPointLight(): this is PointLight {\n return true;\n }\n /** @internal */\n computeBoundingVolume() {\n const range = this.positionAndRange.w;\n const bbox = new BoundingBox();\n bbox.minPoint = new Vector3(-range, -range, -range);\n bbox.maxPoint = new Vector3(range, range, range);\n return bbox;\n }\n /** @internal */\n computeUniforms() {\n const a = this.worldMatrix.getRow(3);\n const b = this.worldMatrix.getRow(2);\n const range =\n this.range <= 0\n ? 32 * Math.sqrt(Math.max(0.0001, this.intensity * Math.max(this._diffuseScale, this._specularScale)))\n : this.range;\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\n this._directionCutoff = new Vector4(b.x, b.y, b.z, -1);\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\n this._extraParams = new Vector4(\n this._diffuseScale,\n this._specularScale,\n this._sourceRadius,\n this.lightType\n );\n }\n}\n\n/**\n * Spot light\n * @public\n */\nexport class SpotLight extends PunctualLight {\n /** @internal */\n protected _range: number;\n /** @internal */\n protected _cutoff: number;\n /**\n * Creates an instance of spot light\n * @param scene - The scene to which the light belongs\n */\n constructor(scene: Scene) {\n super(scene, LIGHT_TYPE_SPOT);\n this._range = 0;\n this._cutoff = Math.cos(Math.PI / 4);\n this.invalidateBoundingVolume();\n }\n /** The range of the light */\n get range() {\n return this._range;\n }\n set range(val: number) {\n this.setRange(val);\n }\n /**\n * Sets the range of the light\n * @param val - The value to set\n * @returns self\n */\n setRange(val: number) {\n val = val < 0 ? 0 : val;\n if (this._range !== val) {\n this._range = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /** The cutoff of the light */\n get cutoff() {\n return this._cutoff;\n }\n set cutoff(val: number) {\n this.setCutoff(val);\n }\n /**\n * Sets the cutoff of the light\n * @param val - The value to set\n * @returns self\n */\n setCutoff(val: number) {\n val = val < 0 ? 0 : val;\n if (this._cutoff !== val) {\n this._cutoff = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /**\n * {@inheritDoc BaseLight.isSpotLight}\n * @override\n */\n isSpotLight(): this is SpotLight {\n return true;\n }\n /** @internal */\n computeBoundingVolume() {\n const bbox = new BoundingBox();\n const cosCutoff = Math.cos(this._cutoff);\n const range = this.positionAndRange.w;\n const r = (range / cosCutoff) * Math.sqrt(1 - cosCutoff * cosCutoff);\n bbox.minPoint = new Vector3(-r, -r, 0);\n bbox.maxPoint = new Vector3(r, r, range);\n return bbox;\n }\n /** @internal */\n computeUniforms() {\n const a = this.worldMatrix.getRow(3);\n const b = this.worldMatrix.getRow(2).scaleBy(-1);\n const range = this.range <= 0 ? 32 * Math.sqrt(Math.max(0.0001, this.intensity)) : this.range;\n this._positionRange = new Vector4(a.x, a.y, a.z, range);\n this._directionCutoff = new Vector4(b.x, b.y, b.z, this.cutoff);\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\n this._extraParams = new Vector4(0, 0, 0, this.lightType);\n }\n}\n\n/**\n * Rectangular area light\n * @public\n */\nexport class RectLight extends PunctualLight {\n /** @internal */\n protected _range: number;\n /** @internal */\n protected _width: number;\n /** @internal */\n protected _height: number;\n /**\n * Creates an instance of rect light\n * @param scene - The scene to which the light belongs\n */\n constructor(scene: Scene) {\n super(scene, LIGHT_TYPE_RECT);\n this._range = 10;\n this._width = 1;\n this._height = 1;\n this.invalidateBoundingVolume();\n }\n /** The range of the light */\n get range() {\n return this._range;\n }\n set range(val: number) {\n this.setRange(val);\n }\n /**\n * Sets the range of the light\n * @param val - The value to set\n * @returns self\n */\n setRange(val: number) {\n val = val < 0 ? 0 : val;\n if (this._range !== val) {\n this._range = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /** The width of the light */\n get width() {\n return this._width;\n }\n set width(val: number) {\n this.setWidth(val);\n }\n /**\n * Sets the width of the light\n * @param val - The value to set\n * @returns self\n */\n setWidth(val: number) {\n val = val < 0 ? 0 : val;\n if (this._width !== val) {\n this._width = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /** The height of the light */\n get height() {\n return this._height;\n }\n set height(val: number) {\n this.setHeight(val);\n }\n /**\n * Sets the height of the light\n * @param val - The value to set\n * @returns self\n */\n setHeight(val: number) {\n val = val < 0 ? 0 : val;\n if (this._height !== val) {\n this._height = val;\n this.invalidateUniforms();\n this.invalidateBoundingVolume();\n }\n return this;\n }\n /**\n * {@inheritDoc BaseLight.isRectLight}\n * @override\n */\n isRectLight(): this is RectLight {\n return true;\n }\n /**\n * Rect light supports shadow in current pipeline\n */\n /** @internal */\n computeBoundingVolume() {\n const bbox = new BoundingBox();\n const r = this._range;\n bbox.minPoint = new Vector3(-r, -r, -r);\n bbox.maxPoint = new Vector3(r, r, r);\n return bbox;\n }\n /** @internal */\n computeUniforms() {\n const pos = this.worldMatrix.getRow(3);\n const axisX = this.worldMatrix\n .getRow(0)\n .inplaceNormalize()\n .scaleBy(this._width * 0.5);\n const axisY = this.worldMatrix\n .getRow(1)\n .inplaceNormalize()\n .scaleBy(this._height * 0.5);\n this._positionRange = new Vector4(pos.x, pos.y, pos.z, this.range);\n this._directionCutoff = new Vector4(axisX.x, axisX.y, axisX.z, 0);\n this._diffuseIntensity = new Vector4(this.color.x, this.color.y, this.color.z, this.intensity);\n this._extraParams = new Vector4(axisY.x, axisY.y, axisY.z, this.lightType);\n }\n}\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/**\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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"}
|
package/dist/shaders/ssr.js
CHANGED
|
@@ -248,7 +248,7 @@ function screenSpaceRayTracing_Linear2D(scope, viewPos, traceRay, viewMatrix, pr
|
|
|
248
248
|
});
|
|
249
249
|
return scope.SSR_Linear2D(viewPos, traceRay, viewMatrix, projMatrix, invProjMatrix, stride, maxDistance, maxIterations, thickness, cameraNearFar, textureSize);
|
|
250
250
|
}
|
|
251
|
-
function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMatrix, invProjMatrix, cameraNearFar, maxMipLevel, maxIterations, thickness, textureSize, HiZTexture, normalTexture) {
|
|
251
|
+
function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMatrix, invProjMatrix, cameraNearFar, maxMipLevel, maxIterations, maxDistance, thickness, textureSize, HiZTexture, normalTexture) {
|
|
252
252
|
const pb = scope.$builder;
|
|
253
253
|
pb.func('getMipResolution', [
|
|
254
254
|
pb.int('mipLevel')
|
|
@@ -314,19 +314,41 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
314
314
|
pb.vec2('floorOffset'),
|
|
315
315
|
pb.vec2('uvOffset'),
|
|
316
316
|
pb.float('surfaceZ'),
|
|
317
|
+
pb.float('surfaceZMax'),
|
|
318
|
+
pb.int('currentMip'),
|
|
317
319
|
pb.vec3('position').inout(),
|
|
318
320
|
pb.float('currentT').inout()
|
|
319
321
|
], function() {
|
|
320
322
|
this.$l.xyPlane = pb.add(pb.floor(this.currentMipPosition), this.floorOffset);
|
|
321
323
|
this.xyPlane = pb.add(pb.mul(this.xyPlane, this.invCurrentMipResolution), this.uvOffset);
|
|
322
|
-
this.$l.
|
|
323
|
-
this.$
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
324
|
+
this.$l.skippedTile = pb.bool();
|
|
325
|
+
this.$if(pb.greaterThan(this.direction.z, 0), function() {
|
|
326
|
+
// Preserve the proven min-depth traversal for rays moving away from the camera.
|
|
327
|
+
this.$l.boundaryPlanes = pb.vec3(this.xyPlane, this.surfaceZ);
|
|
328
|
+
this.$l.forwardT = pb.mul(pb.sub(this.boundaryPlanes, this.origin), this.invDirection);
|
|
329
|
+
this.$l.tMin = pb.min(pb.min(this.forwardT.x, this.forwardT.y), this.forwardT.z);
|
|
330
|
+
this.$l.aboveSurface = pb.greaterThan(this.surfaceZ, this.position.z);
|
|
331
|
+
this.skippedTile = pb.and(pb.notEqual(pb.floatBitsToUint(this.tMin), pb.floatBitsToUint(this.forwardT.z)), this.aboveSurface);
|
|
332
|
+
this.currentT = this.$choice(this.aboveSurface, this.tMin, this.currentT);
|
|
333
|
+
this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));
|
|
334
|
+
}).$else(function() {
|
|
335
|
+
this.$l.reverseT = pb.mul(pb.sub(this.xyPlane, this.origin.xy), this.invDirection.xy);
|
|
336
|
+
this.$l.tExit = pb.min(this.reverseT.x, this.reverseT.y);
|
|
337
|
+
this.$l.exitZ = pb.add(this.origin.z, pb.mul(this.direction.z, this.tExit));
|
|
338
|
+
this.$l.rayMinZ = pb.min(this.position.z, this.exitZ);
|
|
339
|
+
this.$l.rayMaxZ = pb.max(this.position.z, this.exitZ);
|
|
340
|
+
this.$l.overlapsDepth = pb.and(pb.greaterThanEqual(this.rayMaxZ, this.surfaceZ), pb.lessThanEqual(this.rayMinZ, this.surfaceZMax));
|
|
341
|
+
this.skippedTile = pb.not(this.overlapsDepth);
|
|
342
|
+
this.$if(this.skippedTile, function() {
|
|
343
|
+
this.currentT = this.tExit;
|
|
344
|
+
this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));
|
|
345
|
+
}).$elseif(pb.equal(this.currentMip, 0), function() {
|
|
346
|
+
this.$if(pb.greaterThan(pb.abs(this.direction.z), 1e-6), function() {
|
|
347
|
+
this.currentT = pb.div(pb.sub(this.surfaceZMax, this.origin.z), this.direction.z);
|
|
348
|
+
this.position = pb.add(this.origin, pb.mul(this.direction, this.currentT));
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
});
|
|
330
352
|
this.$return(this.skippedTile);
|
|
331
353
|
});
|
|
332
354
|
pb.func('SSR_RaymarchHiZ', [
|
|
@@ -337,9 +359,10 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
337
359
|
pb.int('mostDetailMip'),
|
|
338
360
|
pb.int('maxMipLevel'),
|
|
339
361
|
pb.float('maxIterations'),
|
|
362
|
+
pb.float('maxT'),
|
|
340
363
|
pb.float('numIterations').out()
|
|
341
364
|
], function() {
|
|
342
|
-
this.$l.invDirection = this.$choice(pb.
|
|
365
|
+
this.$l.invDirection = pb.vec3(this.$choice(pb.greaterThan(pb.abs(this.screenSpaceDirection.x), 1e-8), pb.div(1, this.screenSpaceDirection.x), MAX_FLOAT_VALUE), this.$choice(pb.greaterThan(pb.abs(this.screenSpaceDirection.y), 1e-8), pb.div(1, this.screenSpaceDirection.y), MAX_FLOAT_VALUE), this.$choice(pb.greaterThan(pb.abs(this.screenSpaceDirection.z), 1e-8), pb.div(1, this.screenSpaceDirection.z), MAX_FLOAT_VALUE));
|
|
343
366
|
this.$l.currentMip = this.mostDetailMip;
|
|
344
367
|
this.$l.currentMipResolution = this.getMipResolution(this.currentMip);
|
|
345
368
|
this.$l.invCurrentMipResolution = pb.div(pb.vec2(1), this.currentMipResolution);
|
|
@@ -350,10 +373,10 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
350
373
|
this.$l.position = pb.vec3();
|
|
351
374
|
this.SSR_initialAdvanceRay(this.screenSpacePos, this.screenSpaceDirection, this.invDirection, this.currentMipResolution, this.invCurrentMipResolution, this.floorOffset, this.uvOffset, this.position, this.currentT);
|
|
352
375
|
this.numIterations = pb.float(0);
|
|
353
|
-
this.$while(pb.and(pb.lessThan(this.numIterations, this.maxIterations), pb.greaterThanEqual(this.currentMip, this.mostDetailMip)), function() {
|
|
376
|
+
this.$while(pb.and(pb.and(pb.lessThan(this.numIterations, this.maxIterations), pb.greaterThanEqual(this.currentMip, this.mostDetailMip)), pb.and(pb.lessThanEqual(this.currentT, this.maxT), pb.all(pb.greaterThanEqual(this.position.xy, pb.vec2(0))), pb.all(pb.lessThanEqual(this.position.xy, pb.vec2(1))))), function() {
|
|
354
377
|
this.$l.currentMipPosition = pb.mul(this.currentMipResolution, this.position.xy);
|
|
355
|
-
this.$l.
|
|
356
|
-
this.$l.skippedTile = this.SSR_advanceRay(this.screenSpacePos, this.screenSpaceDirection, this.invDirection, this.currentMipPosition, this.invCurrentMipResolution, this.floorOffset, this.uvOffset, this.
|
|
378
|
+
this.$l.depthRange = pb.textureLoad(HiZTexture, pb.ivec2(this.currentMipPosition), this.currentMip).rg;
|
|
379
|
+
this.$l.skippedTile = this.SSR_advanceRay(this.screenSpacePos, this.screenSpaceDirection, this.invDirection, this.currentMipPosition, this.invCurrentMipResolution, this.floorOffset, this.uvOffset, this.depthRange.x, this.depthRange.y, this.currentMip, this.position, this.currentT);
|
|
357
380
|
this.$l.nextMipIsOutOfRange = pb.and(this.skippedTile, pb.greaterThanEqual(this.currentMip, this.maxMipLevel));
|
|
358
381
|
this.$if(pb.not(this.nextMipIsOutOfRange), function() {
|
|
359
382
|
this.currentMip = pb.add(this.currentMip, this.$choice(this.skippedTile, pb.int(1), pb.int(-1)));
|
|
@@ -362,7 +385,7 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
362
385
|
});
|
|
363
386
|
this.numIterations = pb.add(this.numIterations, 1);
|
|
364
387
|
});
|
|
365
|
-
this.$l.validHit = this.$choice(pb.lessThanEqual(this.
|
|
388
|
+
this.$l.validHit = this.$choice(pb.and(pb.lessThan(this.currentMip, this.mostDetailMip), pb.and(pb.greaterThanEqual(this.currentT, 0), pb.lessThanEqual(this.currentT, this.maxT))), pb.float(1), pb.float(0));
|
|
366
389
|
this.$return(pb.vec4(this.position, this.validHit));
|
|
367
390
|
});
|
|
368
391
|
pb.func('SSR_HiZ', [
|
|
@@ -372,21 +395,30 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
372
395
|
pb.mat4('projMatrix'),
|
|
373
396
|
pb.mat4('invProjMatrix'),
|
|
374
397
|
pb.vec2('cameraNearFar'),
|
|
398
|
+
pb.float('maxDistance'),
|
|
375
399
|
pb.float('thickness'),
|
|
376
400
|
pb.vec4('textureSize'),
|
|
377
401
|
pb.int('maxMipLevel'),
|
|
378
402
|
pb.float('maxIterations')
|
|
379
403
|
], function() {
|
|
380
|
-
this.$
|
|
404
|
+
this.$l.rayDirection = pb.normalize(this.traceRay);
|
|
405
|
+
this.$l.reverseRay = pb.greaterThan(this.rayDirection.z, 1e-6);
|
|
406
|
+
this.$l.rayLength = this.maxDistance;
|
|
407
|
+
this.$if(this.reverseRay, function() {
|
|
408
|
+
this.rayLength = pb.min(this.rayLength, pb.div(pb.sub(pb.neg(this.cameraNearFar.x), this.viewPos.z), this.rayDirection.z));
|
|
409
|
+
});
|
|
410
|
+
this.$if(pb.lessThanEqual(this.rayLength, 0), function() {
|
|
381
411
|
this.$return(pb.vec4(0));
|
|
382
412
|
});
|
|
383
413
|
this.$l.originH = pb.mul(this.projMatrix, pb.vec4(this.viewPos, 1));
|
|
384
414
|
this.$l.originCS = pb.div(this.originH.xyz, this.originH.w);
|
|
385
415
|
this.$l.originTS = pb.add(pb.mul(this.originCS, 0.5), pb.vec3(0.5));
|
|
386
|
-
this.$l.
|
|
416
|
+
this.$l.endTS = this.projectPosition(pb.add(this.viewPos, pb.mul(this.rayDirection, this.rayLength)), this.projMatrix);
|
|
417
|
+
this.$l.directionTS = this.$choice(this.reverseRay, pb.sub(this.endTS, this.originTS), this.projectDirection(this.viewPos, this.rayDirection, this.originTS, this.projMatrix));
|
|
418
|
+
this.$l.maxT = this.$choice(this.reverseRay, pb.float(1), pb.float(MAX_FLOAT_VALUE));
|
|
387
419
|
this.$l.mostDetailMip = pb.int(0);
|
|
388
420
|
this.$l.numIterations = pb.float();
|
|
389
|
-
this.$l.hit = this.SSR_RaymarchHiZ(this.originTS, this.directionTS, this.cameraNearFar, this.textureSize.zw, this.mostDetailMip, this.maxMipLevel, this.maxIterations, this.numIterations);
|
|
421
|
+
this.$l.hit = this.SSR_RaymarchHiZ(this.originTS, this.directionTS, this.cameraNearFar, this.textureSize.zw, this.mostDetailMip, this.maxMipLevel, this.maxIterations, this.maxT, this.numIterations);
|
|
390
422
|
this.$l.confidence = pb.float(0);
|
|
391
423
|
this.$if(pb.notEqual(this.hit.w, 0), function() {
|
|
392
424
|
this.$l.surfaceZ = pb.textureSampleLevel(HiZTexture, this.hit.xy, 0).r;
|
|
@@ -394,18 +426,17 @@ function screenSpaceRayTracing_HiZ(scope, viewPos, traceRay, viewMatrix, projMat
|
|
|
394
426
|
this.$return(pb.vec4(0));
|
|
395
427
|
});
|
|
396
428
|
this.$l.hit3D = invProjectPosition(this, this.hit.xyz, this.invProjMatrix);
|
|
397
|
-
this.confidence = validateHit(this, this.hit.xy, this.hit3D, this.surfaceZ, this.thickness, this.originTS.xy, this.
|
|
429
|
+
this.confidence = validateHit(this, this.hit.xy, this.hit3D, this.surfaceZ, this.thickness, this.originTS.xy, this.rayDirection, this.viewMatrix, this.invProjMatrix, this.textureSize, normalTexture);
|
|
398
430
|
});
|
|
399
431
|
this.$l.iterationAttenuation = pb.sub(1, pb.smoothStep(0, this.maxIterations, this.numIterations));
|
|
400
|
-
this.$l.viewAttenuation = pb.sub(1, pb.smoothStep(-0.5, 0, this.traceRay.z));
|
|
401
432
|
//this.$l.iterationAttenuation = pb.smoothStep(this.maxIterations, 1, this.numIterations);
|
|
402
|
-
this.confidence = pb.mul(this.confidence, this.iterationAttenuation
|
|
433
|
+
this.confidence = pb.mul(this.confidence, this.iterationAttenuation);
|
|
403
434
|
this.$l.hitPixel = pb.mul(this.hit.xy, this.textureSize.zw);
|
|
404
435
|
this.$l.startPixel = pb.mul(this.originTS.xy, this.textureSize.zw);
|
|
405
436
|
this.$l.hitDistance = pb.length(pb.sub(this.hitPixel, this.startPixel));
|
|
406
437
|
this.$return(pb.vec4(this.hit.xy, this.hitDistance, this.confidence));
|
|
407
438
|
});
|
|
408
|
-
return scope.SSR_HiZ(viewPos, traceRay, viewMatrix, projMatrix, invProjMatrix, cameraNearFar, thickness, textureSize, pb.sub(maxMipLevel, 1), maxIterations);
|
|
439
|
+
return scope.SSR_HiZ(viewPos, traceRay, viewMatrix, projMatrix, invProjMatrix, cameraNearFar, maxDistance, thickness, textureSize, pb.sub(maxMipLevel, 1), maxIterations);
|
|
409
440
|
} /*
|
|
410
441
|
float2 cell(float2 ray, float2 cell_count, uint camera) {
|
|
411
442
|
return floor(ray.xy * cell_count);
|