diff --git a/src/render/opengl/OpenGLWater.cpp b/src/render/opengl/OpenGLWater.cpp index 7d057d4..75068c9 100644 --- a/src/render/opengl/OpenGLWater.cpp +++ b/src/render/opengl/OpenGLWater.cpp @@ -10,6 +10,7 @@ #include "NoiseFunctionSimplex.h" #include "FloatNode.h" #include "FloatDiff.h" +#include "IntNode.h" OpenGLWater::OpenGLWater(OpenGLRenderer *renderer): OpenGLPart(renderer) @@ -42,12 +43,16 @@ void OpenGLWater::initialize() // Watch for definition changes renderer->getScenery()->getTerrain()->propWaterHeight()->addWatcher(this, true); renderer->getScenery()->getWater()->propReflection()->addWatcher(this, true); + renderer->getScenery()->getWater()->propModel()->addWatcher(this, false); } void OpenGLWater::update() { - Color water_color = *renderer->getScenery()->getWater()->material->base; - renderer->getSharedState()->set("waterColor", water_color); + WaterDefinition *water = renderer->getScenery()->getWater(); + renderer->getSharedState()->set("waterMaterialColor", *water->material->base); + renderer->getSharedState()->set("waterMaterialReflection", water->material->reflection); + renderer->getSharedState()->set("waterMaterialShininess", water->material->shininess); + renderer->getSharedState()->set("waterMaterialHardness", water->material->hardness); renderer->getSharedState()->set("simplexSampler", NoiseFunctionSimplex::getNormalTexture(), true, true); } @@ -77,6 +82,10 @@ void OpenGLWater::nodeChanged(const DefinitionNode *node, const DefinitionDiff * { renderer->getSharedState()->set("waterReflection", renderer->getScenery()->getWater()->propReflection()->getValue()); } + else if (node->getPath() == "/water/model") + { + update(); + } } void OpenGLWater::setEnabled(bool enabled) diff --git a/src/render/opengl/shaders/atmosphere.frag b/src/render/opengl/shaders/atmosphere.frag index d75ef20..0ca341e 100644 --- a/src/render/opengl/shaders/atmosphere.frag +++ b/src/render/opengl/shaders/atmosphere.frag @@ -285,11 +285,8 @@ vec4 getSkyColor(vec3 location, vec3 direction) return vec4(applyWeatherEffects(SPHERE_SIZE, nightsky + sunTransmittance.rgb, vec3(1), inscattering), 1.0); } -vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float shininess) +vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float reflection, float shininess, float hardness) { - float material_hardness = 0.3; - float material_reflection = 1.0; - float r0 = Rg + WORKAROUND_OFFSET + location.y * WORLD_SCALING; vec3 sun_position = sunDirection * SUN_DISTANCE; float muS = dot(vec3(0.0, 1.0, 0.0), normalize(sun_position - vec3(0.0, r0, 0.0))); @@ -301,15 +298,15 @@ vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float shininess) /* diffused light */ float diffuse = dot(sunDirection, normal); float sign = (diffuse < 0.0) ? -1.0 : 1.0; - if (material_hardness <= 0.5) + if (hardness <= 0.5) { - float hardness = material_hardness * 2.0; - diffuse = (1.0 - hardness) * (diffuse * diffuse) * sign + hardness * diffuse; + float hardness_factor = hardness * 2.0; + diffuse = (1.0 - hardness_factor) * (diffuse * diffuse) * sign + hardness_factor * diffuse; } else if (diffuse != 0.0) { - float hardness = (material_hardness - 0.5) * 2.0; - diffuse = (1.0 - hardness) * diffuse + hardness * sign * sqrt(abs(diffuse)); + float hardness_factor = (hardness - 0.5) * 2.0; + diffuse = (1.0 - hardness) * diffuse + hardness_factor * sign * sqrt(abs(diffuse)); } if (diffuse > 0.0) { @@ -317,14 +314,14 @@ vec4 applyLighting(vec3 location, vec3 normal, vec4 color, float shininess) } /* specular reflection */ - if (shininess > 0.0 && material_reflection > 0.0) + if (shininess > 0.0 && reflection > 0.0) { vec3 view = normalize(location - cameraLocation); vec3 reflect = sunDirection - normal * 2.0 * dot(sunDirection, normal); float specular = dot(reflect, view); if (specular > 0.0) { - specular = pow(specular, shininess) * material_reflection; + specular = pow(specular, shininess) * reflection * ISun; if (specular > 0.0) { result += specular * light_color; diff --git a/src/render/opengl/shaders/water.frag b/src/render/opengl/shaders/water.frag index 4a873a3..a20d106 100644 --- a/src/render/opengl/shaders/water.frag +++ b/src/render/opengl/shaders/water.frag @@ -1,11 +1,14 @@ -uniform vec4 waterColor; +uniform vec4 waterMaterialColor; +uniform float waterMaterialReflection; +uniform float waterMaterialShininess; +uniform float waterMaterialHardness; uniform float waterReflection; void main(void) { vec3 normal = noiseNormal2d(unprojected.xz, 0.001); - gl_FragColor = applyLighting(unprojected, normal, waterColor, 16.0); + gl_FragColor = applyLighting(unprojected, normal, waterMaterialColor, waterMaterialReflection, waterMaterialShininess, waterMaterialHardness); vec3 reflected = reflect(unprojected - cameraLocation, normal); reflected.y = max(reflected.y, 0.0); diff --git a/src/render/software/LightingManager.cpp b/src/render/software/LightingManager.cpp index 37a514a..040b0c3 100644 --- a/src/render/software/LightingManager.cpp +++ b/src/render/software/LightingManager.cpp @@ -80,7 +80,7 @@ Color LightingManager::applyFinalComponent(const LightComponent &component, cons } /* specular reflection */ - if (material.reflection > 0.0 && component.reflection > 0.0) + if (material.shininess > 0.0 && material.reflection > 0.0 && component.reflection > 0.0) { Vector3 view = location.sub(eye).normalize(); Vector3 reflect = direction_inv.sub(normal.scale(2.0 * direction_inv.dotProduct(normal)));