From a338872c8286f89af29d6f5533d9c001f4d06f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Lemaire?= Date: Tue, 29 May 2012 13:32:23 +0000 Subject: [PATCH] paysages : New curve input and dialog for cloud density profile + get rid of constants.h git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@330 b1fd45b6-86a6-48da-8261-f70d1f35bdcc --- gui_qt/baseform.cpp | 6 ++ gui_qt/baseform.h | 2 + gui_qt/dialogcolorgradation.cpp | 3 +- gui_qt/dialogcolorgradation.h | 1 - gui_qt/dialogcurve.cpp | 106 +++++++++++++++++++ gui_qt/dialogcurve.h | 38 +++++++ gui_qt/formclouds.cpp | 9 +- gui_qt/formsky.cpp | 1 - gui_qt/formterrain.cpp | 1 - gui_qt/formwater.cpp | 1 - gui_qt/inputcurve.cpp | 87 ++++++++++++++++ gui_qt/inputcurve.h | 32 ++++++ gui_qt/widgetcurveeditor.cpp | 2 +- gui_qt/widgetcurveeditor.h | 2 +- i18n/paysages_fr.ts | 177 ++++++++++++++++++++------------ lib_paysages/atmosphere.c | 1 - lib_paysages/auto.c | 1 - lib_paysages/camera.c | 1 - lib_paysages/clouds.c | 42 ++++---- lib_paysages/clouds.h | 2 +- lib_paysages/color.c | 1 - lib_paysages/color.h | 18 +++- lib_paysages/euclid.h | 30 +++++- lib_paysages/lighting.c | 1 - lib_paysages/main.c | 1 - lib_paysages/pack.c | 1 + lib_paysages/pack.h | 3 - lib_paysages/render.c | 1 - lib_paysages/renderer.c | 2 +- lib_paysages/shared/constants.h | 24 ----- lib_paysages/shared/types.h | 38 +------ lib_paysages/sky.c | 1 - lib_paysages/terrain.c | 1 - lib_paysages/textures.c | 1 - lib_paysages/water.c | 1 - 35 files changed, 460 insertions(+), 179 deletions(-) create mode 100644 gui_qt/dialogcurve.cpp create mode 100644 gui_qt/dialogcurve.h create mode 100644 gui_qt/inputcurve.cpp create mode 100644 gui_qt/inputcurve.h delete mode 100644 lib_paysages/shared/constants.h diff --git a/gui_qt/baseform.cpp b/gui_qt/baseform.cpp index 1dfa18f..0a1b513 100644 --- a/gui_qt/baseform.cpp +++ b/gui_qt/baseform.cpp @@ -6,6 +6,7 @@ #include "inputcolor.h" #include "inputcolorgradation.h" #include "inputnoise.h" +#include "inputcurve.h" #include #include @@ -236,6 +237,11 @@ void BaseForm::addInputNoise(QString label, NoiseGenerator* value) addInput(new InputNoise(form, label, value)); } +void BaseForm::addInputCurve(QString label, Curve* value, double xmin, double xmax, double ymin, double ymax) +{ + addInput(new InputCurve(form, label, value, xmin, xmax, ymin, ymax)); +} + int BaseForm::currentLayer() { if (with_layers) diff --git a/gui_qt/baseform.h b/gui_qt/baseform.h index 5ab840f..c55f5b2 100644 --- a/gui_qt/baseform.h +++ b/gui_qt/baseform.h @@ -8,6 +8,7 @@ #include "baseinput.h" #include "../lib_paysages/shared/types.h" #include "../lib_paysages/noise.h" +#include "../lib_paysages/curve.h" #include "../lib_paysages/color.h" class BaseForm:public QWidget @@ -42,6 +43,7 @@ protected: void addInputColor(QString label, Color* value); void addInputColorGradation(QString label, ColorGradation* value); void addInputNoise(QString label, NoiseGenerator* value); + void addInputCurve(QString label, Curve* value, double xmin, double xmax, double ymin, double ymax); int currentLayer(); void setLayerCount(int layer_count); diff --git a/gui_qt/dialogcolorgradation.cpp b/gui_qt/dialogcolorgradation.cpp index eb9a694..aa0a658 100644 --- a/gui_qt/dialogcolorgradation.cpp +++ b/gui_qt/dialogcolorgradation.cpp @@ -10,7 +10,6 @@ #include #include #include -#include "baseform.h" #include "tools.h" #include "widgetcurveeditor.h" @@ -40,7 +39,7 @@ DialogColorGradation::DialogColorGradation(QWidget *parent, ColorGradation* grad label->setMaximumWidth(200); label->setWordWrap(true); form_layout->addWidget(label, 0, 1); - _curve_editor = new WidgetCurveEditor(form); + _curve_editor = new WidgetCurveEditor(form, 0.0, 1.0, 0.0, 1.0); _curve_editor->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); form_layout->addWidget(_curve_editor, 0, 0); connect(_curve_editor, SIGNAL(liveChanged()), this, SLOT(updateColors())); diff --git a/gui_qt/dialogcolorgradation.h b/gui_qt/dialogcolorgradation.h index dd9cb0e..94a39ef 100644 --- a/gui_qt/dialogcolorgradation.h +++ b/gui_qt/dialogcolorgradation.h @@ -3,7 +3,6 @@ #include #include -#include "baseform.h" #include "widgetcurveeditor.h" #include "previewcolorgradation.h" diff --git a/gui_qt/dialogcurve.cpp b/gui_qt/dialogcurve.cpp new file mode 100644 index 0000000..ad02e4b --- /dev/null +++ b/gui_qt/dialogcurve.cpp @@ -0,0 +1,106 @@ +#include "dialogcurve.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "baseform.h" +#include "tools.h" +#include "widgetcurveeditor.h" + +/**************** Dialog ****************/ +DialogCurve::DialogCurve(QWidget *parent, Curve* curve, double xmin, double xmax, double ymin, double ymax) : QDialog(parent) +{ + QWidget* buttons; + QWidget* form; + QGridLayout* form_layout; + QLabel* label; + + _base = curve; + _current = curveCreate(); + curveCopy(_base, _current); + + setLayout(new QVBoxLayout()); + + form = new QWidget(this); + form_layout = new QGridLayout(); + form->setLayout(form_layout); + layout()->addWidget(form); + + label = new QLabel(tr("This is the curve editor.\nClick on points and drag them to move them.\nDouble click to add a new point.\nRight click on a point to delete it."), form); + label->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum); + label->setMinimumWidth(150); + label->setMaximumWidth(200); + label->setWordWrap(true); + form_layout->addWidget(label, 0, 1); + _curve_editor = new WidgetCurveEditor(form, xmin, xmax, ymin, ymax); + _curve_editor->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + form_layout->addWidget(_curve_editor, 0, 0); + + buttons = new QWidget(this); + layout()->addWidget(buttons); + buttons->setLayout(new QHBoxLayout()); + + _button_accept = new QPushButton(tr("Validate"), buttons); + buttons->layout()->addWidget(_button_accept); + QObject::connect(_button_accept, SIGNAL(clicked()), this, SLOT(accept())); + + _button_revert = new QPushButton(tr("Revert"), buttons); + buttons->layout()->addWidget(_button_revert); + QObject::connect(_button_revert, SIGNAL(clicked()), this, SLOT(revert())); + + _button_cancel = new QPushButton(tr("Cancel"), buttons); + buttons->layout()->addWidget(_button_cancel); + QObject::connect(_button_cancel, SIGNAL(clicked()), this, SLOT(reject())); + + setWindowTitle(tr("Paysages 3D - Curve editor")); + resize(900, 600); + + revert(); +} + +DialogCurve::~DialogCurve() +{ + curveDelete(_current); +} + +bool DialogCurve::getCurve(QWidget* parent, Curve* curve, double xmin, double xmax, double ymin, double ymax) +{ + int result; + + DialogCurve* dialog = new DialogCurve(parent, curve, xmin, xmax, ymin, ymax); + result = dialog->exec(); + + delete dialog; + + return (result != 0) ? true : false; +} + +void DialogCurve::closeEvent(QCloseEvent* e) +{ + reject(); +} + +void DialogCurve::accept() +{ + _curve_editor->getCurve(_current); + curveCopy(_current, _base); + QDialog::accept(); +} + +void DialogCurve::revert() +{ + curveCopy(_base, _current); + revertToCurrent(); +} + +void DialogCurve::revertToCurrent() +{ + _curve_editor->setCurve(_current); +} diff --git a/gui_qt/dialogcurve.h b/gui_qt/dialogcurve.h new file mode 100644 index 0000000..20d66b1 --- /dev/null +++ b/gui_qt/dialogcurve.h @@ -0,0 +1,38 @@ +#ifndef _PAYSAGES_QT_DIALOGCURVE_H_ +#define _PAYSAGES_QT_DIALOGCURVE_H_ + +#include +#include +#include "widgetcurveeditor.h" + +#include "../lib_paysages/curve.h" + +class DialogCurve : public QDialog +{ + Q_OBJECT +public: + explicit DialogCurve(QWidget* parent, Curve* curve, double xmin, double xmax, double ymin, double ymax); + ~DialogCurve(); + + static bool getCurve(QWidget* parent, Curve* curve, double xmin, double xmax, double ymin, double ymax); + +public slots: + virtual void accept(); + void revert(); + +protected: + virtual void closeEvent(QCloseEvent* e); + +private: + void revertToCurrent(); + +private: + Curve* _base; + Curve* _current; + WidgetCurveEditor* _curve_editor; + QPushButton* _button_accept; + QPushButton* _button_revert; + QPushButton* _button_cancel; +}; + +#endif diff --git a/gui_qt/formclouds.cpp b/gui_qt/formclouds.cpp index 3426f73..e65b8c1 100644 --- a/gui_qt/formclouds.cpp +++ b/gui_qt/formclouds.cpp @@ -4,7 +4,6 @@ #include "../lib_paysages/color.h" #include "../lib_paysages/euclid.h" #include "../lib_paysages/scenery.h" -#include "../lib_paysages/shared/constants.h" #include "tools.h" @@ -107,8 +106,8 @@ protected: { cloudsLayerCopyDefinition(&_layer, &_preview_layer); _preview_layer.ymax = (_preview_layer.ymax - _preview_layer.ymin) / 2.0; - _preview_layer.ycenter = 0.0; _preview_layer.ymin = -_preview_layer.ymin; + curveClear(_preview_layer.density_altitude); _preview_layer.customcoverage = _coverageFunc; } private: @@ -149,9 +148,9 @@ FormClouds::FormClouds(QWidget *parent): addPreview(new PreviewCloudsCoverage(parent), tr("Layer coverage (no lighting)")); addPreview(new PreviewCloudsColor(parent), tr("Color and lighting")); - addInputDouble(tr("Start altitude"), &_layer.ymin, -10.0, 250.0, 0.5, 5.0); - addInputDouble(tr("Max density altitude"), &_layer.ycenter, -10.0, 250.0, 0.5, 5.0); - addInputDouble(tr("End altitude"), &_layer.ymax, -10.0, 250.0, 0.5, 5.0); + addInputDouble(tr("Lower altitude"), &_layer.ymin, -10.0, 250.0, 0.5, 5.0); + addInputDouble(tr("Upper altitude"), &_layer.ymax, -10.0, 250.0, 0.5, 5.0); + addInputCurve(tr("Density / Altitude"), _layer.density_altitude, 0.0, 1.0, 0.0, 1.0); addInputNoise(tr("Noise"), _layer.noise); addInputDouble(tr("Coverage"), &_layer.coverage, 0.0, 1.0, 0.01, 0.1); addInputDouble(tr("Scaling"), &_layer.scaling, 1.0, 100.0, 0.5, 5.0); diff --git a/gui_qt/formsky.cpp b/gui_qt/formsky.cpp index 8eb51be..91b335b 100644 --- a/gui_qt/formsky.cpp +++ b/gui_qt/formsky.cpp @@ -9,7 +9,6 @@ #include "../lib_paysages/sky.h" #include "../lib_paysages/scenery.h" #include "../lib_paysages/renderer.h" -#include "../lib_paysages/shared/constants.h" static SkyDefinition _definition; diff --git a/gui_qt/formterrain.cpp b/gui_qt/formterrain.cpp index 0a5486e..113f2ef 100644 --- a/gui_qt/formterrain.cpp +++ b/gui_qt/formterrain.cpp @@ -8,7 +8,6 @@ #include "../lib_paysages/terrain.h" #include "../lib_paysages/scenery.h" #include "../lib_paysages/euclid.h" -#include "../lib_paysages/shared/constants.h" static TerrainDefinition _definition; diff --git a/gui_qt/formwater.cpp b/gui_qt/formwater.cpp index b007c95..2e6c6e1 100644 --- a/gui_qt/formwater.cpp +++ b/gui_qt/formwater.cpp @@ -5,7 +5,6 @@ #include #include -#include "../lib_paysages/shared/constants.h" #include "../lib_paysages/euclid.h" #include "../lib_paysages/lighting.h" #include "../lib_paysages/renderer.h" diff --git a/gui_qt/inputcurve.cpp b/gui_qt/inputcurve.cpp new file mode 100644 index 0000000..cc38bb3 --- /dev/null +++ b/gui_qt/inputcurve.cpp @@ -0,0 +1,87 @@ +#include "inputcurve.h" + +#include +#include +#include +#include "dialogcurve.h" + +class CurveSmallPreview:public QWidget +{ +public: + CurveSmallPreview(QWidget* parent, Curve* curve, double xmin, double xmax, double ymin, double ymax) : QWidget(parent) + { + _curve = curve; + _xmin = xmin; + _xmax = xmax; + _ymin = ymin; + _ymax = ymax; + } + + void paintEvent(QPaintEvent* event) + { + if (!_curve) + { + return; + } + + QPainter painter(this); + int width = this->width(); + int height = this->height(); + double position, value; + + painter.fillRect(rect(), QColor(255, 255, 255)); + for (int x = 0; x < width; x++) + { + painter.setPen(QColor(0, 0, 0)); + position = _xmin + (_xmax - _xmin) * (double)x / (double)(width - 1); + value = (curveGetValue(_curve, position) - _ymin) * (_ymax - _ymin); + painter.drawPoint(x, height - 1 - (int)(value * (double)(height - 1))); + } + } + Curve* _curve; + double _xmin; + double _xmax; + double _ymin; + double _ymax; +}; + +InputCurve::InputCurve(QWidget* form, QString label, Curve* value, double xmin, double xmax, double ymin, double ymax) : BaseInput(form, label) +{ + _value = value; + _xmin = xmin; + _xmax = xmax; + _ymin = ymin; + _ymax = ymax; + + _preview = new CurveSmallPreview(form, value, xmin, xmax, ymin, ymax); + _preview->setMinimumSize(100, 40); + _control = new QPushButton(tr("Edit"), form); + _control->setMaximumWidth(150); + + connect((QPushButton*)_control, SIGNAL(clicked()), this, SLOT(editCurve())); +} + +void InputCurve::updatePreview() +{ + _preview->update(); + + BaseInput::updatePreview(); +} + +void InputCurve::applyValue() +{ + BaseInput::applyValue(); +} + +void InputCurve::revert() +{ + BaseInput::revert(); +} + +void InputCurve::editCurve() +{ + if (DialogCurve::getCurve(_control, _value, _xmin, _xmax, _ymin, _ymax)) + { + applyValue(); + } +} diff --git a/gui_qt/inputcurve.h b/gui_qt/inputcurve.h new file mode 100644 index 0000000..e19ae7a --- /dev/null +++ b/gui_qt/inputcurve.h @@ -0,0 +1,32 @@ +#ifndef _PAYSAGES_QT_INPUTCURVE_H_ +#define _PAYSAGES_QT_INPUTCURVE_H_ + +#include +#include "baseinput.h" + +#include "../lib_paysages/curve.h" + +class InputCurve:public BaseInput +{ + Q_OBJECT + +public: + InputCurve(QWidget* form, QString label, Curve* value, double xmin, double xmax, double ymin, double ymax); + +public slots: + virtual void updatePreview(); + virtual void applyValue(); + virtual void revert(); + +private slots: + void editCurve(); + +private: + Curve* _value; + double _xmin; + double _xmax; + double _ymin; + double _ymax; +}; + +#endif diff --git a/gui_qt/widgetcurveeditor.cpp b/gui_qt/widgetcurveeditor.cpp index 4a1d8de..fdb6023 100644 --- a/gui_qt/widgetcurveeditor.cpp +++ b/gui_qt/widgetcurveeditor.cpp @@ -4,7 +4,7 @@ #include #include "../lib_paysages/tools.h" -WidgetCurveEditor::WidgetCurveEditor(QWidget *parent) : QWidget(parent) +WidgetCurveEditor::WidgetCurveEditor(QWidget *parent, double xmin, double xmax, double ymin, double ymax) : QWidget(parent) { _curve = curveCreate(); _dragged = -1; diff --git a/gui_qt/widgetcurveeditor.h b/gui_qt/widgetcurveeditor.h index 34724a6..39913d8 100644 --- a/gui_qt/widgetcurveeditor.h +++ b/gui_qt/widgetcurveeditor.h @@ -10,7 +10,7 @@ class WidgetCurveEditor : public QWidget Q_OBJECT public: - WidgetCurveEditor(QWidget* parent); + WidgetCurveEditor(QWidget* parent, double xmin, double xmax, double ymin, double ymax); ~WidgetCurveEditor(); void setCurve(Curve* curve); diff --git a/i18n/paysages_fr.ts b/i18n/paysages_fr.ts index d621f74..16735e8 100644 --- a/i18n/paysages_fr.ts +++ b/i18n/paysages_fr.ts @@ -4,32 +4,32 @@ BaseForm - + Layers : Niveaux : - + Add layer Ajouter un niveau - + Delete layer Supprimer un niveau - + Apply Appliquer - + Revert Annuler les modifications - + Layer %1 Niveau %1 @@ -37,7 +37,7 @@ DialogColorGradation - + This is the curve editor for color components. Click on a component preview below to edit it. Click on points and drag them to move them. @@ -50,46 +50,77 @@ Double cliquez sur le fond pour ajouter un point. Cliquez avec le bouton droit sur un point pour le supprimer. - + Red preview, click to edit Aperçu du rouge, cliquer pour éditer - + Green preview, click to edit Aperçu du vert, cliquer pour éditer - + Blue preview, click to edit Aperçu du bleu, cliquez pour éditer - + Final preview Aperçu du gradient final - + Validate Valider - + Revert Recommencer - + Cancel Annuler - + Paysages 3D - Color gradation editor Paysages 3D - Editeur de gradients de couleur + + DialogCurve + + + This is the curve editor. +Click on points and drag them to move them. +Double click to add a new point. +Right click on a point to delete it. + + + + + Validate + Valider + + + + Revert + + + + + Cancel + Annuler + + + + Paysages 3D - Curve editor + + + DialogNoise @@ -253,77 +284,89 @@ Maintenir Ctrl : Plus rapide FormClouds - + Layer coverage (no lighting) Couverture de la couche (sans éclairage) - + Color and lighting Echantillon éclairé - Start altitude - Altitude de début + Altitude de début + + + Max density altitude + Altitude de densité maximale + + + End altitude + Altitude de fin + + + + Lower altitude + + + + + Upper altitude + - Max density altitude - Altitude de densité maximale + Density / Altitude + - End altitude - Altitude de fin - - - Noise Bruit - + Coverage Couverture - + Scaling Echelle - + Base color Couleur de base - + Light reflection Facteur de réflexion de la lumière - + Light reflection shininess Concentration de la réflexion de lumière - + Hardness to light - + Transparency depth Distance de transparence - + Light traversal depth Distance de traversée de la lumière - + Minimum lighting Eclairage minimal @@ -429,47 +472,47 @@ Maintenir Ctrl : Plus rapide FormSky - + West preview Aperçu de l'ouest - + East preview Aperçu de l'est - + Day time Heure du jour - + Sun color Couleur du soleil - + Sun radius Diamètre apparent du soleil - + Zenith color Couleur du ciel au zénith - + Haze color Couleur de la brume - + Haze height Hauteur apparente de la brume - + Haze smoothing Facteur de lissage de la brume @@ -477,7 +520,7 @@ Maintenir Ctrl : Plus rapide FormTerrain - + Height preview (normalized) Aperçu de la hauteur (normalisée) @@ -486,22 +529,22 @@ Maintenir Ctrl : Plus rapide Aperçu du rendu (sans ombres) - + Lighted preview (no texture) Aperçu éclairé (sans texture) - + Noise Bruit - + Height Hauteur - + Scaling Echelle @@ -596,72 +639,72 @@ Maintenir Ctrl : Plus rapide FormWater - + Coverage preview Aperçu de la couverture - + Rendered preview (without/with lighting) Aperçu du rendu (sans/avec éclairage) - + Height Hauteur - + Surface color Couleur de la surface - + Light reflection Réflection de la lumière - + Shininess to light Concentration de la lumière réfléchie - + Transparency Transparence - + Reflection Reflets - + Transparency distance Distance maximale de transparence - + Depth color Couleur en profondeur - + Light-through distance Distance de filtrage de la lumière - + Waves noise Bruit des vagues - + Waves height Hauteur des vagues - + Waves scaling Echelle des vagues @@ -703,6 +746,14 @@ Maintenir Ctrl : Plus rapide Editer + + InputCurve + + + Edit + Editer + + InputNoise diff --git a/lib_paysages/atmosphere.c b/lib_paysages/atmosphere.c index 22f9fe9..3128f5f 100644 --- a/lib_paysages/atmosphere.c +++ b/lib_paysages/atmosphere.c @@ -1,6 +1,5 @@ #include "atmosphere.h" -#include "shared/constants.h" #include "scenery.h" #include "euclid.h" #include "color.h" diff --git a/lib_paysages/auto.c b/lib_paysages/auto.c index 7297186..763f0f3 100644 --- a/lib_paysages/auto.c +++ b/lib_paysages/auto.c @@ -5,7 +5,6 @@ #include #include "shared/types.h" -#include "shared/constants.h" #include "clouds.h" #include "color.h" #include "lighting.h" diff --git a/lib_paysages/camera.c b/lib_paysages/camera.c index bf87353..939dbce 100644 --- a/lib_paysages/camera.c +++ b/lib_paysages/camera.c @@ -6,7 +6,6 @@ #include "euclid.h" #include "render.h" #include "shared/types.h" -#include "shared/constants.h" #include "scenery.h" #include "tools.h" diff --git a/lib_paysages/clouds.c b/lib_paysages/clouds.c index 89907e8..c425928 100644 --- a/lib_paysages/clouds.c +++ b/lib_paysages/clouds.c @@ -8,7 +8,6 @@ #include "lighting.h" #include "tools.h" #include "shared/types.h" -#include "shared/constants.h" typedef struct { @@ -21,9 +20,7 @@ static CloudsLayerDefinition NULL_LAYER; void cloudsInit() { - NULL_LAYER.noise = noiseCreateGenerator(); - NULL_LAYER.coverage = 0.0; - NULL_LAYER.customcoverage = NULL; + NULL_LAYER = cloudsLayerCreateDefinition();; cloudsLayerValidateDefinition(&NULL_LAYER); } @@ -42,9 +39,9 @@ void cloudsSave(PackStream* stream, CloudsDefinition* definition) { layer = definition->layers + i; - packWriteDouble(stream, &layer->ycenter); packWriteDouble(stream, &layer->ymin); packWriteDouble(stream, &layer->ymax); + curveSave(stream, layer->density_altitude); noiseSaveGenerator(stream, layer->noise); materialSave(stream, &layer->material); packWriteDouble(stream, &layer->hardness); @@ -71,9 +68,9 @@ void cloudsLoad(PackStream* stream, CloudsDefinition* definition) { layer = definition->layers + cloudsAddLayer(definition); - packReadDouble(stream, &layer->ycenter); packReadDouble(stream, &layer->ymin); packReadDouble(stream, &layer->ymax); + curveLoad(stream, layer->density_altitude); noiseLoadGenerator(stream, layer->noise); materialLoad(stream, &layer->material); packReadDouble(stream, &layer->hardness); @@ -129,24 +126,13 @@ void cloudsValidateDefinition(CloudsDefinition* definition) static double _standardCoverageFunc(CloudsLayerDefinition* layer, Vector3 position) { - double inside; - - if (position.y > layer->ycenter) - { - inside = 1.0 - (position.y - layer->ycenter) / (layer->ymax - layer->ycenter); - } - else - { - inside = 1.0 - (layer->ycenter - position.y) / (layer->ycenter - layer->ymin); - } - - if (inside <= 0.0) + if (position.y > layer->ymax || position.y < layer->ymin) { return 0.0; } else - { - return layer->coverage * inside; + { + return layer->coverage * curveGetValue(layer->density_altitude, (position.y - layer->ymin) / (layer->ymax - layer->ymin)); } } @@ -155,8 +141,12 @@ CloudsLayerDefinition cloudsLayerCreateDefinition() CloudsLayerDefinition result; result.ymin = 4.0; - result.ycenter = 6.0; result.ymax = 10.0; + result.density_altitude = curveCreate(); + curveQuickAddPoint(result.density_altitude, 0.0, 0.0); + curveQuickAddPoint(result.density_altitude, 0.3, 1.0); + curveQuickAddPoint(result.density_altitude, 0.5, 1.0); + curveQuickAddPoint(result.density_altitude, 1.0, 0.0); result.material.base.r = 0.7; result.material.base.g = 0.7; result.material.base.b = 0.7; @@ -197,17 +187,21 @@ void cloudsLayerDeleteDefinition(CloudsLayerDefinition* definition) void cloudsLayerCopyDefinition(CloudsLayerDefinition* source, CloudsLayerDefinition* destination) { - NoiseGenerator* noise; + CloudsLayerDefinition temp; if (destination == &NULL_LAYER) { return; } - noise = destination->noise; + temp = *destination; *destination = *source; - destination->noise = noise; + + destination->noise = temp.noise; noiseCopy(source->noise, destination->noise); + + destination->density_altitude = temp.density_altitude; + curveCopy(source->density_altitude, destination->density_altitude); } void cloudsLayerValidateDefinition(CloudsLayerDefinition* definition) diff --git a/lib_paysages/clouds.h b/lib_paysages/clouds.h index f8da51a..26d7da7 100644 --- a/lib_paysages/clouds.h +++ b/lib_paysages/clouds.h @@ -18,9 +18,9 @@ typedef double (*CloudCoverageFunc)(CloudsLayerDefinition* definition, Vector3 p struct CloudsLayerDefinition { - double ycenter; double ymin; double ymax; + Curve* density_altitude; NoiseGenerator* noise; SurfaceMaterial material; double hardness; diff --git a/lib_paysages/color.c b/lib_paysages/color.c index 8fd0b8e..5603bf2 100644 --- a/lib_paysages/color.c +++ b/lib_paysages/color.c @@ -3,7 +3,6 @@ #include #include #include -#include "shared/constants.h" #include "tools.h" #include "curve.h" diff --git a/lib_paysages/color.h b/lib_paysages/color.h index 1bce1d2..41407cf 100644 --- a/lib_paysages/color.h +++ b/lib_paysages/color.h @@ -1,14 +1,28 @@ #ifndef _PAYSAGES_COLOR_H_ #define _PAYSAGES_COLOR_H_ -#include "shared/types.h" -#include "shared/constants.h" #include "curve.h" #ifdef __cplusplus extern "C" { #endif +typedef struct +{ + double r; + double g; + double b; + double a; +} Color; + +extern Color COLOR_TRANSPARENT; +extern Color COLOR_BLACK; +extern Color COLOR_RED; +extern Color COLOR_GREEN; +extern Color COLOR_BLUE; +extern Color COLOR_WHITE; +extern Color COLOR_GREY; + /* Color */ void colorSave(PackStream* stream, Color* col); void colorLoad(PackStream* stream, Color* col); diff --git a/lib_paysages/euclid.h b/lib_paysages/euclid.h index d3e4c65..9875483 100644 --- a/lib_paysages/euclid.h +++ b/lib_paysages/euclid.h @@ -1,13 +1,41 @@ #ifndef _PAYSAGES_EUCLID_H_ #define _PAYSAGES_EUCLID_H_ -#include "shared/types.h" #include "pack.h" #ifdef __cplusplus extern "C" { #endif +typedef struct +{ + double x; + double y; + double z; +} Vector3; + +typedef struct +{ + double a; + double b; + double c; + double d; + double e; + double f; + double g; + double h; + double i; + double j; + double k; + double l; + double m; + double n; + double o; + double p; +} Matrix4; + +extern Vector3 VECTOR_ZERO; + void v3Save(PackStream* stream, Vector3* v); void v3Load(PackStream* stream, Vector3* v); Vector3 v3Translate(Vector3 v1, double x, double y, double z); diff --git a/lib_paysages/lighting.c b/lib_paysages/lighting.c index f185010..f4e59a3 100644 --- a/lib_paysages/lighting.c +++ b/lib_paysages/lighting.c @@ -6,7 +6,6 @@ #include #include "shared/types.h" -#include "shared/constants.h" #include "color.h" #include "euclid.h" #include "renderer.h" diff --git a/lib_paysages/main.c b/lib_paysages/main.c index e052cfc..2fc2f9a 100644 --- a/lib_paysages/main.c +++ b/lib_paysages/main.c @@ -5,7 +5,6 @@ #include "IL/ilu.h" #include "shared/types.h" -#include "shared/constants.h" #include "auto.h" #include "color.h" diff --git a/lib_paysages/pack.c b/lib_paysages/pack.c index 775e3b3..67653f0 100644 --- a/lib_paysages/pack.c +++ b/lib_paysages/pack.c @@ -1,6 +1,7 @@ #include "pack.h" #include +#include #include #include #include diff --git a/lib_paysages/pack.h b/lib_paysages/pack.h index 0075dea..ddc2de7 100644 --- a/lib_paysages/pack.h +++ b/lib_paysages/pack.h @@ -1,9 +1,6 @@ #ifndef _PAYSAGES_PACK_H_ #define _PAYSAGES_PACK_H_ -#include -#include "shared/types.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/lib_paysages/render.c b/lib_paysages/render.c index b9fbf3b..ac05d8f 100644 --- a/lib_paysages/render.c +++ b/lib_paysages/render.c @@ -7,7 +7,6 @@ #include "IL/ilu.h" #include "shared/types.h" -#include "shared/constants.h" #include "array.h" #include "color.h" #include "system.h" diff --git a/lib_paysages/renderer.c b/lib_paysages/renderer.c index 2bb96e6..dba8b81 100644 --- a/lib_paysages/renderer.c +++ b/lib_paysages/renderer.c @@ -1,5 +1,5 @@ #include "renderer.h" -#include "shared/constants.h" + #include "lighting.h" #include "system.h" #include "render.h" diff --git a/lib_paysages/shared/constants.h b/lib_paysages/shared/constants.h deleted file mode 100644 index c7ad627..0000000 --- a/lib_paysages/shared/constants.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _PAYSAGES_CONSTANTS_H_ -#define _PAYSAGES_CONSTANTS_H_ - -#include "types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -extern Color COLOR_TRANSPARENT; -extern Color COLOR_BLACK; -extern Color COLOR_RED; -extern Color COLOR_GREEN; -extern Color COLOR_BLUE; -extern Color COLOR_WHITE; -extern Color COLOR_GREY; - -extern Vector3 VECTOR_ZERO; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/lib_paysages/shared/types.h b/lib_paysages/shared/types.h index e021adc..db910f8 100644 --- a/lib_paysages/shared/types.h +++ b/lib_paysages/shared/types.h @@ -1,47 +1,13 @@ #ifndef _PAYSAGES_TYPES_H_ #define _PAYSAGES_TYPES_H_ -#include +#include "../euclid.h" +#include "../color.h" #ifdef __cplusplus extern "C" { #endif -typedef struct -{ - double x; - double y; - double z; -} Vector3; - -typedef struct -{ - double a; - double b; - double c; - double d; - double e; - double f; - double g; - double h; - double i; - double j; - double k; - double l; - double m; - double n; - double o; - double p; -} Matrix4; - -typedef struct -{ - double r; - double g; - double b; - double a; -} Color; - struct RenderFragment; struct Renderer; diff --git a/lib_paysages/sky.c b/lib_paysages/sky.c index b46f77d..bfcc259 100644 --- a/lib_paysages/sky.c +++ b/lib_paysages/sky.c @@ -4,7 +4,6 @@ #include #include "shared/types.h" -#include "shared/constants.h" #include "color.h" #include "clouds.h" #include "euclid.h" diff --git a/lib_paysages/terrain.c b/lib_paysages/terrain.c index cc6e125..afa7a9c 100644 --- a/lib_paysages/terrain.c +++ b/lib_paysages/terrain.c @@ -6,7 +6,6 @@ #include #include "shared/types.h" -#include "shared/constants.h" #include "euclid.h" #include "render.h" #include "textures.h" diff --git a/lib_paysages/textures.c b/lib_paysages/textures.c index dbb8075..8572a63 100644 --- a/lib_paysages/textures.c +++ b/lib_paysages/textures.c @@ -6,7 +6,6 @@ #include #include "shared/types.h" -#include "shared/constants.h" #include "color.h" #include "euclid.h" #include "lighting.h" diff --git a/lib_paysages/water.c b/lib_paysages/water.c index 8bddeac..006da1b 100644 --- a/lib_paysages/water.c +++ b/lib_paysages/water.c @@ -1,7 +1,6 @@ #include "water.h" #include "shared/types.h" -#include "shared/constants.h" #include "color.h" #include "euclid.h" #include "render.h"