|
@@ -34,10 +34,7 @@ package com.jme3.shader.plugins;
|
|
|
import com.jme3.asset.*;
|
|
|
import com.jme3.asset.cache.AssetCache;
|
|
|
|
|
|
-import java.io.BufferedReader;
|
|
|
-import java.io.IOException;
|
|
|
-import java.io.InputStreamReader;
|
|
|
-import java.io.Reader;
|
|
|
+import java.io.*;
|
|
|
import java.util.*;
|
|
|
|
|
|
/**
|
|
@@ -129,11 +126,11 @@ public class GLSLLoader implements AssetLoader {
|
|
|
|
|
|
private ShaderDependencyNode nextIndependentNode() throws IOException {
|
|
|
Collection<ShaderDependencyNode> allNodes = dependCache.values();
|
|
|
-
|
|
|
+
|
|
|
if (allNodes.isEmpty()) {
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for (ShaderDependencyNode node : allNodes) {
|
|
|
if (node.getDependOnMe().isEmpty()) {
|
|
|
return node;
|
|
@@ -144,11 +141,11 @@ public class GLSLLoader implements AssetLoader {
|
|
|
for (ShaderDependencyNode node : allNodes){
|
|
|
System.out.println(node.getName());
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
throw new IOException("Circular dependency.");
|
|
|
}
|
|
|
|
|
|
- private String resolveDependencies(ShaderDependencyNode node, Set<ShaderDependencyNode> alreadyInjectedSet, StringBuilder extensions) {
|
|
|
+ private String resolveDependencies(ShaderDependencyNode node, Set<ShaderDependencyNode> alreadyInjectedSet, StringBuilder extensions, boolean injectDependencies) {
|
|
|
if (alreadyInjectedSet.contains(node)) {
|
|
|
return "// " + node.getName() + " was already injected at the top.\n";
|
|
|
} else {
|
|
@@ -160,18 +157,27 @@ public class GLSLLoader implements AssetLoader {
|
|
|
if (node.getDependencies().isEmpty()) {
|
|
|
return node.getSource();
|
|
|
} else {
|
|
|
- StringBuilder sb = new StringBuilder(node.getSource());
|
|
|
- List<String> resolvedShaderNodes = new ArrayList<>();
|
|
|
+ if (injectDependencies) {
|
|
|
+ StringBuilder sb = new StringBuilder(node.getSource());
|
|
|
+ List<String> resolvedShaderNodes = new ArrayList<>();
|
|
|
|
|
|
- for (ShaderDependencyNode dependencyNode : node.getDependencies()) {
|
|
|
- resolvedShaderNodes.add(resolveDependencies(dependencyNode, alreadyInjectedSet, extensions));
|
|
|
- }
|
|
|
- List<Integer> injectIndices = node.getDependencyInjectIndices();
|
|
|
- for (int i = resolvedShaderNodes.size() - 1; i >= 0; i--) {
|
|
|
- // Must insert them backwards ..
|
|
|
- sb.insert(injectIndices.get(i), resolvedShaderNodes.get(i));
|
|
|
+ for (ShaderDependencyNode dependencyNode : node.getDependencies()) {
|
|
|
+ resolvedShaderNodes.add(resolveDependencies(dependencyNode, alreadyInjectedSet, extensions, injectDependencies));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Integer> injectIndices = node.getDependencyInjectIndices();
|
|
|
+ for (int i = resolvedShaderNodes.size() - 1; i >= 0; i--) {
|
|
|
+ // Must insert them backwards ..
|
|
|
+ sb.insert(injectIndices.get(i), resolvedShaderNodes.get(i));
|
|
|
+ }
|
|
|
+ return sb.toString();
|
|
|
+ } else {
|
|
|
+ for (ShaderDependencyNode dependencyNode : node.getDependencies()) {
|
|
|
+ resolveDependencies(dependencyNode, alreadyInjectedSet, extensions, injectDependencies);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
- return sb.toString();
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -181,6 +187,10 @@ public class GLSLLoader implements AssetLoader {
|
|
|
// to retrieve the fragment shader, use the content manager
|
|
|
this.assetManager = info.getManager();
|
|
|
Reader reader = new InputStreamReader(info.openStream());
|
|
|
+ boolean injectDependencies = true;
|
|
|
+ if (info.getKey() instanceof ShaderAssetKey) {
|
|
|
+ injectDependencies = ((ShaderAssetKey) info.getKey()).isInjectDependencies();
|
|
|
+ }
|
|
|
if (info.getKey().getExtension().equals("glsllib")) {
|
|
|
// NOTE: Loopback, GLSLLIB is loaded by this loader
|
|
|
// and needs data as InputStream
|
|
@@ -188,10 +198,25 @@ public class GLSLLoader implements AssetLoader {
|
|
|
} else {
|
|
|
ShaderDependencyNode rootNode = loadNode(reader, "[main]");
|
|
|
StringBuilder extensions = new StringBuilder();
|
|
|
- String code = resolveDependencies(rootNode, new HashSet<ShaderDependencyNode>(), extensions);
|
|
|
- extensions.append(code);
|
|
|
- dependCache.clear();
|
|
|
- return extensions.toString();
|
|
|
+ if (injectDependencies) {
|
|
|
+ String code = resolveDependencies(rootNode, new HashSet<ShaderDependencyNode>(), extensions, injectDependencies);
|
|
|
+ extensions.append(code);
|
|
|
+ dependCache.clear();
|
|
|
+ return extensions.toString();
|
|
|
+ } else {
|
|
|
+ Map<String, String> files = new LinkedHashMap<>();
|
|
|
+ HashSet<ShaderDependencyNode> dependencies = new HashSet<>();
|
|
|
+ String code = resolveDependencies(rootNode, dependencies, extensions, injectDependencies);
|
|
|
+ extensions.append(code);
|
|
|
+ files.put("[main]", extensions.toString());
|
|
|
+
|
|
|
+ for (ShaderDependencyNode dependency : dependencies) {
|
|
|
+ files.put(dependency.getName(), dependency.getSource());
|
|
|
+ }
|
|
|
+
|
|
|
+ dependCache.clear();
|
|
|
+ return files;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|