diff --git a/android/core/src/processing/core/FillShaderVert.glsl b/android/core/src/processing/core/FillShaderVert.glsl index 10deef6e2..ea91a7829 100644 --- a/android/core/src/processing/core/FillShaderVert.glsl +++ b/android/core/src/processing/core/FillShaderVert.glsl @@ -46,10 +46,10 @@ attribute vec4 inColor; attribute vec3 inNormal; attribute vec2 inTexcoord; -//attribute vec4 inAmbientColor; -//attribute vec4 inSpecularColor; -//attribute vec4 inEmissiveColor; -//attribute float shine; +attribute vec4 inAmbientColor; +attribute vec4 inSpecularColor; +attribute vec4 inEmissiveColor; +attribute float shine; varying vec4 vertColor; varying vec2 vertTexcoord; @@ -99,7 +99,6 @@ void main() { vec3 lightDir; float falloff; float spot; - float shine = 0.5; if (isDir) { falloff = 1.0; @@ -117,5 +116,6 @@ void main() { totalDiffuse += lightDiffuse[i] * falloff * spot * lambertFactor(lightDir, ecNormal); totalSpecular += lightSpecular[i] * falloff * spot * blinnPhongFactor(lightDir, lightPos3, ecNormal, shine); } - + + vertColor = totalAmbient * inAmbientColor + totalDiffuse * inColor + totalSpecular * inSpecular + inEmissive; } \ No newline at end of file diff --git a/android/core/src/processing/core/PGraphicsAndroid3D.java b/android/core/src/processing/core/PGraphicsAndroid3D.java index 2ead3103e..dfb3d2634 100644 --- a/android/core/src/processing/core/PGraphicsAndroid3D.java +++ b/android/core/src/processing/core/PGraphicsAndroid3D.java @@ -2167,7 +2167,7 @@ public class PGraphicsAndroid3D extends PGraphics { fillVBOsCreated = true; } - int size, sizef, sizex; + int size, sizef, sizei, sizex; startFillShader(); @@ -2180,23 +2180,36 @@ public class PGraphicsAndroid3D extends PGraphics { size = tessGeo.fillVertexCount; sizef = size * PGL.SIZEOF_FLOAT; + sizei = size * PGL.SIZEOF_INT; pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillVertexBufferID); pgl.glBufferData(PGL.GL_ARRAY_BUFFER, 3 * sizef, FloatBuffer.wrap(tessGeo.fillVertices, 0, 3 * size), vboMode); - setFillVertexFormat(3, 0); + pgl.glVertexAttribPointer(fillVertexAttribLoc, size, PGL.GL_FLOAT, false, 0, 0); pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillColorBufferID); pgl.glBufferData(PGL.GL_ARRAY_BUFFER, 4 * sizef, FloatBuffer.wrap(tessGeo.fillColors, 0, 4 * size), vboMode); - setFillColorFormat(4, 0); + pgl.glVertexAttribPointer(fillColorAttribLoc, size, PGL.GL_FLOAT, false, 0, 0); if (lights) { pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillNormalBufferID); pgl.glBufferData(PGL.GL_ARRAY_BUFFER, 3 * sizef, FloatBuffer.wrap(tessGeo.fillNormals, 0, 3 * size), vboMode); - setFillNormalFormat(3, 0); + pgl.glVertexAttribPointer(fillNormalAttribLoc, size, PGL.GL_FLOAT, false, 0, 0); - // bind material buffers.. - // copy data - // set formats + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillAmbientBufferID); + pgl.glBufferData(PGL.GL_ARRAY_BUFFER, sizei, IntBuffer.wrap(tessGeo.fillAmbient, 0, size), vboMode); + pgl.glVertexAttribPointer(fillAmbientAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 0); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillSpecularBufferID); + pgl.glBufferData(PGL.GL_ARRAY_BUFFER, sizei, IntBuffer.wrap(tessGeo.fillSpecular, 0, size), vboMode); + pgl.glVertexAttribPointer(fillSpecularAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 0); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillEmissiveBufferID); + pgl.glBufferData(PGL.GL_ARRAY_BUFFER, sizei, IntBuffer.wrap(tessGeo.fillEmissive, 0, size), vboMode); + pgl.glVertexAttribPointer(fillEmissiveAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 0); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillShininessBufferID); + pgl.glBufferData(PGL.GL_ARRAY_BUFFER, sizef, FloatBuffer.wrap(tessGeo.fillShininess, 0, size), vboMode); + pgl.glVertexAttribPointer(fillShininessAttribLoc, 1, PGL.GL_FLOAT, false, 0, 0); } if (texCache.hasTexture) { @@ -2204,7 +2217,7 @@ public class PGraphicsAndroid3D extends PGraphics { enableFillTexCoord(); pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillTexCoordBufferID); pgl.glBufferData(PGL.GL_ARRAY_BUFFER, 2 * sizef, FloatBuffer.wrap(tessGeo.fillTexcoords, 0, 2 * size), vboMode); - setFillTexCoordFormat(2, 0); + pgl.glVertexAttribPointer(fillTexCoordAttribLoc, size, PGL.GL_FLOAT, false, 0, 0); } pgl.glBindBuffer(PGL.GL_ELEMENT_ARRAY_BUFFER, glFillIndexBufferID); @@ -2272,6 +2285,7 @@ public class PGraphicsAndroid3D extends PGraphics { disableFillColor(); if (lights) { disableFillNormal(); + disableFillMaterials(); } stopFillShader(); @@ -5528,6 +5542,11 @@ public class PGraphicsAndroid3D extends PGraphics { protected static int fillColorAttribLoc; protected static int fillNormalAttribLoc; protected static int fillTexCoordAttribLoc; + protected static int fillAmbientAttribLoc; + protected static int fillSpecularAttribLoc; + protected static int fillEmissiveAttribLoc; + protected static int fillShininessAttribLoc; + protected static int lineModelviewLoc; protected static int lineProjectionLoc; @@ -5571,13 +5590,16 @@ public class PGraphicsAndroid3D extends PGraphics { fillLightFalloffQuadraticLoc = fillShader.getUniformLocation("lightFalloffQuadratic"); fillLightSpotAngleCosLoc = fillShader.getUniformLocation("lightSpotAngleCos"); fillLightSpotConcentrationLoc = fillShader.getUniformLocation("lightSpotConcentration"); - - - + fillVertexAttribLoc = fillShader.getAttribLocation("inVertex"); fillColorAttribLoc = fillShader.getAttribLocation("inColor"); fillNormalAttribLoc = fillShader.getAttribLocation("inNormal"); fillTexCoordAttribLoc = fillShader.getAttribLocation("inTexcoord"); + + fillAmbientAttribLoc = fillShader.getAttribLocation("inAmbientColor"); + fillSpecularAttribLoc = fillShader.getAttribLocation("inSpecularColor"); + fillEmissiveAttribLoc = fillShader.getAttribLocation("inEmissiveColor"); + fillShininessAttribLoc = fillShader.getAttribLocation("inShininess"); } fillShader.start(); @@ -5639,7 +5661,10 @@ public class PGraphicsAndroid3D extends PGraphics { } protected void enableFillMaterials() { - + pgl.glEnableVertexAttribArray(fillAmbientAttribLoc); + pgl.glEnableVertexAttribArray(fillSpecularAttribLoc); + pgl.glEnableVertexAttribArray(fillEmissiveAttribLoc); + pgl.glEnableVertexAttribArray(fillShininessAttribLoc); } protected void enableFillTexCoord() { @@ -5662,6 +5687,13 @@ public class PGraphicsAndroid3D extends PGraphics { pgl.glDisableVertexAttribArray(fillTexCoordAttribLoc); } + protected void disableFillMaterials() { + pgl.glDisableVertexAttribArray(fillAmbientAttribLoc); + pgl.glDisableVertexAttribArray(fillSpecularAttribLoc); + pgl.glDisableVertexAttribArray(fillEmissiveAttribLoc); + pgl.glDisableVertexAttribArray(fillShininessAttribLoc); + } + protected void setFillVertexFormat(int size, int offset) { pgl.glVertexAttribPointer(fillVertexAttribLoc, size, PGL.GL_FLOAT, false, 0, size * offset); } diff --git a/android/core/src/processing/core/PShape3D.java b/android/core/src/processing/core/PShape3D.java index d09a10cd9..88a35d73b 100644 --- a/android/core/src/processing/core/PShape3D.java +++ b/android/core/src/processing/core/PShape3D.java @@ -3967,6 +3967,7 @@ public class PShape3D extends PShape { pg.enableFillColor(); pg.enableFillNormal(); pg.enableFillTexCoord(); + pg.enableFillMaterials(); for (int i = 0; i < fillIndexData.size(); i++) { IndexData index = (IndexData)fillIndexData.get(i); @@ -3986,6 +3987,18 @@ public class PShape3D extends PShape { pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, root.glFillTexCoordBufferID); pg.setFillTexCoordFormat(2, first); + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillAmbientBufferID); + pgl.glVertexAttribPointer(pg.fillAmbientAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 4 * first); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillSpecularBufferID); + pgl.glVertexAttribPointer(pg.fillSpecularAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 4 * first); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillEmissiveBufferID); + pgl.glVertexAttribPointer(pg.fillEmissiveAttribLoc, 4, PGL.GL_UNSIGNED_BYTE, false, 0, 4 * first); + + pgl.glBindBuffer(PGL.GL_ARRAY_BUFFER, glFillShininessBufferID); + pgl.glVertexAttribPointer(pg.fillShininessAttribLoc, 1, PGL.GL_FLOAT, false, 0, first); + PTexture tex = null; if (textureImage != null) { pgl.glActiveTexture(PGL.GL_TEXTURE0); @@ -4012,6 +4025,7 @@ public class PShape3D extends PShape { pg.disableFillColor(); pg.disableFillNormal(); pg.disableFillTexCoord(); + pg.disableFillMaterials(); pg.stopFillShader(); }