|
@@ -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;
|