/** * Render all visible map items * * @param g the graphics component that is used to render the screen * @param c the game container the map is rendered in */ public void render(final Graphics g, final GameContainer c) { if (!active) { return; } if (legacyRendering) { renderImpl(g); } else { Graphics usedGraphics = g; if (gameScreenImage == null) { try { gameScreenImage = new Image(c.getWidth(), c.getHeight(), SGL.GL_LINEAR); } catch (SlickException e) { legacyRendering = true; LOGGER.warn("Rendering to texture fails. Using legacy direct rendering."); render(g, c); return; } } try { usedGraphics = gameScreenImage.getGraphics(); } catch (SlickException e) { legacyRendering = true; LOGGER.warn("Fetching render to texture context failed. Switching to legacy rendering."); render(g, c); return; } renderImpl(usedGraphics); if (gameScreenImage != null) { if (fogShader == null) { try { fogShader = ShaderProgram.loadProgram( "illarion/client/graphics/shader/fog.vert", "illarion/client/graphics/shader/fog.frag"); } catch (SlickException e) { LOGGER.error("Error loading shader!", e); } } if (fogShader != null) { fogShader.bind(); fogShader.setUniform1i("tex0", 0); final float x = 0.5f * gameScreenImage.getTextureWidth(); final float y = 0.5f * gameScreenImage.getTextureHeight(); fogShader.setUniform2f("center", x, y); fogShader.setUniform1f( "density", World.getWeather().getFog() * ((float) gameScreenImage.getHeight() / 200.f)); g.drawImage(gameScreenImage, 0, 0); fogShader.unbind(); } else { g.drawImage(gameScreenImage, 0, 0); } Camera.getInstance().renderDebug(g); } } if (fadeOutColor.getAlpha() > 0) { g.setColor(fadeOutColor); g.setLineWidth(3.f); g.fillRect(0, 0, c.getWidth(), c.getHeight()); } }