void Display_GL() { if (rotationActive) { // Increment rotation rotateX += 0.25; rotateY += 0.25; rotateZ += 0.25; } // Resize window Resize_GL(WINDOW_SIZE,WINDOW_SIZE); // Enable render buffer EnableRenderBuffers(); glLoadIdentity(); // Z-axix translation glTranslatef(0, 0, -2.25); glScalef(zoomValue, zoomValue, zoomValue); // X-axis rotation glRotatef(rotateX, 1, 0, 0); // Y-axis rotation glRotatef(rotateY, 0, 1, 0); // Z-axis rotation glRotatef(rotateZ, 0, 0, 1); // Centring the cube glTranslatef(-0.5, -0.5, -0.5); // Render the backface of the cube RenderBackface(); // Raycast the volume RayCastingPass(); // Disable the render buffers DisableRenderBuffers(); // Render the final image to the texture RenderBufferToScreen(); // Swap buffers glutSwapBuffers(); }
void GLMapRenderer::RenderSunlightPass() { SPADES_MARK_FUNCTION(); GLProfiler profiler(device, "Map"); Vector3 eye = renderer->GetSceneDef().viewOrigin; // draw back face to avoid cheating. // without this, players can see through blocks by // covering themselves by ones. RenderBackface(); device->ActiveTexture(0); aoImage->Bind(IGLDevice::Texture2D); device->TexParamater(IGLDevice::Texture2D, IGLDevice::TextureMinFilter, IGLDevice::Linear); device->ActiveTexture(1); detailImage->Bind(IGLDevice::Texture2D); device->Enable(IGLDevice::CullFace, true); device->Enable(IGLDevice::DepthTest, true); basicProgram->Use(); static GLShadowShader shadowShader; shadowShader(renderer, basicProgram, 2); static GLProgramUniform fogDistance("fogDistance"); fogDistance(basicProgram); fogDistance.SetValue(renderer->GetFogDistance()); static GLProgramUniform viewSpaceLight("viewSpaceLight"); viewSpaceLight(basicProgram); Vector3 vspLight = (renderer->GetViewMatrix() * MakeVector4(0, -1, -1, 0)).GetXYZ(); viewSpaceLight.SetValue(vspLight.x, vspLight.y, vspLight.z); static GLProgramUniform fogColor("fogColor"); fogColor(basicProgram); Vector3 fogCol = renderer->GetFogColorForSolidPass(); fogCol *= fogCol; // linearize fogColor.SetValue(fogCol.x, fogCol.y, fogCol.z); static GLProgramUniform aoUniform("ambientOcclusionTexture"); aoUniform(basicProgram); aoUniform.SetValue(0); static GLProgramUniform detailTextureUnif("detailTexture"); detailTextureUnif(basicProgram); detailTextureUnif.SetValue(1); device->BindBuffer(IGLDevice::ArrayBuffer, 0); static GLProgramAttribute positionAttribute("positionAttribute"); static GLProgramAttribute ambientOcclusionCoordAttribute("ambientOcclusionCoordAttribute"); static GLProgramAttribute colorAttribute("colorAttribute"); static GLProgramAttribute normalAttribute("normalAttribute"); static GLProgramAttribute fixedPositionAttribute("fixedPositionAttribute"); positionAttribute(basicProgram); ambientOcclusionCoordAttribute(basicProgram); colorAttribute(basicProgram); normalAttribute(basicProgram); fixedPositionAttribute(basicProgram); device->EnableVertexAttribArray(positionAttribute(), true); if(ambientOcclusionCoordAttribute() != -1) device->EnableVertexAttribArray(ambientOcclusionCoordAttribute(), true); device->EnableVertexAttribArray(colorAttribute(), true); if(normalAttribute() != -1) device->EnableVertexAttribArray(normalAttribute(), true); device->EnableVertexAttribArray(fixedPositionAttribute(), true); static GLProgramUniform projectionViewMatrix("projectionViewMatrix"); projectionViewMatrix(basicProgram); projectionViewMatrix.SetValue(renderer->GetProjectionViewMatrix()); static GLProgramUniform viewMatrix("viewMatrix"); viewMatrix(basicProgram); viewMatrix.SetValue(renderer->GetViewMatrix()); RealizeChunks(eye); // draw from nearest to farthest int cx = (int)floorf(eye.x) / GLMapChunk::Size; int cy = (int)floorf(eye.y) / GLMapChunk::Size; int cz = (int)floorf(eye.z) / GLMapChunk::Size; DrawColumnSunlight(cx, cy, cz, eye); for(int dist = 1; dist <= 128 / GLMapChunk::Size; dist++) { for(int x = cx - dist; x <= cx + dist; x++){ DrawColumnSunlight(x, cy + dist, cz, eye); DrawColumnSunlight(x, cy - dist, cz, eye); } for(int y = cy - dist + 1; y <= cy + dist - 1; y++){ DrawColumnSunlight(cx + dist, y, cz, eye); DrawColumnSunlight(cx - dist, y, cz, eye); } } device->EnableVertexAttribArray(positionAttribute(), false); if(ambientOcclusionCoordAttribute() != -1) device->EnableVertexAttribArray(ambientOcclusionCoordAttribute(), false); device->EnableVertexAttribArray(colorAttribute(), false); if(normalAttribute() != -1) device->EnableVertexAttribArray(normalAttribute(), false); device->EnableVertexAttribArray(fixedPositionAttribute(), false); device->ActiveTexture(1); device->BindTexture(IGLDevice::Texture2D, 0); device->ActiveTexture(0); device->BindTexture(IGLDevice::Texture2D, 0); }