public void RenderWater()
{
float z = Client.Network.CurrentSim.WaterHeight;
GL.Color4(0.09f, 0.28f, 0.63f, 0.84f);
if (RenderSettings.WaterReflections)
{
waterProgram.Start();
// Reflection texture unit
GL.ActiveTexture(TextureUnit.Texture0);
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, reflectionTexture);
GL.Uniform1(waterProgram.Uni("reflection"), 0);
// Refraction texture unit
GL.ActiveTexture(TextureUnit.Texture1);
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, refractionTexture);
GL.Uniform1(waterProgram.Uni("refraction"), 1);
// Normal map
GL.ActiveTexture(TextureUnit.Texture2);
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, normalmap);
GL.Uniform1(waterProgram.Uni("normalMap"), 2);
//// DUDV map
GL.ActiveTexture(TextureUnit.Texture3);
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, dudvmap);
GL.Uniform1(waterProgram.Uni("dudvMap"), 3);
//// Depth map
GL.ActiveTexture(TextureUnit.Texture4);
GL.Enable(EnableCap.Texture2D);
GL.BindTexture(TextureTarget.Texture2D, depthTexture);
GL.Uniform1(waterProgram.Uni("depthMap"), 4);
int lightPos = GL.GetUniformLocation(waterProgram.ID, "lightPos");
GL.Uniform4(lightPos, 0f, 0f, z + 100, 1f); // For now sun reflection in the water comes from the south west sim corner
int cameraPos = GL.GetUniformLocation(waterProgram.ID, "cameraPos");
GL.Uniform4(cameraPos, Camera.RenderPosition.X, Camera.RenderPosition.Y, Camera.RenderPosition.Z, 1f);
int waterColor = GL.GetUniformLocation(waterProgram.ID, "waterColor");
GL.Uniform4(waterColor, 0.09f, 0.28f, 0.63f, 0.84f);
}
GL.Begin(PrimitiveType.Quads);
for (float x = -256f * 2; x <= 256 * 2; x += 256f)
for (float y = -256f * 2; y <= 256 * 2; y += 256f)
DrawWaterQuad(x, y, z);
GL.End();
if (RenderSettings.WaterReflections)
{
GL.ActiveTexture(TextureUnit.Texture4);
GL.Disable(EnableCap.Texture2D);
GL.ActiveTexture(TextureUnit.Texture3);
GL.Disable(EnableCap.Texture2D);
GL.ActiveTexture(TextureUnit.Texture2);
GL.Disable(EnableCap.Texture2D);
GL.ActiveTexture(TextureUnit.Texture1);
GL.Disable(EnableCap.Texture2D);
GL.ActiveTexture(TextureUnit.Texture0);
GL.Disable(EnableCap.Texture2D);
ShaderProgram.Stop();
}
}