|
|
@@ -35,6 +35,8 @@ import { warn, error } from '../../utils.js';
|
|
|
|
|
|
let _id = 0;
|
|
|
|
|
|
+const sharedNodeData = new WeakMap();
|
|
|
+
|
|
|
const rendererCache = new WeakMap();
|
|
|
|
|
|
const typeFromArray = new Map( [
|
|
|
@@ -2951,6 +2953,26 @@ class NodeBuilder {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Returns shared data object for the given node.
|
|
|
+ *
|
|
|
+ * @param {Node} node - The node to get shared data from.
|
|
|
+ * @return {Object} The shared data.
|
|
|
+ */
|
|
|
+ getSharedDataFromNode( node ) {
|
|
|
+
|
|
|
+ let data = sharedNodeData.get( node );
|
|
|
+
|
|
|
+ if ( data === undefined ) {
|
|
|
+
|
|
|
+ data = {};
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return data;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Returns a uniform representation which is later used for UBO generation and rendering.
|
|
|
*
|
|
|
@@ -2960,16 +2982,31 @@ class NodeBuilder {
|
|
|
*/
|
|
|
getNodeUniform( uniformNode, type ) {
|
|
|
|
|
|
- if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode );
|
|
|
- if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) return new Vector2NodeUniform( uniformNode );
|
|
|
- if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode );
|
|
|
- if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode );
|
|
|
- if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
|
|
|
- if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode );
|
|
|
- if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
|
|
|
- if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
|
|
|
+ const nodeData = this.getSharedDataFromNode( uniformNode );
|
|
|
+
|
|
|
+ let node = nodeData.cache;
|
|
|
+
|
|
|
+ if ( node === undefined ) {
|
|
|
+
|
|
|
+ if ( type === 'float' || type === 'int' || type === 'uint' ) node = new NumberNodeUniform( uniformNode );
|
|
|
+ else if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) node = new Vector2NodeUniform( uniformNode );
|
|
|
+ else if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) node = new Vector3NodeUniform( uniformNode );
|
|
|
+ else if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) node = new Vector4NodeUniform( uniformNode );
|
|
|
+ else if ( type === 'color' ) node = new ColorNodeUniform( uniformNode );
|
|
|
+ else if ( type === 'mat2' ) node = new Matrix2NodeUniform( uniformNode );
|
|
|
+ else if ( type === 'mat3' ) node = new Matrix3NodeUniform( uniformNode );
|
|
|
+ else if ( type === 'mat4' ) node = new Matrix4NodeUniform( uniformNode );
|
|
|
+ else {
|
|
|
+
|
|
|
+ throw new Error( `Uniform "${ type }" not implemented.` );
|
|
|
|
|
|
- throw new Error( `Uniform "${type}" not declared.` );
|
|
|
+ }
|
|
|
+
|
|
|
+ nodeData.cache = node;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return node;
|
|
|
|
|
|
}
|
|
|
|