添加关照、全局等高线、修改图层问题
This commit is contained in:
		
							
								
								
									
										44
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeBuilderState.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeBuilderState.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
class NodeBuilderState {
 | 
			
		||||
 | 
			
		||||
	constructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, transforms = [] ) {
 | 
			
		||||
 | 
			
		||||
		this.vertexShader = vertexShader;
 | 
			
		||||
		this.fragmentShader = fragmentShader;
 | 
			
		||||
		this.computeShader = computeShader;
 | 
			
		||||
		this.transforms = transforms;
 | 
			
		||||
 | 
			
		||||
		this.nodeAttributes = nodeAttributes;
 | 
			
		||||
		this.bindings = bindings;
 | 
			
		||||
 | 
			
		||||
		this.updateNodes = updateNodes;
 | 
			
		||||
		this.updateBeforeNodes = updateBeforeNodes;
 | 
			
		||||
 | 
			
		||||
		this.usedTimes = 0;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	createBindings() {
 | 
			
		||||
 | 
			
		||||
		const bindingsArray = [];
 | 
			
		||||
 | 
			
		||||
		for ( const instanceBinding of this.bindings ) {
 | 
			
		||||
 | 
			
		||||
			let binding = instanceBinding;
 | 
			
		||||
 | 
			
		||||
			if ( instanceBinding.shared !== true ) {
 | 
			
		||||
 | 
			
		||||
				binding = instanceBinding.clone();
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			bindingsArray.push( binding );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return bindingsArray;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default NodeBuilderState;
 | 
			
		||||
							
								
								
									
										49
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeSampledTexture.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeSampledTexture.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
import { SampledTexture } from '../SampledTexture.js';
 | 
			
		||||
 | 
			
		||||
class NodeSampledTexture extends SampledTexture {
 | 
			
		||||
 | 
			
		||||
	constructor( name, textureNode ) {
 | 
			
		||||
 | 
			
		||||
		super( name, textureNode ? textureNode.value : null );
 | 
			
		||||
 | 
			
		||||
		this.textureNode = textureNode;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get needsBindingsUpdate() {
 | 
			
		||||
 | 
			
		||||
		return this.textureNode.value !== this.texture || super.needsBindingsUpdate;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	update() {
 | 
			
		||||
 | 
			
		||||
		const { textureNode } = this;
 | 
			
		||||
 | 
			
		||||
		if ( this.texture !== textureNode.value ) {
 | 
			
		||||
 | 
			
		||||
			this.texture = textureNode.value;
 | 
			
		||||
 | 
			
		||||
			return true;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return super.update();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class NodeSampledCubeTexture extends NodeSampledTexture {
 | 
			
		||||
 | 
			
		||||
	constructor( name, textureNode ) {
 | 
			
		||||
 | 
			
		||||
		super( name, textureNode );
 | 
			
		||||
 | 
			
		||||
		this.isSampledCubeTexture = true;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export { NodeSampledTexture, NodeSampledCubeTexture };
 | 
			
		||||
							
								
								
									
										15
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeSampler.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeSampler.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,15 @@
 | 
			
		||||
import Sampler from '../Sampler.js';
 | 
			
		||||
 | 
			
		||||
class NodeSampler extends Sampler {
 | 
			
		||||
 | 
			
		||||
	constructor( name, textureNode ) {
 | 
			
		||||
 | 
			
		||||
		super( name, textureNode ? textureNode.value : null );
 | 
			
		||||
 | 
			
		||||
		this.textureNode = textureNode;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default NodeSampler;
 | 
			
		||||
							
								
								
									
										23
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeStorageBuffer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeStorageBuffer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
import StorageBuffer from '../StorageBuffer.js';
 | 
			
		||||
 | 
			
		||||
let _id = 0;
 | 
			
		||||
 | 
			
		||||
class NodeStorageBuffer extends StorageBuffer {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get buffer() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default NodeStorageBuffer;
 | 
			
		||||
							
								
								
									
										135
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniform.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniform.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,135 @@
 | 
			
		||||
import {
 | 
			
		||||
	FloatUniform, Vector2Uniform, Vector3Uniform, Vector4Uniform,
 | 
			
		||||
	ColorUniform, Matrix3Uniform, Matrix4Uniform
 | 
			
		||||
} from '../Uniform.js';
 | 
			
		||||
 | 
			
		||||
class FloatNodeUniform extends FloatUniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Vector2NodeUniform extends Vector2Uniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Vector3NodeUniform extends Vector3Uniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Vector4NodeUniform extends Vector4Uniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ColorNodeUniform extends ColorUniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Matrix3NodeUniform extends Matrix3Uniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Matrix4NodeUniform extends Matrix4Uniform {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( nodeUniform.name, nodeUniform.value );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getValue() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
	FloatNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
 | 
			
		||||
	ColorNodeUniform, Matrix3NodeUniform, Matrix4NodeUniform
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										23
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniformBuffer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniformBuffer.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
import UniformBuffer from '../UniformBuffer.js';
 | 
			
		||||
 | 
			
		||||
let _id = 0;
 | 
			
		||||
 | 
			
		||||
class NodeUniformBuffer extends UniformBuffer {
 | 
			
		||||
 | 
			
		||||
	constructor( nodeUniform ) {
 | 
			
		||||
 | 
			
		||||
		super( 'UniformBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );
 | 
			
		||||
 | 
			
		||||
		this.nodeUniform = nodeUniform;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get buffer() {
 | 
			
		||||
 | 
			
		||||
		return this.nodeUniform.value;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default NodeUniformBuffer;
 | 
			
		||||
							
								
								
									
										44
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniformsGroup.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/NodeUniformsGroup.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
import UniformsGroup from '../UniformsGroup.js';
 | 
			
		||||
 | 
			
		||||
let id = 0;
 | 
			
		||||
 | 
			
		||||
class NodeUniformsGroup extends UniformsGroup {
 | 
			
		||||
 | 
			
		||||
	constructor( name, groupNode ) {
 | 
			
		||||
 | 
			
		||||
		super( name );
 | 
			
		||||
 | 
			
		||||
		this.id = id ++;
 | 
			
		||||
		this.groupNode = groupNode;
 | 
			
		||||
 | 
			
		||||
		this.isNodeUniformsGroup = true;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get shared() {
 | 
			
		||||
 | 
			
		||||
		return this.groupNode.shared;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getNodes() {
 | 
			
		||||
 | 
			
		||||
		const nodes = [];
 | 
			
		||||
 | 
			
		||||
		for ( const uniform of this.uniforms ) {
 | 
			
		||||
 | 
			
		||||
			const node = uniform.nodeUniform.node;
 | 
			
		||||
 | 
			
		||||
			if ( ! node ) throw new Error( 'NodeUniformsGroup: Uniform has no node.' );
 | 
			
		||||
 | 
			
		||||
			nodes.push( node );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nodes;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default NodeUniformsGroup;
 | 
			
		||||
							
								
								
									
										467
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/Nodes.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								dist/electron/static/sdk/three/jsm/renderers/common/nodes/Nodes.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,467 @@
 | 
			
		||||
import DataMap from '../DataMap.js';
 | 
			
		||||
import ChainMap from '../ChainMap.js';
 | 
			
		||||
import NodeBuilderState from './NodeBuilderState.js';
 | 
			
		||||
import { EquirectangularReflectionMapping, EquirectangularRefractionMapping, NoToneMapping, SRGBColorSpace } from 'three';
 | 
			
		||||
import { NodeFrame, vec4, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
 | 
			
		||||
 | 
			
		||||
class Nodes extends DataMap {
 | 
			
		||||
 | 
			
		||||
	constructor( renderer, backend ) {
 | 
			
		||||
 | 
			
		||||
		super();
 | 
			
		||||
 | 
			
		||||
		this.renderer = renderer;
 | 
			
		||||
		this.backend = backend;
 | 
			
		||||
		this.nodeFrame = new NodeFrame();
 | 
			
		||||
		this.nodeBuilderCache = new Map();
 | 
			
		||||
		this.callHashCache = new ChainMap();
 | 
			
		||||
		this.groupsData = new ChainMap();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateGroup( nodeUniformsGroup ) {
 | 
			
		||||
 | 
			
		||||
		const groupNode = nodeUniformsGroup.groupNode;
 | 
			
		||||
		const name = groupNode.name;
 | 
			
		||||
 | 
			
		||||
		// objectGroup is every updated
 | 
			
		||||
 | 
			
		||||
		if ( name === objectGroup.name ) return true;
 | 
			
		||||
 | 
			
		||||
		// renderGroup is updated once per render/compute call
 | 
			
		||||
 | 
			
		||||
		if ( name === renderGroup.name ) {
 | 
			
		||||
 | 
			
		||||
			const uniformsGroupData = this.get( nodeUniformsGroup );
 | 
			
		||||
			const renderId = this.nodeFrame.renderId;
 | 
			
		||||
 | 
			
		||||
			if ( uniformsGroupData.renderId !== renderId ) {
 | 
			
		||||
 | 
			
		||||
				uniformsGroupData.renderId = renderId;
 | 
			
		||||
 | 
			
		||||
				return true;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// frameGroup is updated once per frame
 | 
			
		||||
 | 
			
		||||
		if ( name === frameGroup.name ) {
 | 
			
		||||
 | 
			
		||||
			const uniformsGroupData = this.get( nodeUniformsGroup );
 | 
			
		||||
			const frameId = this.nodeFrame.frameId;
 | 
			
		||||
 | 
			
		||||
			if ( uniformsGroupData.frameId !== frameId ) {
 | 
			
		||||
 | 
			
		||||
				uniformsGroupData.frameId = frameId;
 | 
			
		||||
 | 
			
		||||
				return true;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return false;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// other groups are updated just when groupNode.needsUpdate is true
 | 
			
		||||
 | 
			
		||||
		const groupChain = [ groupNode, nodeUniformsGroup ];
 | 
			
		||||
 | 
			
		||||
		let groupData = this.groupsData.get( groupChain );
 | 
			
		||||
		if ( groupData === undefined ) this.groupsData.set( groupChain, groupData = {} );
 | 
			
		||||
 | 
			
		||||
		if ( groupData.version !== groupNode.version ) {
 | 
			
		||||
 | 
			
		||||
			groupData.version = groupNode.version;
 | 
			
		||||
 | 
			
		||||
			return true;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getForRenderCacheKey( renderObject ) {
 | 
			
		||||
 | 
			
		||||
		return renderObject.initialCacheKey;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getForRender( renderObject ) {
 | 
			
		||||
 | 
			
		||||
		const renderObjectData = this.get( renderObject );
 | 
			
		||||
 | 
			
		||||
		let nodeBuilderState = renderObjectData.nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
		if ( nodeBuilderState === undefined ) {
 | 
			
		||||
 | 
			
		||||
			const { nodeBuilderCache } = this;
 | 
			
		||||
 | 
			
		||||
			const cacheKey = this.getForRenderCacheKey( renderObject );
 | 
			
		||||
 | 
			
		||||
			nodeBuilderState = nodeBuilderCache.get( cacheKey );
 | 
			
		||||
 | 
			
		||||
			if ( nodeBuilderState === undefined ) {
 | 
			
		||||
 | 
			
		||||
				const nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer, renderObject.scene );
 | 
			
		||||
				nodeBuilder.material = renderObject.material;
 | 
			
		||||
				nodeBuilder.context.material = renderObject.material;
 | 
			
		||||
				nodeBuilder.lightsNode = renderObject.lightsNode;
 | 
			
		||||
				nodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );
 | 
			
		||||
				nodeBuilder.fogNode = this.getFogNode( renderObject.scene );
 | 
			
		||||
				nodeBuilder.clippingContext = renderObject.clippingContext;
 | 
			
		||||
				nodeBuilder.build();
 | 
			
		||||
 | 
			
		||||
				nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
 | 
			
		||||
 | 
			
		||||
				nodeBuilderCache.set( cacheKey, nodeBuilderState );
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			nodeBuilderState.usedTimes ++;
 | 
			
		||||
 | 
			
		||||
			renderObjectData.nodeBuilderState = nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	delete( object ) {
 | 
			
		||||
 | 
			
		||||
		if ( object.isRenderObject ) {
 | 
			
		||||
 | 
			
		||||
			const nodeBuilderState = this.get( object ).nodeBuilderState;
 | 
			
		||||
			nodeBuilderState.usedTimes --;
 | 
			
		||||
 | 
			
		||||
			if ( nodeBuilderState.usedTimes === 0 ) {
 | 
			
		||||
 | 
			
		||||
				this.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) );
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return super.delete( object );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getForCompute( computeNode ) {
 | 
			
		||||
 | 
			
		||||
		const computeData = this.get( computeNode );
 | 
			
		||||
 | 
			
		||||
		let nodeBuilderState = computeData.nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
		if ( nodeBuilderState === undefined ) {
 | 
			
		||||
 | 
			
		||||
			const nodeBuilder = this.backend.createNodeBuilder( computeNode, this.renderer );
 | 
			
		||||
			nodeBuilder.build();
 | 
			
		||||
 | 
			
		||||
			nodeBuilderState = this._createNodeBuilderState( nodeBuilder );
 | 
			
		||||
 | 
			
		||||
			computeData.nodeBuilderState = nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return nodeBuilderState;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	_createNodeBuilderState( nodeBuilder ) {
 | 
			
		||||
 | 
			
		||||
		return new NodeBuilderState(
 | 
			
		||||
			nodeBuilder.vertexShader,
 | 
			
		||||
			nodeBuilder.fragmentShader,
 | 
			
		||||
			nodeBuilder.computeShader,
 | 
			
		||||
			nodeBuilder.getAttributesArray(),
 | 
			
		||||
			nodeBuilder.getBindings(),
 | 
			
		||||
			nodeBuilder.updateNodes,
 | 
			
		||||
			nodeBuilder.updateBeforeNodes,
 | 
			
		||||
			nodeBuilder.transforms
 | 
			
		||||
		);
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getEnvironmentNode( scene ) {
 | 
			
		||||
 | 
			
		||||
		return scene.environmentNode || this.get( scene ).environmentNode || null;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getBackgroundNode( scene ) {
 | 
			
		||||
 | 
			
		||||
		return scene.backgroundNode || this.get( scene ).backgroundNode || null;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getFogNode( scene ) {
 | 
			
		||||
 | 
			
		||||
		return scene.fogNode || this.get( scene ).fogNode || null;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getCacheKey( scene, lightsNode ) {
 | 
			
		||||
 | 
			
		||||
		const chain = [ scene, lightsNode ];
 | 
			
		||||
		const callId = this.renderer.info.calls;
 | 
			
		||||
 | 
			
		||||
		let cacheKeyData = this.callHashCache.get( chain );
 | 
			
		||||
 | 
			
		||||
		if ( cacheKeyData === undefined || cacheKeyData.callId !== callId ) {
 | 
			
		||||
 | 
			
		||||
			const environmentNode = this.getEnvironmentNode( scene );
 | 
			
		||||
			const fogNode = this.getFogNode( scene );
 | 
			
		||||
 | 
			
		||||
			const cacheKey = [];
 | 
			
		||||
 | 
			
		||||
			if ( lightsNode ) cacheKey.push( lightsNode.getCacheKey() );
 | 
			
		||||
			if ( environmentNode ) cacheKey.push( environmentNode.getCacheKey() );
 | 
			
		||||
			if ( fogNode ) cacheKey.push( fogNode.getCacheKey() );
 | 
			
		||||
 | 
			
		||||
			cacheKeyData = {
 | 
			
		||||
				callId,
 | 
			
		||||
				cacheKey: cacheKey.join( ',' )
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
			this.callHashCache.set( chain, cacheKeyData );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return cacheKeyData.cacheKey;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateScene( scene ) {
 | 
			
		||||
 | 
			
		||||
		this.updateEnvironment( scene );
 | 
			
		||||
		this.updateFog( scene );
 | 
			
		||||
		this.updateBackground( scene );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	get isToneMappingState() {
 | 
			
		||||
 | 
			
		||||
		return this.renderer.getRenderTarget() ? false : true;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateBackground( scene ) {
 | 
			
		||||
 | 
			
		||||
		const sceneData = this.get( scene );
 | 
			
		||||
		const background = scene.background;
 | 
			
		||||
 | 
			
		||||
		if ( background ) {
 | 
			
		||||
 | 
			
		||||
			if ( sceneData.background !== background ) {
 | 
			
		||||
 | 
			
		||||
				let backgroundNode = null;
 | 
			
		||||
 | 
			
		||||
				if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
 | 
			
		||||
 | 
			
		||||
					backgroundNode = pmremTexture( background, normalWorld );
 | 
			
		||||
 | 
			
		||||
				} else if ( background.isTexture === true ) {
 | 
			
		||||
 | 
			
		||||
					backgroundNode = texture( background, viewportBottomLeft ).setUpdateMatrix( true );
 | 
			
		||||
 | 
			
		||||
				} else if ( background.isColor !== true ) {
 | 
			
		||||
 | 
			
		||||
					console.error( 'WebGPUNodes: Unsupported background configuration.', background );
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				sceneData.backgroundNode = backgroundNode;
 | 
			
		||||
				sceneData.background = background;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else if ( sceneData.backgroundNode ) {
 | 
			
		||||
 | 
			
		||||
			delete sceneData.backgroundNode;
 | 
			
		||||
			delete sceneData.background;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateFog( scene ) {
 | 
			
		||||
 | 
			
		||||
		const sceneData = this.get( scene );
 | 
			
		||||
		const fog = scene.fog;
 | 
			
		||||
 | 
			
		||||
		if ( fog ) {
 | 
			
		||||
 | 
			
		||||
			if ( sceneData.fog !== fog ) {
 | 
			
		||||
 | 
			
		||||
				let fogNode = null;
 | 
			
		||||
 | 
			
		||||
				if ( fog.isFogExp2 ) {
 | 
			
		||||
 | 
			
		||||
					fogNode = densityFog( reference( 'color', 'color', fog ), reference( 'density', 'float', fog ) );
 | 
			
		||||
 | 
			
		||||
				} else if ( fog.isFog ) {
 | 
			
		||||
 | 
			
		||||
					fogNode = rangeFog( reference( 'color', 'color', fog ), reference( 'near', 'float', fog ), reference( 'far', 'float', fog ) );
 | 
			
		||||
 | 
			
		||||
				} else {
 | 
			
		||||
 | 
			
		||||
					console.error( 'WebGPUNodes: Unsupported fog configuration.', fog );
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				sceneData.fogNode = fogNode;
 | 
			
		||||
				sceneData.fog = fog;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
 | 
			
		||||
			delete sceneData.fogNode;
 | 
			
		||||
			delete sceneData.fog;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateEnvironment( scene ) {
 | 
			
		||||
 | 
			
		||||
		const sceneData = this.get( scene );
 | 
			
		||||
		const environment = scene.environment;
 | 
			
		||||
 | 
			
		||||
		if ( environment ) {
 | 
			
		||||
 | 
			
		||||
			if ( sceneData.environment !== environment ) {
 | 
			
		||||
 | 
			
		||||
				let environmentNode = null;
 | 
			
		||||
 | 
			
		||||
				if ( environment.isCubeTexture === true ) {
 | 
			
		||||
 | 
			
		||||
					environmentNode = cubeTexture( environment );
 | 
			
		||||
 | 
			
		||||
				} else if ( environment.isTexture === true ) {
 | 
			
		||||
 | 
			
		||||
					environmentNode = texture( environment );
 | 
			
		||||
 | 
			
		||||
				} else {
 | 
			
		||||
 | 
			
		||||
					console.error( 'Nodes: Unsupported environment configuration.', environment );
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				sceneData.environmentNode = environmentNode;
 | 
			
		||||
				sceneData.environment = environment;
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		} else if ( sceneData.environmentNode ) {
 | 
			
		||||
 | 
			
		||||
			delete sceneData.environmentNode;
 | 
			
		||||
			delete sceneData.environment;
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getNodeFrame( renderer = this.renderer, scene = null, object = null, camera = null, material = null ) {
 | 
			
		||||
 | 
			
		||||
		const nodeFrame = this.nodeFrame;
 | 
			
		||||
		nodeFrame.renderer = renderer;
 | 
			
		||||
		nodeFrame.scene = scene;
 | 
			
		||||
		nodeFrame.object = object;
 | 
			
		||||
		nodeFrame.camera = camera;
 | 
			
		||||
		nodeFrame.material = material;
 | 
			
		||||
 | 
			
		||||
		return nodeFrame;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getNodeFrameForRender( renderObject ) {
 | 
			
		||||
 | 
			
		||||
		return this.getNodeFrame( renderObject.renderer, renderObject.scene, renderObject.object, renderObject.camera, renderObject.material );
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	getOutputNode( outputTexture ) {
 | 
			
		||||
 | 
			
		||||
		let output = texture( outputTexture, viewportTopLeft );
 | 
			
		||||
 | 
			
		||||
		if ( this.isToneMappingState ) {
 | 
			
		||||
 | 
			
		||||
			if ( this.renderer.toneMappingNode ) {
 | 
			
		||||
 | 
			
		||||
				output = vec4( this.renderer.toneMappingNode.context( { color: output.rgb } ), output.a );
 | 
			
		||||
 | 
			
		||||
			} else if ( this.renderer.toneMapping !== NoToneMapping ) {
 | 
			
		||||
 | 
			
		||||
				output = output.toneMapping( this.renderer.toneMapping );
 | 
			
		||||
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if ( this.renderer.currentColorSpace === SRGBColorSpace ) {
 | 
			
		||||
 | 
			
		||||
			output = output.linearToColorSpace( this.renderer.currentColorSpace );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return output;
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateBefore( renderObject ) {
 | 
			
		||||
 | 
			
		||||
		const nodeFrame = this.getNodeFrameForRender( renderObject );
 | 
			
		||||
		const nodeBuilder = renderObject.getNodeBuilderState();
 | 
			
		||||
 | 
			
		||||
		for ( const node of nodeBuilder.updateBeforeNodes ) {
 | 
			
		||||
 | 
			
		||||
			nodeFrame.updateBeforeNode( node );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateForCompute( computeNode ) {
 | 
			
		||||
 | 
			
		||||
		const nodeFrame = this.getNodeFrame();
 | 
			
		||||
		const nodeBuilder = this.getForCompute( computeNode );
 | 
			
		||||
 | 
			
		||||
		for ( const node of nodeBuilder.updateNodes ) {
 | 
			
		||||
 | 
			
		||||
			nodeFrame.updateNode( node );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	updateForRender( renderObject ) {
 | 
			
		||||
 | 
			
		||||
		const nodeFrame = this.getNodeFrameForRender( renderObject );
 | 
			
		||||
		const nodeBuilder = renderObject.getNodeBuilderState();
 | 
			
		||||
 | 
			
		||||
		for ( const node of nodeBuilder.updateNodes ) {
 | 
			
		||||
 | 
			
		||||
			nodeFrame.updateNode( node );
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dispose() {
 | 
			
		||||
 | 
			
		||||
		super.dispose();
 | 
			
		||||
 | 
			
		||||
		this.nodeFrame = new NodeFrame();
 | 
			
		||||
		this.nodeBuilderCache = new Map();
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default Nodes;
 | 
			
		||||
		Reference in New Issue
	
	Block a user