Water is now always at y=0.0

This commit is contained in:
Michaël Lemaire 2014-01-06 20:22:00 +01:00
parent 33c5d89783
commit 25d9a95141
13 changed files with 32 additions and 87 deletions

View file

@ -183,7 +183,7 @@ void Scenery::checkCameraAboveGround()
{ {
Vector3 camera_location = camera->getLocation(); Vector3 camera_location = camera->getLocation();
double terrain_height = terrain->getInterpolatedHeight(camera_location.x, camera_location.z, 1, 1) + 2.0; double terrain_height = terrain->getInterpolatedHeight(camera_location.x, camera_location.z, 1, 1) + 2.0;
double water_height = terrain->getWaterHeight() + 1.5; double water_height = 1.5;
if (camera_location.y < water_height || camera_location.y < terrain_height) if (camera_location.y < water_height || camera_location.y < terrain_height)
{ {
double diff = ((water_height > terrain_height) ? water_height : terrain_height) - camera_location.y; double diff = ((water_height > terrain_height) ? water_height : terrain_height) - camera_location.y;

View file

@ -107,7 +107,7 @@ double TerrainDefinition::getInterpolatedHeight(double x, double z, int scaled,
if (scaled) if (scaled)
{ {
return h * height * scaling; return (h - water_height) * height * scaling;
} }
else else
{ {
@ -127,11 +127,6 @@ HeightInfo TerrainDefinition::getHeightInfo()
return result; return result;
} }
double TerrainDefinition::getWaterHeight()
{
return water_height * height * scaling;
}
unsigned long TerrainDefinition::getMemoryStats() unsigned long TerrainDefinition::getMemoryStats()
{ {
return height_map->getMemoryStats(); return height_map->getMemoryStats();

View file

@ -31,7 +31,6 @@ public:
double getInterpolatedHeight(double x, double z, int scaled, int with_painting); double getInterpolatedHeight(double x, double z, int scaled, int with_painting);
unsigned long getMemoryStats(); unsigned long getMemoryStats();
HeightInfo getHeightInfo(); HeightInfo getHeightInfo();
double getWaterHeight();
public: public:
typedef enum typedef enum

View file

@ -33,7 +33,6 @@ QGLWidget(parent)
_water = true; _water = true;
_wireframe = true; _wireframe = true;
_painted_area = true; _painted_area = true;
_water_height = 0.0;
_average_frame_time = 0.0; _average_frame_time = 0.0;
@ -78,7 +77,6 @@ void WidgetHeightMap::setTerrain(TerrainDefinition* terrain)
_renderer->getScenery()->setTerrain(_terrain); _renderer->getScenery()->setTerrain(_terrain);
_renderer->prepare(); _renderer->prepare();
_water_height = _renderer->getTerrainRenderer()->getWaterHeight() / _terrain->scaling;
revert(); revert();
} }
@ -466,10 +464,11 @@ void WidgetHeightMap::paintGL()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.2, 0.3, 0.7, 0.7); glColor4f(0.2, 0.3, 0.7, 0.7);
glBegin(GL_QUADS); glBegin(GL_QUADS);
glVertex3f(_target_x - 500.0, _water_height, _target_z - 500.0); double water_height = _terrain->water_height * _terrain->scaling * _terrain->height;
glVertex3f(_target_x - 500.0, _water_height, _target_z + 500.0); glVertex3f(_target_x - 500.0, water_height, _target_z - 500.0);
glVertex3f(_target_x + 500.0, _water_height, _target_z + 500.0); glVertex3f(_target_x - 500.0, water_height, _target_z + 500.0);
glVertex3f(_target_x + 500.0, _water_height, _target_z - 500.0); glVertex3f(_target_x + 500.0, water_height, _target_z + 500.0);
glVertex3f(_target_x + 500.0, water_height, _target_z - 500.0);
glEnd(); glEnd();
glDisable(GL_BLEND); glDisable(GL_BLEND);
glEnable(GL_LIGHTING); glEnable(GL_LIGHTING);

View file

@ -61,7 +61,6 @@ private:
bool _dirty; bool _dirty;
double _water_height;
bool _water; bool _water;
bool _wireframe; bool _wireframe;
bool _painted_area; bool _painted_area;

View file

@ -37,9 +37,6 @@ void OpenGLWater::initialize()
void OpenGLWater::update() void OpenGLWater::update()
{ {
double water_height = renderer->getWaterRenderer()->getHeightInfo().max_height;
renderer->getSharedState()->set("waterHeight", water_height);
Color water_color = renderer->getScenery()->getWater()->material->_rgb; Color water_color = renderer->getScenery()->getWater()->material->_rgb;
renderer->getSharedState()->set("waterColor", water_color); renderer->getSharedState()->set("waterColor", water_color);

View file

@ -1,4 +1,3 @@
const float GROUND_OFFSET = 0.5;
const float Rg = 6360.0; const float Rg = 6360.0;
const float Rt = 6420.0; const float Rt = 6420.0;
const float RL = 6421.0; const float RL = 6421.0;
@ -188,11 +187,8 @@ vec3 _getInscatterColor(inout vec3 x, inout float t, vec3 v, vec3 s, out float r
vec4 applyAerialPerspective(vec4 base) vec4 applyAerialPerspective(vec4 base)
{ {
float yoffset = GROUND_OFFSET - waterHeight; vec3 x = vec3(0.0, Rg + cameraLocation.y * WORLD_SCALING, 0.0);
vec3 camera = vec3(cameraLocation.x, max(cameraLocation.y + yoffset, 0.0), cameraLocation.z); vec3 v = normalize(unprojected - cameraLocation);
vec3 location = vec3(unprojected.x, max(unprojected.y + yoffset, 0.0), unprojected.z);
vec3 x = vec3(0.0, Rg + camera.y * WORLD_SCALING, 0.0);
vec3 v = normalize(location - camera);
vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x); vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x);
if (v.y == 0.0) if (v.y == 0.0)
@ -202,7 +198,7 @@ vec4 applyAerialPerspective(vec4 base)
float r = length(x); float r = length(x);
float mu = dot(x, v) / r; float mu = dot(x, v) / r;
float t = length(location - camera) * WORLD_SCALING; float t = length(unprojected - cameraLocation) * WORLD_SCALING;
vec3 attenuation; vec3 attenuation;
vec3 inscattering = _getInscatterColor(x, t, v, s, r, mu, attenuation); vec3 inscattering = _getInscatterColor(x, t, v, s, r, mu, attenuation);
@ -212,9 +208,7 @@ vec4 applyAerialPerspective(vec4 base)
vec4 getSkyColor(vec3 location, vec3 direction) vec4 getSkyColor(vec3 location, vec3 direction)
{ {
float yoffset = GROUND_OFFSET - waterHeight; vec3 x = vec3(0.0, Rg + location.y * WORLD_SCALING, 0.0);
vec3 camera = vec3(location.x, max(location.y + yoffset, 0.0), location.z);
vec3 x = vec3(0.0, Rg + camera.y * WORLD_SCALING, 0.0);
vec3 v = normalize(direction); vec3 v = normalize(direction);
vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x); vec3 s = normalize(sunDirection * SUN_DISTANCE_SCALED - x);

View file

@ -6,6 +6,6 @@ varying vec3 unprojected;
void main(void) void main(void)
{ {
unprojected = vec3(cameraLocation.x + vertex.x * 500.0, vertex.y + waterHeight, cameraLocation.z + vertex.z * 500.0); unprojected = vec3(cameraLocation.x + vertex.x * 500.0, 0.0, cameraLocation.z + vertex.z * 500.0);
gl_Position = viewMatrix * vec4(unprojected, 1.0); gl_Position = viewMatrix * vec4(unprojected, 1.0);
} }

View file

@ -58,7 +58,7 @@ Color TerrainShapePreviewRenderer::getColor2D(double x, double y, double scaling
double height; double height;
height = getTerrainRenderer()->getHeight(x, y, 1); height = getTerrainRenderer()->getHeight(x, y, 1);
if (height > getTerrainRenderer()->getWaterHeight()) if (height > 0.0)
{ {
return getTerrainRenderer()->getFinalColor(Vector3(x, height, y), 0.000001); return getTerrainRenderer()->getFinalColor(Vector3(x, height, y), 0.000001);
} }

View file

@ -34,7 +34,6 @@
/*********************** Constants ***********************/ /*********************** Constants ***********************/
#define GROUND_OFFSET 0.5
static const double Rg = 6360.0; static const double Rg = 6360.0;
static const double Rt = 6420.0; static const double Rt = 6420.0;
static const double RL = 6421.0; static const double RL = 6421.0;
@ -1156,12 +1155,6 @@ AtmosphereModelBruneton::AtmosphereModelBruneton(SoftwareRenderer *parent):
AtmosphereResult AtmosphereModelBruneton::getSkyColor(Vector3 eye, const Vector3 &direction, const Vector3 &sun_position, const Color &base) AtmosphereResult AtmosphereModelBruneton::getSkyColor(Vector3 eye, const Vector3 &direction, const Vector3 &sun_position, const Color &base)
{ {
double yoffset = GROUND_OFFSET - parent->getWaterRenderer()->getHeightInfo().base_height;
eye.y += yoffset;
if (eye.y < 0.0)
{
eye.y = 0.0;
}
Vector3 x = {0.0, Rg + eye.y * WORLD_SCALING, 0.0}; Vector3 x = {0.0, Rg + eye.y * WORLD_SCALING, 0.0};
Vector3 v = direction.normalize(); Vector3 v = direction.normalize();
Vector3 s = sun_position.sub(x).normalize(); Vector3 s = sun_position.sub(x).normalize();
@ -1192,17 +1185,6 @@ AtmosphereResult AtmosphereModelBruneton::applyAerialPerspective(Vector3 locatio
Vector3 eye = parent->getCameraLocation(location); Vector3 eye = parent->getCameraLocation(location);
Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE); Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE);
double yoffset = GROUND_OFFSET - parent->getWaterRenderer()->getHeightInfo().base_height;
eye.y += yoffset;
location.y += yoffset;
if (eye.y < 0.0)
{
eye.y = 0.0;
}
if (location.y < 0.0)
{
location.y = 0.0;
}
Vector3 direction = location.sub(eye).scale(WORLD_SCALING); Vector3 direction = location.sub(eye).scale(WORLD_SCALING);
Vector3 x = {0.0, Rg + eye.y * WORLD_SCALING, 0.0}; Vector3 x = {0.0, Rg + eye.y * WORLD_SCALING, 0.0};
@ -1238,23 +1220,16 @@ void AtmosphereModelBruneton::fillLightingStatus(LightStatus *status, const Vect
LightComponent sun, irradiance; LightComponent sun, irradiance;
double muS; double muS;
double altitude = status->getLocation().y; double altitude = status->getLocation().y * WORLD_SCALING;
double yoffset = GROUND_OFFSET - parent->getWaterRenderer()->getHeightInfo().base_height; double r0 = Rg + altitude;
altitude += yoffset;
if (altitude < 0.0)
{
altitude = 0.0;
}
double r0 = Rg + altitude * WORLD_SCALING;
Vector3 up = {0.0, 1.0, 0.0}; Vector3 up = {0.0, 1.0, 0.0};
Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE); Vector3 sun_position = parent->getAtmosphereRenderer()->getSunDirection().scale(SUN_DISTANCE);
Vector3 x = {0.0, r0, 0.0}; Vector3 x = {0.0, r0, 0.0};
Vector3 s = sun_position.sub(x).normalize(); Vector3 s = sun_position.sub(x).normalize();
muS = up.dotProduct(s); muS = up.dotProduct(s);
if (altitude * WORLD_SCALING > RL) if (altitude > RL)
{ {
sun.color = parent->getScenery()->getAtmosphere()->sun_color; sun.color = parent->getScenery()->getAtmosphere()->sun_color;
} }

View file

@ -201,9 +201,3 @@ bool TerrainRenderer::applyLightFilter(LightComponent &light, const Vector3 &at)
return true; return true;
} }
} }
double TerrainRenderer::getWaterHeight()
{
TerrainDefinition* terrain = parent->getScenery()->getTerrain();
return terrain->water_height * terrain->height * terrain->scaling;
}

View file

@ -30,7 +30,6 @@ public:
virtual double getHeight(double x, double z, int with_painting); virtual double getHeight(double x, double z, int with_painting);
virtual TerrainResult getResult(double x, double z, int with_painting, int with_textures); virtual TerrainResult getResult(double x, double z, int with_painting, int with_textures);
virtual Color getFinalColor(const Vector3 &location, double precision); virtual Color getFinalColor(const Vector3 &location, double precision);
virtual double getWaterHeight();
virtual bool applyLightFilter(LightComponent &light, const Vector3 &at) override; virtual bool applyLightFilter(LightComponent &light, const Vector3 &at) override;
private: private:

View file

@ -21,12 +21,12 @@ void WaterRenderer::update()
{ {
} }
static inline double _getHeight(WaterDefinition* definition, double base_height, double x, double z) static inline double _getHeight(WaterDefinition* definition, double x, double z)
{ {
return base_height + definition->_waves_noise->get2DTotal(x, z); return definition->_waves_noise->get2DTotal(x, z);
} }
static inline Vector3 _getNormal(WaterDefinition* definition, double base_height, Vector3 base, double detail) static inline Vector3 _getNormal(WaterDefinition* definition, Vector3 base, double detail)
{ {
Vector3 back, right; Vector3 back, right;
double x, z; double x, z;
@ -35,12 +35,12 @@ static inline Vector3 _getNormal(WaterDefinition* definition, double base_height
z = base.z; z = base.z;
back.x = x; back.x = x;
back.y = _getHeight(definition, base_height, x, z + detail); back.y = _getHeight(definition, x, z + detail);
back.z = z + detail; back.z = z + detail;
back = back.sub(base); back = back.sub(base);
right.x = x + detail; right.x = x + detail;
right.y = _getHeight(definition, base_height, x + detail, z); right.y = _getHeight(definition, x + detail, z);
right.z = z; right.z = z;
right = right.sub(base); right = right.sub(base);
@ -76,33 +76,31 @@ static inline Color _getFoamMask(SoftwareRenderer* renderer, WaterDefinition* de
{ {
Color result; Color result;
double foam_factor, normal_diff, location_offset; double foam_factor, normal_diff, location_offset;
double base_height;
base_height = renderer->getTerrainRenderer()->getWaterHeight();
location_offset = 2.0 * detail; location_offset = 2.0 * detail;
foam_factor = 0.0; foam_factor = 0.0;
location.x += location_offset; location.x += location_offset;
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, base_height, location, detail)); normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
if (normal_diff > foam_factor) if (normal_diff > foam_factor)
{ {
foam_factor = normal_diff; foam_factor = normal_diff;
} }
location.x -= location_offset * 2.0; location.x -= location_offset * 2.0;
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, base_height, location, detail)); normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
if (normal_diff > foam_factor) if (normal_diff > foam_factor)
{ {
foam_factor = normal_diff; foam_factor = normal_diff;
} }
location.x += location_offset; location.x += location_offset;
location.z -= location_offset; location.z -= location_offset;
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, base_height, location, detail)); normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
if (normal_diff > foam_factor) if (normal_diff > foam_factor)
{ {
foam_factor = normal_diff; foam_factor = normal_diff;
} }
location.z += location_offset * 2.0; location.z += location_offset * 2.0;
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, base_height, location, detail)); normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
if (normal_diff > foam_factor) if (normal_diff > foam_factor)
{ {
foam_factor = normal_diff; foam_factor = normal_diff;
@ -145,7 +143,7 @@ HeightInfo WaterRenderer::getHeightInfo()
HeightInfo info; HeightInfo info;
double noise_minvalue, noise_maxvalue; double noise_minvalue, noise_maxvalue;
info.base_height = parent->getTerrainRenderer()->getWaterHeight(); info.base_height = 0.0;
definition->_waves_noise->getRange(&noise_minvalue, &noise_maxvalue); definition->_waves_noise->getRange(&noise_minvalue, &noise_maxvalue);
info.min_height = info.base_height + noise_minvalue; info.min_height = info.base_height + noise_minvalue;
info.max_height = info.base_height + noise_maxvalue; info.max_height = info.base_height + noise_maxvalue;
@ -155,7 +153,7 @@ HeightInfo WaterRenderer::getHeightInfo()
double WaterRenderer::getHeight(double x, double z) double WaterRenderer::getHeight(double x, double z)
{ {
return _getHeight(parent->getScenery()->getWater(), parent->getTerrainRenderer()->getWaterHeight(), x, z); return _getHeight(parent->getScenery()->getWater(), x, z);
} }
WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z) WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
@ -165,12 +163,10 @@ WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
RayCastingResult refracted; RayCastingResult refracted;
Vector3 location, normal, look_direction; Vector3 location, normal, look_direction;
Color color, foam; Color color, foam;
double base_height, detail, depth; double detail, depth;
base_height = parent->getTerrainRenderer()->getWaterHeight();
location.x = x; location.x = x;
location.y = _getHeight(definition, base_height, x, z); location.y = _getHeight(definition, x, z);
location.z = z; location.z = z;
result.location = location; result.location = location;
@ -180,7 +176,7 @@ WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
detail = 0.00001; detail = 0.00001;
} }
normal = _getNormal(definition, base_height, location, detail); normal = _getNormal(definition, location, detail);
look_direction = location.sub(parent->getCameraLocation(location)).normalize(); look_direction = location.sub(parent->getCameraLocation(location)).normalize();
/* Reflection */ /* Reflection */
@ -242,14 +238,12 @@ bool WaterRenderer::applyLightFilter(LightComponent &light, const Vector3 &at)
{ {
WaterDefinition* definition = parent->getScenery()->getWater(); WaterDefinition* definition = parent->getScenery()->getWater();
double factor; double factor;
double base_height;
base_height = parent->getTerrainRenderer()->getWaterHeight(); if (at.y < 0.0)
if (at.y < base_height)
{ {
if (light.direction.y <= -0.00001) if (light.direction.y <= -0.00001)
{ {
factor = (base_height - at.y) / (-light.direction.y * definition->lighting_depth); factor = -at.y / (-light.direction.y * definition->lighting_depth);
if (factor > 1.0) if (factor > 1.0)
{ {
factor = 1.0; factor = 1.0;