Merge branch 'master' of github.com:processing/processing

This commit is contained in:
Ben Fry
2015-06-05 22:21:04 -04:00
2 changed files with 59 additions and 37 deletions
@@ -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;
+54 -34
View File
@@ -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());