diff --git a/src/nodes/accessors/Object3DNode.js b/src/nodes/accessors/Object3DNode.js index 0a7b14b37cf96e..333d1f119eadbd 100644 --- a/src/nodes/accessors/Object3DNode.js +++ b/src/nodes/accessors/Object3DNode.js @@ -64,10 +64,9 @@ class Object3DNode extends Node { /** * Holds the value of the node as a uniform. * - * @private * @type {UniformNode} */ - this._uniformNode = new UniformNode( null ); + this.uniformNode = new UniformNode( null ); } @@ -104,7 +103,7 @@ class Object3DNode extends Node { update( frame ) { const object = this.object3d; - const uniformNode = this._uniformNode; + const uniformNode = this.uniformNode; const scope = this.scope; if ( scope === Object3DNode.WORLD_MATRIX ) { @@ -165,19 +164,19 @@ class Object3DNode extends Node { if ( scope === Object3DNode.WORLD_MATRIX ) { - this._uniformNode.nodeType = 'mat4'; + this.uniformNode.nodeType = 'mat4'; } else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) { - this._uniformNode.nodeType = 'vec3'; + this.uniformNode.nodeType = 'vec3'; } else if ( scope === Object3DNode.RADIUS ) { - this._uniformNode.nodeType = 'float'; + this.uniformNode.nodeType = 'float'; } - return this._uniformNode.build( builder ); + return this.uniformNode.build( builder ); } diff --git a/src/nodes/core/AssignNode.js b/src/nodes/core/AssignNode.js index c232c64a330a1e..f33bcd41bb9c3b 100644 --- a/src/nodes/core/AssignNode.js +++ b/src/nodes/core/AssignNode.js @@ -93,15 +93,25 @@ class AssignNode extends TempNode { } - generate( builder, output ) { + setup( builder ) { const { targetNode, sourceNode } = this; + const properties = builder.getNodeProperties( this ); + properties.sourceNode = sourceNode; + properties.targetNode = targetNode.context( { assign: true } ); + + } + + generate( builder, output ) { + + const { targetNode, sourceNode } = builder.getNodeProperties( this ); + const needsSplitAssign = this.needsSplitAssign( builder ); const targetType = targetNode.getNodeType( builder ); - const target = targetNode.context( { assign: true } ).build( builder ); + const target = targetNode.build( builder ); const source = sourceNode.build( builder, targetType ); const sourceType = sourceNode.getNodeType( builder ); @@ -127,11 +137,14 @@ class AssignNode extends TempNode { builder.addLineFlowCode( `${ sourceProperty } = ${ source }`, this ); - const targetRoot = targetNode.node.context( { assign: true } ).build( builder ); + const splitNode = targetNode.node; + const splitTargetNode = splitNode.node.context( { assign: true } ); + + const targetRoot = splitTargetNode.build( builder ); - for ( let i = 0; i < targetNode.components.length; i ++ ) { + for ( let i = 0; i < splitNode.components.length; i ++ ) { - const component = targetNode.components[ i ]; + const component = splitNode.components[ i ]; builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]`, this ); diff --git a/src/nodes/core/Node.js b/src/nodes/core/Node.js index ab866257db1ebb..00c003ee28224e 100644 --- a/src/nodes/core/Node.js +++ b/src/nodes/core/Node.js @@ -4,6 +4,11 @@ import { getNodeChildren, getCacheKey, hash } from './NodeUtils.js'; import { EventDispatcher } from '../../core/EventDispatcher.js'; import { MathUtils } from '../../math/MathUtils.js'; +const _parentBuildStage = { + analyze: 'setup', + generate: 'analyze' +}; + let _nodeId = 0; /** @@ -623,6 +628,30 @@ class Node extends EventDispatcher { } + // + + const nodeData = builder.getDataFromNode( this ); + nodeData.buildStages = nodeData.buildStages || {}; + nodeData.buildStages[ builder.buildStage ] = true; + + const parentBuildStage = _parentBuildStage[ builder.buildStage ]; + + if ( parentBuildStage && nodeData.buildStages[ parentBuildStage ] !== true ) { + + // force parent build stage (setup or analyze) + + const previousBuildStage = builder.getBuildStage(); + + builder.setBuildStage( parentBuildStage ); + + this.build( builder ); + + builder.setBuildStage( previousBuildStage ); + + } + + // + builder.addNode( this ); builder.addChain( this ); diff --git a/src/nodes/lighting/LightsNode.js b/src/nodes/lighting/LightsNode.js index fb8de9e7c2f413..4a4c62123ade45 100644 --- a/src/nodes/lighting/LightsNode.js +++ b/src/nodes/lighting/LightsNode.js @@ -173,7 +173,7 @@ class LightsNode extends Node { analyze( builder ) { - const properties = builder.getDataFromNode( this ); + const properties = builder.getNodeProperties( this ); for ( const node of properties.nodes ) { @@ -181,6 +181,8 @@ class LightsNode extends Node { } + properties.outputNode.build( builder ); + } /** @@ -329,7 +331,7 @@ class LightsNode extends Node { const context = builder.context; const lightingModel = context.lightingModel; - const properties = builder.getDataFromNode( this ); + const properties = builder.getNodeProperties( this ); if ( lightingModel ) { diff --git a/src/nodes/math/MathNode.js b/src/nodes/math/MathNode.js index ef7a110ddab975..12733acec47716 100644 --- a/src/nodes/math/MathNode.js +++ b/src/nodes/math/MathNode.js @@ -160,26 +160,31 @@ class MathNode extends TempNode { } - generate( builder, output ) { + setup( builder ) { - let method = this.method; + const { aNode, bNode, method } = this; - const type = this.getNodeType( builder ); - const inputType = this.getInputType( builder ); + let outputNode = null; - const a = this.aNode; - const b = this.bNode; - const c = this.cNode; + if ( method === MathNode.ONE_MINUS ) { - const coordinateSystem = builder.renderer.coordinateSystem; + outputNode = sub( 1.0, aNode ); - if ( method === MathNode.TRANSFORM_DIRECTION ) { + } else if ( method === MathNode.RECIPROCAL ) { + + outputNode = div( 1.0, aNode ); + + } else if ( method === MathNode.DIFFERENCE ) { + + outputNode = abs( sub( aNode, bNode ) ); + + } else if ( method === MathNode.TRANSFORM_DIRECTION ) { // dir can be either a direction vector or a normal vector // upper-left 3x3 of matrix is assumed to be orthogonal - let tA = a; - let tB = b; + let tA = aNode; + let tB = bNode; if ( builder.isMatrix( tA.getNodeType( builder ) ) ) { @@ -193,23 +198,46 @@ class MathNode extends TempNode { const mulNode = mul( tA, tB ).xyz; - return normalize( mulNode ).build( builder, output ); + outputNode = normalize( mulNode ); - } else if ( method === MathNode.NEGATE ) { + } - return builder.format( '( - ' + a.build( builder, inputType ) + ' )', type, output ); + if ( outputNode !== null ) { - } else if ( method === MathNode.ONE_MINUS ) { + return outputNode; - return sub( 1.0, a ).build( builder, output ); + } else { - } else if ( method === MathNode.RECIPROCAL ) { + return super.setup( builder ); - return div( 1.0, a ).build( builder, output ); + } - } else if ( method === MathNode.DIFFERENCE ) { + } - return abs( sub( a, b ) ).build( builder, output ); + generate( builder, output ) { + + const properties = builder.getNodeProperties( this ); + + if ( properties.outputNode ) { + + return super.generate( builder, output ); + + } + + let method = this.method; + + const type = this.getNodeType( builder ); + const inputType = this.getInputType( builder ); + + const a = this.aNode; + const b = this.bNode; + const c = this.cNode; + + const coordinateSystem = builder.renderer.coordinateSystem; + + if ( method === MathNode.NEGATE ) { + + return builder.format( '( - ' + a.build( builder, inputType ) + ' )', type, output ); } else { diff --git a/src/nodes/math/OperatorNode.js b/src/nodes/math/OperatorNode.js index 03bfcfaaa728b8..4b94b5fb038800 100644 --- a/src/nodes/math/OperatorNode.js +++ b/src/nodes/math/OperatorNode.js @@ -113,7 +113,7 @@ class OperatorNode extends TempNode { const bNode = this.bNode; const typeA = aNode.getNodeType( builder ); - const typeB = typeof bNode !== 'undefined' ? bNode.getNodeType( builder ) : null; + const typeB = bNode ? bNode.getNodeType( builder ) : null; if ( typeA === 'void' || typeB === 'void' ) { @@ -191,8 +191,7 @@ class OperatorNode extends TempNode { const op = this.op; - const aNode = this.aNode; - const bNode = this.bNode; + const { aNode, bNode } = this; const type = this.getNodeType( builder ); @@ -202,7 +201,7 @@ class OperatorNode extends TempNode { if ( type !== 'void' ) { typeA = aNode.getNodeType( builder ); - typeB = typeof bNode !== 'undefined' ? bNode.getNodeType( builder ) : null; + typeB = bNode ? bNode.getNodeType( builder ) : null; if ( op === '<' || op === '>' || op === '<=' || op === '>=' || op === '==' || op === '!=' ) { @@ -288,7 +287,7 @@ class OperatorNode extends TempNode { } const a = aNode.build( builder, typeA ); - const b = typeof bNode !== 'undefined' ? bNode.build( builder, typeB ) : null; + const b = bNode ? bNode.build( builder, typeB ) : null; const fnOpSnippet = builder.getFunctionOperator( op );