diff --git a/examples-jsm/changes.patch b/examples-jsm/changes.patch index 3bfdd1192..18a4a83d1 100644 --- a/examples-jsm/changes.patch +++ b/examples-jsm/changes.patch @@ -519,10 +519,10 @@ index 4d52ec26..5987158d 100644 export default InputNode; diff --git a/examples-jsm/examples/nodes/core/Node.ts b/examples-jsm/examples/nodes/core/Node.ts -index e257c4a1..bb8da751 100644 +index 1278417e..a8d28599 100644 --- a/examples-jsm/examples/nodes/core/Node.ts +++ b/examples-jsm/examples/nodes/core/Node.ts -@@ -2,13 +2,97 @@ import { EventDispatcher } from 'three'; +@@ -2,13 +2,98 @@ import { EventDispatcher } from 'three'; import { NodeUpdateType } from './constants.js'; import { getNodeChildren, getCacheKey } from './NodeUtils.js'; import { MathUtils } from 'three'; @@ -603,6 +603,7 @@ index e257c4a1..bb8da751 100644 + + updateType: NodeUpdateType; + updateBeforeType: NodeUpdateType; ++ updateAfterType: NodeUpdateType; + + uuid: string; + @@ -623,7 +624,7 @@ index e257c4a1..bb8da751 100644 super(); this.nodeType = nodeType; -@@ -30,36 +114,36 @@ class Node extends EventDispatcher { +@@ -31,36 +116,36 @@ class Node extends EventDispatcher { Object.defineProperty(this, 'id', { value: _nodeId++ }); } @@ -667,7 +668,7 @@ index e257c4a1..bb8da751 100644 this.updateReference = callback.bind(this.getSelf()); return this; -@@ -71,11 +155,11 @@ class Node extends EventDispatcher { +@@ -72,11 +157,11 @@ class Node extends EventDispatcher { return this.self || this; } @@ -681,7 +682,7 @@ index e257c4a1..bb8da751 100644 return this.global; } -@@ -89,7 +173,7 @@ class Node extends EventDispatcher { +@@ -90,7 +175,7 @@ class Node extends EventDispatcher { this.dispatchEvent({ type: 'dispose' }); } @@ -690,7 +691,7 @@ index e257c4a1..bb8da751 100644 callback(this); for (const childNode of this.getChildren()) { -@@ -108,7 +192,7 @@ class Node extends EventDispatcher { +@@ -109,7 +194,7 @@ class Node extends EventDispatcher { return this._cacheKey; } @@ -699,8 +700,8 @@ index e257c4a1..bb8da751 100644 return this.uuid; } -@@ -120,14 +204,14 @@ class Node extends EventDispatcher { - return this.updateBeforeType; +@@ -125,14 +210,14 @@ class Node extends EventDispatcher { + return this.updateAfterType; } - getElementType(builder) { @@ -716,7 +717,7 @@ index e257c4a1..bb8da751 100644 const nodeProperties = builder.getNodeProperties(this); if (nodeProperties.outputNode) { -@@ -137,27 +221,27 @@ class Node extends EventDispatcher { +@@ -142,27 +227,27 @@ class Node extends EventDispatcher { return this.nodeType; } @@ -748,7 +749,7 @@ index e257c4a1..bb8da751 100644 // @deprecated, r157 console.warn('THREE.Node: construct() is deprecated. Use setup() instead.'); -@@ -165,14 +249,14 @@ class Node extends EventDispatcher { +@@ -170,14 +255,14 @@ class Node extends EventDispatcher { return this.setup(builder); } @@ -765,7 +766,7 @@ index e257c4a1..bb8da751 100644 const usageCount = this.increaseUsage(builder); if (usageCount === 1) { -@@ -181,14 +265,14 @@ class Node extends EventDispatcher { +@@ -186,14 +271,14 @@ class Node extends EventDispatcher { const nodeProperties = builder.getNodeProperties(this); for (const childNode of Object.values(nodeProperties)) { @@ -783,7 +784,7 @@ index e257c4a1..bb8da751 100644 const { outputNode } = builder.getNodeProperties(this); if (outputNode && outputNode.isNode === true) { -@@ -196,15 +280,15 @@ class Node extends EventDispatcher { +@@ -201,19 +286,19 @@ class Node extends EventDispatcher { } } @@ -792,6 +793,11 @@ index e257c4a1..bb8da751 100644 console.warn('Abstract function.'); } +- updateAfter(/*frame*/) { ++ updateAfter(frame: NodeFrame) { + console.warn('Abstract function.'); + } + - update(/*frame*/) { + update(frame: NodeFrame) { console.warn('Abstract function.'); @@ -802,7 +808,7 @@ index e257c4a1..bb8da751 100644 const refNode = this.getShared(builder); if (this !== refNode) { -@@ -239,8 +323,8 @@ class Node extends EventDispatcher { +@@ -248,8 +333,8 @@ class Node extends EventDispatcher { } for (const childNode of Object.values(properties)) { @@ -813,7 +819,7 @@ index e257c4a1..bb8da751 100644 } } } -@@ -276,10 +360,10 @@ class Node extends EventDispatcher { +@@ -285,10 +370,10 @@ class Node extends EventDispatcher { return getNodeChildren(this); } @@ -826,7 +832,7 @@ index e257c4a1..bb8da751 100644 for (const { property, index, childNode } of nodeChildren) { if (index !== undefined) { -@@ -287,7 +371,9 @@ class Node extends EventDispatcher { +@@ -296,7 +381,9 @@ class Node extends EventDispatcher { inputNodes[property] = Number.isInteger(index) ? [] : {}; } @@ -837,7 +843,7 @@ index e257c4a1..bb8da751 100644 } else { inputNodes[property] = childNode.toJSON(json.meta).uuid; } -@@ -298,39 +384,39 @@ class Node extends EventDispatcher { +@@ -307,39 +394,39 @@ class Node extends EventDispatcher { } } @@ -888,7 +894,7 @@ index e257c4a1..bb8da751 100644 const { uuid, type } = this; const isRoot = meta === undefined || typeof meta === 'string'; -@@ -339,18 +425,18 @@ class Node extends EventDispatcher { +@@ -348,18 +435,18 @@ class Node extends EventDispatcher { textures: {}, images: {}, nodes: {}, @@ -910,7 +916,7 @@ index e257c4a1..bb8da751 100644 metadata: { version: 4.6, type: 'Node', -@@ -358,7 +444,7 @@ class Node extends EventDispatcher { +@@ -367,7 +454,7 @@ class Node extends EventDispatcher { }, }; @@ -919,7 +925,7 @@ index e257c4a1..bb8da751 100644 this.serialize(data); -@@ -367,12 +453,12 @@ class Node extends EventDispatcher { +@@ -376,12 +463,12 @@ class Node extends EventDispatcher { // TODO: Copied from Object3D.toJSON @@ -934,7 +940,7 @@ index e257c4a1..bb8da751 100644 values.push(data); } -@@ -380,9 +466,9 @@ class Node extends EventDispatcher { +@@ -389,9 +476,9 @@ class Node extends EventDispatcher { } if (isRoot) { @@ -947,7 +953,7 @@ index e257c4a1..bb8da751 100644 if (textures.length > 0) data.textures = textures; if (images.length > 0) data.images = images; -@@ -395,7 +481,7 @@ class Node extends EventDispatcher { +@@ -404,7 +491,7 @@ class Node extends EventDispatcher { export default Node; @@ -956,7 +962,7 @@ index e257c4a1..bb8da751 100644 if (typeof nodeClass !== 'function' || !type) throw new Error(`Node class ${type} is not a class`); if (NodeClasses.has(type)) { console.warn(`Redefinition of node class ${type}`); -@@ -403,10 +489,10 @@ export function addNodeClass(type, nodeClass) { +@@ -412,10 +499,10 @@ export function addNodeClass(type, nodeClass) { } NodeClasses.set(type, nodeClass); @@ -989,7 +995,7 @@ index 190fe8c5..d873bb24 100644 this.name = name; diff --git a/examples-jsm/examples/nodes/core/NodeBuilder.ts b/examples-jsm/examples/nodes/core/NodeBuilder.ts -index b5a7f109..a05f2cca 100644 +index e0227081..f03b96c8 100644 --- a/examples-jsm/examples/nodes/core/NodeBuilder.ts +++ b/examples-jsm/examples/nodes/core/NodeBuilder.ts @@ -8,7 +8,7 @@ import NodeCache from './NodeCache.js'; @@ -1065,7 +1071,7 @@ index b5a7f109..a05f2cca 100644 [Int8Array, 'int'], [Int16Array, 'int'], [Int32Array, 'int'], -@@ -60,17 +93,92 @@ const typeFromArray = new Map([ +@@ -60,17 +93,93 @@ const typeFromArray = new Map([ [Float32Array, 'float'], ]); @@ -1102,6 +1108,7 @@ index b5a7f109..a05f2cca 100644 + nodes: Node[]; + updateNodes: Node[]; + updateBeforeNodes: Node[]; ++ updateAfterNodes: Node[]; + hashNodes: { [hash: string]: Node }; + + lightsNode: LightsNode | null; @@ -1164,7 +1171,7 @@ index b5a7f109..a05f2cca 100644 this.renderer = renderer; this.parser = parser; this.scene = scene; -@@ -118,17 +226,17 @@ class NodeBuilder { +@@ -119,17 +228,17 @@ class NodeBuilder { this.cache = new NodeCache(); this.globalCache = this.cache; @@ -1185,7 +1192,7 @@ index b5a7f109..a05f2cca 100644 return new CubeRenderTarget(size, options); } -@@ -138,17 +246,17 @@ class NodeBuilder { +@@ -139,17 +248,17 @@ class NodeBuilder { return new PMREMGenerator(this.renderer); } @@ -1208,7 +1215,7 @@ index b5a7f109..a05f2cca 100644 let sharedBinding = uniformsGroupCache.get(nodes); -@@ -181,11 +289,11 @@ class NodeBuilder { +@@ -182,11 +291,11 @@ class NodeBuilder { return bindingsArray; } @@ -1222,7 +1229,7 @@ index b5a7f109..a05f2cca 100644 if (this.nodes.includes(node) === false) { this.nodes.push(node); -@@ -212,7 +320,7 @@ class NodeBuilder { +@@ -218,7 +327,7 @@ class NodeBuilder { return this.chaining[this.chaining.length - 1]; } @@ -1231,7 +1238,7 @@ index b5a7f109..a05f2cca 100644 /* if ( this.chaining.indexOf( node ) !== - 1 ) { -@@ -224,7 +332,7 @@ class NodeBuilder { +@@ -230,7 +339,7 @@ class NodeBuilder { this.chaining.push(node); } @@ -1240,7 +1247,7 @@ index b5a7f109..a05f2cca 100644 const lastChain = this.chaining.pop(); if (lastChain !== node) { -@@ -232,21 +340,21 @@ class NodeBuilder { +@@ -238,21 +347,21 @@ class NodeBuilder { } } @@ -1266,7 +1273,7 @@ index b5a7f109..a05f2cca 100644 this.context = context; } -@@ -254,7 +362,7 @@ class NodeBuilder { +@@ -260,7 +369,7 @@ class NodeBuilder { return this.context; } @@ -1275,7 +1282,7 @@ index b5a7f109..a05f2cca 100644 this.cache = cache; } -@@ -262,7 +370,7 @@ class NodeBuilder { +@@ -268,7 +377,7 @@ class NodeBuilder { return this.cache; } @@ -1284,7 +1291,7 @@ index b5a7f109..a05f2cca 100644 return false; } -@@ -286,15 +394,45 @@ class NodeBuilder { +@@ -292,15 +401,45 @@ class NodeBuilder { return false; } @@ -1339,7 +1346,7 @@ index b5a7f109..a05f2cca 100644 if (value === null) { if (type === 'float' || type === 'int' || type === 'uint') value = 0; else if (type === 'bool') value = false; -@@ -305,26 +443,26 @@ class NodeBuilder { +@@ -311,26 +450,26 @@ class NodeBuilder { } if (type === 'float') return toFloat(value); @@ -1375,7 +1382,7 @@ index b5a7f109..a05f2cca 100644 } else if (typeLength > 4) { return `${this.getType(type)}()`; } -@@ -332,17 +470,17 @@ class NodeBuilder { +@@ -338,17 +477,17 @@ class NodeBuilder { throw new Error(`NodeBuilder: Type '${type}' not found in generate constant attempt.`); } @@ -1396,7 +1403,7 @@ index b5a7f109..a05f2cca 100644 const attributes = this.attributes; // find attribute -@@ -362,19 +500,19 @@ class NodeBuilder { +@@ -368,19 +507,19 @@ class NodeBuilder { return attribute; } @@ -1423,7 +1430,7 @@ index b5a7f109..a05f2cca 100644 return ( type === 'void' || type === 'property' || -@@ -390,10 +528,10 @@ class NodeBuilder { +@@ -396,10 +535,10 @@ class NodeBuilder { return false; } @@ -1436,7 +1443,7 @@ index b5a7f109..a05f2cca 100644 if (type === IntType) return 'int'; if (type === UnsignedIntType) return 'uint'; } -@@ -401,7 +539,7 @@ class NodeBuilder { +@@ -407,7 +546,7 @@ class NodeBuilder { return 'float'; } @@ -1445,7 +1452,7 @@ index b5a7f109..a05f2cca 100644 if (type === 'mat2') return 'vec2'; if (type === 'mat3') return 'vec3'; if (type === 'mat4') return 'vec4'; -@@ -409,7 +547,7 @@ class NodeBuilder { +@@ -415,7 +554,7 @@ class NodeBuilder { return this.getComponentType(type); } @@ -1454,7 +1461,7 @@ index b5a7f109..a05f2cca 100644 type = this.getVectorType(type); if (type === 'float' || type === 'bool' || type === 'int' || type === 'uint') return type; -@@ -425,7 +563,7 @@ class NodeBuilder { +@@ -431,7 +570,7 @@ class NodeBuilder { return 'float'; } @@ -1463,7 +1470,7 @@ index b5a7f109..a05f2cca 100644 if (type === 'color') return 'vec3'; if (type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D') return 'vec4'; -@@ -433,23 +571,23 @@ class NodeBuilder { +@@ -439,23 +578,23 @@ class NodeBuilder { return type; } @@ -1495,7 +1502,7 @@ index b5a7f109..a05f2cca 100644 const array = dataAttribute.array; const itemSize = attribute.itemSize; -@@ -464,28 +602,28 @@ class NodeBuilder { +@@ -470,28 +609,28 @@ class NodeBuilder { return this.getTypeFromLength(itemSize, arrayType); } @@ -1532,7 +1539,7 @@ index b5a7f109..a05f2cca 100644 const componentType = this.getComponentType(type); if (componentType === 'int' || componentType === 'uint') return type; -@@ -511,7 +649,11 @@ class NodeBuilder { +@@ -517,7 +656,11 @@ class NodeBuilder { return lastStack; } @@ -1545,7 +1552,7 @@ index b5a7f109..a05f2cca 100644 cache = cache === null ? (node.isGlobal(this) ? this.globalCache : this.cache) : cache; let nodeData = cache.getNodeData(node); -@@ -524,16 +666,16 @@ class NodeBuilder { +@@ -530,16 +673,16 @@ class NodeBuilder { if (nodeData[shaderStage] === undefined) nodeData[shaderStage] = {}; @@ -1565,7 +1572,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node); let bufferAttribute = nodeData.bufferAttribute; -@@ -551,7 +693,7 @@ class NodeBuilder { +@@ -557,7 +700,7 @@ class NodeBuilder { return bufferAttribute; } @@ -1574,7 +1581,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node, shaderStage); if (nodeData.structType === undefined) { -@@ -566,7 +708,12 @@ class NodeBuilder { +@@ -572,7 +715,12 @@ class NodeBuilder { return node; } @@ -1588,7 +1595,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node, shaderStage, this.globalCache); let nodeUniform = nodeData.uniform; -@@ -584,7 +731,12 @@ class NodeBuilder { +@@ -590,7 +738,12 @@ class NodeBuilder { return nodeUniform; } @@ -1602,7 +1609,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node, shaderStage); let nodeVar = nodeData.variable; -@@ -604,7 +756,7 @@ class NodeBuilder { +@@ -610,7 +763,7 @@ class NodeBuilder { return nodeVar; } @@ -1611,7 +1618,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node, 'any'); let nodeVarying = nodeData.varying; -@@ -625,7 +777,7 @@ class NodeBuilder { +@@ -631,7 +784,7 @@ class NodeBuilder { return nodeVarying; } @@ -1620,7 +1627,7 @@ index b5a7f109..a05f2cca 100644 const nodeData = this.getDataFromNode(node); let nodeCode = nodeData.code; -@@ -644,7 +796,7 @@ class NodeBuilder { +@@ -650,7 +803,7 @@ class NodeBuilder { return nodeCode; } @@ -1629,7 +1636,7 @@ index b5a7f109..a05f2cca 100644 if (code === '') return this; code = this.tab + code; -@@ -658,7 +810,7 @@ class NodeBuilder { +@@ -664,7 +817,7 @@ class NodeBuilder { return this; } @@ -1638,7 +1645,7 @@ index b5a7f109..a05f2cca 100644 this.flow.code += code; return this; -@@ -676,11 +828,11 @@ class NodeBuilder { +@@ -682,11 +835,11 @@ class NodeBuilder { return this; } @@ -1652,7 +1659,7 @@ index b5a7f109..a05f2cca 100644 const output = node.getNodeType(this); const flowData = this.flowChildNode(node, output); -@@ -690,7 +842,9 @@ class NodeBuilder { +@@ -696,7 +849,9 @@ class NodeBuilder { return flowData; } @@ -1663,7 +1670,7 @@ index b5a7f109..a05f2cca 100644 const fn = new FunctionNode(); const previous = this.currentFunctionNode; -@@ -704,7 +858,7 @@ class NodeBuilder { +@@ -710,7 +865,7 @@ class NodeBuilder { return fn; } @@ -1672,7 +1679,7 @@ index b5a7f109..a05f2cca 100644 const layout = shaderNode.layout; let inputs; -@@ -712,13 +866,13 @@ class NodeBuilder { +@@ -718,13 +873,13 @@ class NodeBuilder { if (shaderNode.isArrayInput) { inputs = []; @@ -1688,7 +1695,7 @@ index b5a7f109..a05f2cca 100644 inputs[input.name] = new ParameterNode(input.type, input.name); } } -@@ -735,14 +889,14 @@ class NodeBuilder { +@@ -741,14 +896,14 @@ class NodeBuilder { return flowData; } @@ -1705,7 +1712,7 @@ index b5a7f109..a05f2cca 100644 code: '', }; -@@ -757,7 +911,7 @@ class NodeBuilder { +@@ -763,7 +918,7 @@ class NodeBuilder { flow.result = node.build(this, output); } @@ -1714,7 +1721,7 @@ index b5a7f109..a05f2cca 100644 this.flow = previousFlow; this.vars = previousVars; -@@ -773,10 +927,10 @@ class NodeBuilder { +@@ -779,10 +934,10 @@ class NodeBuilder { return null; } @@ -1727,7 +1734,7 @@ index b5a7f109..a05f2cca 100644 code: '', }; -@@ -789,7 +943,12 @@ class NodeBuilder { +@@ -795,7 +950,12 @@ class NodeBuilder { return flow; } @@ -1741,7 +1748,7 @@ index b5a7f109..a05f2cca 100644 const previousShaderStage = this.shaderStage; this.setShaderStage(shaderStage); -@@ -811,19 +970,15 @@ class NodeBuilder { +@@ -817,19 +977,15 @@ class NodeBuilder { return this.attributes.concat(this.bufferAttributes); } @@ -1765,7 +1772,7 @@ index b5a7f109..a05f2cca 100644 let snippet = ''; const vars = this.vars[shaderStage]; -@@ -837,11 +992,9 @@ class NodeBuilder { +@@ -843,11 +999,9 @@ class NodeBuilder { return snippet; } @@ -1779,7 +1786,7 @@ index b5a7f109..a05f2cca 100644 const codes = this.codes[shaderStage]; let code = ''; -@@ -856,10 +1009,10 @@ class NodeBuilder { +@@ -862,10 +1016,10 @@ class NodeBuilder { } getHash() { @@ -1792,7 +1799,7 @@ index b5a7f109..a05f2cca 100644 this.shaderStage = shaderStage; } -@@ -867,7 +1020,7 @@ class NodeBuilder { +@@ -873,7 +1027,7 @@ class NodeBuilder { return this.shaderStage; } @@ -1801,7 +1808,7 @@ index b5a7f109..a05f2cca 100644 this.buildStage = buildStage; } -@@ -925,7 +1078,7 @@ class NodeBuilder { +@@ -931,7 +1085,7 @@ class NodeBuilder { return this; } @@ -1810,7 +1817,7 @@ index b5a7f109..a05f2cca 100644 if (type === 'float') return new FloatNodeUniform(uniformNode); if (type === 'vec2') return new Vector2NodeUniform(uniformNode); if (type === 'vec3') return new Vector3NodeUniform(uniformNode); -@@ -943,7 +1096,7 @@ class NodeBuilder { +@@ -949,7 +1103,7 @@ class NodeBuilder { return createNodeMaterialFromType(type); } @@ -1896,7 +1903,7 @@ index 2ee50903..0c0d8c87 100644 this.type = type; this.code = code; diff --git a/examples-jsm/examples/nodes/core/NodeFrame.ts b/examples-jsm/examples/nodes/core/NodeFrame.ts -index b8e8d37b..d5c60178 100644 +index ee64620c..14eb7f75 100644 --- a/examples-jsm/examples/nodes/core/NodeFrame.ts +++ b/examples-jsm/examples/nodes/core/NodeFrame.ts @@ -1,6 +1,26 @@ @@ -1926,7 +1933,7 @@ index b8e8d37b..d5c60178 100644 constructor() { this.time = 0; this.deltaTime = 0; -@@ -35,7 +55,7 @@ class NodeFrame { +@@ -36,7 +56,7 @@ class NodeFrame { return maps; } @@ -1935,7 +1942,7 @@ index b8e8d37b..d5c60178 100644 const updateType = node.getUpdateBeforeType(); const reference = node.updateReference(this); -@@ -60,7 +80,7 @@ class NodeFrame { +@@ -86,7 +106,7 @@ class NodeFrame { } } @@ -4743,7 +4750,7 @@ index 0ec34b04..573cae2b 100644 this.vertexProgram = vertexProgram; diff --git a/examples-jsm/examples/renderers/common/Renderer.ts b/examples-jsm/examples/renderers/common/Renderer.ts -index f083dbd7..2074d552 100644 +index 7c1dcaa9..e058a587 100644 --- a/examples-jsm/examples/renderers/common/Renderer.ts +++ b/examples-jsm/examples/renderers/common/Renderer.ts @@ -30,10 +30,40 @@ import { @@ -5046,7 +5053,7 @@ index f083dbd7..2074d552 100644 // -@@ -389,15 +536,15 @@ class Renderer { +@@ -389,17 +536,17 @@ class Renderer { ); renderObject.object.normalMatrix.getNormalMatrix(renderObject.object.modelViewMatrix); @@ -5056,6 +5063,9 @@ index f083dbd7..2074d552 100644 + this._bindings!.updateForRender(renderObject); this.backend.draw(renderObject, this.info); + +- this._nodes.updateAfter(renderObject); ++ this._nodes!.updateAfter(renderObject); } } } @@ -5065,7 +5075,7 @@ index f083dbd7..2074d552 100644 if (this._initialized === false) { console.warn( 'THREE.Renderer: .render() called before the backend is initialized. Try using .renderAsync() instead.', -@@ -453,12 +600,12 @@ class Renderer { +@@ -455,12 +602,12 @@ class Renderer { return frameBufferTarget; } @@ -5080,7 +5090,7 @@ index f083dbd7..2074d552 100644 const previousRenderId = nodeFrame.renderId; const previousRenderContext = this._currentRenderContext; -@@ -487,7 +634,7 @@ class Renderer { +@@ -489,7 +636,7 @@ class Renderer { // @@ -5089,7 +5099,7 @@ index f083dbd7..2074d552 100644 this._currentRenderContext = renderContext; this._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject; -@@ -558,7 +705,7 @@ class Renderer { +@@ -560,7 +707,7 @@ class Renderer { _projScreenMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse); _frustum.setFromProjectionMatrix(_projScreenMatrix, coordinateSystem); @@ -5098,7 +5108,7 @@ index f083dbd7..2074d552 100644 renderList.begin(); this._projectObject(scene, camera, 0, renderList); -@@ -572,14 +719,14 @@ class Renderer { +@@ -574,14 +721,14 @@ class Renderer { // if (renderTarget !== null) { @@ -5119,7 +5129,7 @@ index f083dbd7..2074d552 100644 renderContext.renderTarget = renderTarget; renderContext.depth = renderTarget.depthBuffer; renderContext.stencil = renderTarget.stencilBuffer; -@@ -600,11 +747,11 @@ class Renderer { +@@ -602,11 +749,11 @@ class Renderer { // @@ -5133,7 +5143,7 @@ index f083dbd7..2074d552 100644 // -@@ -637,7 +784,7 @@ class Renderer { +@@ -639,7 +786,7 @@ class Renderer { if (frameBufferTarget !== null) { this.setRenderTarget(outputRenderTarget, activeCubeFace, activeMipmapLevel); @@ -5142,7 +5152,7 @@ index f083dbd7..2074d552 100644 this._renderScene(_quad, _quad.camera, false); } -@@ -663,13 +810,13 @@ class Renderer { +@@ -665,13 +812,13 @@ class Renderer { return this._activeMipmapLevel; } @@ -5159,7 +5169,7 @@ index f083dbd7..2074d552 100644 return await this.backend.getArrayBufferAsync(attribute); } -@@ -681,11 +828,11 @@ class Renderer { +@@ -683,11 +830,11 @@ class Renderer { return this._pixelRatio; } @@ -5173,7 +5183,7 @@ index f083dbd7..2074d552 100644 return target.set(this._width, this._height); } -@@ -695,7 +842,7 @@ class Renderer { +@@ -697,7 +844,7 @@ class Renderer { this.setSize(this._width, this._height, false); } @@ -5182,7 +5192,7 @@ index f083dbd7..2074d552 100644 this._width = width; this._height = height; -@@ -709,7 +856,7 @@ class Renderer { +@@ -711,7 +858,7 @@ class Renderer { if (this._initialized) this.backend.updateSize(); } @@ -5191,7 +5201,7 @@ index f083dbd7..2074d552 100644 this._width = width; this._height = height; -@@ -726,15 +873,15 @@ class Renderer { +@@ -728,15 +875,15 @@ class Renderer { if (this._initialized) this.backend.updateSize(); } @@ -5210,7 +5220,7 @@ index f083dbd7..2074d552 100644 const scissor = this._scissor; target.x = scissor.x; -@@ -745,13 +892,15 @@ class Renderer { +@@ -747,13 +894,15 @@ class Renderer { return target; } @@ -5230,7 +5240,7 @@ index f083dbd7..2074d552 100644 } } -@@ -759,34 +908,36 @@ class Renderer { +@@ -761,34 +910,36 @@ class Renderer { return this._scissorTest; } @@ -5275,7 +5285,7 @@ index f083dbd7..2074d552 100644 this._clearColor.set(color); this._clearColor.a = alpha; } -@@ -795,7 +946,7 @@ class Renderer { +@@ -797,7 +948,7 @@ class Renderer { return this._clearColor.a; } @@ -5284,7 +5294,7 @@ index f083dbd7..2074d552 100644 this._clearColor.a = alpha; } -@@ -803,7 +954,7 @@ class Renderer { +@@ -805,7 +956,7 @@ class Renderer { return this._clearDepth; } @@ -5293,7 +5303,7 @@ index f083dbd7..2074d552 100644 this._clearDepth = depth; } -@@ -811,11 +962,11 @@ class Renderer { +@@ -813,11 +964,11 @@ class Renderer { return this._clearStencil; } @@ -5307,7 +5317,7 @@ index f083dbd7..2074d552 100644 const renderContext = this._currentRenderContext; return renderContext && this.backend.isOccluded(renderContext, object); -@@ -835,9 +986,9 @@ class Renderer { +@@ -837,9 +988,9 @@ class Renderer { let renderTargetData = null; if (renderTarget !== null) { @@ -5319,7 +5329,7 @@ index f083dbd7..2074d552 100644 } this.backend.clear(color, depth, stencil, renderTargetData); -@@ -846,7 +997,7 @@ class Renderer { +@@ -848,7 +999,7 @@ class Renderer { // If a color space transform or tone mapping is required, // the clear operation clears the intermediate renderTarget texture, but does not update the screen canvas. @@ -5328,7 +5338,7 @@ index f083dbd7..2074d552 100644 this._renderScene(_quad, _quad.camera, false); } } -@@ -882,7 +1033,7 @@ class Renderer { +@@ -884,7 +1035,7 @@ class Renderer { } get currentColorSpace() { @@ -5337,7 +5347,7 @@ index f083dbd7..2074d552 100644 if (renderTarget !== null) { const texture = renderTarget.texture; -@@ -896,20 +1047,20 @@ class Renderer { +@@ -898,20 +1049,20 @@ class Renderer { dispose() { this.info.dispose(); @@ -5367,7 +5377,7 @@ index f083dbd7..2074d552 100644 this._renderTarget = renderTarget; this._activeCubeFace = activeCubeFace; this._activeMipmapLevel = activeMipmapLevel; -@@ -919,7 +1070,19 @@ class Renderer { +@@ -921,7 +1072,19 @@ class Renderer { return this._renderTarget; } @@ -5388,7 +5398,7 @@ index f083dbd7..2074d552 100644 this._renderObjectFunction = renderObjectFunction; } -@@ -927,10 +1090,10 @@ class Renderer { +@@ -929,10 +1092,10 @@ class Renderer { return this._renderObjectFunction; } @@ -5401,7 +5411,7 @@ index f083dbd7..2074d552 100644 const previousRenderId = nodeFrame.renderId; -@@ -945,9 +1108,9 @@ class Renderer { +@@ -947,9 +1110,9 @@ class Renderer { // const backend = this.backend; @@ -5414,7 +5424,7 @@ index f083dbd7..2074d552 100644 const computeList = Array.isArray(computeNodes) ? computeNodes : [computeNodes]; if (computeList[0] === undefined || computeList[0].isComputeNode !== true) { -@@ -993,13 +1156,13 @@ class Renderer { +@@ -995,13 +1158,13 @@ class Renderer { nodeFrame.renderId = previousRenderId; } @@ -5430,7 +5440,7 @@ index f083dbd7..2074d552 100644 if (this._initialized === false) { console.warn( 'THREE.Renderer: .hasFeature() called before the backend is initialized. Try using .hasFeatureAsync() instead.', -@@ -1011,64 +1174,77 @@ class Renderer { +@@ -1013,64 +1176,77 @@ class Renderer { return this.backend.hasFeature(name); } @@ -5529,7 +5539,7 @@ index f083dbd7..2074d552 100644 .applyMatrix4(object.matrixWorld) .applyMatrix4(_projScreenMatrix); } -@@ -1078,7 +1254,7 @@ class Renderer { +@@ -1080,7 +1256,7 @@ class Renderer { for (let i = 0, l = groups.length; i < l; i++) { const group = groups[i]; @@ -5538,7 +5548,7 @@ index f083dbd7..2074d552 100644 if (groupMaterial && groupMaterial.visible) { renderList.push(object, geometry, groupMaterial, groupOrder, _vector3.z, group); -@@ -1095,7 +1271,7 @@ class Renderer { +@@ -1097,7 +1273,7 @@ class Renderer { const baseRenderList = renderList; // replace render list @@ -5547,7 +5557,7 @@ index f083dbd7..2074d552 100644 renderList.begin(); -@@ -1115,13 +1291,13 @@ class Renderer { +@@ -1117,13 +1293,13 @@ class Renderer { } } @@ -5563,7 +5573,7 @@ index f083dbd7..2074d552 100644 // process renderable objects for (let i = 0, il = renderList.length; i < il; i++) { -@@ -1132,42 +1308,50 @@ class Renderer { +@@ -1134,42 +1310,50 @@ class Renderer { const { object, geometry, material, group } = renderItem; @@ -5625,7 +5635,7 @@ index f083dbd7..2074d552 100644 let overridePositionNode; let overrideFragmentNode; let overrideDepthNode; -@@ -1254,21 +1438,29 @@ class Renderer { +@@ -1256,21 +1440,29 @@ class Renderer { object.onAfterRender(this, scene, camera, geometry, material, group); } @@ -5659,7 +5669,7 @@ index f083dbd7..2074d552 100644 // -@@ -1277,10 +1469,10 @@ class Renderer { +@@ -1279,10 +1471,10 @@ class Renderer { // @@ -5674,7 +5684,7 @@ index f083dbd7..2074d552 100644 // -@@ -1294,34 +1486,42 @@ class Renderer { +@@ -1296,38 +1488,46 @@ class Renderer { this.backend.draw(renderObject, this.info); if (this._currentRenderBundle !== null) { @@ -5684,6 +5694,9 @@ index f083dbd7..2074d552 100644 - renderContextData.renderObjects.push(renderObject); + renderContextData.renderObjects!.push(renderObject); } + +- this._nodes.updateAfter(renderObject); ++ this._nodes!.updateAfter(renderObject); } - _createObjectPipeline(object, material, scene, camera, lightsNode, passId) { @@ -5724,6 +5737,9 @@ index f083dbd7..2074d552 100644 - this._pipelines.getForRender(renderObject, this._compilationPromises); + this._pipelines!.getForRender(renderObject, this._compilationPromises); + +- this._nodes.updateAfter(renderObject); ++ this._nodes!.updateAfter(renderObject); } get compute() { @@ -6247,13 +6263,13 @@ index beb35347..c264d777 100644 if (a[offset + i] !== b[i]) return false; } diff --git a/examples-jsm/examples/renderers/common/nodes/NodeBuilderState.ts b/examples-jsm/examples/renderers/common/nodes/NodeBuilderState.ts -index 5553bd2d..3d871cc6 100644 +index 2f4d0121..9c46d730 100644 --- a/examples-jsm/examples/renderers/common/nodes/NodeBuilderState.ts +++ b/examples-jsm/examples/renderers/common/nodes/NodeBuilderState.ts -@@ -1,13 +1,30 @@ -+import Node from '../../../nodes/core/Node.js'; +@@ -1,14 +1,32 @@ +import NodeAttribute from '../../../nodes/core/NodeAttribute.js'; +import Binding from '../Binding.js'; ++import Node from '../../../nodes/core/Node.js'; + class NodeBuilderState { + vertexShader: string | null; @@ -6266,6 +6282,7 @@ index 5553bd2d..3d871cc6 100644 + + updateNodes: Node[]; + updateBeforeNodes: Node[]; ++ updateAfterNodes: Node[]; + + usedTimes: number; + @@ -6277,6 +6294,7 @@ index 5553bd2d..3d871cc6 100644 - bindings, - updateNodes, - updateBeforeNodes, +- updateAfterNodes, - transforms = [], + vertexShader: string | null, + fragmentShader: string | null, @@ -6285,6 +6303,7 @@ index 5553bd2d..3d871cc6 100644 + bindings: Binding[], + updateNodes: Node[], + updateBeforeNodes: Node[], ++ updateAfterNodes: Node[], + transforms: never[] = [], ) { this.vertexShader = vertexShader; @@ -6418,7 +6437,7 @@ index 0bbc1add..570a79ac 100644 for (const uniform of this.uniforms) { const node = uniform.nodeUniform.node; diff --git a/examples-jsm/examples/renderers/common/nodes/Nodes.ts b/examples-jsm/examples/renderers/common/nodes/Nodes.ts -index 86df5654..ec898ce4 100644 +index 50712ee8..8cad3734 100644 --- a/examples-jsm/examples/renderers/common/nodes/Nodes.ts +++ b/examples-jsm/examples/renderers/common/nodes/Nodes.ts @@ -2,10 +2,20 @@ import DataMap from '../DataMap.js'; @@ -6571,12 +6590,7 @@ index 86df5654..ec898ce4 100644 return new NodeBuilderState( nodeBuilder.vertexShader, nodeBuilder.fragmentShader, -@@ -172,24 +227,32 @@ class Nodes extends DataMap { - nodeBuilder.getBindings(), - nodeBuilder.updateNodes, - nodeBuilder.updateBeforeNodes, -- nodeBuilder.transforms, -+ (nodeBuilder as GLSLNodeBuilder | { transforms?: Transform[] }).transforms, +@@ -177,20 +232,28 @@ class Nodes extends DataMap { ); } @@ -6613,7 +6627,7 @@ index 86df5654..ec898ce4 100644 const callId = this.renderer.info.calls; let cacheKeyData = this.callHashCache.get(chain); -@@ -215,7 +278,7 @@ class Nodes extends DataMap { +@@ -216,7 +279,7 @@ class Nodes extends DataMap { return cacheKeyData.cacheKey; } @@ -6622,7 +6636,7 @@ index 86df5654..ec898ce4 100644 this.updateEnvironment(scene); this.updateFog(scene); this.updateBackground(scene); -@@ -225,7 +288,7 @@ class Nodes extends DataMap { +@@ -226,7 +289,7 @@ class Nodes extends DataMap { return this.renderer.getRenderTarget() ? false : true; } @@ -6631,7 +6645,7 @@ index 86df5654..ec898ce4 100644 const sceneData = this.get(scene); const background = scene.background; -@@ -234,15 +297,15 @@ class Nodes extends DataMap { +@@ -235,15 +298,15 @@ class Nodes extends DataMap { let backgroundNode = null; if ( @@ -6654,7 +6668,7 @@ index 86df5654..ec898ce4 100644 } sceneData.backgroundNode = backgroundNode; -@@ -254,7 +317,7 @@ class Nodes extends DataMap { +@@ -255,7 +318,7 @@ class Nodes extends DataMap { } } @@ -6663,7 +6677,7 @@ index 86df5654..ec898ce4 100644 const sceneData = this.get(scene); const fog = scene.fog; -@@ -262,9 +325,9 @@ class Nodes extends DataMap { +@@ -263,9 +326,9 @@ class Nodes extends DataMap { if (sceneData.fog !== fog) { let fogNode = null; @@ -6675,7 +6689,7 @@ index 86df5654..ec898ce4 100644 fogNode = rangeFog( reference('color', 'color', fog), reference('near', 'float', fog), -@@ -283,7 +346,7 @@ class Nodes extends DataMap { +@@ -284,7 +347,7 @@ class Nodes extends DataMap { } } @@ -6684,7 +6698,7 @@ index 86df5654..ec898ce4 100644 const sceneData = this.get(scene); const environment = scene.environment; -@@ -291,7 +354,7 @@ class Nodes extends DataMap { +@@ -292,7 +355,7 @@ class Nodes extends DataMap { if (sceneData.environment !== environment) { let environmentNode = null; @@ -6693,7 +6707,7 @@ index 86df5654..ec898ce4 100644 environmentNode = cubeTexture(environment); } else if (environment.isTexture === true) { environmentNode = texture(environment); -@@ -308,7 +371,13 @@ class Nodes extends DataMap { +@@ -309,7 +372,13 @@ class Nodes extends DataMap { } } @@ -6708,7 +6722,7 @@ index 86df5654..ec898ce4 100644 const nodeFrame = this.nodeFrame; nodeFrame.renderer = renderer; nodeFrame.scene = scene; -@@ -319,7 +388,7 @@ class Nodes extends DataMap { +@@ -320,7 +389,7 @@ class Nodes extends DataMap { return nodeFrame; } @@ -6717,7 +6731,7 @@ index 86df5654..ec898ce4 100644 return this.getNodeFrame( renderObject.renderer, renderObject.scene, -@@ -329,8 +398,8 @@ class Nodes extends DataMap { +@@ -330,8 +399,8 @@ class Nodes extends DataMap { ); } @@ -6728,7 +6742,7 @@ index 86df5654..ec898ce4 100644 if (this.isToneMappingState) { if (this.renderer.toneMappingNode) { -@@ -347,7 +416,7 @@ class Nodes extends DataMap { +@@ -348,7 +417,7 @@ class Nodes extends DataMap { return output; } @@ -6737,7 +6751,16 @@ index 86df5654..ec898ce4 100644 const nodeFrame = this.getNodeFrameForRender(renderObject); const nodeBuilder = renderObject.getNodeBuilderState(); -@@ -356,7 +425,7 @@ class Nodes extends DataMap { +@@ -357,7 +426,7 @@ class Nodes extends DataMap { + } + } + +- updateAfter(renderObject) { ++ updateAfter(renderObject: RenderObject) { + const nodeFrame = this.getNodeFrameForRender(renderObject); + const nodeBuilder = renderObject.getNodeBuilderState(); + +@@ -366,7 +435,7 @@ class Nodes extends DataMap { } } @@ -6746,7 +6769,7 @@ index 86df5654..ec898ce4 100644 const nodeFrame = this.getNodeFrame(); const nodeBuilder = this.getForCompute(computeNode); -@@ -365,7 +434,7 @@ class Nodes extends DataMap { +@@ -375,7 +444,7 @@ class Nodes extends DataMap { } } diff --git a/three.js b/three.js index 3556fc5d6..f80532573 160000 --- a/three.js +++ b/three.js @@ -1 +1 @@ -Subproject commit 3556fc5d6986e03bcd4776ee2e89b862ec493c10 +Subproject commit f805325738e077629acfb067081b896f0953a7d8 diff --git a/types/three/examples/jsm/nodes/core/Node.d.ts b/types/three/examples/jsm/nodes/core/Node.d.ts index 9f7f05c44..ee6ef955f 100644 --- a/types/three/examples/jsm/nodes/core/Node.d.ts +++ b/types/three/examples/jsm/nodes/core/Node.d.ts @@ -69,6 +69,7 @@ declare class Node extends EventDispatcher<{ nodeType: string | null; updateType: NodeUpdateType; updateBeforeType: NodeUpdateType; + updateAfterType: NodeUpdateType; uuid: string; version: number; _cacheKey: string | null; @@ -95,6 +96,7 @@ declare class Node extends EventDispatcher<{ getHash(builder: NodeBuilder): string; getUpdateType(): NodeUpdateType; getUpdateBeforeType(): NodeUpdateType; + getUpdateAfterType(): NodeUpdateType; getElementType(builder: NodeBuilder): "bool" | "int" | "float" | "vec2" | "vec3" | "vec4" | "uint" | null; getNodeType(builder: NodeBuilder): string | null; getShared(builder: NodeBuilder): Node; @@ -104,6 +106,7 @@ declare class Node extends EventDispatcher<{ analyze(builder: NodeBuilder): void; generate(builder: NodeBuilder, output?: string | null): string | null | undefined; updateBefore(frame: NodeFrame): void; + updateAfter(frame: NodeFrame): void; update(frame: NodeFrame): void; build(builder: NodeBuilder, output?: string | null): string | null; getSerializeChildren(): Generator; diff --git a/types/three/examples/jsm/renderers/common/nodes/NodeBuilderState.d.ts b/types/three/examples/jsm/renderers/common/nodes/NodeBuilderState.d.ts index 68a09a47e..0164aa58e 100644 --- a/types/three/examples/jsm/renderers/common/nodes/NodeBuilderState.d.ts +++ b/types/three/examples/jsm/renderers/common/nodes/NodeBuilderState.d.ts @@ -10,6 +10,7 @@ declare class NodeBuilderState { bindings: Binding[]; updateNodes: Node[]; updateBeforeNodes: Node[]; + updateAfterNodes: Node[]; usedTimes: number; constructor( vertexShader: string | null, @@ -19,6 +20,7 @@ declare class NodeBuilderState { bindings: Binding[], updateNodes: Node[], updateBeforeNodes: Node[], + updateAfterNodes: Node[], transforms?: never[], ); createBindings(): Binding[]; diff --git a/types/three/examples/jsm/renderers/common/nodes/Nodes.d.ts b/types/three/examples/jsm/renderers/common/nodes/Nodes.d.ts index 39e41db7e..6c264cd4c 100644 --- a/types/three/examples/jsm/renderers/common/nodes/Nodes.d.ts +++ b/types/three/examples/jsm/renderers/common/nodes/Nodes.d.ts @@ -87,6 +87,7 @@ declare class Nodes extends DataMap<{ getNodeFrameForRender(renderObject: RenderObject): NodeFrame; getOutputNode(outputTexture: Texture): ShaderNodeObject; updateBefore(renderObject: RenderObject): void; + updateAfter(renderObject: RenderObject): void; updateForCompute(computeNode: ComputeNode): void; updateForRender(renderObject: RenderObject): void; dispose(): void;