@@ -35,6 +35,8 @@ import { warn, error } from '../../utils.js';
3535
3636let _id = 0 ;
3737
38+ const sharedNodeData = new WeakMap ( ) ;
39+
3840const rendererCache = new WeakMap ( ) ;
3941
4042const typeFromArray = new Map ( [
@@ -2951,6 +2953,26 @@ class NodeBuilder {
29512953
29522954 }
29532955
2956+ /**
2957+ * Returns shared data object for the given node.
2958+ *
2959+ * @param {Node } node - The node to get shared data from.
2960+ * @return {Object } The shared data.
2961+ */
2962+ getSharedDataFromNode ( node ) {
2963+
2964+ let data = sharedNodeData . get ( node ) ;
2965+
2966+ if ( data === undefined ) {
2967+
2968+ data = { } ;
2969+
2970+ }
2971+
2972+ return data ;
2973+
2974+ }
2975+
29542976 /**
29552977 * Returns a uniform representation which is later used for UBO generation and rendering.
29562978 *
@@ -2960,16 +2982,31 @@ class NodeBuilder {
29602982 */
29612983 getNodeUniform ( uniformNode , type ) {
29622984
2963- if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform ( uniformNode ) ;
2964- if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) return new Vector2NodeUniform ( uniformNode ) ;
2965- if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform ( uniformNode ) ;
2966- if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform ( uniformNode ) ;
2967- if ( type === 'color' ) return new ColorNodeUniform ( uniformNode ) ;
2968- if ( type === 'mat2' ) return new Matrix2NodeUniform ( uniformNode ) ;
2969- if ( type === 'mat3' ) return new Matrix3NodeUniform ( uniformNode ) ;
2970- if ( type === 'mat4' ) return new Matrix4NodeUniform ( uniformNode ) ;
2985+ const nodeData = this . getSharedDataFromNode ( uniformNode ) ;
2986+
2987+ let node = nodeData . cache ;
2988+
2989+ if ( node === undefined ) {
2990+
2991+ if ( type === 'float' || type === 'int' || type === 'uint' ) node = new NumberNodeUniform ( uniformNode ) ;
2992+ else if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) node = new Vector2NodeUniform ( uniformNode ) ;
2993+ else if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) node = new Vector3NodeUniform ( uniformNode ) ;
2994+ else if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) node = new Vector4NodeUniform ( uniformNode ) ;
2995+ else if ( type === 'color' ) node = new ColorNodeUniform ( uniformNode ) ;
2996+ else if ( type === 'mat2' ) node = new Matrix2NodeUniform ( uniformNode ) ;
2997+ else if ( type === 'mat3' ) node = new Matrix3NodeUniform ( uniformNode ) ;
2998+ else if ( type === 'mat4' ) node = new Matrix4NodeUniform ( uniformNode ) ;
2999+ else {
3000+
3001+ throw new Error ( `Uniform "${ type } " not implemented.` ) ;
29713002
2972- throw new Error ( `Uniform "${ type } " not declared.` ) ;
3003+ }
3004+
3005+ nodeData . cache = node ;
3006+
3007+ }
3008+
3009+ return node ;
29733010
29743011 }
29753012
0 commit comments