/*
    Raydium - CQFD Corp.
    http://raydium.org/
    Released under both BSD license and Lesser GPL library license.
    See "license.txt" file.
*/

#ifndef DONT_INCLUDE_HEADERS
#include "index.h"
#else
#include "headers/fog.h"

#endif

void raydium_fog_enable(void)
{
raydium_fog_enabled_tag=1;
raydium_fog_apply();
}

void raydium_fog_disable(void)
{
raydium_fog_enabled_tag=0;
raydium_fog_apply();
}

void raydium_fog_color_update(void)
{
glFogfv(GL_FOG_COLOR,raydium_background_color);
}

void raydium_fog_mode(GLuint mode)
{
raydium_fog_mode_value=mode;
}

void raydium_fog_density(GLfloat density)
{
raydium_fog_density_value=density;
}

void raydium_fog_near(GLfloat fnear)
{
raydium_fog_near_value=fnear;
}

void raydium_fog_far(GLfloat ffar)
{
raydium_fog_far_value=ffar;
}

void raydium_fog_apply(void)
{

if(raydium_fog_enabled_tag)
{
    glEnable(GL_FOG);
    glFogi(GL_FOG_MODE,raydium_fog_mode_value);
    raydium_fog_color_update();
    glFogf(GL_FOG_DENSITY, raydium_fog_density_value);
    glHint(GL_FOG_HINT, GL_FASTEST);

    if(raydium_fog_far_value==0)
        {
        raydium_fog_far_value=raydium_projection_far;
        raydium_fog_near_value=raydium_projection_far/4.f;
        }

    glFogf(GL_FOG_START,raydium_fog_near_value);
    glFogf(GL_FOG_END,raydium_fog_far_value);
    }
    else
    {
    glDisable(GL_FOG);
    }
}


void raydium_fog_wait(void)
{
glDisable(GL_FOG);
}

void raydium_fog_init(void)
{
raydium_fog_far_value=0;
raydium_fog_near_value=0;
raydium_fog_density_value=0;
raydium_fog_mode_value=RAYDIUM_FOG_MODE_LINEAR;
raydium_fog_volumetric_enabled_tag=0;


if(RENDER_VOLUMETRIC_FOG_AXIS<0 || RENDER_VOLUMETRIC_FOG_AXIS>2)
    {
        raydium_log("fog: FAILED: RENDER_VOLUMETRIC_FOG_AXIS is broken !");
        exit(100);
    }

raydium_fog_volumetric_axis=RENDER_VOLUMETRIC_FOG_AXIS;

raydium_fog_enable();
raydium_log("fog: OK");
}

void raydium_fog_volumetric_support(void)
{
raydium_fog_volumetric_enabled_tag=1;
}

void raydium_fog_volumetric_enable(void)
{
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
}

void raydium_fog_volumetric_disable(void)
{
glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
}