diff --git a/TODO b/TODO index f01c12e..90006fe 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,6 @@ - Refactor fog in a new 'atmosphere' module. +- Make multi-lights work, to restore lighting from skydome. - In GUI, revertConfig should lock the previews while reverting. - All Save and Load methods should have same signature : void ...Save(FILE*, ...*) - All noises should use the same entropy pool (saved separately), and avoid reallocs. - Remove all global variables (render_quality, render_width...), it should all be set in Renderer. -- Make multi-lights work, to restore lighting from skydome. diff --git a/lib_paysages/atmosphere.c b/lib_paysages/atmosphere.c new file mode 100644 index 0000000..5f1133e --- /dev/null +++ b/lib_paysages/atmosphere.c @@ -0,0 +1,100 @@ +#include "atmosphere.h" +#include "shared/functions.h" +#include "shared/constants.h" +#include "scenery.h" + +void atmosphereInit() +{ +} + +void atmosphereSave(FILE* f, AtmosphereDefinition* definition) +{ + toolsSaveDouble(f, definition->distance_near); + toolsSaveDouble(f, definition->distance_far); + toolsSaveDouble(f, definition->full_mask); + toolsSaveInt(f, definition->auto_lock_on_haze); + colorSave(definition->color, f); +} + +void atmosphereLoad(FILE* f, AtmosphereDefinition* definition) +{ + definition->distance_near = toolsLoadDouble(f); + definition->distance_far = toolsLoadDouble(f); + definition->full_mask = toolsLoadDouble(f); + definition->auto_lock_on_haze = toolsLoadInt(f); + definition->color = colorLoad(f); + + atmosphereValidateDefinition(definition); +} + +AtmosphereDefinition atmosphereCreateDefinition() +{ + AtmosphereDefinition definition; + + definition.distance_near = 0.0; + definition.distance_far = 1.0; + definition.full_mask = 0.0; + definition.auto_lock_on_haze = 0; + definition.color = COLOR_BLACK; + + atmosphereValidateDefinition(&definition); + + return definition; +} + +void atmosphereDeleteDefinition(AtmosphereDefinition* definition) +{ +} + +void atmosphereCopyDefinition(AtmosphereDefinition* source, AtmosphereDefinition* destination) +{ + *destination = *source; +} + +void atmosphereValidateDefinition(AtmosphereDefinition* definition) +{ + SkyDefinition sky; + + if (definition->distance_far <= definition->distance_near) + { + definition->distance_far = definition->distance_near + 1.0; + } + if (definition->full_mask < 0.0) + { + definition->full_mask = 0.0; + } + if (definition->full_mask > 1.0) + { + definition->full_mask = 1.0; + } + if (definition->auto_lock_on_haze) + { + sky = skyCreateDefinition(); + sceneryGetSky(&sky); + definition->color = colorGradationGet(&sky.haze_color, sky.daytime); + skyDeleteDefinition(&sky); + } +} + +Color atmosphereApply(AtmosphereDefinition* definition, Renderer* renderer, Vector3 location, Color base) +{ + Color mask = definition->color; + double distance = v3Norm(v3Sub(renderer->camera_location, location)); + double value; + + if (distance < definition->distance_near) + { + return base; + } + else if (distance > definition->distance_far) + { + distance = definition->distance_far; + } + + value = definition->full_mask * (distance - definition->distance_near) / (definition->distance_far - definition->distance_near); + mask.a = value; + + colorMask(&base, &mask); + + return base; +} diff --git a/lib_paysages/atmosphere.h b/lib_paysages/atmosphere.h new file mode 100644 index 0000000..946a800 --- /dev/null +++ b/lib_paysages/atmosphere.h @@ -0,0 +1,36 @@ +#ifndef _PAYSAGES_ATMOSPHERE_H_ +#define _PAYSAGES_ATMOSPHERE_H_ + +#include "shared/types.h" +#include "lighting.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + double distance_near; + double distance_far; + double full_mask; + int auto_lock_on_haze; + Color color; +} AtmosphereDefinition; + +void atmosphereInit(); +void atmosphereSave(FILE* f, AtmosphereDefinition* definition); +void atmosphereLoad(FILE* f, AtmosphereDefinition* definition); + +AtmosphereDefinition atmosphereCreateDefinition(); +void atmosphereDeleteDefinition(AtmosphereDefinition* definition); +void atmosphereCopyDefinition(AtmosphereDefinition* source, AtmosphereDefinition* destination); +void atmosphereValidateDefinition(AtmosphereDefinition* definition); + +Color atmosphereApply(AtmosphereDefinition* definition, Renderer* renderer, Vector3 location, Color base); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib_paysages/auto.c b/lib_paysages/auto.c index 35a96e7..59700bc 100644 --- a/lib_paysages/auto.c +++ b/lib_paysages/auto.c @@ -57,12 +57,11 @@ void autoSetDaytimeFraction(double daytime) sky.daytime = daytime; scenerySetSky(&sky); skyDeleteDefinition(&sky); - - fogSetColor(colorGradationGet(&sky.haze_color, daytime)); } void autoGenRealisticLandscape(int seed) { + AtmosphereDefinition atmosphere; TerrainDefinition terrain; WaterDefinition water; CloudsDefinition clouds; @@ -217,8 +216,14 @@ void autoGenRealisticLandscape(int seed) scenerySetTextures(&textures); texturesDeleteDefinition(&textures); - /* Fog */ - fogSetDistance(20.0, 100.0); + /* Atmosphere */ + atmosphere = atmosphereCreateDefinition(); + atmosphere.distance_near = 20.0; + atmosphere.distance_far = 100.0; + atmosphere.full_mask = 0.6; + atmosphere.auto_lock_on_haze = 1; + scenerySetAtmosphere(&atmosphere); + atmosphereDeleteDefinition(&atmosphere); } void* _renderFirstPass(void* data) diff --git a/lib_paysages/clouds.c b/lib_paysages/clouds.c index 1837a10..9a38e04 100644 --- a/lib_paysages/clouds.c +++ b/lib_paysages/clouds.c @@ -454,6 +454,9 @@ Color cloudsGetLayerColor(CloudsLayerDefinition* definition, Renderer* renderer, col.a = (segments[i].length >= 50.0) ? 1.0 : (segments[i].length / 50.0); colorMask(&result, &col); } + + result = renderer->applyAtmosphere(renderer, start, result); + return result; } diff --git a/lib_paysages/fog.c b/lib_paysages/fog.c deleted file mode 100644 index 36d64cd..0000000 --- a/lib_paysages/fog.c +++ /dev/null @@ -1,51 +0,0 @@ -#include "shared/types.h" -#include "shared/functions.h" -#include "shared/globals.h" -#include "shared/constants.h" - -static double _near = 0.0, _far = 1.0; -static Color _col = {0.0, 0.0, 0.0, 0.0}; - -void fogSave(FILE* f) -{ -} - -void fogLoad(FILE* f) -{ -} - -void fogSetColor(Color col) -{ - _col = col; -} - -void fogSetDistance(double near, double far) -{ - _near = near; - _far = far; -} - -Color fogApplyToLocation(Vector3 location, Color base) -{ - return base; - // TODO Don't use camera_location - /*Color mask = _col; - double distance = v3Norm(v3Sub(camera_location, location)); - double value; - - if (distance < _near) - { - return base; - } - else if (distance > _far) - { - distance = _far; - } - - value = 0.8 * (distance - _near) / (_far - _near); - - mask.a *= value; - colorMask(&base, &mask); - return base;*/ -} - diff --git a/lib_paysages/scenery.c b/lib_paysages/scenery.c index f5217b9..76825de 100644 --- a/lib_paysages/scenery.c +++ b/lib_paysages/scenery.c @@ -5,6 +5,7 @@ #include "system.h" #include "render.h" +AtmosphereDefinition _atmosphere; CameraDefinition _camera; CloudsDefinition _clouds; LightingDefinition _lighting; @@ -15,6 +16,7 @@ WaterDefinition _water; void sceneryInit() { + atmosphereInit(); cameraInit(); cloudsInit(); lightingInit(); @@ -23,6 +25,7 @@ void sceneryInit() texturesInit(); waterInit(); + _atmosphere = atmosphereCreateDefinition(); _camera = cameraCreateDefinition(); _clouds = cloudsCreateDefinition(); _lighting = lightingCreateDefinition(); @@ -36,6 +39,7 @@ void scenerySaveToFile(char* filepath) { FILE* f = fopen(filepath, "wb"); + atmosphereSave(f, &_atmosphere); cameraSave(f, &_camera); cloudsSave(f, &_clouds); lightingSave(f, &_lighting); @@ -53,6 +57,9 @@ void sceneryLoadFromFile(char* filepath) /* TODO Use intermediary definitions ? */ + atmosphereLoad(f, &_atmosphere); + atmosphereValidateDefinition(&_atmosphere); + cameraLoad(f, &_camera); cameraValidateDefinition(&_camera); @@ -77,6 +84,17 @@ void sceneryLoadFromFile(char* filepath) fclose(f); } +void scenerySetAtmosphere(AtmosphereDefinition* atmosphere) +{ + atmosphereCopyDefinition(atmosphere, &_atmosphere); + atmosphereValidateDefinition(&_atmosphere); +} + +void sceneryGetAtmosphere(AtmosphereDefinition* atmosphere) +{ + atmosphereCopyDefinition(&_atmosphere, atmosphere); +} + void scenerySetCamera(CameraDefinition* camera) { cameraCopyDefinition(camera, &_camera); @@ -115,6 +133,7 @@ void scenerySetSky(SkyDefinition* sky) skyCopyDefinition(sky, &_sky); skyValidateDefinition(&_sky); + atmosphereValidateDefinition(&_atmosphere); lightingValidateDefinition(&_lighting); } @@ -230,7 +249,7 @@ static Color _applyTextures(Renderer* renderer, Vector3 location, double precisi static Color _applyAtmosphere(Renderer* renderer, Vector3 location, Color base) { - return fogApplyToLocation(location, base); + return atmosphereApply(&_atmosphere, renderer, location, base); } static Color _applyClouds(Renderer* renderer, Color base, Vector3 start, Vector3 end) @@ -268,6 +287,9 @@ Renderer sceneryGetStandardRenderer(int quality) { Renderer result; + quality = (quality > 10) ? 10 : quality; + quality = (quality < 1) ? 1 : quality; + result.camera_location = _camera.location; result.render_quality = quality; diff --git a/lib_paysages/scenery.h b/lib_paysages/scenery.h index a2cc074..fa44287 100644 --- a/lib_paysages/scenery.h +++ b/lib_paysages/scenery.h @@ -8,6 +8,7 @@ * a standard renderer. */ +#include "atmosphere.h" #include "camera.h" #include "clouds.h" #include "lighting.h" @@ -26,6 +27,9 @@ void sceneryInit(); void scenerySaveToFile(char* filepath); void sceneryLoadFromFile(char* filepath); +void scenerySetAtmosphere(AtmosphereDefinition* atmosphere); +void sceneryGetAtmosphere(AtmosphereDefinition* atmosphere); + void scenerySetCamera(CameraDefinition* camera); void sceneryGetCamera(CameraDefinition* camera); diff --git a/lib_paysages/shared/functions.h b/lib_paysages/shared/functions.h index acb91d8..ade1beb 100644 --- a/lib_paysages/shared/functions.h +++ b/lib_paysages/shared/functions.h @@ -70,13 +70,6 @@ Matrix4 m4NewPerspective(double fov_y, double aspect, double near, double far); double m4Determinant(Matrix4 m); Matrix4 m4Inverse(Matrix4 m); -/* fog.c */ -void fogSave(FILE* f); -void fogLoad(FILE* f); -void fogSetColor(Color col); -void fogSetDistance(double near, double far); -Color fogApplyToLocation(Vector3 location, Color base); - /* tools.c */ double toolsRandom(); double toolsBicubicInterpolate(double stencil[16], double x, double y); diff --git a/lib_paysages/sky.c b/lib_paysages/sky.c index 3afe0d8..956267e 100644 --- a/lib_paysages/sky.c +++ b/lib_paysages/sky.c @@ -1,3 +1,5 @@ +#include "sky.h" + #include #include @@ -7,7 +9,6 @@ #include "shared/constants.h" #include "render.h" #include "clouds.h" -#include "sky.h" #include "lighting.h" #define SPHERE_SIZE 1000.0