/**
* draws the shadow volumns in the render bin
* @param bin
*/
protected void drawShadows(ShadowBin bin) {
final int FULLMASK = 0xffffffff;
// determine edges
for (int i = 0; i < bin.curSize; i++)
determineVisibleEdges(bin.buckets[i], bin.lightsource);
gl.glPushAttrib(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT |
GL.GL_ENABLE_BIT | GL.GL_POLYGON_BIT |
GL.GL_STENCIL_BUFFER_BIT);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glDisable(GL.GL_LIGHTING); // Turn Off Lighting
gl.glDisable(GL.GL_TEXTURE_2D);
gl.glDisable(GL.GL_TEXTURE_3D);
gl.glStencilFunc(GL.GL_NEVER, 0xff,FULLMASK);
gl.glDepthMask(true);
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glEnable(GL.GL_DEPTH_TEST);
// (test)draw a floor
gl.glColor3f(0.2f,0.4f,0.2f);
gl.glBegin(GL.GL_QUADS); // Begin Drawing Quads
// Floor
gl.glNormal3f(0.0f, 1.0f, 0.0f); // Normal Pointing Up
gl.glVertex3f(-100.0f,-10.0f,-100.0f); // Back Left
gl.glVertex3f(-100.0f,-10.0f, 100.0f); // Front Left
gl.glVertex3f( 100.0f,-10.0f, 100.0f); // Front Right
gl.glVertex3f( 100.0f,-10.0f,-100.0f);
gl.glEnd();
gl.glPopMatrix();
gl.glColor3f(1f,0f,0f);
gl.glClearStencil(0);
gl.glDisable(GL.GL_LIGHTING); // Turn Off Lighting
gl.glEnable(GL.GL_CULL_FACE);
gl.glCullFace(GL.GL_FRONT);
gl.glDepthMask(false); // Turn Off Writing To The Depth-Buffer
gl.glDepthFunc(GL.GL_LEQUAL);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glEnable(GL.GL_STENCIL_TEST); // Turn On Stencil Buffer Testing
// gl.glColorMask(false, false, false, false); // Don't Draw Into The Colour Buffer
// gl.glStencilFunc(GL.GL_ALWAYS, 0xff,FULLMASK);
gl.glStencilFunc( GL.GL_ALWAYS, 1, 0xFFFFFFFF );
// First Pass. Increase Stencil Value In The Shadow
gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_INCR);
for (int i = 0; i < bin.curSize; i++) {
drawObjectShadow(bin.buckets[i], bin.lightsource);
}
// Second Pass. Decrease Stencil Value In The Shadow
gl.glCullFace(GL.GL_BACK);
gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_DECR);
for (int i = 0; i < bin.curSize; i++) {
drawObjectShadow(bin.buckets[i], bin.lightsource);
}
// gl.glFrontFace(GL.GL_CCW);
gl.glColorMask(true, true, true, true); // Enable Rendering To Colour Buffer For All Components
// Draw A Shadowing Rectangl.gle Covering The Entire Screen
gl.glColor4f(0.0f, 0.0f, 0.0f, 0.4f);
gl.glEnable(GL.GL_BLEND);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA);
/*
for (int i = 0; i < bin.curSize; i++) {
drawObjectShadow(bin.buckets[i], bin.lightsource);
}
*/
// get rid of the view matrix, only have the projection matrix
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
renderFrame.getView().getProjection().get(trans);
gl.glLoadMatrixf(trans);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glDepthMask(false);
// gl.glColor3f(0,0,1);
gl.glEnable(GL.GL_STENCIL_TEST); // Turn On Stencil Buffer Testing
gl.glStencilFunc(GL.GL_EQUAL, 0, FULLMASK);
gl.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_KEEP);
gl.glBegin(GL.GL_TRIANGLE_STRIP);
gl.glBegin(GL.GL_TRIANGLE_STRIP);
gl.glVertex3f(-0.1f, 0.1f,-1f);
gl.glVertex3f(-0.1f,-0.1f,-1f);
gl.glVertex3f( 0.1f, 0.1f,-1f);
gl.glVertex3f( 0.1f,-0.1f,-1f);
gl.glEnd();
/*
gl.glVertex3f( -100f, 100f, -2f);
gl.glVertex3f( -100f, -1000f, -2f);
gl.glVertex3f(100f, 100f, -2f);
gl.glVertex3f(100f, -1000f, -2f);
gl.glEnd();
*/
gl.glPopMatrix();
gl.glPopAttrib();
}