@onerjs/core 8.48.3 → 8.48.5
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/Cameras/Inputs/geospatialCameraPointersInput.js +10 -8
- package/Cameras/Inputs/geospatialCameraPointersInput.js.map +1 -1
- package/Cameras/geospatialCameraMovement.js +2 -2
- package/Cameras/geospatialCameraMovement.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.d.ts +105 -0
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js +318 -0
- package/FrameGraph/Node/Blocks/Rendering/iblShadowsRendererBlock.js.map +1 -0
- package/FrameGraph/Node/Blocks/index.d.ts +1 -0
- package/FrameGraph/Node/Blocks/index.js +1 -0
- package/FrameGraph/Node/Blocks/index.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +34 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +144 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +26 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +82 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +61 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +207 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +104 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +218 -0
- package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.d.ts +217 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js +640 -0
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.js.map +1 -0
- package/FrameGraph/frameGraph.js +1 -0
- package/FrameGraph/frameGraph.js.map +1 -1
- package/FrameGraph/index.d.ts +1 -0
- package/FrameGraph/index.js +1 -0
- package/FrameGraph/index.js.map +1 -1
- package/Materials/PBR/openpbrMaterial.d.ts +13 -2
- package/Materials/PBR/openpbrMaterial.js +47 -16
- package/Materials/PBR/openpbrMaterial.js.map +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.js +1 -1
- package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
- package/Materials/Textures/Filtering/hdrFiltering.js +6 -0
- package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
- package/Materials/Textures/envCubeTexture.js +13 -13
- package/Materials/Textures/envCubeTexture.js.map +1 -1
- package/Materials/materialHelper.functions.js +1 -1
- package/Materials/materialHelper.functions.js.map +1 -1
- package/Meshes/instancedMesh.js +44 -42
- package/Meshes/instancedMesh.js.map +1 -1
- package/Misc/textureTools.d.ts +3 -1
- package/Misc/textureTools.js +74 -13
- package/Misc/textureTools.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +33 -1
- package/Particles/baseParticleSystem.js +65 -0
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/computeShaderParticleSystem.js +6 -0
- package/Particles/computeShaderParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.d.ts +24 -6
- package/Particles/gpuParticleSystem.js +85 -36
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particleSystem.d.ts +0 -7
- package/Particles/particleSystem.js +3 -15
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.d.ts +1 -3
- package/Particles/thinParticleSystem.js +1 -27
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Particles/webgl2ParticleSystem.js +7 -0
- package/Particles/webgl2ParticleSystem.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +1 -1
- package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.d.ts +3 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.js +11 -1
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.d.ts +0 -19
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +21 -65
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +15 -52
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +129 -220
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +3 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/geometryBufferRenderer.d.ts +14 -5
- package/Rendering/geometryBufferRenderer.js +6 -2
- package/Rendering/geometryBufferRenderer.js.map +1 -1
- package/Rendering/geometryBufferRendererSceneComponent.d.ts +4 -6
- package/Rendering/geometryBufferRendererSceneComponent.js.map +1 -1
- package/Rendering/iblCdfGenerator.d.ts +10 -0
- package/Rendering/iblCdfGenerator.js +52 -17
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/index.d.ts +0 -6
- package/Rendering/index.js +0 -6
- package/Rendering/index.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +6 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/Shaders/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/Shaders/gpuUpdateParticles.vertex.js +12 -6
- package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js +5 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/Shaders/iblVoxelGrid.fragment.d.ts +1 -0
- package/Shaders/iblVoxelGrid.fragment.js +33 -5
- package/Shaders/iblVoxelGrid.fragment.js.map +1 -1
- package/Shaders/lod3D.fragment.d.ts +5 -0
- package/Shaders/lod3D.fragment.js +13 -0
- package/Shaders/lod3D.fragment.js.map +1 -0
- package/Shaders/openpbr.fragment.js +5 -0
- package/Shaders/openpbr.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +6 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrEnvironmentLighting.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +14 -7
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +5 -1
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
- package/ShadersWGSL/lod3D.fragment.d.ts +5 -0
- package/ShadersWGSL/lod3D.fragment.js +13 -0
- package/ShadersWGSL/lod3D.fragment.js.map +1 -0
- package/ShadersWGSL/openpbr.fragment.js +5 -0
- package/ShadersWGSL/openpbr.fragment.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { Matrix, Quaternion, Vector3 } from "../../../../Maths/math.vector.js";
|
|
2
|
+
import { Observable } from "../../../../Misc/observable.js";
|
|
3
|
+
import { _IblShadowsVoxelRenderer } from "../../../../Rendering/IBLShadows/iblShadowsVoxelRenderer.js";
|
|
4
|
+
import { FrameGraphTask } from "../../../frameGraphTask.js";
|
|
5
|
+
/**
|
|
6
|
+
* Task used to voxelize shadow casting objects for IBL shadows.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export class FrameGraphIblShadowsVoxelizationTask extends FrameGraphTask {
|
|
10
|
+
/**
|
|
11
|
+
* Sets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
|
|
12
|
+
*/
|
|
13
|
+
set resolutionExp(value) {
|
|
14
|
+
const newValue = Math.round(Math.max(1, Math.min(value, 8)));
|
|
15
|
+
if (newValue === this._resolutionExp) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
this._resolutionExp = newValue;
|
|
19
|
+
if (this._voxelRenderer) {
|
|
20
|
+
this._voxelRenderer.voxelResolutionExp = this._resolutionExp;
|
|
21
|
+
}
|
|
22
|
+
this.dirty = true;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Gets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
|
|
26
|
+
*/
|
|
27
|
+
get resolutionExp() {
|
|
28
|
+
return this._resolutionExp;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Controls how often voxelization is refreshed.
|
|
32
|
+
* - -1: manual only (requires setting `dirty = true`)
|
|
33
|
+
* - 0: every frame
|
|
34
|
+
* - 1: skip 1 frame between updates
|
|
35
|
+
* - N: skip N frames between updates
|
|
36
|
+
*/
|
|
37
|
+
get refreshRate() {
|
|
38
|
+
return this._refreshRate;
|
|
39
|
+
}
|
|
40
|
+
set refreshRate(value) {
|
|
41
|
+
this._refreshRate = Math.max(-1, Math.round(value));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Creates a new voxelization task.
|
|
45
|
+
* @param name The task name.
|
|
46
|
+
* @param frameGraph The frame graph this task belongs to.
|
|
47
|
+
*/
|
|
48
|
+
constructor(name, frameGraph) {
|
|
49
|
+
super(name, frameGraph);
|
|
50
|
+
/**
|
|
51
|
+
* Observable raised when voxelization completes.
|
|
52
|
+
*/
|
|
53
|
+
this.onVoxelizationCompleteObservable = new Observable();
|
|
54
|
+
/**
|
|
55
|
+
* World-space voxel grid size.
|
|
56
|
+
*/
|
|
57
|
+
this.voxelGridSize = 1;
|
|
58
|
+
/**
|
|
59
|
+
* Voxel grid resolution exponent. Actual resolution is 2^resolutionExp.
|
|
60
|
+
*/
|
|
61
|
+
this._resolutionExp = 6;
|
|
62
|
+
/**
|
|
63
|
+
* Enables tri-planar voxelization mode.
|
|
64
|
+
*/
|
|
65
|
+
this.triPlanarVoxelization = true;
|
|
66
|
+
/**
|
|
67
|
+
* Indicates whether voxelization should be refreshed.
|
|
68
|
+
*/
|
|
69
|
+
this.dirty = true;
|
|
70
|
+
this._refreshRate = -1;
|
|
71
|
+
/**
|
|
72
|
+
* World-to-voxel normalization matrix used by tracing.
|
|
73
|
+
*/
|
|
74
|
+
this.worldScaleMatrix = Matrix.Identity();
|
|
75
|
+
this._voxelizationCompleteObserver = null;
|
|
76
|
+
this._frameCounter = 0;
|
|
77
|
+
this.outputVoxelGridTexture = this._frameGraph.textureManager.createDanglingHandle();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Gets the class name.
|
|
81
|
+
* @returns The class name.
|
|
82
|
+
*/
|
|
83
|
+
getClassName() {
|
|
84
|
+
return "FrameGraphIblShadowsVoxelizationTask";
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Checks whether the task has all required inputs.
|
|
88
|
+
* @returns True when ready.
|
|
89
|
+
*/
|
|
90
|
+
isReady() {
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Requests a voxelization update on the next eligible frame.
|
|
95
|
+
*/
|
|
96
|
+
requestVoxelizationUpdate() {
|
|
97
|
+
this.dirty = true;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Recomputes voxel world bounds from the current object list and updates worldScaleMatrix.
|
|
101
|
+
*/
|
|
102
|
+
updateSceneBounds() {
|
|
103
|
+
this._updateWorldScaleMatrix();
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Records the voxelization passes.
|
|
107
|
+
*/
|
|
108
|
+
record() {
|
|
109
|
+
if (this.objectList === undefined) {
|
|
110
|
+
throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: objectList is required`);
|
|
111
|
+
}
|
|
112
|
+
this._ensureVoxelRenderer();
|
|
113
|
+
this._updateWorldScaleMatrix();
|
|
114
|
+
this._updateOutputTextureHandlesFromRenderer();
|
|
115
|
+
const voxelRT = this._voxelRenderer.getRT();
|
|
116
|
+
const voxelRTInternalTexture = voxelRT.getInternalTexture();
|
|
117
|
+
if (!voxelRTInternalTexture) {
|
|
118
|
+
throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: voxel renderer RT texture is unavailable`);
|
|
119
|
+
}
|
|
120
|
+
this._voxelRTTextureHandle = this._frameGraph.textureManager.importTexture(`${this.name} Voxel RT`, voxelRTInternalTexture, this._voxelRTTextureHandle);
|
|
121
|
+
const pass = this._frameGraph.addRenderPass(this.name);
|
|
122
|
+
pass.setRenderTarget(this._voxelRTTextureHandle);
|
|
123
|
+
pass.addDependencies(this.outputVoxelGridTexture);
|
|
124
|
+
pass.setExecuteFunc((context) => {
|
|
125
|
+
context.restoreDefaultFramebuffer();
|
|
126
|
+
this._frameCounter++;
|
|
127
|
+
const shouldRefreshFromRate = this.refreshRate >= 0 && (this._frameCounter - 1) % (this.refreshRate + 1) === 0;
|
|
128
|
+
if (this._voxelRenderer.isVoxelizationInProgress()) {
|
|
129
|
+
this._voxelRenderer.processVoxelization();
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
if (this.dirty || shouldRefreshFromRate) {
|
|
133
|
+
const meshes = this.objectList.meshes;
|
|
134
|
+
if (meshes.length === 0) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
this._ensureVoxelRenderer();
|
|
138
|
+
this._updateWorldScaleMatrix();
|
|
139
|
+
this._voxelRenderer.setWorldScaleMatrix(this.worldScaleMatrix);
|
|
140
|
+
this._voxelRenderer.updateVoxelGrid(meshes, false);
|
|
141
|
+
this.dirty = false;
|
|
142
|
+
}
|
|
143
|
+
if (this._voxelRenderer.isVoxelizationInProgress()) {
|
|
144
|
+
this._voxelRenderer.processVoxelization();
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Disposes internal resources.
|
|
150
|
+
*/
|
|
151
|
+
dispose() {
|
|
152
|
+
this._detachVoxelizationObserver();
|
|
153
|
+
this._voxelRenderer?.dispose();
|
|
154
|
+
this._voxelRenderer = undefined;
|
|
155
|
+
this.onVoxelizationCompleteObservable.clear();
|
|
156
|
+
super.dispose();
|
|
157
|
+
}
|
|
158
|
+
_ensureVoxelRenderer() {
|
|
159
|
+
const needsNewRenderer = !this._voxelRenderer || this._voxelRendererResolutionExp !== this.resolutionExp || this._voxelRendererTriPlanar !== this.triPlanarVoxelization;
|
|
160
|
+
if (!needsNewRenderer) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
this._voxelRenderer?.dispose();
|
|
164
|
+
this._voxelRenderer = new _IblShadowsVoxelRenderer(this._frameGraph.scene, {}, this.resolutionExp, this.triPlanarVoxelization);
|
|
165
|
+
this._attachVoxelizationObserver();
|
|
166
|
+
this._voxelRendererResolutionExp = this.resolutionExp;
|
|
167
|
+
this._voxelRendererTriPlanar = this.triPlanarVoxelization;
|
|
168
|
+
}
|
|
169
|
+
_attachVoxelizationObserver() {
|
|
170
|
+
this._detachVoxelizationObserver();
|
|
171
|
+
if (!this._voxelRenderer) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
this._voxelizationCompleteObserver = this._voxelRenderer.onVoxelizationCompleteObservable.add(() => {
|
|
175
|
+
this._updateOutputTextureHandlesFromRenderer();
|
|
176
|
+
this.onVoxelizationCompleteObservable.notifyObservers();
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
_detachVoxelizationObserver() {
|
|
180
|
+
if (this._voxelRenderer && this._voxelizationCompleteObserver) {
|
|
181
|
+
this._voxelRenderer.onVoxelizationCompleteObservable.remove(this._voxelizationCompleteObserver);
|
|
182
|
+
}
|
|
183
|
+
this._voxelizationCompleteObserver = null;
|
|
184
|
+
}
|
|
185
|
+
_updateWorldScaleMatrix() {
|
|
186
|
+
const meshes = this.objectList?.meshes;
|
|
187
|
+
if (!meshes || meshes.length === 0 || !isFinite(this.voxelGridSize) || this.voxelGridSize <= 0) {
|
|
188
|
+
this.worldScaleMatrix.copyFrom(Matrix.Identity());
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
const bounds = {
|
|
192
|
+
min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),
|
|
193
|
+
max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),
|
|
194
|
+
};
|
|
195
|
+
for (const mesh of meshes) {
|
|
196
|
+
const localBounds = mesh.getHierarchyBoundingVectors(true);
|
|
197
|
+
bounds.min = Vector3.Minimize(bounds.min, localBounds.min);
|
|
198
|
+
bounds.max = Vector3.Maximize(bounds.max, localBounds.max);
|
|
199
|
+
}
|
|
200
|
+
const size = bounds.max.subtract(bounds.min);
|
|
201
|
+
this.voxelGridSize = Math.max(size.x, size.y, size.z);
|
|
202
|
+
const halfSize = this.voxelGridSize / 2.0;
|
|
203
|
+
const centerOffset = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);
|
|
204
|
+
const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), Vector3.Zero());
|
|
205
|
+
const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centerOffset);
|
|
206
|
+
invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, this.worldScaleMatrix);
|
|
207
|
+
}
|
|
208
|
+
_updateOutputTextureHandlesFromRenderer() {
|
|
209
|
+
const voxelTexture = this._voxelRenderer.getVoxelGrid();
|
|
210
|
+
const voxelInternalTexture = voxelTexture.getInternalTexture();
|
|
211
|
+
if (!voxelInternalTexture) {
|
|
212
|
+
throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: voxel renderer texture is unavailable`);
|
|
213
|
+
}
|
|
214
|
+
this._voxelGridTextureHandle = this._frameGraph.textureManager.importTexture(`${this.name} Voxel Grid`, voxelInternalTexture, this._voxelGridTextureHandle);
|
|
215
|
+
this._frameGraph.textureManager.resolveDanglingHandle(this.outputVoxelGridTexture, this._voxelGridTextureHandle);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=iblShadowsVoxelizationTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iblShadowsVoxelizationTask.js","sourceRoot":"","sources":["../../../../../../../dev/core/src/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.ts"],"names":[],"mappings":"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","sourcesContent":["import { type FrameGraph, type FrameGraphObjectList, type FrameGraphTextureHandle, type Mesh, type Observer } from \"core/index\";\r\nimport { Matrix, Quaternion, Vector3 } from \"core/Maths/math.vector\";\r\nimport { Observable } from \"core/Misc/observable\";\r\nimport { _IblShadowsVoxelRenderer } from \"core/Rendering/IBLShadows/iblShadowsVoxelRenderer\";\r\nimport { FrameGraphTask } from \"../../../frameGraphTask\";\r\n\r\n/**\r\n * Task used to voxelize shadow casting objects for IBL shadows.\r\n * @internal\r\n */\r\nexport class FrameGraphIblShadowsVoxelizationTask extends FrameGraphTask {\r\n /**\r\n * Observable raised when voxelization completes.\r\n */\r\n public readonly onVoxelizationCompleteObservable = new Observable<void>();\r\n\r\n /**\r\n * Input object list containing the meshes to voxelize.\r\n */\r\n public objectList: FrameGraphObjectList;\r\n\r\n /**\r\n * World-space voxel grid size.\r\n */\r\n public voxelGridSize = 1;\r\n\r\n /**\r\n * Voxel grid resolution exponent. Actual resolution is 2^resolutionExp.\r\n */\r\n private _resolutionExp = 6;\r\n /**\r\n * Sets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.\r\n */\r\n public set resolutionExp(value: number) {\r\n const newValue = Math.round(Math.max(1, Math.min(value, 8)));\r\n if (newValue === this._resolutionExp) {\r\n return;\r\n }\r\n this._resolutionExp = newValue;\r\n if (this._voxelRenderer) {\r\n this._voxelRenderer.voxelResolutionExp = this._resolutionExp;\r\n }\r\n this.dirty = true;\r\n }\r\n /**\r\n * Gets voxel grid resolution exponent. Actual resolution is 2^resolutionExp.\r\n */\r\n public get resolutionExp(): number {\r\n return this._resolutionExp;\r\n }\r\n\r\n /**\r\n * Enables tri-planar voxelization mode.\r\n */\r\n public triPlanarVoxelization = true;\r\n\r\n /**\r\n * Indicates whether voxelization should be refreshed.\r\n */\r\n public dirty = true;\r\n\r\n private _refreshRate = -1;\r\n\r\n /**\r\n * Controls how often voxelization is refreshed.\r\n * - -1: manual only (requires setting `dirty = true`)\r\n * - 0: every frame\r\n * - 1: skip 1 frame between updates\r\n * - N: skip N frames between updates\r\n */\r\n public get refreshRate(): number {\r\n return this._refreshRate;\r\n }\r\n\r\n public set refreshRate(value: number) {\r\n this._refreshRate = Math.max(-1, Math.round(value));\r\n }\r\n\r\n /**\r\n * World-to-voxel normalization matrix used by tracing.\r\n */\r\n public readonly worldScaleMatrix = Matrix.Identity();\r\n\r\n /**\r\n * Output voxel grid texture handle.\r\n */\r\n public readonly outputVoxelGridTexture: FrameGraphTextureHandle;\r\n\r\n private _voxelRenderer?: _IblShadowsVoxelRenderer;\r\n private _voxelRendererResolutionExp?: number;\r\n private _voxelRendererTriPlanar?: boolean;\r\n private _voxelizationCompleteObserver: Observer<void> | null = null;\r\n private _voxelRTTextureHandle?: FrameGraphTextureHandle;\r\n private _voxelGridTextureHandle?: FrameGraphTextureHandle;\r\n private _frameCounter = 0;\r\n\r\n /**\r\n * Creates a new voxelization task.\r\n * @param name The task name.\r\n * @param frameGraph The frame graph this task belongs to.\r\n */\r\n constructor(name: string, frameGraph: FrameGraph) {\r\n super(name, frameGraph);\r\n\r\n this.outputVoxelGridTexture = this._frameGraph.textureManager.createDanglingHandle();\r\n }\r\n\r\n /**\r\n * Gets the class name.\r\n * @returns The class name.\r\n */\r\n public override getClassName(): string {\r\n return \"FrameGraphIblShadowsVoxelizationTask\";\r\n }\r\n\r\n /**\r\n * Checks whether the task has all required inputs.\r\n * @returns True when ready.\r\n */\r\n public override isReady(): boolean {\r\n return true;\r\n }\r\n\r\n /**\r\n * Requests a voxelization update on the next eligible frame.\r\n */\r\n public requestVoxelizationUpdate(): void {\r\n this.dirty = true;\r\n }\r\n\r\n /**\r\n * Recomputes voxel world bounds from the current object list and updates worldScaleMatrix.\r\n */\r\n public updateSceneBounds(): void {\r\n this._updateWorldScaleMatrix();\r\n }\r\n\r\n /**\r\n * Records the voxelization passes.\r\n */\r\n public override record() {\r\n if (this.objectList === undefined) {\r\n throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: objectList is required`);\r\n }\r\n\r\n this._ensureVoxelRenderer();\r\n this._updateWorldScaleMatrix();\r\n\r\n this._updateOutputTextureHandlesFromRenderer();\r\n\r\n const voxelRT = this._voxelRenderer!.getRT();\r\n const voxelRTInternalTexture = voxelRT.getInternalTexture();\r\n if (!voxelRTInternalTexture) {\r\n throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: voxel renderer RT texture is unavailable`);\r\n }\r\n this._voxelRTTextureHandle = this._frameGraph.textureManager.importTexture(`${this.name} Voxel RT`, voxelRTInternalTexture, this._voxelRTTextureHandle);\r\n\r\n const pass = this._frameGraph.addRenderPass(this.name);\r\n pass.setRenderTarget(this._voxelRTTextureHandle);\r\n pass.addDependencies(this.outputVoxelGridTexture);\r\n pass.setExecuteFunc((context) => {\r\n context.restoreDefaultFramebuffer();\r\n\r\n this._frameCounter++;\r\n const shouldRefreshFromRate = this.refreshRate >= 0 && (this._frameCounter - 1) % (this.refreshRate + 1) === 0;\r\n\r\n if (this._voxelRenderer!.isVoxelizationInProgress()) {\r\n this._voxelRenderer!.processVoxelization();\r\n return;\r\n }\r\n\r\n if (this.dirty || shouldRefreshFromRate) {\r\n const meshes = this.objectList!.meshes as Mesh[];\r\n if (meshes.length === 0) {\r\n return;\r\n }\r\n\r\n this._ensureVoxelRenderer();\r\n this._updateWorldScaleMatrix();\r\n this._voxelRenderer!.setWorldScaleMatrix(this.worldScaleMatrix);\r\n this._voxelRenderer!.updateVoxelGrid(meshes, false);\r\n this.dirty = false;\r\n }\r\n\r\n if (this._voxelRenderer!.isVoxelizationInProgress()) {\r\n this._voxelRenderer!.processVoxelization();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Disposes internal resources.\r\n */\r\n public override dispose(): void {\r\n this._detachVoxelizationObserver();\r\n this._voxelRenderer?.dispose();\r\n this._voxelRenderer = undefined;\r\n this.onVoxelizationCompleteObservable.clear();\r\n super.dispose();\r\n }\r\n\r\n private _ensureVoxelRenderer(): void {\r\n const needsNewRenderer = !this._voxelRenderer || this._voxelRendererResolutionExp !== this.resolutionExp || this._voxelRendererTriPlanar !== this.triPlanarVoxelization;\r\n\r\n if (!needsNewRenderer) {\r\n return;\r\n }\r\n\r\n this._voxelRenderer?.dispose();\r\n this._voxelRenderer = new _IblShadowsVoxelRenderer(this._frameGraph.scene, {} as never, this.resolutionExp, this.triPlanarVoxelization);\r\n this._attachVoxelizationObserver();\r\n this._voxelRendererResolutionExp = this.resolutionExp;\r\n this._voxelRendererTriPlanar = this.triPlanarVoxelization;\r\n }\r\n\r\n private _attachVoxelizationObserver(): void {\r\n this._detachVoxelizationObserver();\r\n\r\n if (!this._voxelRenderer) {\r\n return;\r\n }\r\n\r\n this._voxelizationCompleteObserver = this._voxelRenderer.onVoxelizationCompleteObservable.add(() => {\r\n this._updateOutputTextureHandlesFromRenderer();\r\n this.onVoxelizationCompleteObservable.notifyObservers();\r\n });\r\n }\r\n\r\n private _detachVoxelizationObserver(): void {\r\n if (this._voxelRenderer && this._voxelizationCompleteObserver) {\r\n this._voxelRenderer.onVoxelizationCompleteObservable.remove(this._voxelizationCompleteObserver);\r\n }\r\n\r\n this._voxelizationCompleteObserver = null;\r\n }\r\n\r\n private _updateWorldScaleMatrix(): void {\r\n const meshes = this.objectList?.meshes as Mesh[] | undefined;\r\n if (!meshes || meshes.length === 0 || !isFinite(this.voxelGridSize) || this.voxelGridSize <= 0) {\r\n this.worldScaleMatrix.copyFrom(Matrix.Identity());\r\n return;\r\n }\r\n\r\n const bounds = {\r\n min: new Vector3(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE),\r\n max: new Vector3(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE),\r\n };\r\n\r\n for (const mesh of meshes) {\r\n const localBounds = mesh.getHierarchyBoundingVectors(true);\r\n bounds.min = Vector3.Minimize(bounds.min, localBounds.min);\r\n bounds.max = Vector3.Maximize(bounds.max, localBounds.max);\r\n }\r\n\r\n const size = bounds.max.subtract(bounds.min);\r\n this.voxelGridSize = Math.max(size.x, size.y, size.z);\r\n\r\n const halfSize = this.voxelGridSize / 2.0;\r\n const centerOffset = bounds.max.add(bounds.min).multiplyByFloats(-0.5, -0.5, -0.5);\r\n const invWorldScaleMatrix = Matrix.Compose(new Vector3(1.0 / halfSize, 1.0 / halfSize, 1.0 / halfSize), new Quaternion(), Vector3.Zero());\r\n const invTranslationMatrix = Matrix.Compose(new Vector3(1.0, 1.0, 1.0), new Quaternion(), centerOffset);\r\n invTranslationMatrix.multiplyToRef(invWorldScaleMatrix, this.worldScaleMatrix);\r\n }\r\n\r\n private _updateOutputTextureHandlesFromRenderer(): void {\r\n const voxelTexture = this._voxelRenderer!.getVoxelGrid();\r\n const voxelInternalTexture = voxelTexture.getInternalTexture();\r\n if (!voxelInternalTexture) {\r\n throw new Error(`FrameGraphIblShadowsVoxelizationTask ${this.name}: voxel renderer texture is unavailable`);\r\n }\r\n\r\n this._voxelGridTextureHandle = this._frameGraph.textureManager.importTexture(`${this.name} Voxel Grid`, voxelInternalTexture, this._voxelGridTextureHandle);\r\n this._frameGraph.textureManager.resolveDanglingHandle(this.outputVoxelGridTexture, this._voxelGridTextureHandle);\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { type Camera, type FrameGraph, type FrameGraphObjectList, type FrameGraphTextureHandle, type InternalTexture, type Mesh } from "../../../index.js";
|
|
2
|
+
import { type Material } from "../../../Materials/material.js";
|
|
3
|
+
import { Observable } from "../../../Misc/observable.js";
|
|
4
|
+
import { FrameGraphTask } from "../../frameGraphTask.js";
|
|
5
|
+
import "../../../Rendering/iblCdfGeneratorSceneComponent.js";
|
|
6
|
+
/**
|
|
7
|
+
* Composite task that owns the individual IBL shadows frame graph tasks.
|
|
8
|
+
* The frame graph remains flat internally, but this task groups the pipeline
|
|
9
|
+
* and owns the child task implementation details.
|
|
10
|
+
*/
|
|
11
|
+
export declare class FrameGraphIblShadowsRendererTask extends FrameGraphTask {
|
|
12
|
+
/** Final frame-graph texture handle produced by the task. */
|
|
13
|
+
readonly outputTexture: FrameGraphTextureHandle;
|
|
14
|
+
private readonly _voxelizationTask;
|
|
15
|
+
private readonly _tracingTask;
|
|
16
|
+
private readonly _spatialBlurTask;
|
|
17
|
+
private readonly _accumulationTask;
|
|
18
|
+
private _dependenciesResolved;
|
|
19
|
+
private _shadowOpacity;
|
|
20
|
+
private readonly _materialsWithRenderPlugin;
|
|
21
|
+
private readonly _outputTextureReadyObservable;
|
|
22
|
+
private _lastNotifiedOutputTexture;
|
|
23
|
+
private _observedEnvironmentTexture;
|
|
24
|
+
private _observedEnvironmentTextureUnsubscribe;
|
|
25
|
+
private _lastImportedIcdfTexture;
|
|
26
|
+
private _lastImportedEnvironmentTexture;
|
|
27
|
+
private _lastImportedBlueNoiseTexture;
|
|
28
|
+
private readonly _blueNoiseTexture;
|
|
29
|
+
private _cameraViewChangedObserver;
|
|
30
|
+
private _cdfTextureChangedObserver;
|
|
31
|
+
private _cdfGeneratedObserver;
|
|
32
|
+
private _environmentTextureChangedObserver;
|
|
33
|
+
private _beforeRenderDependencyObserver;
|
|
34
|
+
private _beforeRenderOutputReadyObserver;
|
|
35
|
+
private _blueNoiseLoadObserver;
|
|
36
|
+
private _texturesAllocatedObserver;
|
|
37
|
+
private _voxelizationCompleteObserver;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the class name.
|
|
40
|
+
* @returns The class name.
|
|
41
|
+
*/
|
|
42
|
+
getClassName(): string;
|
|
43
|
+
get name(): string;
|
|
44
|
+
set name(value: string);
|
|
45
|
+
/**
|
|
46
|
+
* Whether the task is disabled.
|
|
47
|
+
*/
|
|
48
|
+
get disabled(): boolean;
|
|
49
|
+
set disabled(value: boolean);
|
|
50
|
+
/** Camera used by the tracing stage. */
|
|
51
|
+
get camera(): Camera;
|
|
52
|
+
/** Camera used by the tracing stage. */
|
|
53
|
+
set camera(value: Camera);
|
|
54
|
+
/** Object list used by voxelization. */
|
|
55
|
+
get objectList(): FrameGraphObjectList;
|
|
56
|
+
/** Object list used by voxelization. */
|
|
57
|
+
set objectList(value: FrameGraphObjectList);
|
|
58
|
+
/**
|
|
59
|
+
* Depth texture handle used by tracing and blur.
|
|
60
|
+
* This should be the screen-space depth of all objects in the scene
|
|
61
|
+
* that will receive shadows.
|
|
62
|
+
* It is important that this texture stores 32-bit depth values to avoid artifacts.
|
|
63
|
+
*/
|
|
64
|
+
depthTexture: FrameGraphTextureHandle;
|
|
65
|
+
/**
|
|
66
|
+
* World-space normal texture handle used by tracing and blur.
|
|
67
|
+
* This should store the world-space normals of all objects in the scene
|
|
68
|
+
* that will receive shadows. Each component should be normalized to [0, 1] rather than [-1, 1].
|
|
69
|
+
* Recommended to be 16-bit floating point though 8-bit unsigned byte can be used with minimal
|
|
70
|
+
* loss in quality.
|
|
71
|
+
*/
|
|
72
|
+
normalTexture: FrameGraphTextureHandle;
|
|
73
|
+
/**
|
|
74
|
+
* Position texture handle used by accumulation.
|
|
75
|
+
* This should store the world-space position of all objects in the scene
|
|
76
|
+
* that will receive shadows.
|
|
77
|
+
* Should be stored as 16-bit floating point.
|
|
78
|
+
*/
|
|
79
|
+
positionTexture: FrameGraphTextureHandle;
|
|
80
|
+
/**
|
|
81
|
+
* Velocity texture handle used by accumulation.
|
|
82
|
+
* This should store the linear velocity per pixel of all objects in the scene
|
|
83
|
+
* that will receive shadows.
|
|
84
|
+
* Should be stored as 16-bit floating point.
|
|
85
|
+
*/
|
|
86
|
+
velocityTexture: FrameGraphTextureHandle;
|
|
87
|
+
/** Number of tracing sample directions. */
|
|
88
|
+
get sampleDirections(): number;
|
|
89
|
+
/** Number of tracing sample directions. */
|
|
90
|
+
set sampleDirections(value: number);
|
|
91
|
+
/** Whether traced shadows preserve environment color. */
|
|
92
|
+
get coloredShadows(): boolean;
|
|
93
|
+
/** Whether traced shadows preserve environment color. */
|
|
94
|
+
set coloredShadows(value: boolean);
|
|
95
|
+
/** Opacity of voxel-traced shadows. */
|
|
96
|
+
get voxelShadowOpacity(): number;
|
|
97
|
+
/** Opacity of voxel-traced shadows. */
|
|
98
|
+
set voxelShadowOpacity(value: number);
|
|
99
|
+
/** Opacity of screen-space shadows. */
|
|
100
|
+
get ssShadowOpacity(): number;
|
|
101
|
+
/** Opacity of screen-space shadows. */
|
|
102
|
+
set ssShadowOpacity(value: number);
|
|
103
|
+
/** Number of screen-space shadow samples. */
|
|
104
|
+
get ssShadowSampleCount(): number;
|
|
105
|
+
/** Number of screen-space shadow samples. */
|
|
106
|
+
set ssShadowSampleCount(value: number);
|
|
107
|
+
/** Stride used by screen-space shadow sampling. */
|
|
108
|
+
get ssShadowStride(): number;
|
|
109
|
+
/** Stride used by screen-space shadow sampling. */
|
|
110
|
+
set ssShadowStride(value: number);
|
|
111
|
+
/** Distance scale used by screen-space shadow tracing. */
|
|
112
|
+
get ssShadowDistanceScale(): number;
|
|
113
|
+
/** Distance scale used by screen-space shadow tracing. */
|
|
114
|
+
set ssShadowDistanceScale(value: number);
|
|
115
|
+
/** Thickness scale used by screen-space shadow tracing. */
|
|
116
|
+
get ssShadowThicknessScale(): number;
|
|
117
|
+
/** Thickness scale used by screen-space shadow tracing. */
|
|
118
|
+
set ssShadowThicknessScale(value: number);
|
|
119
|
+
/** Voxel tracing normal bias. */
|
|
120
|
+
get voxelNormalBias(): number;
|
|
121
|
+
/** Voxel tracing normal bias. */
|
|
122
|
+
set voxelNormalBias(value: number);
|
|
123
|
+
/** Voxel tracing direction bias. */
|
|
124
|
+
get voxelDirectionBias(): number;
|
|
125
|
+
/** Voxel tracing direction bias. */
|
|
126
|
+
set voxelDirectionBias(value: number);
|
|
127
|
+
/** Environment rotation in radians. */
|
|
128
|
+
get envRotation(): number;
|
|
129
|
+
/** Environment rotation in radians. */
|
|
130
|
+
set envRotation(value: number);
|
|
131
|
+
/** Temporal shadow remanence while moving. */
|
|
132
|
+
get shadowRemanence(): number;
|
|
133
|
+
/** Temporal shadow remanence while moving. */
|
|
134
|
+
set shadowRemanence(value: number);
|
|
135
|
+
/** Final material shadow opacity. */
|
|
136
|
+
get shadowOpacity(): number;
|
|
137
|
+
/** Final material shadow opacity. */
|
|
138
|
+
set shadowOpacity(value: number);
|
|
139
|
+
/** Voxelization resolution exponent. */
|
|
140
|
+
get resolutionExp(): number;
|
|
141
|
+
/** Voxelization resolution exponent. */
|
|
142
|
+
set resolutionExp(value: number);
|
|
143
|
+
/** Voxelization refresh rate. */
|
|
144
|
+
get refreshRate(): number;
|
|
145
|
+
/** Voxelization refresh rate. */
|
|
146
|
+
set refreshRate(value: number);
|
|
147
|
+
/** Whether tri-planar voxelization is used. */
|
|
148
|
+
get triPlanarVoxelization(): boolean;
|
|
149
|
+
/** Whether tri-planar voxelization is used. */
|
|
150
|
+
set triPlanarVoxelization(value: boolean);
|
|
151
|
+
/** Current world-space voxel grid size. */
|
|
152
|
+
get voxelGridSize(): number;
|
|
153
|
+
/** True when the accumulated output texture is ready. */
|
|
154
|
+
get outputTextureReady(): boolean;
|
|
155
|
+
/** Notifies when the accumulated output texture becomes ready. */
|
|
156
|
+
get onOutputTextureReadyObservable(): Observable<InternalTexture>;
|
|
157
|
+
/** Triggers a voxelization refresh on the next eligible frame. */
|
|
158
|
+
updateVoxelization(): void;
|
|
159
|
+
/** Recomputes the voxelization scene bounds from the current object list. */
|
|
160
|
+
updateSceneBounds(): void;
|
|
161
|
+
/** Resets temporal accumulation. */
|
|
162
|
+
resetAccumulation(): void;
|
|
163
|
+
/**
|
|
164
|
+
* Adds one or more materials that should receive IBL shadows.
|
|
165
|
+
* @param material The material or materials to register. If omitted, all scene materials are added.
|
|
166
|
+
*/
|
|
167
|
+
addShadowReceivingMaterial(material?: Material | Material[]): void;
|
|
168
|
+
/**
|
|
169
|
+
* Removes one or more materials from IBL shadow reception.
|
|
170
|
+
* @param material The material or materials to unregister.
|
|
171
|
+
*/
|
|
172
|
+
removeShadowReceivingMaterial(material: Material | Material[]): void;
|
|
173
|
+
/** Clears all registered shadow-receiving materials. */
|
|
174
|
+
clearShadowReceivingMaterials(): void;
|
|
175
|
+
/**
|
|
176
|
+
* Adds one or more meshes to the voxelization object list.
|
|
177
|
+
* @param mesh The mesh or meshes to add.
|
|
178
|
+
*/
|
|
179
|
+
addShadowCastingMesh(mesh: Mesh | Mesh[]): void;
|
|
180
|
+
/**
|
|
181
|
+
* Removes one or more meshes from the voxelization object list.
|
|
182
|
+
* @param mesh The mesh or meshes to remove.
|
|
183
|
+
*/
|
|
184
|
+
removeShadowCastingMesh(mesh: Mesh | Mesh[]): void;
|
|
185
|
+
/** Clears all shadow-casting meshes from the voxelization object list. */
|
|
186
|
+
clearShadowCastingMeshes(): void;
|
|
187
|
+
private _initAsyncCancel;
|
|
188
|
+
initAsync(): Promise<unknown>;
|
|
189
|
+
isReady(): boolean;
|
|
190
|
+
/**
|
|
191
|
+
* Records the parent task.
|
|
192
|
+
* Child tasks record the actual passes.
|
|
193
|
+
*/
|
|
194
|
+
record(): void;
|
|
195
|
+
/**
|
|
196
|
+
* Disposes the task and owned resources.
|
|
197
|
+
*/
|
|
198
|
+
dispose(): void;
|
|
199
|
+
/**
|
|
200
|
+
* Creates a new IBL shadows composite task.
|
|
201
|
+
* @param name The task name.
|
|
202
|
+
* @param frameGraph The owning frame graph.
|
|
203
|
+
*/
|
|
204
|
+
constructor(name: string, frameGraph: FrameGraph);
|
|
205
|
+
private _disposeDependencyObservers;
|
|
206
|
+
private _disposeObservers;
|
|
207
|
+
private _setCamera;
|
|
208
|
+
private _observeEnvironmentTexture;
|
|
209
|
+
private _getEnvironmentTextureInternal;
|
|
210
|
+
private _getAccumulationOutputTexture;
|
|
211
|
+
private _notifyIfOutputTextureReady;
|
|
212
|
+
private _applyMaterialPluginParameters;
|
|
213
|
+
private _addShadowReceivingMaterialInternal;
|
|
214
|
+
private readonly _onEnvironmentTextureLoaded;
|
|
215
|
+
private _tryEnableShadowsTasks;
|
|
216
|
+
private _initialize;
|
|
217
|
+
}
|