From a109b1bc9b5180acaefd10751807d08e4328a1dc Mon Sep 17 00:00:00 2001 From: codeanticode Date: Wed, 12 Sep 2012 20:15:59 +0000 Subject: [PATCH] setUniformVector takes length of array as argument, so partially full arrays can be passed to shader w/out wasting empty elements --- .../processing/opengl/PGraphicsOpenGL.java | 17 +++++++------- .../core/src/processing/opengl/PShader.java | 22 ++++++++++--------- .../processing/opengl/PGraphicsOpenGL.java | 17 +++++++------- core/src/processing/opengl/PShader.java | 22 ++++++++++--------- 4 files changed, 42 insertions(+), 36 deletions(-) diff --git a/android/core/src/processing/opengl/PGraphicsOpenGL.java b/android/core/src/processing/opengl/PGraphicsOpenGL.java index 73381219e..55328d6db 100644 --- a/android/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/android/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6760,16 +6760,17 @@ public class PGraphicsOpenGL extends PGraphics { setUniformMatrix(normalMatrixLoc, pgCurrent.glNormal); } - setUniformValue(lightCountLoc, pgCurrent.lightCount); - setUniformVector(lightPositionLoc, pgCurrent.lightPosition, 4); - setUniformVector(lightNormalLoc, pgCurrent.lightNormal, 3); - setUniformVector(lightAmbientLoc, pgCurrent.lightAmbient, 3); - setUniformVector(lightDiffuseLoc, pgCurrent.lightDiffuse, 3); - setUniformVector(lightSpecularLoc, pgCurrent.lightSpecular, 3); + int count = pgCurrent.lightCount; + setUniformValue(lightCountLoc, count); + setUniformVector(lightPositionLoc, pgCurrent.lightPosition, 4, count); + setUniformVector(lightNormalLoc, pgCurrent.lightNormal, 3, count); + setUniformVector(lightAmbientLoc, pgCurrent.lightAmbient, 3, count); + setUniformVector(lightDiffuseLoc, pgCurrent.lightDiffuse, 3, count); + setUniformVector(lightSpecularLoc, pgCurrent.lightSpecular, 3, count); setUniformVector(lightFalloffCoefficientsLoc, - pgCurrent.lightFalloffCoefficients, 3); + pgCurrent.lightFalloffCoefficients, 3, count); setUniformVector(lightSpotParametersLoc, - pgCurrent.lightSpotParameters, 2); + pgCurrent.lightSpotParameters, 2, count); } @Override diff --git a/android/core/src/processing/opengl/PShader.java b/android/core/src/processing/opengl/PShader.java index d73644555..0a4827981 100644 --- a/android/core/src/processing/opengl/PShader.java +++ b/android/core/src/processing/opengl/PShader.java @@ -431,31 +431,33 @@ public class PShader { } - protected void setUniformVector(int loc, int[] vec, int ncoords) { + protected void setUniformVector(int loc, int[] vec, int ncoords, + int length) { if (-1 < loc) { if (ncoords == 1) { - pgl.uniform1iv(loc, vec.length, vec, 0); + pgl.uniform1iv(loc, length, vec, 0); } else if (ncoords == 2) { - pgl.uniform2iv(loc, vec.length / 2, vec, 0); + pgl.uniform2iv(loc, length, vec, 0); } else if (ncoords == 3) { - pgl.uniform3iv(loc, vec.length / 3, vec, 0); + pgl.uniform3iv(loc, length, vec, 0); } else if (ncoords == 4) { - pgl.uniform3iv(loc, vec.length / 4, vec, 0); + pgl.uniform3iv(loc, length, vec, 0); } } } - protected void setUniformVector(int loc, float[] vec, int ncoords) { + protected void setUniformVector(int loc, float[] vec, int ncoords, + int length) { if (-1 < loc) { if (ncoords == 1) { - pgl.uniform1fv(loc, vec.length, vec, 0); + pgl.uniform1fv(loc, length, vec, 0); } else if (ncoords == 2) { - pgl.uniform2fv(loc, vec.length / 2, vec, 0); + pgl.uniform2fv(loc, length, vec, 0); } else if (ncoords == 3) { - pgl.uniform3fv(loc, vec.length / 3, vec, 0); + pgl.uniform3fv(loc, length, vec, 0); } else if (ncoords == 4) { - pgl.uniform4fv(loc, vec.length / 4, vec, 0); + pgl.uniform4fv(loc, length, vec, 0); } } } diff --git a/core/src/processing/opengl/PGraphicsOpenGL.java b/core/src/processing/opengl/PGraphicsOpenGL.java index 73381219e..55328d6db 100644 --- a/core/src/processing/opengl/PGraphicsOpenGL.java +++ b/core/src/processing/opengl/PGraphicsOpenGL.java @@ -6760,16 +6760,17 @@ public class PGraphicsOpenGL extends PGraphics { setUniformMatrix(normalMatrixLoc, pgCurrent.glNormal); } - setUniformValue(lightCountLoc, pgCurrent.lightCount); - setUniformVector(lightPositionLoc, pgCurrent.lightPosition, 4); - setUniformVector(lightNormalLoc, pgCurrent.lightNormal, 3); - setUniformVector(lightAmbientLoc, pgCurrent.lightAmbient, 3); - setUniformVector(lightDiffuseLoc, pgCurrent.lightDiffuse, 3); - setUniformVector(lightSpecularLoc, pgCurrent.lightSpecular, 3); + int count = pgCurrent.lightCount; + setUniformValue(lightCountLoc, count); + setUniformVector(lightPositionLoc, pgCurrent.lightPosition, 4, count); + setUniformVector(lightNormalLoc, pgCurrent.lightNormal, 3, count); + setUniformVector(lightAmbientLoc, pgCurrent.lightAmbient, 3, count); + setUniformVector(lightDiffuseLoc, pgCurrent.lightDiffuse, 3, count); + setUniformVector(lightSpecularLoc, pgCurrent.lightSpecular, 3, count); setUniformVector(lightFalloffCoefficientsLoc, - pgCurrent.lightFalloffCoefficients, 3); + pgCurrent.lightFalloffCoefficients, 3, count); setUniformVector(lightSpotParametersLoc, - pgCurrent.lightSpotParameters, 2); + pgCurrent.lightSpotParameters, 2, count); } @Override diff --git a/core/src/processing/opengl/PShader.java b/core/src/processing/opengl/PShader.java index d73644555..0a4827981 100644 --- a/core/src/processing/opengl/PShader.java +++ b/core/src/processing/opengl/PShader.java @@ -431,31 +431,33 @@ public class PShader { } - protected void setUniformVector(int loc, int[] vec, int ncoords) { + protected void setUniformVector(int loc, int[] vec, int ncoords, + int length) { if (-1 < loc) { if (ncoords == 1) { - pgl.uniform1iv(loc, vec.length, vec, 0); + pgl.uniform1iv(loc, length, vec, 0); } else if (ncoords == 2) { - pgl.uniform2iv(loc, vec.length / 2, vec, 0); + pgl.uniform2iv(loc, length, vec, 0); } else if (ncoords == 3) { - pgl.uniform3iv(loc, vec.length / 3, vec, 0); + pgl.uniform3iv(loc, length, vec, 0); } else if (ncoords == 4) { - pgl.uniform3iv(loc, vec.length / 4, vec, 0); + pgl.uniform3iv(loc, length, vec, 0); } } } - protected void setUniformVector(int loc, float[] vec, int ncoords) { + protected void setUniformVector(int loc, float[] vec, int ncoords, + int length) { if (-1 < loc) { if (ncoords == 1) { - pgl.uniform1fv(loc, vec.length, vec, 0); + pgl.uniform1fv(loc, length, vec, 0); } else if (ncoords == 2) { - pgl.uniform2fv(loc, vec.length / 2, vec, 0); + pgl.uniform2fv(loc, length, vec, 0); } else if (ncoords == 3) { - pgl.uniform3fv(loc, vec.length / 3, vec, 0); + pgl.uniform3fv(loc, length, vec, 0); } else if (ncoords == 4) { - pgl.uniform4fv(loc, vec.length / 4, vec, 0); + pgl.uniform4fv(loc, length, vec, 0); } } }