Fixed uploading of all shader stages

experimental
michael 10 years ago
parent 46a48f466d
commit 1ad8ff154c
  1. 13
      jme3-core/src/main/java/com/jme3/asset/DesktopAssetManager.java
  2. 2
      jme3-core/src/main/java/com/jme3/asset/cache/WeakRefCloneAssetCache.java
  3. 13
      jme3-core/src/main/java/com/jme3/shader/ShaderKey.java
  4. 6
      jme3-core/src/plugins/java/com/jme3/material/plugins/J3MLoader.java
  5. 3
      jme3-testdata/src/main/resources/Materials/Geom/SimpleGeom.frag
  6. 19
      jme3-testdata/src/main/resources/Materials/Geom/SimpleGeom.geom
  7. 4
      jme3-testdata/src/main/resources/Materials/Geom/SimpleGeom.j3m
  8. 17
      jme3-testdata/src/main/resources/Materials/Geom/SimpleGeom.j3md
  9. 5
      jme3-testdata/src/main/resources/Materials/Geom/SimpleGeom.vert

@ -393,6 +393,7 @@ public class DesktopAssetManager implements AssetManager {
public Shader loadShader(ShaderKey key){ public Shader loadShader(ShaderKey key){
// cache abuse in method // cache abuse in method
// that doesn't use loaders/locators // that doesn't use loaders/locators
System.out.println();
AssetCache cache = handler.getCache(SimpleAssetCache.class); AssetCache cache = handler.getCache(SimpleAssetCache.class);
Shader shader = (Shader) cache.getFromCache(key); Shader shader = (Shader) cache.getFromCache(key);
if (shader == null){ if (shader == null){
@ -402,17 +403,11 @@ public class DesktopAssetManager implements AssetManager {
} }
shader = shaderGenerator.generateShader(); shader = shaderGenerator.generateShader();
} else { } else {
String vertName = key.getVertName();
String fragName = key.getFragName();
String vertSource = (String) loadAsset(new AssetKey(vertName));
String fragSource = (String) loadAsset(new AssetKey(fragName));
shader = new Shader(); shader = new Shader();
shader.initialize(); shader.initialize();
shader.addSource(Shader.ShaderType.Vertex, vertName, vertSource, key.getDefines().getCompiled(), key.getVertexShaderLanguage()); for (Shader.ShaderType shaderType : key.getUsedShaderPrograms()) {
shader.addSource(Shader.ShaderType.Fragment, fragName, fragSource, key.getDefines().getCompiled(), key.getFragmentShaderLanguage()); shader.addSource(shaderType,key.getShaderProgramName(shaderType),(String) loadAsset(new AssetKey(key.getShaderProgramName(shaderType))),key.getDefines().getCompiled(),key.getShaderProgramLanguage(shaderType));
}
} }
cache.addToCache(key, shader); cache.addToCache(key, shader);

@ -33,6 +33,7 @@ package com.jme3.asset.cache;
import com.jme3.asset.AssetKey; import com.jme3.asset.AssetKey;
import com.jme3.asset.CloneableSmartAsset; import com.jme3.asset.CloneableSmartAsset;
import java.lang.ref.PhantomReference; import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue; import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -123,7 +124,6 @@ public class WeakRefCloneAssetCache implements AssetCache {
public <T> void addToCache(AssetKey<T> originalKey, T obj) { public <T> void addToCache(AssetKey<T> originalKey, T obj) {
// Make room for new asset // Make room for new asset
removeCollectedAssets(); removeCollectedAssets();
CloneableSmartAsset asset = (CloneableSmartAsset) obj; CloneableSmartAsset asset = (CloneableSmartAsset) obj;
// No circular references, since the original asset is // No circular references, since the original asset is

@ -38,6 +38,7 @@ import com.jme3.export.JmeImporter;
import com.jme3.export.OutputCapsule; import com.jme3.export.OutputCapsule;
import java.io.IOException; import java.io.IOException;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Set;
public class ShaderKey extends AssetKey<Shader> { public class ShaderKey extends AssetKey<Shader> {
@ -141,6 +142,18 @@ public class ShaderKey extends AssetKey<Shader> {
this.usesShaderNodes = usesShaderNodes; this.usesShaderNodes = usesShaderNodes;
} }
public Set<Shader.ShaderType> getUsedShaderPrograms(){
return shaderName.keySet();
}
public String getShaderProgramLanguage(Shader.ShaderType shaderType){
return shaderLanguage.get(shaderType);
}
public String getShaderProgramName(Shader.ShaderType shaderType){
return shaderName.get(shaderType);
}
@Override @Override
public void write(JmeExporter ex) throws IOException{ public void write(JmeExporter ex) throws IOException{
super.write(ex); super.write(ex);

@ -49,6 +49,7 @@ import com.jme3.texture.image.ColorSpace;
import com.jme3.util.PlaceholderAssets; import com.jme3.util.PlaceholderAssets;
import com.jme3.util.blockparser.BlockLanguageParser; import com.jme3.util.blockparser.BlockLanguageParser;
import com.jme3.util.blockparser.Statement; import com.jme3.util.blockparser.Statement;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.EnumMap; import java.util.EnumMap;
@ -410,7 +411,10 @@ public class J3MLoader implements AssetLoader {
private void readTechniqueStatement(Statement statement) throws IOException { private void readTechniqueStatement(Statement statement) throws IOException {
String[] split = statement.getLine().split("[ \\{]"); String[] split = statement.getLine().split("[ \\{]");
if (split[0].equals("VertexShader") || if (split[0].equals("VertexShader") ||
split[0].equals("FragmentShader")){ split[0].equals("FragmentShader") ||
split[0].equals("GeometryShader") ||
split[0].equals("TesselationControlShader") ||
split[0].equals("TesselationEvaluationShader")) {
readShaderStatement(statement.getLine()); readShaderStatement(statement.getLine());
} else if (split[0].equals("LightMode")) { } else if (split[0].equals("LightMode")) {
readLightMode(statement.getLine()); readLightMode(statement.getLine());

@ -0,0 +1,3 @@
void main(){
gl_FragColor=vec4(1.0,0.0,1.0,0.5);
}

@ -0,0 +1,19 @@
layout (points) in;
layout (line_strip) out;
layout (max_vertices = 11) out;
uniform mat4 g_WorldViewProjectionMatrix;
const float PI = 3.1415926;
void main(){
for (int i = 0; i <= 10; i++) {
float ang = PI * 2.0 / 10.0 * i;
vec4 offset = vec4(cos(ang) * 5, -sin(ang) * 5, 0.0, 0.0);
gl_Position = g_WorldViewProjectionMatrix*vec4(gl_in[0].gl_Position.xyz + offset.xyz,1.0);
EmitVertex();
}
EndPrimitive();
}

@ -0,0 +1,4 @@
Material Pong Rock : Materials/Geom/SimpleGeom.j3md {
MaterialParameters {
}
}

@ -0,0 +1,17 @@
MaterialDef SimpleGeom {
MaterialParameters {
}
Technique {
VertexShader GLSL330: Materials/Geom/SimpleGeom.vert
GeometryShader GLSL330: Materials/Geom/SimpleGeom.geom
FragmentShader GLSL330: Materials/Geom/SimpleGeom.frag
WorldParameters {
WorldViewProjectionMatrix
}
}
}

@ -0,0 +1,5 @@
attribute vec3 inPosition;
void main(){
gl_Position=vec4(inPosition,1);
}
Loading…
Cancel
Save