diff --git a/cli/main.c b/cli/main.c index 98cdb25..7dfb02a 100644 --- a/cli/main.c +++ b/cli/main.c @@ -120,7 +120,7 @@ int main(int argc, char** argv) printf("Initializing ...\n"); paysagesInit(); - + if (conf_file_path) { paysagesLoad(conf_file_path); @@ -131,14 +131,14 @@ int main(int argc, char** argv) for (outputcount = 0; outputcount < conf_nb_pictures; outputcount++) { - autoSetDaytimeFraction(conf_daytime_start); + /*autoSetDaytimeFraction(conf_daytime_start);*/ /* TODO */ sprintf(outputpath, "output/pic%05d.png", outputcount); startRender(&renderer, outputpath, conf_render_params); conf_daytime_start += conf_daytime_step; } - + printf("Cleaning up ...\n"); rendererDelete(&renderer); paysagesQuit(); diff --git a/gui_qt/dialognoise.cpp b/gui_qt/dialognoise.cpp index 6b47782..1465369 100644 --- a/gui_qt/dialognoise.cpp +++ b/gui_qt/dialognoise.cpp @@ -20,7 +20,7 @@ public: _noise_original = noise; _noise_preview = noiseCreateGenerator(); _level = -1; - + configScaling(0.15, 6.0, 0.09, 6.0); } @@ -58,7 +58,7 @@ public: { _noise_original = noise; _noise_preview = noiseCreateGenerator(); - + configScaling(0.15, 6.0, 0.09, 6.0); } protected: @@ -108,7 +108,7 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value): label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); previews->layout()->addWidget(label); previews->layout()->addWidget(previewLevel); - + previewTotal = new PreviewTotal(previews, _current); label = new QLabel(tr("Total preview")); label->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); @@ -118,11 +118,11 @@ DialogNoise::DialogNoise(QWidget *parent, NoiseGenerator* value): form = new QWidget(this); form->setLayout(new QVBoxLayout()); layout()->addWidget(form); - + function = new QWidget(form); function->setLayout(new QHBoxLayout()); form->layout()->addWidget(function); - + function->layout()->addWidget(new QLabel(tr("Noise function"))); function_algo = new QComboBox(function); function_algo->addItems(QStringList(tr("Simplex (best)")) << tr("Perlin (fast)") << tr("Naive (slow)")); @@ -222,7 +222,7 @@ bool DialogNoise::getNoise(QWidget* parent, NoiseGenerator* noise) return (result != 0) ? true : false; } -void DialogNoise::closeEvent(QCloseEvent* e) +void DialogNoise::closeEvent(QCloseEvent*) { reject(); } @@ -245,7 +245,7 @@ void DialogNoise::revertToCurrent() int i, n; int selected; NoiseFunction function; - + selected = levels->currentRow(); levels->clear(); @@ -254,7 +254,7 @@ void DialogNoise::revertToCurrent() { levels->addItem(QString(tr("Component %1")).arg(i + 1)); } - + if (n > 0) { if (selected < 0) @@ -267,7 +267,7 @@ void DialogNoise::revertToCurrent() } levels->setCurrentRow(selected); } - + function = noiseGetFunction(_current); function_algo->setCurrentIndex((int)function.algorithm); function_ridge->setValue(round(function.ridge_factor * 20.0)); @@ -279,7 +279,7 @@ void DialogNoise::revertToCurrent() void DialogNoise::addLevel() { NoiseLevel level; - + level.height = 0.1; level.scaling = 0.1; level.xoffset = 0.0; @@ -288,20 +288,20 @@ void DialogNoise::addLevel() noiseAddLevel(_current, level); revertToCurrent(); - + levels->setCurrentRow(levels->count() - 1); } void DialogNoise::removeLevel() { int row; - + row = levels->currentRow(); - + noiseRemoveLevel(_current, _current_level); revertToCurrent(); - + if (row >= levels->count()) { row--; @@ -312,13 +312,13 @@ void DialogNoise::removeLevel() void DialogNoise::functionChanged() { NoiseFunction function; - + function.algorithm = (NoiseFunctionAlgorithm)function_algo->currentIndex(); function.ridge_factor = (double)function_ridge->value() * 0.05; - + noiseSetFunction(_current, &function); noiseValidate(_current); - + previewLevel->redraw(); previewTotal->redraw(); } diff --git a/gui_qt/explorerchunksky.cpp b/gui_qt/explorerchunksky.cpp index 1449571..e73d6d3 100644 --- a/gui_qt/explorerchunksky.cpp +++ b/gui_qt/explorerchunksky.cpp @@ -8,12 +8,12 @@ ExplorerChunkSky::ExplorerChunkSky(Renderer* renderer, double size, SkyboxOrient { _box_size = size; _orientation = orientation; - + setMaxTextureSize(256); maintain(); } -void ExplorerChunkSky::onRenderEvent(QGLWidget* widget) +void ExplorerChunkSky::onRenderEvent(QGLWidget*) { double size = _box_size; Vector3 camera = renderer()->camera_location; @@ -85,7 +85,7 @@ void ExplorerChunkSky::onRenderEvent(QGLWidget* widget) glEnd(); } -double ExplorerChunkSky::getDisplayedSizeHint(CameraDefinition* camera) +double ExplorerChunkSky::getDisplayedSizeHint(CameraDefinition*) { return 1000.0; } @@ -93,10 +93,10 @@ double ExplorerChunkSky::getDisplayedSizeHint(CameraDefinition* camera) Color ExplorerChunkSky::getTextureColor(double x, double y) { Vector3 location; - + x -= 0.5; y -= 0.5; - + switch(_orientation) { case SKYBOX_NORTH: diff --git a/gui_qt/explorerchunkterrain.cpp b/gui_qt/explorerchunkterrain.cpp index 354b2cb..80c3bfc 100644 --- a/gui_qt/explorerchunkterrain.cpp +++ b/gui_qt/explorerchunkterrain.cpp @@ -94,7 +94,7 @@ void ExplorerChunkTerrain::onCameraEvent(CameraDefinition* camera) _lock_data.unlock(); } -void ExplorerChunkTerrain::onRenderEvent(QGLWidget* widget) +void ExplorerChunkTerrain::onRenderEvent(QGLWidget*) { _lock_data.lock(); int tessellation_size = _tessellation_current_size; diff --git a/gui_qt/formatmosphere.cpp b/gui_qt/formatmosphere.cpp index 5f42e8a..a8abca3 100644 --- a/gui_qt/formatmosphere.cpp +++ b/gui_qt/formatmosphere.cpp @@ -77,7 +77,8 @@ FormAtmosphere::FormAtmosphere(QWidget *parent): addPreview(previewEast, QString(tr("East preview"))); addInputEnum(tr("Color model"), (int*)&_definition->model, QStringList(tr("Preetham/Shirley analytic model")) << tr("Bruneton/Neyret precomputed model")); - addInputDouble(tr("Day time"), &_definition->daytime, 0.14, 0.86, 0.002, 0.1); + addInputInt(tr("Day time (hour)"), &_definition->hour, 0, 23, 1, 10); + addInputInt(tr("Day time (minute)"), &_definition->minute, 0, 59, 1, 10); addInputColor(tr("Sun color"), &_definition->sun_color); addInputDouble(tr("Sun radius"), &_definition->sun_radius, 0.0, 0.4, 0.004, 0.04); addInputDouble(tr("Sun halo radius"), &_definition->sun_halo_size, 0.0, 0.4, 0.004, 0.04); diff --git a/gui_qt/formclouds.cpp b/gui_qt/formclouds.cpp index 7a1c64e..760f9c7 100644 --- a/gui_qt/formclouds.cpp +++ b/gui_qt/formclouds.cpp @@ -47,7 +47,7 @@ protected: { cloudsLayerCopyDefinition(_original_layer, _preview_layer); } - static Color _applyLightStatus(Renderer* renderer, LightStatus* status, Vector3 location, Vector3 normal, SurfaceMaterial material) + static Color _applyLightStatus(Renderer*, LightStatus*, Vector3, Vector3, SurfaceMaterial) { return COLOR_WHITE; } diff --git a/gui_qt/mainwindow.cpp b/gui_qt/mainwindow.cpp index 85c828f..eaa8086 100644 --- a/gui_qt/mainwindow.cpp +++ b/gui_qt/mainwindow.cpp @@ -56,7 +56,7 @@ int main(int argc, char** argv) app.installTranslator(&qtTranslator); } - splash->showMessage(app.tr("Preloading..."), Qt::AlignCenter, Qt::white); + //splash->showMessage(app.tr("Preloading..."), Qt::AlignCenter, Qt::white); app.processEvents(); paysagesInit(); @@ -184,7 +184,6 @@ void MainWindow::fileNew() if (QMessageBox::question(this, tr("Paysages 3D - New scenery"), tr("Do you want to start a new scenery ? Any unsaved changes will be lost."), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { autoGenRealisticLandscape(0); - autoSetDaytime(8, 30); refreshAll(); } } diff --git a/lib_paysages/atmosphere/basic.c b/lib_paysages/atmosphere/basic.c new file mode 100644 index 0000000..db6b128 --- /dev/null +++ b/lib_paysages/atmosphere/basic.c @@ -0,0 +1,41 @@ +#include "private.h" + +#include +#include +#include "../renderer.h" + +Color basicApplyAerialPerspective(Renderer* renderer, Vector3 location, Color base) +{ + Vector3 direction = v3Sub(location, renderer->camera_location); + double distance = v3Norm(direction); + AtmosphereDefinition* definition = renderer->atmosphere->definition; + double near = 10.0 - definition->humidity * 10.0; + double far = 100.0 - definition->humidity * 90.0; + double max = 0.85 + definition->humidity * 0.12; + + assert(near < far); + + if (distance < near) + { + return base; + } + else + { + if (distance > far) + { + distance = far; + } + double factor = (distance - near) / (far - near); + + /* TODO Get sky color without celestial objects (sun, stars...) */ + double angle = (1.0 - factor) * (1.0 - factor) * (1.0 - factor) * (1.0 - factor) * M_PI_4; + direction = v3Normalize(direction); + direction.y = sin(angle); + Color sky = renderer->atmosphere->getSkyColor(renderer, v3Normalize(direction)); + + sky.a = max * factor; + colorMask(&base, &sky); + + return base; + } +} diff --git a/lib_paysages/atmosphere/bruneton.c b/lib_paysages/atmosphere/bruneton.c index d47acca..8502559 100644 --- a/lib_paysages/atmosphere/bruneton.c +++ b/lib_paysages/atmosphere/bruneton.c @@ -25,7 +25,7 @@ static const double exposure = 0.4; static const double ISun = 100.0; static const double AVERAGE_GROUND_REFLECTANCE = 0.1; -#if 0 +#if 1 #define RES_MU 128 #define RES_MU_S 32 #define RES_R 32 diff --git a/lib_paysages/atmosphere/main.c b/lib_paysages/atmosphere/main.c index a5af481..a721362 100644 --- a/lib_paysages/atmosphere/main.c +++ b/lib_paysages/atmosphere/main.c @@ -23,7 +23,24 @@ static int _inited = 0; /******************** Definition ********************/ static void _validateDefinition(AtmosphereDefinition* definition) { - UNUSED(definition); + if (definition->hour < 0) + { + definition->hour = 0; + } + if (definition->hour > 23) + { + definition->hour = 23; + } + if (definition->minute < 0) + { + definition->minute = 0; + } + if (definition->minute > 59) + { + definition->minute = 59; + } + + definition->_daytime = (double)definition->hour / 24.0 + (double)definition->minute / 1440.0; } static AtmosphereDefinition* _createDefinition() @@ -54,7 +71,8 @@ static void _deleteDefinition(AtmosphereDefinition* definition) static void _copyDefinition(AtmosphereDefinition* source, AtmosphereDefinition* destination) { destination->model = source->model; - destination->daytime = source->daytime; + destination->hour = source->hour; + destination->minute = source->minute; destination->sun_color = source->sun_color; destination->sun_radius = source->sun_radius; destination->sun_halo_size = source->sun_halo_size; @@ -69,7 +87,8 @@ static void _copyDefinition(AtmosphereDefinition* source, AtmosphereDefinition* static void _saveDefinition(PackStream* stream, AtmosphereDefinition* definition) { packWriteInt(stream, (int*)&definition->model); - packWriteDouble(stream, &definition->daytime); + packWriteInt(stream, &definition->hour); + packWriteInt(stream, &definition->minute); colorSave(stream, &definition->sun_color); packWriteDouble(stream, &definition->sun_radius); packWriteDouble(stream, &definition->sun_halo_size); @@ -81,7 +100,8 @@ static void _saveDefinition(PackStream* stream, AtmosphereDefinition* definition static void _loadDefinition(PackStream* stream, AtmosphereDefinition* definition) { packReadInt(stream, (int*)&definition->model); - packReadDouble(stream, &definition->daytime); + packReadInt(stream, &definition->hour); + packReadInt(stream, &definition->minute); colorLoad(stream, &definition->sun_color); packReadDouble(stream, &definition->sun_radius); packReadDouble(stream, &definition->sun_halo_size); @@ -175,7 +195,7 @@ static Color _getSkyColor(Renderer* renderer, Vector3 direction) static Vector3 _getSunDirection(Renderer* renderer) { Vector3 result; - double sun_angle = (renderer->atmosphere->definition->daytime + 0.75) * M_PI * 2.0; + double sun_angle = (renderer->atmosphere->definition->_daytime + 0.75) * M_PI * 2.0; result.x = cos(sun_angle); result.y = sin(sun_angle); result.z = 0.0; @@ -207,7 +227,7 @@ static int _getSkydomeLights(Renderer* renderer, LightDefinition* lights, int ma { definition = renderer->atmosphere->definition; - sun_angle = (definition->daytime + 0.75) * M_PI * 2.0; + sun_angle = (definition->_daytime + 0.75) * M_PI * 2.0; sun_direction.x = cos(sun_angle); sun_direction.y = sin(sun_angle); sun_direction.z = 0.0; @@ -321,14 +341,11 @@ static void _bindRenderer(AtmosphereRenderer* renderer, AtmosphereDefinition* de switch (definition->model) { - case ATMOSPHERE_MODEL_PREETHAM: - renderer->applyAerialPerspective = preethamApplyAerialPerspective; - break; case ATMOSPHERE_MODEL_BRUNETON: renderer->applyAerialPerspective = brunetonApplyAerialPerspective; break; default: - renderer->applyAerialPerspective = _fakeApplyAerialPerspective; + renderer->applyAerialPerspective = basicApplyAerialPerspective; } mutexAcquire(cache->lock); diff --git a/lib_paysages/atmosphere/preetham.c b/lib_paysages/atmosphere/preetham.c index 5a68801..9f9650d 100644 --- a/lib_paysages/atmosphere/preetham.c +++ b/lib_paysages/atmosphere/preetham.c @@ -135,33 +135,3 @@ Color preethamGetSkyColor(AtmosphereDefinition* definition, Vector3 eye, Vector3 colorMask(&result, &humidity_color); return result; } - -Color preethamApplyAerialPerspective(Renderer* renderer, Vector3 location, Color base) -{ - Vector3 ray = v3Sub(location, renderer->camera_location); - Vector3 direction = v3Normalize(ray); - double distance = v3Norm(ray); - AtmosphereDefinition* definition = renderer->atmosphere->definition; - double near = 10.0 - definition->humidity * 10.0; - double far = 100.0 - definition->humidity * 90.0; - double max = 0.85 + definition->humidity * 0.12; - - assert(near < far); - - if (distance < near) - { - return base; - } - else - { - Vector3 sun_position = renderer->atmosphere->getSunDirection(renderer); - Color sky = preethamGetSkyColor(definition, renderer->camera_location, direction, sun_position); - if (distance > far) - { - distance = far; - } - sky.a = max * ((distance - near) / (far - near)); - colorMask(&base, &sky); - return base; - } -} diff --git a/lib_paysages/atmosphere/presets.c b/lib_paysages/atmosphere/presets.c index e64d72e..eccdb04 100644 --- a/lib_paysages/atmosphere/presets.c +++ b/lib_paysages/atmosphere/presets.c @@ -22,30 +22,35 @@ void atmosphereAutoPreset(AtmosphereDefinition* definition, AtmospherePreset pre { case ATMOSPHERE_PRESET_CLEAR_DAY: definition->model = ATMOSPHERE_MODEL_BRUNETON; - definition->daytime = 0.4; + definition->hour = 15; + definition->minute = 0; definition->dome_lighting = 0.6; break; case ATMOSPHERE_PRESET_CLEAR_SUNSET: definition->model = ATMOSPHERE_MODEL_BRUNETON; - definition->daytime = 0.74; + definition->hour = 17; + definition->minute = 45; definition->dome_lighting = 0.8; definition->sun_radius = 0.03; break; case ATMOSPHERE_PRESET_HAZY_MORNING: definition->model = ATMOSPHERE_MODEL_PREETHAM; - definition->daytime = 0.3; + definition->hour = 8; + definition->minute = 30; definition->dome_lighting = 0.5; definition->humidity = 0.3; break; case ATMOSPHERE_PRESET_FOGGY: definition->model = ATMOSPHERE_MODEL_PREETHAM; - definition->daytime = 0.4; + definition->hour = 15; + definition->minute = 0; definition->dome_lighting = 0.7; definition->humidity = 0.6; break; case ATMOSPHERE_PRESET_STORMY: definition->model = ATMOSPHERE_MODEL_PREETHAM; - definition->daytime = 0.4; + definition->hour = 15; + definition->minute = 0; definition->dome_lighting = 0.3; definition->humidity = 0.9; break; diff --git a/lib_paysages/atmosphere/private.h b/lib_paysages/atmosphere/private.h index 35967a4..cee96cd 100644 --- a/lib_paysages/atmosphere/private.h +++ b/lib_paysages/atmosphere/private.h @@ -5,11 +5,12 @@ #define SPHERE_SIZE 1000.0 +Color basicApplyAerialPerspective(Renderer* renderer, Vector3 location, Color base); + void brunetonInit(); Color brunetonGetSkyColor(AtmosphereDefinition* definition, Vector3 eye, Vector3 direction, Vector3 sun_position); Color brunetonApplyAerialPerspective(Renderer* renderer, Vector3 location, Color base); Color preethamGetSkyColor(AtmosphereDefinition* definition, Vector3 eye, Vector3 direction, Vector3 sun_position); -Color preethamApplyAerialPerspective(Renderer* renderer, Vector3 location, Color base); #endif diff --git a/lib_paysages/atmosphere/public.h b/lib_paysages/atmosphere/public.h index d228c55..2d8640d 100644 --- a/lib_paysages/atmosphere/public.h +++ b/lib_paysages/atmosphere/public.h @@ -29,13 +29,16 @@ typedef enum typedef struct { AtmosphereModel model; - double daytime; + int hour; + int minute; double humidity; Color sun_color; double sun_radius; double sun_halo_size; Curve* sun_halo_profile; double dome_lighting; + + double _daytime; } AtmosphereDefinition; typedef int (*FuncAtmosphereGetSkydomeLights)(Renderer* renderer, LightDefinition* array, int max_lights); diff --git a/lib_paysages/auto.c b/lib_paysages/auto.c index 489617f..e2ad864 100644 --- a/lib_paysages/auto.c +++ b/lib_paysages/auto.c @@ -16,28 +16,6 @@ #include "water.h" #include "zone.h" -void autoSetDaytime(int hour, int minute) -{ - autoSetDaytimeFraction((double)hour / 24.0 + (double)minute / 1440.0); -} - -void autoSetDaytimeFraction(double daytime) -{ - AtmosphereDefinition* atmosphere; - - daytime = fmod(daytime, 1.0); - if (daytime < 0.0) - { - daytime += 1.0; - } - - atmosphere = AtmosphereDefinitionClass.create(); - sceneryGetAtmosphere(atmosphere); - atmosphere->daytime = daytime; - scenerySetAtmosphere(atmosphere); - AtmosphereDefinitionClass.destroy(atmosphere); -} - void autoGenRealisticLandscape(int seed) { WaterDefinition water; diff --git a/lib_paysages/auto.h b/lib_paysages/auto.h index b7a9ca1..341594a 100644 --- a/lib_paysages/auto.h +++ b/lib_paysages/auto.h @@ -7,8 +7,6 @@ extern "C" { #endif -void autoSetDaytime(int hour, int minute); -void autoSetDaytimeFraction(double daytime); void autoGenRealisticLandscape(int seed); #ifdef __cplusplus diff --git a/lib_paysages/main.c b/lib_paysages/main.c index a3440ec..e9dc38a 100644 --- a/lib_paysages/main.c +++ b/lib_paysages/main.c @@ -32,7 +32,6 @@ void paysagesInit() cameraDeleteDefinition(&camera); autoGenRealisticLandscape(0); - autoSetDaytime(8, 30); // DEBUG /*double last_height, height, x; @@ -52,7 +51,7 @@ void paysagesQuit() { sceneryQuit(); renderQuit(); - + openclQuit(); } @@ -60,21 +59,21 @@ FileOperationResult paysagesSave(char* filepath) { PackStream* stream = packWriteFile(filepath); double app_header, version_header; - + if (!stream) { return FILE_OPERATION_IOERROR; } - + app_header = (double)APP_HEADER; packWriteDouble(stream, &app_header); version_header = (double)PAYSAGES_CURRENT_DATA_VERSION; packWriteDouble(stream, &version_header); - + scenerySave(stream); - + packCloseStream(stream); - + return FILE_OPERATION_OK; } @@ -94,7 +93,7 @@ FileOperationResult paysagesLoad(char* filepath) packCloseStream(stream); return FILE_OPERATION_APP_MISMATCH; } - + packReadDouble(stream, &version_header); if ((int)version_header != PAYSAGES_CURRENT_DATA_VERSION) { @@ -105,6 +104,6 @@ FileOperationResult paysagesLoad(char* filepath) sceneryLoad(stream); packCloseStream(stream); - + return FILE_OPERATION_OK; }