diff --git a/core/src/processing/opengl/PGL.java b/core/src/processing/opengl/PGL.java index 82e8b835d..775ee46a9 100644 --- a/core/src/processing/opengl/PGL.java +++ b/core/src/processing/opengl/PGL.java @@ -212,7 +212,6 @@ public abstract class PGL { "varying vec2 vertTexcoord;\n" + "void main() {\n" + " gl_FragColor = texture2D(textureSampler, vertTexcoord.st);\n" + -// " gl_FragColor = vec4(vertTexcoord.st, 0, 1);\n" + "}\n", "#version 150\n" + SHADER_PREPROCESSOR_DIRECTIVE + @@ -220,8 +219,7 @@ public abstract class PGL { "in vec2 vertTexcoord;\n" + "out vec4 fragColor;\n" + "void main() {\n" + -// " fragColor = texture(textureSampler, vertTexcoord.st);\n" + - " fragColor = vec4(vertTexcoord.st, 0, 1);\n" + + " fragColor = texture(textureSampler, vertTexcoord.st);\n" + "}\n" }; @@ -1454,50 +1452,30 @@ public abstract class PGL { } } - /** - * Loads and compiles the vertex shader contained in file. - * - * @param file String - */ + protected String[] loadVertexShader(String filename) { return pg.parent.loadStrings(filename); - //PApplet.join(parent.loadStrings(filename), "\n"); } - /** - * Loads and compiles the fragment shader contained in file. - * - * @param file String - */ + protected String[] loadFragmentShader(String filename) { return pg.parent.loadStrings(filename); - // PApplet.join(parent.loadStrings(filename), "\n"); } - /** - * Loads and compiles the fragment shader contained in the URL. - * - * @param url URL - */ + protected String[] loadFragmentShader(URL url) { try { return PApplet.loadStrings(url.openStream()); - // PApplet.join(PApplet.loadStrings(url.openStream()), "\n"); } catch (IOException e) { PGraphics.showException("Cannot load fragment shader " + url.getFile()); } return null; } - /** - * Loads and compiles the vertex shader contained in the URL. - * - * @param file String - */ + protected String[] loadVertexShader(URL url) { try { return PApplet.loadStrings(url.openStream()); - //PApplet.join(PApplet.loadStrings(url.openStream()), "\n"); } catch (IOException e) { PGraphics.showException("Cannot load vertex shader " + url.getFile()); } @@ -1505,6 +1483,37 @@ public abstract class PGL { } + protected String[] loadVertexShader(String filename, int version) { + return loadVertexShader(filename); + } + + + protected String[] loadFragmentShader(String filename, int version) { + return loadFragmentShader(filename); + } + + + protected String[] loadFragmentShader(URL url, int version) { + return loadFragmentShader(url); + } + + + protected String[] loadVertexShader(URL url, int version) { + return loadVertexShader(url); + } + + + protected String[] convertFragmentSource(String[] fragSrc0, + int version0, int version1) { + return fragSrc0; + } + + + protected String[] convertVertexSource(String[] vertSrc0, + int version0, int version1) { + return vertSrc0; + } + protected int createShader(int shaderType, String source) { int shader = createShader(shaderType); diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index fbddc3eb8..10c1f0fc6 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6284,19 +6284,26 @@ public class PGraphicsOpenGL extends PGraphics { shader.setType(type); shader.setFragmentShader(fragFilename); if (type == PShader.POINT) { - shader.setVertexShader(defPointShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120); + shader.setVertexShader(vertSource); } else if (type == PShader.LINE) { - shader.setVertexShader(defLineShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120); + shader.setVertexShader(vertSource); } else if (type == PShader.TEXLIGHT) { - shader.setVertexShader(defTexlightShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120); + shader.setVertexShader(vertSource); } else if (type == PShader.LIGHT) { - shader.setVertexShader(defLightShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120); + shader.setVertexShader(vertSource); } else if (type == PShader.TEXTURE) { - shader.setVertexShader(defTextureShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); + shader.setVertexShader(vertSource); } else if (type == PShader.COLOR) { - shader.setVertexShader(defColorShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120); + shader.setVertexShader(vertSource); } else { - shader.setVertexShader(defTextureShaderVertURL); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); + shader.setVertexShader(vertSource); } return shader; } @@ -6382,8 +6389,8 @@ public class PGraphicsOpenGL extends PGraphics { if (tex) { if (useDefault || !polyShader.checkPolyType(PShader.TEXLIGHT)) { if (defTexlightShader == null) { - String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL, 120); defTexlightShader = new PShader(parent, vertSource, fragSource); } shader = defTexlightShader; @@ -6393,8 +6400,8 @@ public class PGraphicsOpenGL extends PGraphics { } else { if (useDefault || !polyShader.checkPolyType(PShader.LIGHT)) { if (defLightShader == null) { - String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL, 120); defLightShader = new PShader(parent, vertSource, fragSource); } shader = defLightShader; @@ -6411,8 +6418,8 @@ public class PGraphicsOpenGL extends PGraphics { if (tex) { if (useDefault || !polyShader.checkPolyType(PShader.TEXTURE)) { if (defTextureShader == null) { - String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL, 120); defTextureShader = new PShader(parent, vertSource, fragSource); } shader = defTextureShader; @@ -6422,8 +6429,8 @@ public class PGraphicsOpenGL extends PGraphics { } else { if (useDefault || !polyShader.checkPolyType(PShader.COLOR)) { if (defColorShader == null) { - String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL, 120); defColorShader = new PShader(parent, vertSource, fragSource); } shader = defColorShader; @@ -6445,8 +6452,8 @@ public class PGraphicsOpenGL extends PGraphics { PShader shader; if (lineShader == null) { if (defLineShader == null) { - String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL, 120); defLineShader = new PShader(parent, vertSource, fragSource); } shader = defLineShader; @@ -6464,8 +6471,8 @@ public class PGraphicsOpenGL extends PGraphics { PShader shader; if (pointShader == null) { if (defPointShader == null) { - String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL); - String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL); + String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120); + String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL, 120); defPointShader = new PShader(parent, vertSource, fragSource); } shader = defPointShader; diff --git a/core/src/processing/opengl/PJOGL.java b/core/src/processing/opengl/PJOGL.java index d2576c916..333271c82 100644 --- a/core/src/processing/opengl/PJOGL.java +++ b/core/src/processing/opengl/PJOGL.java @@ -1039,31 +1039,33 @@ public class PJOGL extends PGL { @Override - protected String[] loadFragmentShader(URL url) { + protected String[] loadVertexShader(String filename, int version) { + if (2 < PROFILE && version < 150) { + String[] fragSrc0 = pg.parent.loadStrings(filename); + return convertFragmentSource(fragSrc0, version, 150); + } else { + return pg.parent.loadStrings(filename); + } + } + + + @Override + protected String[] loadFragmentShader(String filename, int version) { + if (2 < PROFILE && version < 150) { + String[] vertSrc0 = pg.parent.loadStrings(filename); + return convertVertexSource(vertSrc0, version, 150); + } else { + return pg.parent.loadStrings(filename); + } + } + + + @Override + protected String[] loadFragmentShader(URL url, int version) { try { - if (2 < PROFILE) { -// if (false) { + if (2 < PROFILE && version < 150) { String[] fragSrc0 = PApplet.loadStrings(url.openStream()); - // PApplet.join(PApplet.loadStrings(url.openStream()), "\n"); - String[] fragSrc = new String[fragSrc0.length + 2]; - fragSrc[0] = "#version 150"; - fragSrc[1] = "out vec4 fragColor;"; - - for (int i = 0; i < fragSrc0.length; i++) { - String line = fragSrc0[i]; - System.out.print(line + " ---> "); - - line = line.replace("varying", "in"); - line = line.replace("attribute", "in"); - line = line.replace("gl_FragColor", "fragColor"); - line = line.replace("texture", "texSampler"); - line = line.replace("texSampler2D(", "texture("); - - fragSrc[i + 2] = line; - System.out.println(line); - } - - return fragSrc; + return convertFragmentSource(fragSrc0, version, 150); } else { return PApplet.loadStrings(url.openStream()); } @@ -1073,25 +1075,13 @@ public class PJOGL extends PGL { return null; } + @Override - protected String[] loadVertexShader(URL url) { + protected String[] loadVertexShader(URL url, int version) { try { - if (2 < PROFILE) { -// if (false) { + if (2 < PROFILE && version < 150) { String[] vertSrc0 = PApplet.loadStrings(url.openStream()); - String[] vertSrc = new String[vertSrc0.length + 1]; - vertSrc[0] = "#version 150"; - - for (int i = 0; i < vertSrc0.length; i++) { - String line = vertSrc0[i]; - System.out.print(line + " ---> "); - line = line.replace("attribute", "in"); - line = line.replace("varying", "out"); - vertSrc[i + 1] = line; - System.out.println(line); - } - - return vertSrc; + return convertVertexSource(vertSrc0, version, 150); } else { return PApplet.loadStrings(url.openStream()); } @@ -1102,6 +1092,40 @@ public class PJOGL extends PGL { } + @Override + protected String[] convertFragmentSource(String[] fragSrc0, + int version0, int version1) { + String[] fragSrc = new String[fragSrc0.length + 2]; + fragSrc[0] = "#version 150"; + fragSrc[1] = "out vec4 fragColor;"; + for (int i = 0; i < fragSrc0.length; i++) { + String line = fragSrc0[i]; + line = line.replace("varying", "in"); + line = line.replace("attribute", "in"); + line = line.replace("gl_FragColor", "fragColor"); + line = line.replace("texture", "texSampler"); + line = line.replace("texSampler2D(", "texture("); + fragSrc[i + 2] = line; + } + return fragSrc; + } + + + @Override + protected String[] convertVertexSource(String[] vertSrc0, + int version0, int version1) { + String[] vertSrc = new String[vertSrc0.length + 1]; + vertSrc[0] = "#version 150"; + for (int i = 0; i < vertSrc0.length; i++) { + String line = vertSrc0[i]; + line = line.replace("attribute", "in"); + line = line.replace("varying", "out"); + vertSrc[i + 1] = line; + } + return vertSrc; + } + + /////////////////////////////////////////////////////////// // Tessellator diff --git a/core/src/processing/opengl/PShader.java b/core/src/processing/opengl/PShader.java index 54e62d09a..9b9b48105 100644 --- a/core/src/processing/opengl/PShader.java +++ b/core/src/processing/opengl/PShader.java @@ -315,21 +315,34 @@ public class PShader implements PConstants { public void setVertexShader(String vertFilename) { this.vertexFilename = vertFilename; + vertexShaderSource = pgl.loadFragmentShader(vertFilename); } public void setVertexShader(URL vertURL) { this.vertexURL = vertURL; + vertexShaderSource = pgl.loadVertexShader(vertURL); + } + + + public void setVertexShader(String[] vertSource) { + vertexShaderSource = vertSource; } public void setFragmentShader(String fragFilename) { this.fragmentFilename = fragFilename; + fragmentShaderSource = pgl.loadVertexShader(fragFilename); } public void setFragmentShader(URL fragURL) { this.fragmentURL = fragURL; + fragmentShaderSource = pgl.loadVertexShader(fragURL); + } + + public void setFragmentShader(String[] fragSource) { + fragmentShaderSource = fragSource; } @@ -1099,7 +1112,7 @@ public class PShader implements PConstants { if (textureLoc == -1) { textureLoc = getUniformLoc("texSampler"); } - System.err.println("textureLoc: " + textureLoc); + texMatrixLoc = getUniformLoc("texMatrix"); texOffsetLoc = getUniformLoc("texOffset"); @@ -1145,7 +1158,6 @@ public class PShader implements PConstants { protected void bindTyped() { if (pg == null) { - System.out.println(" setting pg and uniforms " + pg); setRenderer(PGraphicsOpenGL.pgCurrent); loadAttributes(); loadUniforms();