paysages : Added foam to water + auto preset for water.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@464 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-11-19 20:40:57 +00:00 committed by ThunderK
parent 55f606bd85
commit a95c07623c
9 changed files with 188 additions and 36 deletions

View file

@ -1,27 +1,31 @@
????-??-?? Technology Preview 2 ????-??-?? Technology Preview 2
------------------------------- -------------------------------
Previews : Global :
* Scaling is now logarithmic (slower when zoomed). * Version handling in saved files.
* Drawing now takes advantage of multiple CPU cores. * Replaced old noise algorithm with Simplex Noise (up to 4 times faster).
3D Explorer: Terrain :
* Added ground texture and skybox. * Added canvases to paint the shape directly.
* Progressive rendering now takes advantage of multiple CPU cores. * Shadows have been improved and are now configurable.
Scenery : Textures :
* Added terrain canvases to paint the shape directly. * New texture model (perpendicular displacement and thickness).
* Added clouds hardness to light.
* Added sun halo control.
* New cloud model with 2 noises : one for the global shape and one for edges.
* Terrain shadows have been improved and are now configurable.
* New sky model (based on Preetham's work).
* Textures ranges are now using curves. * Textures ranges are now using curves.
Water :
* Added foam.
Sky :
* New sky model (based on Preetham's work).
* Added sun halo control.
Clouds :
* Added clouds hardness to light.
* New cloud model with 2 noises : one for the global shape and one for edges.
Rendering : Rendering :
* New texture model (perpendicular displacement and thickness).
* Added full scene antialiasing (FSAA). * Added full scene antialiasing (FSAA).
* Replaced old noise algorithm with Simplex Noise (up to 4 times faster).
GUI : GUI :
* Improved curve rendering. * Improved curve rendering.
@ -29,12 +33,18 @@ GUI :
* Added render timer. * Added render timer.
* Previews locations and render params are now saved. * Previews locations and render params are now saved.
* Added grid and axis labels to curve editor. * Added grid and axis labels to curve editor.
* Added camera location to previews.
* Added toggles and choices to configure some previews.
* Added layer sorting and naming. * Added layer sorting and naming.
* Automatic settings can be loaded from presets.
Misc : Previews :
* Version handling in saved files. * Scaling is now logarithmic (slower when zoomed).
* Drawing now takes advantage of multiple CPU cores.
* Added camera location.
* Added toggles and choices to configure some previews.
3D Explorer:
* Added ground texture and skybox.
* Progressive rendering now takes advantage of multiple CPU cores.
2012-04-20 Technology Preview 1 2012-04-20 Technology Preview 1
------------------------------- -------------------------------

18
TODO
View file

@ -1,22 +1,26 @@
Technology Preview 2 : Technology Preview 2 :
- Fully move layer management from BaseForm to BaseFormLayer. - Fully move layer management from BaseForm to BaseFormLayer.
- Replace math.h methods by optimized ones (fastfloor, fastsin...). - Replace terrain canvas editor by full sculpting editor.
- Add foam to water. => Add a generation dialog, with fixed resolution.
=> Store local terrain modifications in fully dynamic canvas.
=> Add map preview with editor area.
=> Allow camera move and zoom.
- Get rid of noise dialogs, for simpler settings.
- Finalize Preetham's model usage - Finalize Preetham's model usage
=> Apply model to atmosphere (aerial perspective) => Apply model to atmosphere (aerial perspective)
=> Find a proper model for night sky (maybe Shirley) => Find a proper model for night sky (maybe Shirley)
- Keep skydome lights in cache for a render. - Keep skydome lights in cache for a render.
- Add buttons to restore "auto" default values in tabs and dialogs (with several auto presets). - Add buttons to restore "auto" default values in tabs and dialogs (with several auto presets).
- Clouds should keep distance to ground. - Clouds should keep distance to ground.
- Rethink the quality settings and detail smoothing in the distance.
=> When quality setting is set to 10, add boost options
=> Add detail boost (adds granularity)
=> Add step boost (for marching algorithms)
- Waves noise should not change layers offsets each time a setting is changed (layers are reconstructed currently).
- Add "hardness to light" and shadow control ("minimum lighting") to material. - Add "hardness to light" and shadow control ("minimum lighting") to material.
Technlogy Preview 3 : Technlogy Preview 3 :
- Add logarithmic sliders for some float values. - Add logarithmic sliders for some float values.
- Replace terrain canvas editor by full sculpting editor.
=> Add a generation dialog, with fixed resolution.
=> Store local terrain modifications in fully dynamic canvas.
=> Add map preview with editor area.
=> Allow camera move and zoom.
- Improve previews. - Improve previews.
=> Add user markers on OSD. => Add user markers on OSD.
=> Add areas marking. => Add areas marking.

View file

@ -120,6 +120,10 @@ BaseForm::BaseForm(QWidget* parent, bool auto_apply, bool with_layers) : QWidget
_button_apply->setIcon(QIcon("images/apply.png")); _button_apply->setIcon(QIcon("images/apply.png"));
_button_apply->setEnabled(false); _button_apply->setEnabled(false);
connect(_button_apply, SIGNAL(clicked()), this, SLOT(applyConfig())); connect(_button_apply, SIGNAL(clicked()), this, SLOT(applyConfig()));
_button_preset = addButton(tr("Load preset"));
_button_preset->setIcon(QIcon("images/auto.png"));
_button_preset->hide();
connect(_button_preset, SIGNAL(clicked()), this, SLOT(presetChoiceClicked()));
_auto_update_previews = true; _auto_update_previews = true;
@ -183,6 +187,16 @@ void BaseForm::configChangeEvent()
} }
} }
void BaseForm::autoPresetSelected(int)
{
for (int i = 0; i < _inputs_list.size(); i++)
{
_inputs_list[i]->revert();
}
updatePreviews();
configChangeEvent();
}
void BaseForm::revertConfig() void BaseForm::revertConfig()
{ {
for (int i = 0; i < _inputs_list.size(); i++) for (int i = 0; i < _inputs_list.size(); i++)
@ -322,6 +336,21 @@ void BaseForm::layerListChanged()
_button_revert->setEnabled(changed); _button_revert->setEnabled(changed);
} }
void BaseForm::presetChoiceClicked()
{
bool ok;
QString item = QInputDialog::getItem(this, tr("Choose a preset"), tr("Preset settings : "), _preset_list, 0, false, &ok);
if (ok && !item.isEmpty())
{
int preset = _preset_list.indexOf(item);
if (preset >= 0)
{
autoPresetSelected(preset);
}
}
}
void BaseForm::addPreview(BasePreview* preview, QString label) void BaseForm::addPreview(BasePreview* preview, QString label)
{ {
QLabel* label_widget; QLabel* label_widget;
@ -342,6 +371,12 @@ QPushButton* BaseForm::addButton(QString label)
return button; return button;
} }
void BaseForm::addAutoPreset(QString label)
{
_preset_list.append(label);
_button_preset->show();
}
BaseInput* BaseForm::addInput(BaseInput* input) BaseInput* BaseForm::addInput(BaseInput* input)
{ {
int row_height = 30; int row_height = 30;

View file

@ -36,6 +36,7 @@ public slots:
protected slots: protected slots:
virtual void configChangeEvent(); virtual void configChangeEvent();
virtual void autoPresetSelected(int preset);
private slots: private slots:
void rebuildLayerList(); void rebuildLayerList();
@ -45,10 +46,12 @@ private slots:
void layerDownClicked(); void layerDownClicked();
void layerRenameClicked(); void layerRenameClicked();
void layerListChanged(); void layerListChanged();
void presetChoiceClicked();
protected: protected:
void addPreview(BasePreview* preview, QString label); void addPreview(BasePreview* preview, QString label);
QPushButton* addButton(QString label); QPushButton* addButton(QString label);
void addAutoPreset(QString label);
BaseInput* addInput(BaseInput* input); BaseInput* addInput(BaseInput* input);
BaseInput* addInputInt(QString label, int* value, int min, int max, int small_step, int large_step); BaseInput* addInputInt(QString label, int* value, int min, int max, int small_step, int large_step);
BaseInput* addInputDouble(QString label, double* value, double min, double max, double small_step, double large_step); BaseInput* addInputDouble(QString label, double* value, double min, double max, double small_step, double large_step);
@ -83,6 +86,7 @@ private:
QWidget* _buttons; QWidget* _buttons;
QPushButton* _button_apply; QPushButton* _button_apply;
QPushButton* _button_revert; QPushButton* _button_revert;
QPushButton* _button_preset;
QWidget* _previews; QWidget* _previews;
QVector<BasePreview*> _previews_list; QVector<BasePreview*> _previews_list;
@ -90,6 +94,8 @@ private:
QVector<BaseInput*> _inputs_list; QVector<BaseInput*> _inputs_list;
QStringList _preset_list;
bool _with_layers; bool _with_layers;
QComboBox* _layer_list; QComboBox* _layer_list;
int _layer_count; int _layer_count;

View file

@ -206,12 +206,14 @@ private:
FormWater::FormWater(QWidget *parent): FormWater::FormWater(QWidget *parent):
BaseForm(parent) BaseForm(parent)
{ {
addAutoPreset(tr("Standard water"));
_definition = waterCreateDefinition(); _definition = waterCreateDefinition();
previewCoverage = new PreviewWaterCoverage(this); previewCoverage = new PreviewWaterCoverage(this);
previewColor = new PreviewWaterColor(this); previewColor = new PreviewWaterColor(this);
addPreview(previewCoverage, QString(tr("Coverage preview"))); addPreview(previewCoverage, tr("Coverage preview"));
addPreview(previewColor, QString(tr("Rendered preview"))); addPreview(previewColor, tr("Rendered preview"));
addInputDouble(tr("Height"), &_definition.height, -10.0, 10.0, 0.1, 1.0); addInputDouble(tr("Height"), &_definition.height, -10.0, 10.0, 0.1, 1.0);
addInputMaterial(tr("Surface material"), &_definition.material); addInputMaterial(tr("Surface material"), &_definition.material);
@ -224,6 +226,8 @@ FormWater::FormWater(QWidget *parent):
addInputDouble(tr("Waves height"), &_definition.waves_height, 0.0, 2.0, 0.02, 0.2); addInputDouble(tr("Waves height"), &_definition.waves_height, 0.0, 2.0, 0.02, 0.2);
addInputDouble(tr("Waves detail"), &_definition.detail_height, 0.0, 0.3, 0.003, 0.03); addInputDouble(tr("Waves detail"), &_definition.detail_height, 0.0, 0.3, 0.003, 0.03);
addInputDouble(tr("Waves turbulence"), &_definition.turbulence, 0.0, 0.5, 0.005, 0.05); addInputDouble(tr("Waves turbulence"), &_definition.turbulence, 0.0, 0.5, 0.005, 0.05);
addInputDouble(tr("Foam coverage"), &_definition.foam_coverage, 0.0, 1.0, 0.01, 0.1);
addInputMaterial(tr("Foam material"), &_definition.foam_material);
revertConfig(); revertConfig();
} }
@ -245,3 +249,13 @@ void FormWater::configChangeEvent()
waterValidateDefinition(&_definition); waterValidateDefinition(&_definition);
BaseForm::configChangeEvent(); BaseForm::configChangeEvent();
} }
void FormWater::autoPresetSelected(int preset)
{
if (preset == (int)WATER_PRESET_STD)
{
waterAutoPreset(&_definition, WATER_PRESET_STD);
}
BaseForm::autoPresetSelected(preset);
}

View file

@ -18,6 +18,7 @@ public slots:
protected slots: protected slots:
virtual void configChangeEvent(); virtual void configChangeEvent();
virtual void autoPresetSelected(int preset);
private: private:
BasePreview* previewCoverage; BasePreview* previewCoverage;

BIN
images/auto.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View file

@ -25,6 +25,9 @@ void waterSave(PackStream* stream, WaterDefinition* definition)
packWriteDouble(stream, &definition->detail_height); packWriteDouble(stream, &definition->detail_height);
packWriteDouble(stream, &definition->turbulence); packWriteDouble(stream, &definition->turbulence);
packWriteDouble(stream, &definition->foam_coverage);
materialSave(stream, &definition->foam_material);
noiseSaveGenerator(stream, definition->_waves_noise); noiseSaveGenerator(stream, definition->_waves_noise);
} }
@ -43,6 +46,9 @@ void waterLoad(PackStream* stream, WaterDefinition* definition)
packReadDouble(stream, &definition->detail_height); packReadDouble(stream, &definition->detail_height);
packReadDouble(stream, &definition->turbulence); packReadDouble(stream, &definition->turbulence);
packReadDouble(stream, &definition->foam_coverage);
materialLoad(stream, &definition->foam_material);
noiseLoadGenerator(stream, definition->_waves_noise); noiseLoadGenerator(stream, definition->_waves_noise);
waterValidateDefinition(definition); waterValidateDefinition(definition);
@ -85,6 +91,12 @@ void waterAutoPreset(WaterDefinition* definition, WaterPreset preset)
definition->waves_height = 1.0; definition->waves_height = 1.0;
definition->detail_height = 0.05; definition->detail_height = 0.05;
definition->turbulence = 0.3; definition->turbulence = 0.3;
definition->foam_coverage = 0.4;
definition->foam_material.base.r = 0.8;
definition->foam_material.base.g = 0.8;
definition->foam_material.base.b = 0.8;
definition->foam_material.reflection = 0.2;
definition->foam_material.shininess = 1.5;
} }
waterValidateDefinition(definition); waterValidateDefinition(definition);
@ -126,11 +138,6 @@ static inline Vector3 _getNormal(WaterDefinition* definition, Vector3 base, doub
Vector3 back, right; Vector3 back, right;
double x, z; double x, z;
if (detail < 0.00001)
{
detail = 0.00001;
}
x = base.x; x = base.x;
z = base.z; z = base.z;
@ -187,6 +194,9 @@ Color waterLightFilter(WaterDefinition* definition, Renderer* renderer, Color li
{ {
double factor; double factor;
UNUSED(renderer);
UNUSED(light_location);
if (location.y < definition->height) if (location.y < definition->height)
{ {
if (direction_to_light.y > 0.00001) if (direction_to_light.y > 0.00001)
@ -215,6 +225,67 @@ Color waterLightFilter(WaterDefinition* definition, Renderer* renderer, Color li
} }
} }
static inline void _applyFoam(WaterDefinition* definition, Vector3 location, Vector3 normal, double detail, SurfaceMaterial* material)
{
Color result = definition->foam_material.base;
double foam_factor, normal_diff, location_offset;
location_offset = 2.0 * detail;
foam_factor = 0.0;
location.x += location_offset;
normal_diff = 1.0 - v3Dot(normal, _getNormal(definition, location, detail));
if (normal_diff > foam_factor)
{
foam_factor = normal_diff;
}
location.x -= location_offset * 2.0;
normal_diff = 1.0 - v3Dot(normal, _getNormal(definition, location, detail));
if (normal_diff > foam_factor)
{
foam_factor = normal_diff;
}
location.x += location_offset;
location.z -= location_offset;
normal_diff = 1.0 - v3Dot(normal, _getNormal(definition, location, detail));
if (normal_diff > foam_factor)
{
foam_factor = normal_diff;
}
location.z += location_offset * 2.0;
normal_diff = 1.0 - v3Dot(normal, _getNormal(definition, location, detail));
if (normal_diff > foam_factor)
{
foam_factor = normal_diff;
}
foam_factor *= 10.0;
if (foam_factor > 1.0)
{
foam_factor = 1.0;
}
if (foam_factor <= 1.0 - definition->foam_coverage)
{
return;
}
foam_factor = (foam_factor - (1.0 - definition->foam_coverage)) * definition->foam_coverage;
material->reflection = foam_factor * definition->foam_material.reflection + (1.0 - foam_factor) * material->reflection;
material->shininess = foam_factor * definition->foam_material.shininess + (1.0 - foam_factor) * material->shininess;
/* TODO This should be configurable */
if (foam_factor > 0.2)
{
result.a = 0.8;
}
else
{
result.a = 0.8 * (foam_factor / 0.2);
}
colorMask(&material->base, &result);
}
WaterResult waterGetColorDetail(WaterDefinition* definition, Renderer* renderer, Vector3 location, Vector3 look) WaterResult waterGetColorDetail(WaterDefinition* definition, Renderer* renderer, Vector3 location, Vector3 look)
{ {
WaterResult result; WaterResult result;
@ -225,7 +296,11 @@ WaterResult waterGetColorDetail(WaterDefinition* definition, Renderer* renderer,
SurfaceMaterial material; SurfaceMaterial material;
double detail, depth; double detail, depth;
detail = renderer->getPrecision(renderer, location); detail = renderer->getPrecision(renderer, location) * 0.1;
if (detail < 0.00001)
{
detail = 0.00001;
}
location.y = _getHeight(definition, location.x, location.z); location.y = _getHeight(definition, location.x, location.z);
result.location = location; result.location = location;
@ -255,6 +330,9 @@ WaterResult waterGetColorDetail(WaterDefinition* definition, Renderer* renderer,
material = definition->material; material = definition->material;
material.base = color; material.base = color;
_applyFoam(definition, location, normal, detail, &material);
renderer->getLightStatus(renderer, &light, location); renderer->getLightStatus(renderer, &light, location);
color = renderer->applyLightStatus(renderer, &light, location, normal, material); color = renderer->applyLightStatus(renderer, &light, location, normal, material);
color = renderer->applyAtmosphere(renderer, location, color); color = renderer->applyAtmosphere(renderer, location, color);

View file

@ -31,6 +31,9 @@ typedef struct
double waves_height; double waves_height;
double detail_height; double detail_height;
double foam_coverage;
SurfaceMaterial foam_material;
NoiseGenerator* _waves_noise; NoiseGenerator* _waves_noise;
} WaterDefinition; } WaterDefinition;
@ -40,6 +43,7 @@ typedef struct
Color base; Color base;
Color reflected; Color reflected;
Color refracted; Color refracted;
Color foam;
Color final; Color final;
} WaterResult; } WaterResult;