#ifndef _FOG_H
#define _FOG_H
/*=
Fog
500
**/

// Introduction
/**
Fog is usefull for two major reasons:

1. Realism: Just try, and you'll understand:
amazing depth impression, no ?

2. Speed: For a correct fog effect (i'm talking
about estetic aspect), you must bring near_clipping to a closer value,
reducing the overall number of triangles displayed at the same time.

There are 3 types of fog. They are:
* Linear: fog = (Far-z) / (Far-Near)
* Exp: fog = e^(-density*z)
* Exp2: fog = e^((-density*z)^2)

Above ##z## is the distance to the calculated point from the camera.
As you can see, linear mode doesn't use ##density##, and Exp & Exp2 modes don't
use near and far values. Remember that.
**/

__rayapi void raydium_fog_enable (void);
/**
Obvious
**/

__rayapi void raydium_fog_disable (void);
/**
Obvious
**/

__rayapi void raydium_fog_color_update (void);
/**
If you have modified ##raydium_background_color## array, you must
call this function, applying the specified color to hardware.
See also: ##raydium_background_color_change##
**/

__rayapi void raydium_fog_mode(GLuint mode);
/**
The fog mode can be change with this function. There are 3 different ways
to apply the fog:

1. ##RAYDIUM_FOG_MODE_LINEAR## - Used by default, the fog is directly applied
according the distance. Not real world fog, but used to avoid drawing
too distant objects.
##IMPORTANT##: LINEAR mode ignores the ##density## value,
only uses ##near## and ##far##.

2. ##RAYDIUM_FOG_MODE_EXP## - The fog grows exponentially with the distance.
Usual mist in the real world.
##IMPORTANT##: EXP mode ignores the ##near## and ##far## values,
only uses the ##density##.

3. ##RAYDIUM_FOG_MODE_EXP2## - The fog grows twice exponentially with the
distance. Used when the observer is inside a cloud/mist.
##IMPORTANT##: EXP2 mode ignores the ##near## and ##far## values,
only uses the ##density##.
**/

__rayapi void raydium_fog_density(GLfloat density);
/**
Sets the density of the fog.
Useless if you are using LINEAR mode.
**/

__rayapi void raydium_fog_near(GLfloat near);
/**
Sets the near point to apply the fog.
Useless if you are using EXP or EXP2 modes.
**/

__rayapi void raydium_fog_far(GLfloat far);
/**
Sets the far point of the fog.
Useless if you are using EXP or EXP2 modes.
**/

__rayapi void raydium_fog_apply(void);
/**
Used to apply changes in your setup of fog.
Also is used to continue a previously stopped fog.
See: ##raydium_fog_wait()## below.
**/

__rayapi void raydium_fog_wait(void);
/**
With this function you can deactivate TEMPORALY the fog, but the internal state
of the fog in Raydium won't change, so when you use raydium_fog_apply, the fog
will continue like it was before being stoped.
It's very usefull for certain rendering effects that need to
stop the fog temporaly.
**/

__rayapi void raydium_fog_volumetric_support(void);
/**
With this function, you're saying to Raydium that you want a support
for volumetric fog in you application. Call this function as soon as possible
after engine init, since it will change the way Raydium renders objects (think
about display lists).
**/

__rayapi void raydium_fog_volumetric_enable(void);
/**
When you call this function, fog is no more applied using fragment depth,
but using ##RENDER_VOLUMETRIC_FOG_AXIS## (see config.h).
You must have called ##raydium_fog_volumetric_support()## before enabling
volumetric fog.
**/

__rayapi void raydium_fog_volumetric_disable(void);
/**
Reset fog sytem to default behavior (fragment depth).
**/


#endif
