@Override public void prepare(int color, float alpha, int fbufWidth, int fbufHeight) { ctx.checkGLError("colorShader.prepare start"); boolean wasntAlreadyActive = super.prepare(fbufWidth, fbufHeight); if (wasntAlreadyActive || color != lastColor || alpha != lastAlpha) { flush(); glUniform1f(uAlpha, alpha); lastAlpha = alpha; float a = (float) ((color >> 24) & 0xff) / 255; float r = (float) ((color >> 16) & 0xff) / 255; float g = (float) ((color >> 8) & 0xff) / 255; float b = (float) ((color >> 0) & 0xff) / 255; glUniform4f(uColor, r, g, b, a); lastColor = color; ctx.checkGLError("colorShader.prepare end"); } }
@Override protected void display() { glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); MatrixStack modelMatrix = new MatrixStack(); modelMatrix.setMatrix(viewPole.calcMatrix()); Vec4 lightDirCameraSpace = Mat4.mul(modelMatrix.top(), lightDirection); glUseProgram(whiteDiffuseColor.theProgram); glUniform3(whiteDiffuseColor.dirToLightUnif, lightDirCameraSpace.fillAndFlipBuffer(vec4Buffer)); glUseProgram(vertexDiffuseColor.theProgram); glUniform3( vertexDiffuseColor.dirToLightUnif, lightDirCameraSpace.fillAndFlipBuffer(vec4Buffer)); glUseProgram(0); { modelMatrix.push(); // Render the ground plane. { modelMatrix.push(); glUseProgram(whiteDiffuseColor.theProgram); glUniformMatrix4( whiteDiffuseColor.modelToCameraMatrixUnif, false, modelMatrix.top().fillAndFlipBuffer(mat4Buffer)); Mat3 normMatrix = new Mat3(modelMatrix.top()); glUniformMatrix3( whiteDiffuseColor.normalModelToCameraMatrixUnif, false, normMatrix.fillAndFlipBuffer(mat3Buffer)); glUniform4f(whiteDiffuseColor.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); planeMesh.render(); glUseProgram(0); modelMatrix.pop(); } // Render the Cylinder { modelMatrix.push(); modelMatrix.applyMatrix(objtPole.calcMatrix()); if (drawColoredCyl) { glUseProgram(vertexDiffuseColor.theProgram); glUniformMatrix4( vertexDiffuseColor.modelToCameraMatrixUnif, false, modelMatrix.top().fillAndFlipBuffer(mat4Buffer)); Mat3 normMatrix = new Mat3(modelMatrix.top()); glUniformMatrix3( vertexDiffuseColor.normalModelToCameraMatrixUnif, false, normMatrix.fillAndFlipBuffer(mat3Buffer)); glUniform4f(vertexDiffuseColor.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); cylinderMesh.render("lit-color"); } else { glUseProgram(whiteDiffuseColor.theProgram); glUniformMatrix4( whiteDiffuseColor.modelToCameraMatrixUnif, false, modelMatrix.top().fillAndFlipBuffer(mat4Buffer)); Mat3 normMatrix = new Mat3(modelMatrix.top()); glUniformMatrix3( whiteDiffuseColor.normalModelToCameraMatrixUnif, false, normMatrix.fillAndFlipBuffer(mat3Buffer)); glUniform4f(whiteDiffuseColor.lightIntensityUnif, 1.0f, 1.0f, 1.0f, 1.0f); cylinderMesh.render("lit"); } glUseProgram(0); modelMatrix.pop(); } modelMatrix.pop(); } }