ManiaDrive/raydium/render.c.old
2025-01-26 18:33:45 +01:00

249 lines
5.9 KiB
C

/*
Raydium - CQFD Corp.
http://raydium.org/
License: GPL - GNU General Public License, see "gpl.txt" file.
*/
#ifndef DONT_INCLUDE_HEADERS
#include "index.h"
#else
#include "headers/render.h"
#endif
void raydium_callback_image(void);
void raydium_timecall_callback(void);
// EARLY devel stage !
void raydium_rendering_prepare_texture_unit(GLenum tu,GLuint tex)
{
glActiveTextureARB(tu);
if(tex)
{
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,tex);
// glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT);
glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2);
}
else
{
glDisable(GL_TEXTURE_2D);
// glBindTexture(GL_TEXTURE_2D,0);
}
glActiveTextureARB(GL_TEXTURE0_ARB);
}
void raydium_rendering_internal_prepare_texture_render(GLuint tex)
{
//#define ONE 0.8 // default (according GL specs) DIFFUSE value.
GLfloat one[]={0.8f, 0.8f, 0.8f, 1.f};
GLfloat zero[]={0.0,0.0,0.0,0.0};
GLfloat *rgb;
glColor4f(1.f,1.f,1.f,1.f);
// "cache"
if(tex==raydium_texture_internal_loaded) return;
raydium_texture_internal_loaded=tex;
if(raydium_texture_blended[tex]==1)
{
glEnable(GL_BLEND);
glDepthMask(GL_FALSE);
glDisable(GL_ALPHA_TEST);
// glDisable(GL_FOG);
}
if(raydium_texture_blended[tex]==2)
{
glEnable(GL_BLEND);
glDepthMask(GL_TRUE);
glAlphaFunc(GL_GREATER,0);
glEnable (GL_ALPHA_TEST);
// glDisable(GL_FOG);
}
if(raydium_texture_blended[tex]==0)
{
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glDisable(GL_ALPHA_TEST);
// glEnable(GL_FOG);
}
if(raydium_texture_rgb[tex][0]>=0)
{
if(raydium_render_rgb_force_tag)
rgb=raydium_render_rgb_force;
else
rgb=raydium_texture_rgb[tex];
glDisable(GL_TEXTURE_2D);
glColor4f(rgb[0],rgb[1],rgb[2],1.f);
if(raydium_light_enabled_tag)
{
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, rgb);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, rgb);
}
}
else
{
glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, one);
glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT, zero);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,tex);
}
}
void raydium_rendering_internal_restore_render_state(void)
{
//#define ONE 0.8 // default DIFFUSE value.
GLfloat one[]={0.8f, 0.8f, 0.8f, 1.f};
//return; // make no sens to restore state since next texture will reset it
glDisable(GL_BLEND);
glDepthMask(GL_TRUE);
glEnable(GL_TEXTURE_2D);
glMaterialfv( GL_FRONT_AND_BACK, GL_DIFFUSE, one);
}
// 2D quick 'n ugly clipping test
char infov(GLfloat x, GLfloat y)
{
#ifdef RENDER_DEBUG_NO_CLIP
return 1;
#endif
if((x+raydium_camera_cursor_place[0])>(raydium_camera_x-raydium_projection_far) &&
(x+raydium_camera_cursor_place[0])<(raydium_camera_x+raydium_projection_far) &&
(y+raydium_camera_cursor_place[1])>(raydium_camera_y-raydium_projection_far) &&
(y+raydium_camera_cursor_place[1])<(raydium_camera_y+raydium_projection_far) ) return 1; else return 0;
}
void raydium_rendering_from_to(GLuint from, GLuint to)
{
GLuint tex,i,j;
char toload;
for(tex=1;tex<raydium_texture_index;tex++)
{
toload=tex;
for(i=from,j=0;i<to;i+=3)
if(raydium_vertex_texture[i]==tex)
{
if(infov(raydium_vertex_x[i ],raydium_vertex_y[i ]) ||
infov(raydium_vertex_x[i+1],raydium_vertex_y[i+1]) ||
infov(raydium_vertex_x[i+2],raydium_vertex_y[i+2]) )
{
if(toload)
{
raydium_rendering_internal_prepare_texture_render(toload);
raydium_rendering_prepare_texture_unit(GL_TEXTURE1_ARB,raydium_vertex_texture_multi[i]);
#ifndef LIMIT_TO_2_TEXUNITS_DEBUG
raydium_rendering_prepare_texture_unit(GL_TEXTURE2_ARB,raydium_vertex_texture_multi[i]);
#endif
toload=0;
glBegin(GL_TRIANGLES);
}
#ifdef RENDER_DEBUG_TAG
if(raydium_vertex_tag[i ] ||
raydium_vertex_tag[i+1] ||
raydium_vertex_tag[i+2] )
glColor4f(1.f,0.f,1.f,1.f);
else
glColor4f(1.f,1.f,1.f,1.f);
#endif
for(j=0;j<3;j++)
{
glNormal3f(raydium_vertex_normal_visu_x[i+j],raydium_vertex_normal_visu_y[i+j],raydium_vertex_normal_visu_z[i+j]);
//glTexCoord2f(raydium_vertex_texture_u[i+j],raydium_vertex_texture_v[i+j]);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,raydium_vertex_texture_u[i+j],raydium_vertex_texture_v[i+j]);
#define MULTF2 500.f
//#define MULTF 3000.f
#define MULTF 50.f
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,raydium_vertex_texture_u[i+j]*MULTF,raydium_vertex_texture_v[i+j]*MULTF);
#ifndef LIMIT_TO_2_TEXUNITS_DEBUG
glMultiTexCoord2fARB(GL_TEXTURE2_ARB,raydium_vertex_texture_u[i+j]*MULTF2,raydium_vertex_texture_v[i+j]*MULTF2);
#endif
glVertex3f(raydium_vertex_x[i+j], raydium_vertex_y[i+j], raydium_vertex_z[i+j]);
raydium_vertex_counter++;
}
}
}
if(!toload) glEnd();
}
}
void raydium_rendering(void)
{
raydium_rendering_from_to(0,raydium_vertex_index);
}
void raydium_rendering_finish(void)
{
static int fps=0;
static clock_t last=0;
fps++;
if(!last) last=clock();
raydium_callback_image();
glFlush();
raydium_rendering_internal_restore_render_state();
//glutPostRedisplay();
#ifdef DEBUG_MOVIE
{
char name[128];
static int frame;
sprintf(name,"movie/frame%04d.tga",frame);
raydium_capture_frame(name);
frame++;
}
#endif
glutSwapBuffers();
//raydium_timecall_callback();
raydium_key_last=0;
raydium_mouse_clic=0;
raydium_camera_pushed=0;
glPopMatrix();
raydium_texture_internal_loaded=0;
if(clock() > last + CLOCKS_PER_SEC)
{
last=clock();
raydium_render_fps=fps;
fps=0;
}
}
void raydium_rendering_wireframe(void)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
void raydium_rendering_normal(void)
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
void raydium_rendering_rgb_force(GLfloat r, GLfloat g, GLfloat b)
{
raydium_render_rgb_force_tag=1;
raydium_render_rgb_force[0]=r;
raydium_render_rgb_force[1]=g;
raydium_render_rgb_force[2]=b;
raydium_render_rgb_force[3]=1.0;
}
void raydium_rendering_rgb_normal(void)
{
raydium_render_rgb_force_tag=0;
}