binding material buffers in render methods

This commit is contained in:
codeanticode
2012-02-07 07:22:24 +00:00
parent a3787d3b58
commit 1c991da6c6
3 changed files with 64 additions and 18 deletions
@@ -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;
}
@@ -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);
}
@@ -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();
}