From 7ecabd8a346fddb73dc8702ad31b7a32289a5353 Mon Sep 17 00:00:00 2001 From: codeanticode Date: Fri, 5 Jun 2015 18:57:17 -0400 Subject: [PATCH] init shader in shader() call --- .../processing/opengl/PGraphicsOpenGL.java | 8 +- core/src/processing/opengl/PShader.java | 88 ++++++++++++------- 2 files changed, 59 insertions(+), 37 deletions(-) diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 29c8e2b45..ae57241d9 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6850,15 +6850,15 @@ public class PGraphicsOpenGL extends PGraphics { @Override public PShader loadShader(String fragFilename, String vertFilename) { + PShader shader = null; if (fragFilename == null || fragFilename.equals("")) { PGraphics.showWarning(MISSING_FRAGMENT_SHADER); - return null; } else if (vertFilename == null || vertFilename.equals("")) { PGraphics.showWarning(MISSING_VERTEX_SHADER); - return null; } else { - return new PShader(parent, vertFilename, fragFilename); + shader = new PShader(parent, vertFilename, fragFilename); } + return shader; } @@ -6866,6 +6866,7 @@ public class PGraphicsOpenGL extends PGraphics { public void shader(PShader shader) { flush(); // Flushing geometry drawn with a different shader. + if (shader != null) shader.init(); if (shader.isPolyShader()) polyShader = shader; else if (shader.isLineShader()) lineShader = shader; else if (shader.isPointShader()) pointShader = shader; @@ -6877,6 +6878,7 @@ public class PGraphicsOpenGL extends PGraphics { public void shader(PShader shader, int kind) { flush(); // Flushing geometry drawn with a different shader. + if (shader != null) shader.init(); if (kind == TRIANGLES) polyShader = shader; else if (kind == LINES) lineShader = shader; else if (kind == POINTS) pointShader = shader; diff --git a/core/src/processing/opengl/PShader.java b/core/src/processing/opengl/PShader.java index aad807194..03a5f6c4f 100644 --- a/core/src/processing/opengl/PShader.java +++ b/core/src/processing/opengl/PShader.java @@ -753,7 +753,7 @@ public class PShader implements PConstants { uniformValues.put(loc, new UniformValue(type, value)); } else { PGraphics.showWarning("The shader doesn't have a uniform called \"" + - name + "\" OR the uniform was removed during" + + name + "\" OR the uniform was removed during " + "compilation because it was unused."); } } @@ -897,51 +897,67 @@ public class PShader implements PConstants { } } - protected void init() { + + public void init() { if (glProgram == 0 || contextIsOutdated()) { - context = pgl.getCurrentContext(); - glProgram = PGraphicsOpenGL.createGLSLProgramObject(context, pgl); - - boolean vertRes = true; - if (hasVertexShader()) { - vertRes = compileVertexShader(); - } else { - PGraphics.showException("Doesn't have a vertex shader"); - } - - boolean fragRes = true; - if (hasFragmentShader()) { - fragRes = compileFragmentShader(); - } else { - PGraphics.showException("Doesn't have a fragment shader"); - } - - if (vertRes && fragRes) { + create(); + if (compile()) { pgl.attachShader(glProgram, glVertex); pgl.attachShader(glProgram, glFragment); + setup(); pgl.linkProgram(glProgram); - pgl.getProgramiv(glProgram, PGL.LINK_STATUS, intBuffer); - boolean linked = intBuffer.get(0) == 0 ? false : true; - if (!linked) { - PGraphics.showException("Cannot link shader program:\n" + - pgl.getProgramInfoLog(glProgram)); - } - - pgl.validateProgram(glProgram); - pgl.getProgramiv(glProgram, PGL.VALIDATE_STATUS, intBuffer); - boolean validated = intBuffer.get(0) == 0 ? false : true; - if (!validated) { - PGraphics.showException("Cannot validate shader program:\n" + - pgl.getProgramInfoLog(glProgram)); - } + validate(); } } } + protected void create() { + context = pgl.getCurrentContext(); + glProgram = PGraphicsOpenGL.createGLSLProgramObject(context, pgl); + } + + + protected boolean compile() { + boolean vertRes = true; + if (hasVertexShader()) { + vertRes = compileVertexShader(); + } else { + PGraphics.showException("Doesn't have a vertex shader"); + } + + boolean fragRes = true; + if (hasFragmentShader()) { + fragRes = compileFragmentShader(); + } else { + PGraphics.showException("Doesn't have a fragment shader"); + } + + return vertRes && fragRes; + } + + + protected void validate() { + pgl.getProgramiv(glProgram, PGL.LINK_STATUS, intBuffer); + boolean linked = intBuffer.get(0) == 0 ? false : true; + if (!linked) { + PGraphics.showException("Cannot link shader program:\n" + + pgl.getProgramInfoLog(glProgram)); + } + + pgl.validateProgram(glProgram); + pgl.getProgramiv(glProgram, PGL.VALIDATE_STATUS, intBuffer); + boolean validated = intBuffer.get(0) == 0 ? false : true; + if (!validated) { + PGraphics.showException("Cannot validate shader program:\n" + + pgl.getProgramInfoLog(glProgram)); + } + } + + protected boolean contextIsOutdated() { boolean outdated = !pgl.contextIsCurrent(context); if (outdated) { @@ -962,10 +978,12 @@ public class PShader implements PConstants { return vertexShaderSource != null && 0 < vertexShaderSource.length; } + protected boolean hasFragmentShader() { return fragmentShaderSource != null && 0 < fragmentShaderSource.length; } + /** * @param shaderSource a string containing the shader's code */ @@ -1023,6 +1041,7 @@ public class PShader implements PConstants { } } + static protected int getShaderType(String[] source, int defaultType) { for (int i = 0; i < source.length; i++) { String line = source[i].trim(); @@ -1220,6 +1239,7 @@ public class PShader implements PConstants { } } + protected void bindTyped() { if (currentPG == null) { setRenderer(primaryPG.getCurrentPG());