mirror of
https://github.com/processing/processing4.git
synced 2026-06-16 04:26:26 +02:00
Merge branch 'master' of github.com:processing/processing
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user