st and vicente see this a time, but i dont add so many features, for be exact, i am a noob on the shaders, and the problems of the portable water is dfficult.... for start, the ode objects are not in the water, the water hide them... secondly, they are not reflexions, beacause it draw the land +x time...
there is the source code:
water.c
Code:
/*
Raydium - CQFD Corp.
http://raydium.org/
Released under both BSD license and Lesser GPL library license.
See "license.txt" file.
*/
void raydium_effect_water(char model[RAYDIUM_MAX_NAME_LEN],int height) {
float water_color[4]={0.5f, 0.6f, 0.6f, 1.0f};
double plane_reflection[4] = {0.0, 0.0, 1.0, -height}; //it bug if is not here !/
raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
tmp=1;
while(tmp<=raydium_window_tx &&
tmp<=raydium_window_ty &&
tmp<=raydium_texture_size_max)
{
tmp*=2;
}
water_textures_size=tmp/2;
raydium_texture_load_internal("","reflection",1,water_textures_size,water_textures_size,4,-1);
raydium_texture_load_internal("","refraction",1,water_textures_size,water_textures_size,4,-1);
raydium_shader_load("water","water.vert","water.frag");
raydium_shader_var_i_name("water","reflection",0);
raydium_shader_var_i_name("water","refraction",1);
raydium_shader_var_i_name("water","normalMap",2);
raydium_shader_var_i_name("water","dudvMap",3);
raydium_shader_var_4f_name("water","waterColor", water_color[0], water_color[1], water_color[2], water_color[3]);
raydium_init_cli_option("model",model);
raydium_shader_var_4f_name("water","lightPos",raydium_light_position[0][0],raydium_light_position[0][1],raydium_light_position[0][2],1.0f);
/* //NEED TO FIX THE REFLEXION BUG!!
/////////////////////////////////////////////
// create reflection
glViewport(0,0, water_textures_size, water_textures_size);
glScalef(1.0, 1.0, -1.0);
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);// glClear ok ...
raydium_camera_replace(); // cancels the glScalef ...
glTranslatef(0.0f, 0.0f, height*2.0f);
glScalef(1.0, 1.0, -1.0);
glPushMatrix();
{
float a,b,c;
a=raydium_light_position[0][0];
b=raydium_light_position[0][1];
c=raydium_light_position[0][2];
raydium_light_position[0][0]*=-1;
raydium_light_position[0][1]*=-1;
raydium_light_update_position_all();
glEnable(GL_CLIP_PLANE0);
glClipPlane(GL_CLIP_PLANE0, plane_reflection);
raydium_object_draw_name(model);
raydium_light_position[0][0]=a;
raydium_light_position[0][1]=b;
raydium_light_position[0][2]=c;
}
raydium_particle_draw_all();
glDisable(GL_CLIP_PLANE0);
glPopMatrix();
glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("reflection"));
glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
raydium_rendering_internal_restore_render_state();
*/
// create refraction
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glViewport(0,0, water_textures_size, water_textures_size);
raydium_camera_replace();
raydium_light_update_position_all();
{
float zero[]={0,0,0,0};
glEnable(GL_FOG);
glFogf(GL_FOG_START,0.1);
glFogf(GL_FOG_END,2);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogfv(GL_FOG_COLOR,zero);
raydium_fog_volumetric_enable();
}
raydium_object_draw_name(model);
glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("refraction"));
glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
raydium_fog_volumetric_disable();
raydium_fog_apply();
raydium_rendering_internal_restore_render_state();
// regular rendering
glViewport(0, 0, raydium_window_tx, raydium_window_ty);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
raydium_camera_replace();
raydium_object_draw_name(model);
raydium_rendering_internal_restore_render_state();
// rendering water
// prepare texunits
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,raydium_texture_find_by_name("reflection"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,raydium_texture_find_by_name("refraction"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,raydium_texture_find_by_name("water_nmap_0.tga"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,raydium_texture_find_by_name("water_dudvmap_0.tga"));
// activate shader
raydium_shader_current_name("water");
// draw quad
{
// Create a static variable for the movement of the water
static float move = 0.0f;
// Use this variable for the normal map and make it slower
// than the refraction map's speed. We want the refraction
// map to be jittery, but not the normal map's waviness.
float move2 = move * kNormalMapScale;
// Set the refraction map's UV coordinates to our global g_WaterUV
float refrUV = g_WaterUV;
// Set our normal map's UV scale and shrink it by kNormalMapScale
float normalUV = g_WaterUV * kNormalMapScale;
float low=-100;
float high=100;
// Move the water by our global speed
//printf("%f\n",raydium_frame_time);
move += (g_WaterFlow*raydium_frame_time);
glBegin(GL_QUADS);
// The back left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, refrUV - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, low, height);
// The front left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, high, height);
// The front right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, 0.0f - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, high, height);
// The back right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, refrUV - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, low, height);
glEnd();
}
raydium_shader_current(-1);
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,0);
if(raydium_key[GLUT_KEY_F12])
{
raydium_osd_draw_name("reflection",0,0,20,20);
raydium_osd_draw_name("refraction",80,0,100,20);
}
}
//Acid effect: same with green water :D
void raydium_effect_acid(char model[RAYDIUM_MAX_NAME_LEN],int height) {
float water_color[4]={0.0f, 1.0f, 0.0f, 1.0f}; //acid effect
double plane_reflection[4] = {0.0, 0.0, 1.0, -height}; //it bug if is not here !/
raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
tmp=1;
while(tmp<=raydium_window_tx &&
tmp<=raydium_window_ty &&
tmp<=raydium_texture_size_max)
{
tmp*=2;
}
water_textures_size=tmp/2;
raydium_texture_load_internal("","reflection",1,water_textures_size,water_textures_size,4,-1);
raydium_texture_load_internal("","refraction",1,water_textures_size,water_textures_size,4,-1);
raydium_shader_load("water","water.vert","water.frag");
raydium_shader_var_i_name("water","reflection",0);
raydium_shader_var_i_name("water","refraction",1);
raydium_shader_var_i_name("water","normalMap",2);
raydium_shader_var_i_name("water","dudvMap",3);
raydium_shader_var_4f_name("water","waterColor", water_color[0], water_color[1], water_color[2], water_color[3]);
raydium_init_cli_option("model",model);
raydium_shader_var_4f_name("water","lightPos",raydium_light_position[0][0],raydium_light_position[0][1],raydium_light_position[0][2],1.0f);
// create refraction
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glViewport(0,0, water_textures_size, water_textures_size);
raydium_camera_replace();
raydium_light_update_position_all();
{
float zero[]={0,0,0,0};
glEnable(GL_FOG);
glFogf(GL_FOG_START,0.1);
glFogf(GL_FOG_END,2);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogfv(GL_FOG_COLOR,zero);
raydium_fog_volumetric_enable();
}
raydium_object_draw_name(model);
glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("refraction"));
glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
raydium_fog_volumetric_disable();
raydium_fog_apply();
raydium_rendering_internal_restore_render_state();
// regular rendering
glViewport(0, 0, raydium_window_tx, raydium_window_ty);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
raydium_camera_replace();
raydium_object_draw_name(model);
raydium_rendering_internal_restore_render_state();
// rendering water
// prepare texunits
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,raydium_texture_find_by_name("reflection"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,raydium_texture_find_by_name("refraction"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,raydium_texture_find_by_name("water_nmap_0.tga"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,raydium_texture_find_by_name("water_dudvmap_0.tga"));
// activate shader
raydium_shader_current_name("water");
// draw quad
{
// Create a static variable for the movement of the water
static float move = 0.0f;
// Use this variable for the normal map and make it slower
// than the refraction map's speed. We want the refraction
// map to be jittery, but not the normal map's waviness.
float move2 = move * kNormalMapScale;
// Set the refraction map's UV coordinates to our global g_WaterUV
float refrUV = g_WaterUV;
// Set our normal map's UV scale and shrink it by kNormalMapScale
float normalUV = g_WaterUV * kNormalMapScale;
float low=-100;
float high=100;
// Move the water by our global speed
//printf("%f\n",raydium_frame_time);
move += (g_WaterFlow*raydium_frame_time);
glBegin(GL_QUADS);
// The back left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, refrUV - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, low, height);
// The front left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, high, height);
// The front right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, 0.0f - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, high, height);
// The back right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, refrUV - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, low, height);
glEnd();
}
raydium_shader_current(-1);
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,0);
}
//Oil: same with black and not really good alpha :D
void raydium_effect_oil(char model[RAYDIUM_MAX_NAME_LEN],int height) {
float water_color[4]={0.05f, 0.05f, 0.05f, 0.5f}; //oil
double plane_reflection[4] = {0.0, 0.0, 1.0, -height}; //it bug if is not here !/
raydium_register_variable(&speed, RAYDIUM_REGISTER_FLOAT, "speed");
tmp=1;
while(tmp<=raydium_window_tx &&
tmp<=raydium_window_ty &&
tmp<=raydium_texture_size_max)
{
tmp*=2;
}
water_textures_size=tmp/2;
raydium_texture_load_internal("","reflection",1,water_textures_size,water_textures_size,4,-1);
raydium_texture_load_internal("","refraction",1,water_textures_size,water_textures_size,4,-1);
raydium_shader_load("water","water.vert","water.frag");
raydium_shader_var_i_name("water","reflection",0);
raydium_shader_var_i_name("water","refraction",1);
raydium_shader_var_i_name("water","normalMap",2);
raydium_shader_var_i_name("water","dudvMap",3);
raydium_shader_var_4f_name("water","waterColor", water_color[0], water_color[1], water_color[2], water_color[3]);
raydium_init_cli_option("model",model);
raydium_shader_var_4f_name("water","lightPos",raydium_light_position[0][0],raydium_light_position[0][1],raydium_light_position[0][2],1.0f);
// create refraction
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glViewport(0,0, water_textures_size, water_textures_size);
raydium_camera_replace();
raydium_light_update_position_all();
{
float zero[]={0,0,0,0};
glEnable(GL_FOG);
glFogf(GL_FOG_START,0.1);
glFogf(GL_FOG_END,2);
glFogi(GL_FOG_MODE,GL_LINEAR);
glFogfv(GL_FOG_COLOR,zero);
raydium_fog_volumetric_enable();
}
raydium_object_draw_name(model);
glBindTexture(GL_TEXTURE_2D,raydium_texture_find_by_name("refraction"));
glCopyTexSubImage2D(GL_TEXTURE_2D,0, 0,0, 0,0, water_textures_size, water_textures_size);
raydium_fog_volumetric_disable();
raydium_fog_apply();
raydium_rendering_internal_restore_render_state();
// regular rendering
glViewport(0, 0, raydium_window_tx, raydium_window_ty);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
raydium_sky_box_render(raydium_camera_x,raydium_camera_y,raydium_camera_z);
raydium_camera_replace();
raydium_object_draw_name(model);
raydium_rendering_internal_restore_render_state();
// rendering water
// prepare texunits
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,raydium_texture_find_by_name("reflection"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,raydium_texture_find_by_name("refraction"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,raydium_texture_find_by_name("water_nmap_0.tga"));
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,raydium_texture_find_by_name("water_dudvmap_0.tga"));
// activate shader
raydium_shader_current_name("water");
// draw quad
{
// Create a static variable for the movement of the water
static float move = 0.0f;
// Use this variable for the normal map and make it slower
// than the refraction map's speed. We want the refraction
// map to be jittery, but not the normal map's waviness.
float move2 = move * kNormalMapScale;
// Set the refraction map's UV coordinates to our global g_WaterUV
float refrUV = g_WaterUV;
// Set our normal map's UV scale and shrink it by kNormalMapScale
float normalUV = g_WaterUV * kNormalMapScale;
float low=-100;
float high=100;
// Move the water by our global speed
//printf("%f\n",raydium_frame_time);
move += (g_WaterFlow*raydium_frame_time);
glBegin(GL_QUADS);
// The back left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, low, height);
// The front left vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(low, high, height);
// The front right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, 0.0f); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, 0.0f + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, high, height);
// The back right vertice for the water
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_WaterUV, g_WaterUV); // Reflection texture
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, refrUV, refrUV - move); // Refraction texture
glMultiTexCoord2fARB(GL_TEXTURE2_ARB, normalUV, normalUV + move2); // Normal map texture
glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0, 0); // DUDV map texture
glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0, 0); // Depth texture
glVertex3f(high, low, height);
glEnd();
}
raydium_shader_current(-1);
raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,0);
raydium_rendering_prepare_texture_unit(GL_TEXTURE3_ARB,0);
}
effects.h
Code:
/*
Raydium - CQFD Corp.
http://raydium.org/
Released under both BSD license and Lesser GPL library license.
See "license.txt" file.
*/
//water.h: water effect tests
#define RAYDIUM_MAX_LENS_FLARE 5
GLfloat speed = 0.1;
GLint sensibilite = 3;
GLint lacet = 0;
const float kNormalMapScale = 0.25f;
GLfloat light_color[] = {1.0, 0.9, 0.8, 1.0};
GLfloat *back_color=light_color;
static GLfloat secs=0;
float speed,direct;
int tmp;
//water
GLint water_textures_size;
float water_color[4]={0.5f, 0.6f, 0.6f, 1.0f};
GLfloat water_height=0.0;
float g_WaterFlow = 0.12f;
float g_WaterUV = 35.0f;
//not for now, bug with acid :/
//acid
GLint acid_textures_size;
float acid_color[4]={0.0f, 1.0f, 0.0f, 1.0f}; //acid effect
GLfloat acid_height=0.0;
float g_acidFlow = 0.12f;
float g_acidUV = 35.0f;
//oil
float oil_color[4]={0.08f, 0.08f, 0.08f, 0.5f}; //oil
GLint oil_textures_size;
GLfloat oil_height=0.0;
float g_oilFlow = 0.12f;
float g_oilUV = 35.0f;
if anyone wants to add things on it ...
(or remake the shader system for make crysis
, yes Xfennec, all is shader, now...
)