1
1
diff --git a/src-testing/src/materials/nodes/manager/NodeMaterialObserver.ts b/src-testing/src/materials/nodes/manager/NodeMaterialObserver.ts
2
- index f2030fde..061cabf3 100644
2
+ index b18f9a94..6cb70a74 100644
3
3
--- a/src-testing/src/materials/nodes/manager/NodeMaterialObserver.ts
4
4
+++ b/src-testing/src/materials/nodes/manager/NodeMaterialObserver.ts
5
- @@ -1,3 +1,11 @@
5
+ @@ -1,3 +1,14 @@
6
6
+ import NodeBuilder from '../../../nodes/core/NodeBuilder.js';
7
7
+ import RenderObject from '../../../renderers/common/RenderObject.js';
8
8
+ import { Matrix4 } from '../../../math/Matrix4.js';
9
9
+ import { Material } from '../../Material.js';
10
10
+ import NodeFrame from '../../../nodes/core/NodeFrame.js';
11
11
+ import { BufferAttribute } from '../../../core/BufferAttribute.js';
12
12
+ import Renderer from '../../../renderers/common/Renderer.js';
13
+ + import { Light } from '../../../lights/Light.js';
14
+ + import { SpotLight } from '../../../lights/SpotLight.js';
15
+ + import LightsNode from '../../../nodes/lighting/LightsNode.js';
13
16
+
14
17
const refreshUniforms = [
15
18
'alphaMap',
16
19
'alphaTest',
17
- @@ -53,7 +61,29 @@ const refreshUniforms = [
20
+ @@ -53,7 +64,38 @@ const refreshUniforms = [
18
21
'thickness',
19
22
'transmission',
20
23
'transmissionMap',
@@ -42,10 +45,28 @@ index f2030fde..061cabf3 100644
42
45
+ worldMatrix: Matrix4;
43
46
+ version?: number;
44
47
+ }
48
+ +
49
+ + interface LightData {
50
+ + map: number;
51
+ + }
52
+ +
53
+ + interface LightsCacheData {
54
+ + renderId: number;
55
+ + lightsData: LightData[];
56
+ + }
57
+
58
+ /**
59
+ * A WeakMap to cache lights data for node materials.
60
+ @@ -62,7 +104,7 @@ const refreshUniforms = [
61
+ * @private
62
+ * @type {WeakMap<LightsNode,Object>}
63
+ */
64
+ - const _lightsCache = new WeakMap();
65
+ + const _lightsCache = new WeakMap<LightsNode, LightsCacheData>();
45
66
46
67
/**
47
68
* This class is used by {@link WebGPURenderer} as management component.
48
- @@ -61 ,12 +91 ,18 @@ const refreshUniforms = [
69
+ @@ -70 ,12 +112 ,18 @@ const _lightsCache = new WeakMap();
49
70
* refresh right before they are going to be rendered or not.
50
71
*/
51
72
class NodeMaterialObserver {
@@ -65,7 +86,7 @@ index f2030fde..061cabf3 100644
65
86
/**
66
87
* A node material can be used by more than one render object so the
67
88
* monitor must maintain a list of render objects.
68
- @@ -111 ,7 +147 ,7 @@ class NodeMaterialObserver {
89
+ @@ -120 ,7 +168 ,7 @@ class NodeMaterialObserver {
69
90
* @param {RenderObject} renderObject - The render object.
70
91
* @return {boolean} Whether the given render object is verified for the first time of this observer.
71
92
*/
@@ -74,7 +95,7 @@ index f2030fde..061cabf3 100644
74
95
const hasInitialized = this.renderObjects.has(renderObject);
75
96
76
97
if (hasInitialized === false) {
77
- @@ -129 ,7 +165 ,7 @@ class NodeMaterialObserver {
98
+ @@ -138 ,7 +186 ,7 @@ class NodeMaterialObserver {
78
99
* @param {Renderer} renderer - The renderer.
79
100
* @return {boolean} Whether the current rendering produces motion vectors or not.
80
101
*/
@@ -83,7 +104,7 @@ index f2030fde..061cabf3 100644
83
104
const mrt = renderer.getMRT();
84
105
85
106
return mrt !== null && mrt.has('velocity');
86
- @@ -141 ,7 +177 ,7 @@ class NodeMaterialObserver {
107
+ @@ -150 ,7 +198 ,7 @@ class NodeMaterialObserver {
87
108
* @param {RenderObject} renderObject - The render object.
88
109
* @return {Object} The monitoring data.
89
110
*/
@@ -92,7 +113,7 @@ index f2030fde..061cabf3 100644
92
113
let data = this.renderObjects.get(renderObject);
93
114
94
115
if (data === undefined) {
95
- @@ -190 ,8 +226 ,8 @@ class NodeMaterialObserver {
116
+ @@ -201 ,8 +249 ,8 @@ class NodeMaterialObserver {
96
117
* @param {Object} attributes - The geometry attributes.
97
118
* @return {Object} An object for monitoring the versions of attributes.
98
119
*/
@@ -103,7 +124,7 @@ index f2030fde..061cabf3 100644
103
124
104
125
for (const name in attributes) {
105
126
const attribute = attributes[name];
106
- @@ -211 ,7 +247 ,7 @@ class NodeMaterialObserver {
127
+ @@ -222 ,7 +270 ,7 @@ class NodeMaterialObserver {
107
128
* @param {NodeBuilder} builder - The current node builder.
108
129
* @return {boolean} Whether the node builder's material uses node properties or not.
109
130
*/
@@ -112,7 +133,7 @@ index f2030fde..061cabf3 100644
112
133
const material = builder.material;
113
134
114
135
for (const property in material) {
115
- @@ -234 ,8 +270 ,8 @@ class NodeMaterialObserver {
136
+ @@ -245 ,8 +293 ,8 @@ class NodeMaterialObserver {
116
137
* @param {Material} material - The material.
117
138
* @return {Object} An object for monitoring material properties.
118
139
*/
@@ -123,16 +144,47 @@ index f2030fde..061cabf3 100644
123
144
124
145
for (const property of this.refreshUniforms) {
125
146
const value = material[property];
126
- @@ -262 ,7 +298 ,7 @@ class NodeMaterialObserver {
127
- * @param {RenderObject} renderObject - The render object .
147
+ @@ -274 ,7 +322 ,7 @@ class NodeMaterialObserver {
148
+ * @param {Array<Light>} lightsData - The current material lights .
128
149
* @return {boolean} Whether the given render object has changed its state or not.
129
150
*/
130
- - equals(renderObject) {
131
- + equals(renderObject: RenderObject) {
151
+ - equals(renderObject, lightsData ) {
152
+ + equals(renderObject: RenderObject, lightsData: Light[] ) {
132
153
const { object, material, geometry } = renderObject;
133
154
134
155
const renderObjectData = this.getRenderObjectData(renderObject);
135
- @@ -413,7 +449,7 @@ class NodeMaterialObserver {
156
+ @@ -434,14 +482,14 @@ class NodeMaterialObserver {
157
+ * @param {Array<Light>} materialLights - The material lights.
158
+ * @return {Array<Object>} The lights data for the given material lights.
159
+ */
160
+ - getLightsData(materialLights) {
161
+ - const lights = [];
162
+ + getLightsData(materialLights: Light[]) {
163
+ + const lights: LightData[] = [];
164
+
165
+ for (const light of materialLights) {
166
+ - if (light.isSpotLight === true && light.map !== null) {
167
+ + if ((light as SpotLight).isSpotLight === true && (light as SpotLight).map !== null) {
168
+ // only add lights that have a map
169
+
170
+ - lights.push({ map: light.map.version });
171
+ + lights.push({ map: (light as SpotLight).map!.version });
172
+ }
173
+ }
174
+
175
+ @@ -455,9 +503,9 @@ class NodeMaterialObserver {
176
+ * @param {number} renderId - The render ID.
177
+ * @return {Array} The lights for the given lights node and render ID.
178
+ */
179
+ - getLights(lightsNode, renderId) {
180
+ + getLights(lightsNode: LightsNode, renderId: number) {
181
+ if (_lightsCache.has(lightsNode)) {
182
+ - const cached = _lightsCache.get(lightsNode);
183
+ + const cached = _lightsCache.get(lightsNode)!;
184
+
185
+ if (cached.renderId === renderId) {
186
+ return cached.lightsData;
187
+ @@ -478,7 +526,7 @@ class NodeMaterialObserver {
136
188
* @param {NodeFrame} nodeFrame - The current node frame.
137
189
* @return {boolean} Whether the given render object requires a refresh or not.
138
190
*/
@@ -10217,7 +10269,7 @@ index 37784a05..7b08961a 100644
10217
10269
+
10218
10270
export default StandardNodeLibrary;
10219
10271
diff --git a/src-testing/src/renderers/webgpu/nodes/WGSLNodeBuilder.ts b/src-testing/src/renderers/webgpu/nodes/WGSLNodeBuilder.ts
10220
- index 40eff17c..e14f19f9 100644
10272
+ index d6666b28..78ad6547 100644
10221
10273
--- a/src-testing/src/renderers/webgpu/nodes/WGSLNodeBuilder.ts
10222
10274
+++ b/src-testing/src/renderers/webgpu/nodes/WGSLNodeBuilder.ts
10223
10275
@@ -10,7 +10,7 @@ import {
0 commit comments