paysages: Fog has been refactored in an 'atmosphere' module.

git-svn-id: https://subversion.assembla.com/svn/thunderk/paysages@235 b1fd45b6-86a6-48da-8261-f70d1f35bdcc
This commit is contained in:
Michaël Lemaire 2012-01-24 15:47:49 +00:00 committed by ThunderK
parent 932693a24d
commit 1e922ccbce
10 changed files with 178 additions and 65 deletions

2
TODO
View file

@ -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.

100
lib_paysages/atmosphere.c Normal file
View file

@ -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;
}

36
lib_paysages/atmosphere.h Normal file
View file

@ -0,0 +1,36 @@
#ifndef _PAYSAGES_ATMOSPHERE_H_
#define _PAYSAGES_ATMOSPHERE_H_
#include "shared/types.h"
#include "lighting.h"
#include <stdio.h>
#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

View file

@ -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)

View file

@ -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;
}

View file

@ -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;*/
}

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -1,3 +1,5 @@
#include "sky.h"
#include <stdlib.h>
#include <math.h>
@ -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