Browse Source

Nodes: Add `enableExtension()` Method to `GLSLNodeBuilder` (#28952)

* add getExtension to GLSLNodeBuilder

* actually add extensions object

* remove comment

* getExtension() to enableExtension()

* rename mode to behavior
Christian Helgeson 2 năm trước cách đây
mục cha
commit
2d335b7640
1 tập tin đã thay đổi với 31 bổ sung3 xóa
  1. 31 3
      src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js

+ 31 - 3
src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js

@@ -54,6 +54,7 @@ class GLSLNodeBuilder extends NodeBuilder {
 
 		this.uniformGroups = {};
 		this.transforms = [];
+		this.extensions = {};
 
 		this.instanceBindGroups = false;
 
@@ -636,9 +637,24 @@ ${ flowData.code }
 
 	}
 
+	enableExtension( name, behavior, shaderStage = this.shaderStage ) {
+
+		const map = this.extensions[ shaderStage ] || ( this.extensions[ shaderStage ] = new Map() );
+
+		if ( map.has( name ) === false ) {
+
+			map.set( name, {
+				name,
+				behavior
+			} );
+
+		}
+
+	}
+
 	getExtensions( shaderStage ) {
 
-		let extensions = '';
+		const snippets = [];
 
 		if ( shaderStage === 'vertex' ) {
 
@@ -647,13 +663,25 @@ ${ flowData.code }
 
 			if ( isBatchedMesh && ext.has( 'WEBGL_multi_draw' ) ) {
 
-				extensions += '#extension GL_ANGLE_multi_draw : require\n';
+				this.enableExtension( 'GL_ANGLE_multi_draw', 'require' );
 
 			}
 
 		}
 
-		return extensions;
+		const extensions = this.extensions[ shaderStage ];
+
+		if ( extensions !== undefined ) {
+
+			for ( const { name, behavior } of extensions.values() ) {
+
+				snippets.push( `#extension ${name} : ${behavior}` );
+
+			}
+
+		}
+
+		return snippets.join( '\n' );
 
 	}
 

粤ICP备19079148号