Explorar el Código

GLSLLoader now moves all extensions declaration found in the dependencies at the top of the shader code

Nehon hace 8 años
padre
commit
4777c591b1

+ 15 - 5
jme3-core/src/plugins/java/com/jme3/shader/plugins/GLSLLoader.java

@@ -80,6 +80,7 @@ public class GLSLLoader implements AssetLoader {
         ShaderDependencyNode node = new ShaderDependencyNode(nodeName);
 
         StringBuilder sb = new StringBuilder();
+        StringBuilder sbExt = new StringBuilder();
         BufferedReader bufReader = null;
         try {
             bufReader = new BufferedReader(reader);
@@ -108,6 +109,8 @@ public class GLSLLoader implements AssetLoader {
 
                         node.addDependency(sb.length(), dependNode);
                     }
+                } else if (ln.trim().startsWith("#extension ")) {
+                    sbExt.append(ln).append('\n');
                 } else {
                     sb.append(ln).append('\n');
                 }
@@ -126,6 +129,7 @@ public class GLSLLoader implements AssetLoader {
         }
 
         node.setSource(sb.toString());
+        node.setExtensions(sbExt.toString());
         dependCache.put(nodeName, node);
         return node;
     }
@@ -150,20 +154,24 @@ public class GLSLLoader implements AssetLoader {
         
         throw new IOException("Circular dependency.");
     }
-    
-    private String resolveDependencies(ShaderDependencyNode node, Set<ShaderDependencyNode> alreadyInjectedSet) {
+
+    private String resolveDependencies(ShaderDependencyNode node, Set<ShaderDependencyNode> alreadyInjectedSet, StringBuilder extensions) {
         if (alreadyInjectedSet.contains(node)) {
             return "// " + node.getName() + " was already injected at the top.\n";
         } else {
             alreadyInjectedSet.add(node);
         }
+        if (!node.getExtensions().isEmpty()) {
+            extensions.append(node.getExtensions());
+        }
         if (node.getDependencies().isEmpty()) {
             return node.getSource();
         } else {
             StringBuilder sb = new StringBuilder(node.getSource());
             List<String> resolvedShaderNodes = new ArrayList<String>();
+
             for (ShaderDependencyNode dependencyNode : node.getDependencies()) {
-                resolvedShaderNodes.add( resolveDependencies(dependencyNode, alreadyInjectedSet) );
+                resolvedShaderNodes.add(resolveDependencies(dependencyNode, alreadyInjectedSet, extensions));
             }
             List<Integer> injectIndices = node.getDependencyInjectIndices();
             for (int i = resolvedShaderNodes.size() - 1; i >= 0; i--) {
@@ -185,9 +193,11 @@ public class GLSLLoader implements AssetLoader {
             return reader;
         } else {
             ShaderDependencyNode rootNode = loadNode(reader, "[main]");
-            String code = resolveDependencies(rootNode, new HashSet<ShaderDependencyNode>());
+            StringBuilder extensions = new StringBuilder();
+            String code = resolveDependencies(rootNode, new HashSet<ShaderDependencyNode>(), extensions);
+            extensions.append(code);
             dependCache.clear();
-            return code;
+            return extensions.toString();
         }
     }
 }

+ 10 - 1
jme3-core/src/plugins/java/com/jme3/shader/plugins/ShaderDependencyNode.java

@@ -36,7 +36,8 @@ import java.util.Collections;
 import java.util.List;
 
 class ShaderDependencyNode {
-    
+
+    private String extensions;
     private String shaderSource;
     private String shaderName;
 
@@ -64,6 +65,14 @@ class ShaderDependencyNode {
         this.shaderName = shaderName;
     }
 
+    public String getExtensions() {
+        return extensions;
+    }
+
+    public void setExtensions(String extensions) {
+        this.extensions = extensions;
+    }
+
     public void addDependency(int index, ShaderDependencyNode node){
         if (this.dependencies.contains(node)) {
             // already contains dependency ..