diff --git a/core/src/processing/opengl/PGL.java b/core/src/processing/opengl/PGL.java index 375957693..a4109ea76 100644 --- a/core/src/processing/opengl/PGL.java +++ b/core/src/processing/opengl/PGL.java @@ -1065,8 +1065,10 @@ public abstract class PGL { PGL ppgl = primaryPGL ? this : pg.getPrimaryPGL(); if (!ppgl.loadedTex2DShader || ppgl.tex2DShaderContext != ppgl.glContext) { - String vertSource = PApplet.join(texVertShaderSource, "\n"); - String fragSource = PApplet.join(tex2DFragShaderSource, "\n"); + String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion()); + String vertSource = PApplet.join(preprocVertSrc, "\n"); + String[] preprocFragSrc = preprocessFragmentSource(tex2DFragShaderSource, getGLSLVersion()); + String fragSource = PApplet.join(preprocFragSrc, "\n"); ppgl.tex2DVertShader = createShader(VERTEX_SHADER, vertSource); ppgl.tex2DFragShader = createShader(FRAGMENT_SHADER, fragSource); if (0 < ppgl.tex2DVertShader && 0 < ppgl.tex2DFragShader) { @@ -1195,8 +1197,10 @@ public abstract class PGL { PGL ppgl = primaryPGL ? this : pg.getPrimaryPGL(); if (!ppgl.loadedTexRectShader || ppgl.texRectShaderContext != ppgl.glContext) { - String vertSource = PApplet.join(texVertShaderSource, "\n"); - String fragSource = PApplet.join(texRectFragShaderSource, "\n"); + String[] preprocVertSrc = preprocessVertexSource(texVertShaderSource, getGLSLVersion()); + String vertSource = PApplet.join(preprocVertSrc, "\n"); + String[] preprocFragSrc = preprocessFragmentSource(texRectFragShaderSource, getGLSLVersion()); + String fragSource = PApplet.join(preprocFragSrc, "\n"); ppgl.texRectVertShader = createShader(VERTEX_SHADER, vertSource); ppgl.texRectFragShader = createShader(FRAGMENT_SHADER, fragSource); if (0 < ppgl.texRectVertShader && 0 < ppgl.texRectFragShader) { @@ -1616,6 +1620,11 @@ public abstract class PGL { } + protected int getGLSLVersion() { + return 120; + } + + protected String[] loadVertexShader(String filename) { return pg.parent.loadStrings(filename); } @@ -1668,7 +1677,16 @@ public abstract class PGL { protected static String[] preprocessFragmentSource(String[] fragSrc0, int version) { - if (version >= 130) { + String[] fragSrc; + + if (version < 130) { + String[] search = { }; + String[] replace = { }; + int offset = 1; + + fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset); + fragSrc[0] = "#version " + version; + } else { // We need to replace 'texture' uniform by 'texMap' uniform and // 'textureXXX()' functions by 'texture()' functions. Order of these // replacements is important to prevent collisions between these two. @@ -1684,19 +1702,28 @@ public abstract class PGL { "texture", "texture", "texture", "texture", "fragColor" }; + int offset = 2; - String[] fragSrc = preprocessShaderSource(fragSrc0, search, replace, 2); + fragSrc = preprocessShaderSource(fragSrc0, search, replace, offset); fragSrc[0] = "#version " + version; fragSrc[1] = "out vec4 fragColor;"; - - return fragSrc; } - return fragSrc0; + + return fragSrc; } protected static String[] preprocessVertexSource(String[] vertSrc0, int version) { - if (version >= 130) { + String[] vertSrc; + + if (version < 130) { + String[] search = { }; + String[] replace = { }; + int offset = 1; + + vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset); + vertSrc[0] = "#version " + version; + } else { // We need to replace 'texture' uniform by 'texMap' uniform and // 'textureXXX()' functions by 'texture()' functions. Order of these // replacements is important to prevent collisions between these two. @@ -1710,13 +1737,13 @@ public abstract class PGL { "texMap", "texture", "texture", "texture", "texture" }; + int offset = 1; - String[] vertSrc = preprocessShaderSource(vertSrc0, search, replace, 1); + vertSrc = preprocessShaderSource(vertSrc0, search, replace, offset); vertSrc[0] = "#version " + version; - - return vertSrc; } - return vertSrc0; + + return vertSrc; } protected static String[] preprocessShaderSource(String[] src0, diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 31156581d..60f9bce2c 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -7197,25 +7197,25 @@ public class PGraphicsOpenGL extends PGraphics { shader.setType(type); shader.setFragmentShader(fragFilename); if (type == PShader.POINT) { - String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL); shader.setVertexShader(vertSource); } else if (type == PShader.LINE) { - String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL); shader.setVertexShader(vertSource); } else if (type == PShader.TEXLIGHT) { - String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL); shader.setVertexShader(vertSource); } else if (type == PShader.LIGHT) { - String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL); shader.setVertexShader(vertSource); } else if (type == PShader.TEXTURE) { - String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL); shader.setVertexShader(vertSource); } else if (type == PShader.COLOR) { - String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL); shader.setVertexShader(vertSource); } else { - String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL); shader.setVertexShader(vertSource); } return shader; @@ -7309,8 +7309,8 @@ public class PGraphicsOpenGL extends PGraphics { if (tex) { if (useDefault || !polyShader.checkPolyType(PShader.TEXLIGHT)) { if (ppg.defTexlightShader == null) { - String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defTexlightShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defTexlightShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defTexlightShaderFragURL); ppg.defTexlightShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defTexlightShader; @@ -7320,8 +7320,8 @@ public class PGraphicsOpenGL extends PGraphics { } else { if (useDefault || !polyShader.checkPolyType(PShader.LIGHT)) { if (ppg.defLightShader == null) { - String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defLightShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defLightShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defLightShaderFragURL); ppg.defLightShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defLightShader; @@ -7338,8 +7338,8 @@ public class PGraphicsOpenGL extends PGraphics { if (tex) { if (useDefault || !polyShader.checkPolyType(PShader.TEXTURE)) { if (ppg.defTextureShader == null) { - String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defTextureShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defTextureShaderFragURL); ppg.defTextureShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defTextureShader; @@ -7349,8 +7349,8 @@ public class PGraphicsOpenGL extends PGraphics { } else { if (useDefault || !polyShader.checkPolyType(PShader.COLOR)) { if (ppg.defColorShader == null) { - String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defColorShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defColorShaderFragURL); ppg.defColorShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defColorShader; @@ -7373,8 +7373,8 @@ public class PGraphicsOpenGL extends PGraphics { PGraphicsOpenGL ppg = getPrimaryPG(); if (lineShader == null) { if (ppg.defLineShader == null) { - String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defLineShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defLineShaderFragURL); ppg.defLineShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defLineShader; @@ -7393,8 +7393,8 @@ public class PGraphicsOpenGL extends PGraphics { PGraphicsOpenGL ppg = getPrimaryPG(); if (pointShader == null) { if (ppg.defPointShader == null) { - String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL, 120); - String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL, 120); + String[] vertSource = pgl.loadVertexShader(defPointShaderVertURL); + String[] fragSource = pgl.loadFragmentShader(defPointShaderFragURL); ppg.defPointShader = new PShader(parent, vertSource, fragSource); } shader = ppg.defPointShader; diff --git a/core/src/processing/opengl/PJOGL.java b/core/src/processing/opengl/PJOGL.java index 29651057b..73512ca55 100644 --- a/core/src/processing/opengl/PJOGL.java +++ b/core/src/processing/opengl/PJOGL.java @@ -37,6 +37,7 @@ import java.nio.ByteBuffer; import java.nio.FloatBuffer; import java.nio.IntBuffer; +import com.jogamp.common.util.VersionNumber; import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GL2ES1; @@ -1237,38 +1238,56 @@ public class PJOGL extends PGL { return ((Font) font).deriveFont(size); } + @Override + protected int getGLSLVersion() { + VersionNumber vn = context.getGLSLVersionNumber(); + return vn.getMajor() * 100 + vn.getMinor(); + } + @Override - protected String[] loadVertexShader(String filename, int version) { - if (PApplet.platform == PConstants.MACOSX) { - String[] fragSrc0 = pg.parent.loadStrings(filename); - return preprocessFragmentSource(fragSrc0, 130); - } else { - return pg.parent.loadStrings(filename); - } + protected String[] loadVertexShader(String filename) { + return loadVertexShader(filename, getGLSLVersion()); + } + + + @Override + protected String[] loadFragmentShader(String filename) { + return loadFragmentShader(filename, getGLSLVersion()); + } + + + @Override + protected String[] loadVertexShader(URL url) { + return loadVertexShader(url, getGLSLVersion()); + } + + + @Override + protected String[] loadFragmentShader(URL url) { + return loadFragmentShader(url, getGLSLVersion()); } @Override protected String[] loadFragmentShader(String filename, int version) { - if (PApplet.platform == PConstants.MACOSX) { - String[] vertSrc0 = pg.parent.loadStrings(filename); - return preprocessVertexSource(vertSrc0, 130); - } else { - return pg.parent.loadStrings(filename); - } + String[] fragSrc0 = pg.parent.loadStrings(filename); + return preprocessFragmentSource(fragSrc0, version); + } + + + @Override + protected String[] loadVertexShader(String filename, int version) { + String[] vertSrc0 = pg.parent.loadStrings(filename); + return preprocessVertexSource(vertSrc0, version); } @Override protected String[] loadFragmentShader(URL url, int version) { try { - if (PApplet.platform == PConstants.MACOSX) { - String[] fragSrc0 = PApplet.loadStrings(url.openStream()); - return preprocessFragmentSource(fragSrc0, 130); - } else { - return PApplet.loadStrings(url.openStream()); - } + String[] fragSrc0 = PApplet.loadStrings(url.openStream()); + return preprocessFragmentSource(fragSrc0, version); } catch (IOException e) { PGraphics.showException("Cannot load fragment shader " + url.getFile()); } @@ -1279,12 +1298,8 @@ public class PJOGL extends PGL { @Override protected String[] loadVertexShader(URL url, int version) { try { - if (PApplet.platform == PConstants.MACOSX) { - String[] vertSrc0 = PApplet.loadStrings(url.openStream()); - return preprocessVertexSource(vertSrc0, 130); - } else { - return PApplet.loadStrings(url.openStream()); - } + String[] vertSrc0 = PApplet.loadStrings(url.openStream()); + return preprocessVertexSource(vertSrc0, version); } catch (IOException e) { PGraphics.showException("Cannot load vertex shader " + url.getFile()); } diff --git a/core/src/processing/opengl/PShader.java b/core/src/processing/opengl/PShader.java index 25dc248a8..a05531fce 100644 --- a/core/src/processing/opengl/PShader.java +++ b/core/src/processing/opengl/PShader.java @@ -325,7 +325,7 @@ public class PShader implements PConstants { public void setVertexShader(String vertFilename) { this.vertexFilename = vertFilename; - vertexShaderSource = pgl.loadFragmentShader(vertFilename); + vertexShaderSource = pgl.loadVertexShader(vertFilename); } @@ -342,13 +342,13 @@ public class PShader implements PConstants { public void setFragmentShader(String fragFilename) { this.fragmentFilename = fragFilename; - fragmentShaderSource = pgl.loadVertexShader(fragFilename); + fragmentShaderSource = pgl.loadFragmentShader(fragFilename); } public void setFragmentShader(URL fragURL) { this.fragmentURL = fragURL; - fragmentShaderSource = pgl.loadVertexShader(fragURL); + fragmentShaderSource = pgl.loadFragmentShader(fragURL); } public void setFragmentShader(String[] fragSource) { diff --git a/core/src/processing/opengl/PSurfaceJOGL.java b/core/src/processing/opengl/PSurfaceJOGL.java index f9d7bbbd2..cecfd0d0e 100644 --- a/core/src/processing/opengl/PSurfaceJOGL.java +++ b/core/src/processing/opengl/PSurfaceJOGL.java @@ -195,11 +195,7 @@ public class PSurfaceJOGL implements PSurface { if (profile == null) { if (PJOGL.profile == 2) { try { - if (PApplet.platform == PConstants.MACOSX) { - profile = GLProfile.getMaxProgrammableCore(true); - } else { - profile = GLProfile.getGL2ES2(); - } + profile = GLProfile.getGL2ES2(); } catch (GLException ex) { profile = GLProfile.getMaxProgrammable(true); }