/* 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); void raydium_hdr_block(signed char blocking); signed char raydium_shader_current(int shader); // color is a GLfloat[4] (RGBA) void raydium_render_lightmap_color(GLfloat *color) { memcpy(raydium_render_lightmap_color_value,color,raydium_internal_size_vector_float_4); // Err ... no :/ There's no current color for other texture units than 0 ... /* glActiveTextureARB(GL_TEXTURE1_ARB); glColor4fv(raydium_render_lightmap_color_value); glActiveTextureARB(GL_TEXTURE0_ARB); */ } void raydium_render_lightmap_color_4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { GLfloat col[4]; col[0]=r; col[1]=g; col[2]=b; col[3]=a; raydium_render_lightmap_color(col); } // let's keep this define here, until full tests #define RAYDIUM_RENDER_MAX_TEXUNITS 4 int raydium_rendering_prepare_texture_unit(GLenum tu,GLuint tex) { // cache state of each texunit static GLuint texunit_state[RAYDIUM_RENDER_MAX_TEXUNITS]; static int first=1; int tui; if(first) { int i; for(i=0;i=RAYDIUM_RENDER_MAX_TEXUNITS || tui<0) { raydium_log("render: texture unit %i is invalid (%i max, see RAYDIUM_RENDER_MAX_TEXUNITS", tui,RAYDIUM_RENDER_MAX_TEXUNITS); return 0; } if(texunit_state[tui]==tex) return 0; texunit_state[tui]=tex; //printf("preparing texunit %i with %s\n",tui,raydium_texture_name[tex]); // prepare "lightmaps" texture units if(tui>0) { glEnd(); // ugly, but we must close all shapes, if any glActiveTextureARB(tu); #ifndef RENDER_ALLOW_LIGHTING_FOR_LIGHTMAPS if(raydium_texture_islightmap[tex]) { glDisable(GL_LIGHTING); } else if(raydium_light_enabled_tag) glEnable(GL_LIGHTING); #endif glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); //glDisable(GL_BLEND); if(tex) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,tex); if(raydium_texture_env[tex]) { glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1); glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_ADD); } else if(raydium_texture_islightmap[tex]) { glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); glColor4fv(raydium_render_lightmap_color_value); } else { glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE_EXT); glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB_EXT,GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2); } } else { glDisable(GL_TEXTURE_2D); // glBindTexture(GL_TEXTURE_2D,0); } glActiveTextureARB(GL_TEXTURE0_ARB); } else // "standard" textunit { // 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; if(raydium_texture_nolight[tex]) { glGetBooleanv(GL_LIGHTING,&raydium_render_internal_light_previous_step); glDisable(GL_LIGHTING); } if(raydium_texture_shader[tex]>=0) raydium_shader_current(raydium_texture_shader[tex]); else raydium_shader_current(-1); glColor4f(1.f,1.f,1.f,1.f); if(raydium_texture_blended[tex]==RAYDIUM_TEXTURE_BLEND_BLENDED) { glEnable(GL_BLEND); glDepthMask(GL_FALSE); glDisable(GL_ALPHA_TEST); // glDisable(GL_FOG); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); } if(raydium_texture_blended[tex]==RAYDIUM_TEXTURE_BLEND_CUTOUT) { glEnable(GL_BLEND); glDepthMask(GL_TRUE); glAlphaFunc(GL_GREATER,0.50); glEnable (GL_ALPHA_TEST); // glDisable(GL_FOG); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); } if(raydium_texture_blended[tex]==RAYDIUM_TEXTURE_BLEND_NONE) { glDisable(GL_BLEND); glDepthMask(GL_TRUE); glDisable(GL_ALPHA_TEST); // glEnable(GL_FOG); glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); } if(raydium_texture_blended[tex]==RAYDIUM_TEXTURE_PHANTOM) { glDisable(GL_BLEND); glDepthMask(GL_TRUE); glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_2D); glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); } raydium_hdr_block(!raydium_texture_hdr[tex]); if(raydium_texture_rgb[tex][0]>=0 && raydium_texture_blended[tex]!=RAYDIUM_TEXTURE_PHANTOM) { 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); //printf("%s\n",raydium_texture_name[tex]); } } // end "standard" texture return 1; } void raydium_rendering_internal_prepare_texture_render(GLuint tex) { raydium_rendering_prepare_texture_unit(GL_TEXTURE0_ARB,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; } // used by shadows void raydium_rendering_from_to_simple(GLuint from, GLuint to) { GLuint i; //printf("%i -> %i\n",from,to); glBegin(GL_TRIANGLES); for(i=from;i 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; } void raydium_rendering_displaylists_enable(void) { raydium_render_displaylists_tag=1; } void raydium_rendering_displaylists_disable(void) { raydium_render_displaylists_tag=0; }