Browse Source

add preprocessor that by default uses the ShaderChunk library.

Ben Houston 9 years ago
parent
commit
17d1b908f3

+ 2 - 0
src/renderers/webgl/WebGLProgram.js

@@ -460,6 +460,8 @@ THREE.WebGLProgram = ( function () {
 		var vertexGlsl = prefixVertex + vertexShader;
 		var fragmentGlsl = prefixFragment + fragmentShader;
 
+		vertexGlsl = THREE.WebGLShaderPreProcessor.compile( vertexGlsl );
+		fragmentGlsl = THREE.WebGLShaderPreProcessor.compile( fragmentGlsl );
 		// console.log( '*VERTEX*', vertexGlsl );
 		// console.log( '*FRAGMENT*', fragmentGlsl );
 

+ 44 - 0
src/renderers/webgl/WebGLShaderPreProcessor.js

@@ -0,0 +1,44 @@
+/**
+* @author bhouston / http://clara.io
+*/
+
+THREE.WebGLShaderPreProcessor = {};
+
+THREE.WebGLShaderPreProcessor.compile = function() {
+
+  var regexInclude = /[ ]*#include[ ]+["<]([\w\d.]*)[">]/;
+
+  return function( code, includeResolver ) {
+
+    includeResolver = includeResolver || THREE.WebGLShaderPreProcessor.defaultIncludeResolver;
+
+    var lines = code.split( '\n' );
+    var newLines = [];
+    while( lines.length > 0 ) {
+      var line = lines.shift();
+
+      var matcheInclude = regexInclude.exec(line);
+      if( matcheInclude ) {
+        var includeFileName = matcheInclude[1];
+        var includeChunk = includeResolver( includeFileName );
+        if( ! includeChunk ) throw new Error( "can not find include file for line: " + line );
+        var includeLines = includeChunk.split( '\n' ).reverse();
+        console.log( "#including " + includeFileName );
+        while( includeLines.length > 0 ) {
+          lines.unshift( includeLines.shift() );
+        }
+      }
+      else {
+        newLines.push( line );
+      }
+    }
+    return newLines.join( '\n' );
+  };
+
+}();
+
+THREE.WebGLShaderPreProcessor.defaultIncludeResolver = function( fileName ) {
+
+  return THREE.ShaderChunk[ fileName ];
+
+};

+ 1 - 0
utils/build/includes/common.json

@@ -209,6 +209,7 @@
 	"src/renderers/webgl/WebGLPrograms.js",
 	"src/renderers/webgl/WebGLProperties.js",
 	"src/renderers/webgl/WebGLShader.js",
+	"src/renderers/webgl/WebGLShaderPreProcessor.js",
 	"src/renderers/webgl/WebGLShadowMap.js",
 	"src/renderers/webgl/WebGLState.js",
 	"src/renderers/webgl/plugins/LensFlarePlugin.js",