瀏覽代碼

Allow "include inside include" in shader code

Popov72 5 年之前
父節點
當前提交
6be6eff0f0
共有 2 個文件被更改,包括 11 次插入1 次删除
  1. 3 0
      Tools/Gulp/helpers/gulp-processShaders.js
  2. 8 1
      src/Engines/Processors/shaderProcessor.ts

+ 3 - 0
Tools/Gulp/helpers/gulp-processShaders.js

@@ -15,6 +15,7 @@ let shader = \`##SHADER_PLACEHOLDER##\`;
 
 Effect.##SHADERSTORE_PLACEHOLDER##[name] = shader;
 ##EXPORT_PLACEHOLDER##
+// tata
 `;
 
 
@@ -92,6 +93,7 @@ function main(isCore) {
             let includeText = "";
             const includes = getIncludes(fxData);
             includes.forEach((entry) => {
+                //entry = entry.replace(/(\/ShadersInclude)\1+/g, "/ShadersInclude");
                 if (isCore) {
                     includeText = includeText + `import "./ShadersInclude/${entry}";
 `;
@@ -109,6 +111,7 @@ function main(isCore) {
             if (isCore) {
                 if (isInclude) {
                     effectLocation = "../../Materials/effect";
+                    includeText = includeText.replace(/ShadersInclude\//g, "");
                 }
                 else {
                     effectLocation = "../Materials/effect";

+ 8 - 1
src/Engines/Processors/shaderProcessor.ts

@@ -288,6 +288,7 @@ export class ShaderProcessor {
         var match = regex.exec(sourceCode);
 
         var returnValue = new String(sourceCode);
+        var keepProcessing = false;
 
         while (match != null) {
             var includeFile = match[1];
@@ -352,6 +353,8 @@ export class ShaderProcessor {
 
                 // Replace
                 returnValue = returnValue.replace(match[0], includeContent);
+
+                keepProcessing = keepProcessing || includeContent.indexOf("#include<") >= 0;
             } else {
                 var includeShaderUrl = options.shadersRepository + "ShadersInclude/" + includeFile + ".fx";
 
@@ -365,7 +368,11 @@ export class ShaderProcessor {
             match = regex.exec(sourceCode);
         }
 
-        callback(returnValue);
+        if (keepProcessing) {
+            this._ProcessIncludes(returnValue.toString(), options, callback);
+        } else {
+            callback(returnValue);
+        }
     }
 
     /**