2011-12-26 21:53:29 +00:00
|
|
|
#include "preview.h"
|
2011-12-25 21:19:32 +00:00
|
|
|
#include "formwater.h"
|
2012-01-17 20:54:14 +00:00
|
|
|
#include "tools.h"
|
2011-12-26 21:53:29 +00:00
|
|
|
#include <QColor>
|
2012-01-05 16:32:41 +00:00
|
|
|
#include <QSlider>
|
2011-12-27 19:03:46 +00:00
|
|
|
#include <math.h>
|
2011-12-26 21:53:29 +00:00
|
|
|
|
2012-01-03 15:40:50 +00:00
|
|
|
#include "../lib_paysages/terrain.h"
|
2011-12-26 21:53:29 +00:00
|
|
|
#include "../lib_paysages/water.h"
|
2012-01-28 18:32:08 +00:00
|
|
|
#include "../lib_paysages/lighting.h"
|
2012-01-24 13:16:20 +00:00
|
|
|
#include "../lib_paysages/scenery.h"
|
|
|
|
#include "../lib_paysages/renderer.h"
|
2011-12-26 21:53:29 +00:00
|
|
|
#include "../lib_paysages/shared/functions.h"
|
2011-12-27 19:03:46 +00:00
|
|
|
#include "../lib_paysages/shared/constants.h"
|
2011-12-26 21:53:29 +00:00
|
|
|
|
2011-12-27 19:03:46 +00:00
|
|
|
static WaterDefinition _definition;
|
|
|
|
|
|
|
|
/**************** Previews ****************/
|
2012-01-22 18:39:42 +00:00
|
|
|
class PreviewWaterCoverage:public Preview
|
2011-12-26 21:53:29 +00:00
|
|
|
{
|
|
|
|
public:
|
2012-01-24 13:16:20 +00:00
|
|
|
PreviewWaterCoverage(QWidget* parent):Preview(parent)
|
2011-12-26 21:53:29 +00:00
|
|
|
{
|
2012-01-26 22:30:20 +00:00
|
|
|
_water = waterCreateDefinition();
|
2012-01-24 13:16:20 +00:00
|
|
|
_terrain = terrainCreateDefinition();
|
2011-12-26 21:53:29 +00:00
|
|
|
}
|
|
|
|
protected:
|
|
|
|
QColor getColor(double x, double y)
|
|
|
|
{
|
|
|
|
double height;
|
|
|
|
|
2012-01-24 13:16:20 +00:00
|
|
|
height = terrainGetHeight(&_terrain, x, y);
|
2011-12-27 19:03:46 +00:00
|
|
|
if (height > _definition.height)
|
2011-12-26 21:53:29 +00:00
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
height = terrainGetHeightNormalized(&_terrain, x, y);
|
2011-12-26 21:53:29 +00:00
|
|
|
return QColor((int)(255.0 * height), (int)(255.0 * height), (int)(255.0 * height));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-01-28 18:32:08 +00:00
|
|
|
return colorToQColor(_definition.material.base);
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
}
|
2012-01-26 22:30:20 +00:00
|
|
|
void updateData()
|
|
|
|
{
|
|
|
|
waterCopyDefinition(&_definition, &_water);
|
|
|
|
sceneryGetTerrain(&_terrain);
|
|
|
|
}
|
2012-01-24 13:16:20 +00:00
|
|
|
private:
|
2012-01-26 22:30:20 +00:00
|
|
|
WaterDefinition _water;
|
2012-01-24 13:16:20 +00:00
|
|
|
TerrainDefinition _terrain;
|
2011-12-27 19:03:46 +00:00
|
|
|
};
|
|
|
|
|
2012-01-22 18:39:42 +00:00
|
|
|
class PreviewWaterColor:public Preview
|
2011-12-27 19:03:46 +00:00
|
|
|
{
|
|
|
|
public:
|
2012-01-24 13:16:20 +00:00
|
|
|
PreviewWaterColor(QWidget* parent):Preview(parent)
|
2011-12-27 19:03:46 +00:00
|
|
|
{
|
2012-01-28 18:32:08 +00:00
|
|
|
LightDefinition light;
|
|
|
|
|
2012-01-24 13:16:20 +00:00
|
|
|
_water = waterCreateDefinition();
|
2012-01-28 18:32:08 +00:00
|
|
|
|
|
|
|
_lighting = lightingCreateDefinition();
|
|
|
|
light.color = COLOR_WHITE;
|
|
|
|
light.amplitude = 0.0;
|
|
|
|
light.direction.x = 0.0;
|
|
|
|
light.direction.y = -0.4794;
|
|
|
|
light.direction.z = 0.8776;
|
|
|
|
light.filtered = 0;
|
|
|
|
light.masked = 0;
|
|
|
|
light.reflection = 1.0;
|
|
|
|
lightingAddLight(&_lighting, light);
|
|
|
|
lightingValidateDefinition(&_lighting);
|
2012-01-26 22:30:20 +00:00
|
|
|
|
2012-01-24 13:16:20 +00:00
|
|
|
_renderer = rendererGetFake();
|
|
|
|
_renderer.rayWalking = _rayWalking;
|
2012-01-28 18:32:08 +00:00
|
|
|
_renderer.applyLightingToSurface = _applyLightingToSurface;
|
|
|
|
_renderer.customData[0] = &_water;
|
|
|
|
_renderer.customData[1] = &_lighting;
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
protected:
|
|
|
|
QColor getColor(double x, double y)
|
|
|
|
{
|
|
|
|
Vector3 eye, look, location;
|
|
|
|
|
|
|
|
eye.x = 0.0;
|
|
|
|
eye.y = scaling;
|
|
|
|
eye.z = -10.0 * scaling;
|
|
|
|
look.x = x * 0.01 / scaling;
|
|
|
|
look.y = -y * 0.01 / scaling - 0.3;
|
|
|
|
look.z = 1.0;
|
|
|
|
look = v3Normalize(look);
|
|
|
|
|
|
|
|
if (look.y > -0.0001)
|
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
return colorToQColor(_rayWalking(&_renderer, eye, look, 0, 0, 0, 0).hit_color);
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
location.x = eye.x - look.x * eye.y / look.y;
|
|
|
|
location.y = 0.0;
|
|
|
|
location.z = eye.z - look.z * eye.y / look.y;
|
|
|
|
|
|
|
|
if (location.z > 0.0)
|
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
return colorToQColor(_rayWalking(&_renderer, eye, look, 0, 0, 0, 0).hit_color);
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
|
2012-01-26 22:30:20 +00:00
|
|
|
return colorToQColor(waterGetColor(&_water, &_renderer, location, look));
|
|
|
|
}
|
|
|
|
void updateData()
|
|
|
|
{
|
|
|
|
waterCopyDefinition(&_definition, &_water);
|
2012-01-24 13:16:20 +00:00
|
|
|
_water.height = 0.0;
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
2012-01-24 13:16:20 +00:00
|
|
|
Renderer _renderer;
|
|
|
|
WaterDefinition _water;
|
2012-01-28 18:32:08 +00:00
|
|
|
LightingDefinition _lighting;
|
|
|
|
|
2012-01-24 13:16:20 +00:00
|
|
|
static RayCastingResult _rayWalking(Renderer* renderer, Vector3 location, Vector3 direction, int terrain, int water, int sky, int clouds)
|
2011-12-27 19:03:46 +00:00
|
|
|
{
|
|
|
|
RayCastingResult result;
|
|
|
|
double x, y;
|
|
|
|
|
|
|
|
result.hit = 1;
|
|
|
|
if (direction.z < 0.0001)
|
|
|
|
{
|
|
|
|
result.hit_color = COLOR_WHITE;
|
2012-01-24 13:16:20 +00:00
|
|
|
result.hit_location = location;
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
x = location.x + direction.x * (0.0 - location.z) / direction.z;
|
|
|
|
y = location.y + direction.y * (0.0 - location.z) / direction.z;
|
2011-12-27 19:03:46 +00:00
|
|
|
|
|
|
|
if (((int)ceil(x * 0.2) % 2 == 0) ^ ((int)ceil(y * 0.2 - 0.5) % 2 == 0))
|
|
|
|
{
|
|
|
|
result.hit_color = COLOR_WHITE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
result.hit_color = COLOR_GREY;
|
|
|
|
}
|
2012-01-22 18:39:42 +00:00
|
|
|
result.hit_location.x = x;
|
|
|
|
result.hit_location.y = y;
|
|
|
|
result.hit_location.z = 0.0;
|
2011-12-26 21:53:29 +00:00
|
|
|
}
|
2011-12-27 19:03:46 +00:00
|
|
|
|
|
|
|
return result;
|
2011-12-26 21:53:29 +00:00
|
|
|
}
|
2012-01-28 18:32:08 +00:00
|
|
|
static Color _applyLightingToSurface(Renderer* renderer, Vector3 location, Vector3 normal, SurfaceMaterial material)
|
|
|
|
{
|
|
|
|
if (location.x >= 0.0)
|
|
|
|
{
|
|
|
|
return lightingApplyToSurface((LightingDefinition*)renderer->customData[1], renderer, location, normal, material);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return material.base;
|
|
|
|
}
|
|
|
|
}
|
2011-12-26 21:53:29 +00:00
|
|
|
};
|
2011-12-25 21:19:32 +00:00
|
|
|
|
2011-12-27 19:03:46 +00:00
|
|
|
/**************** Form ****************/
|
2012-01-06 16:09:03 +00:00
|
|
|
FormWater::FormWater(QWidget *parent):
|
2012-01-05 16:32:41 +00:00
|
|
|
BaseForm(parent)
|
2011-12-25 21:19:32 +00:00
|
|
|
{
|
2011-12-27 19:03:46 +00:00
|
|
|
_definition = waterCreateDefinition();
|
|
|
|
|
2012-01-22 18:39:42 +00:00
|
|
|
previewCoverage = new PreviewWaterCoverage(this);
|
|
|
|
previewColor = new PreviewWaterColor(this);
|
2012-01-05 16:32:41 +00:00
|
|
|
addPreview(previewCoverage, QString("Coverage preview"));
|
2012-01-28 18:32:08 +00:00
|
|
|
addPreview(previewColor, QString("Rendered preview (without/with lighting)"));
|
2011-12-25 21:19:32 +00:00
|
|
|
|
2012-01-08 10:31:01 +00:00
|
|
|
addInputDouble("Height", &_definition.height, -10.0, 10.0, 0.1, 1.0);
|
2012-01-28 18:32:08 +00:00
|
|
|
addInputColor("Surface color", &_definition.material.base);
|
|
|
|
addInputDouble("Light reflection", &_definition.material.reflection, 0.0, 1.0, 0.01, 0.1);
|
|
|
|
addInputDouble("Shininess to light", &_definition.material.shininess, 0.0, 20.0, 0.1, 1.0);
|
2012-01-05 18:39:17 +00:00
|
|
|
addInputDouble("Transparency", &_definition.transparency, 0.0, 1.0, 0.001, 0.1);
|
|
|
|
addInputDouble("Reflection", &_definition.reflection, 0.0, 1.0, 0.001, 0.1);
|
2012-01-28 18:32:08 +00:00
|
|
|
addInputDouble("Transparency distance", &_definition.transparency_depth, 0.0, 20.0, 0.1, 1.0);
|
2012-01-05 19:41:10 +00:00
|
|
|
addInputColor("Depth color", &_definition.depth_color);
|
2012-01-28 18:32:08 +00:00
|
|
|
addInputDouble("Light-through distance", &_definition.lighting_depth, 0.0, 20.0, 0.1, 1.0);
|
2012-01-17 20:54:14 +00:00
|
|
|
addInputNoise("Waves noise", _definition.waves_noise);
|
|
|
|
addInputDouble("Waves height", &_definition.waves_noise_height, 0.0, 0.1, 0.001, 0.01);
|
|
|
|
addInputDouble("Waves scaling", &_definition.waves_noise_scale, 0.01, 1.0, 0.01, 0.1);
|
2011-12-27 19:03:46 +00:00
|
|
|
|
|
|
|
revertConfig();
|
|
|
|
}
|
|
|
|
|
2012-01-05 18:39:17 +00:00
|
|
|
void FormWater::revertConfig()
|
2011-12-27 19:03:46 +00:00
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
sceneryGetWater(&_definition);
|
2012-01-05 18:39:17 +00:00
|
|
|
BaseForm::revertConfig();
|
2011-12-27 19:03:46 +00:00
|
|
|
}
|
|
|
|
|
2012-01-07 16:53:23 +00:00
|
|
|
void FormWater::applyConfig()
|
2011-12-27 19:03:46 +00:00
|
|
|
{
|
2012-01-24 13:16:20 +00:00
|
|
|
scenerySetWater(&_definition);
|
2012-01-07 16:53:23 +00:00
|
|
|
BaseForm::applyConfig();
|
|
|
|
}
|