Browse Source

WebGLProgram: Unroll loops.

Mr.doob 9 years ago
parent
commit
8ecba28065
1 changed files with 25 additions and 0 deletions
  1. 25 0
      src/renderers/webgl/WebGLProgram.js

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

@@ -161,6 +161,28 @@ THREE.WebGLProgram = ( function () {
 
 	}
 
+	function unrollLoops( string ) {
+
+		var pattern = /for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
+
+		function replace( match, start, end, snippet ) {
+
+			var unroll = '';
+
+			for ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {
+
+				unroll += snippet.replace( /\[ i \]/g, '[ ' + i + ' ]' );
+
+			}
+
+			return unroll;
+
+		}
+
+		return string.replace( pattern, replace );
+
+	}
+
 	return function WebGLProgram( renderer, code, material, parameters ) {
 
 		var gl = renderer.context;
@@ -423,7 +445,10 @@ THREE.WebGLProgram = ( function () {
 		}
 
 		vertexShader = replaceLightNums( vertexShader, parameters );
+		vertexShader = unrollLoops( vertexShader );
+
 		fragmentShader = replaceLightNums( fragmentShader, parameters );
+		fragmentShader = unrollLoops( fragmentShader );
 
 		var vertexGlsl = prefixVertex + vertexShader;
 		var fragmentGlsl = prefixFragment + fragmentShader;