/* 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/osd.h" #endif // need proto void raydium_camera_replace(void); // OSD color could be changed from one frame to the next one by Raydium // itself (console, internal uses, ...) so set your OSD color // in the display loop, no before. void raydium_osd_color_change(GLfloat r, GLfloat g, GLfloat b) { raydium_osd_color[0]=r; raydium_osd_color[1]=g; raydium_osd_color[2]=b; } void raydium_osd_alpha_change(GLfloat a) { raydium_osd_color[3]=a; } void raydium_osd_color_rgba(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { raydium_osd_color_change(r,g,b); raydium_osd_alpha_change(a); } void raydium_osd_color_ega(char hexa) { int i=15; if(hexa>='0' && hexa<='9') i=hexa - '0'; if(hexa>='a' && hexa<='f') i=hexa - 'a'+10; if(hexa>='A' && hexa<='F') i=hexa - 'A'+10; i*=3; raydium_osd_color_change(raydium_osd_ega[i],raydium_osd_ega[i+1],raydium_osd_ega[i+2]); } void raydium_osd_start(void) { glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); //glViewport(0, 0, raydium_window_tx, raydium_window_ty); glOrtho(0,100, 0,100, -100,100); //glPushMatrix(); raydium_rendering_internal_prepare_texture_render(0); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glDisable(GL_LIGHTING); glDisable(GL_FOG); glColor4f(1.f,1.f,1.f,1.f); } void raydium_osd_stop(void) { raydium_window_resize_callback(raydium_window_tx, raydium_window_ty); glEnable(GL_DEPTH_TEST); glDepthMask(GL_TRUE); if(raydium_light_enabled_tag) glEnable(GL_LIGHTING); if(raydium_fog_enabled_tag) glEnable(GL_FOG); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); } void raydium_osd_draw(int tex ,GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { raydium_osd_start(); raydium_texture_current_set(tex); raydium_rendering_internal_prepare_texture_render(tex); glColor4fv(raydium_osd_color); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(x1,y1,0); glTexCoord2f(1,0); glVertex3f(x2,y1,0); glTexCoord2f(1,1); glVertex3f(x2,y2,0); glTexCoord2f(0,1); glVertex3f(x1,y2,0); glEnd(); raydium_rendering_internal_restore_render_state(); raydium_osd_stop(); } void raydium_osd_draw_name(char *tex ,GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) { raydium_osd_draw(raydium_texture_find_by_name(tex),x1,y1,x2,y2); } // need to be secured void raydium_osd_printf(GLfloat x, GLfloat y, GLfloat size, GLfloat spacer,char *texture, char *format, ...) { char str[RAYDIUM_MAX_NAME_LEN]; va_list argptr; int i,texsave; GLfloat dx=0; unsigned char ligne,offset; GLfloat u,v; char c; size/=RAYDIUM_OSD_FONT_SIZE_FACTOR; va_start(argptr,format); vsprintf(str,format,argptr); va_end(argptr); raydium_osd_start(); texsave=raydium_texture_current_main; raydium_texture_current_set_name(texture); raydium_rendering_internal_prepare_texture_render(raydium_texture_current_main); glTranslatef(x,y,0); // strlen is slooow :) for( i=0; str[i]; i++ ) { if(str[i]=='\n' || str[i]=='\t') continue; if(str[i]=='^' && i+190) raydium_osd_logo_angle=-90; raydium_rendering_internal_prepare_texture_render(raydium_texture_current_main); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(-10,5,0); glTexCoord2f(1,0); glVertex3f(10,5,0); glTexCoord2f(1,1); glVertex3f(10,-5,0); glTexCoord2f(0,1); glVertex3f(-10,-5,0); glEnd(); //raydium_rendering_internal_restore_render_state(); raydium_osd_stop(); } void raydium_osd_cursor_set(char *texture,GLfloat xsize, GLfloat ysize) { raydium_mouse_hide(); if(texture && strlen(texture)) raydium_osd_cursor_texture=raydium_texture_find_by_name(texture); else raydium_osd_cursor_texture=0; raydium_osd_cursor_xsize=xsize; raydium_osd_cursor_ysize=ysize; } void raydium_osd_cursor_draw(void) { if(!raydium_osd_cursor_texture || !raydium_window_tx) return; raydium_osd_start(); glTranslatef(((GLfloat)raydium_mouse_x/raydium_window_tx)*100.f, ((GLfloat)(raydium_window_ty-raydium_mouse_y)/raydium_window_ty)*100.f,0); raydium_texture_current_set(raydium_osd_cursor_texture); raydium_rendering_internal_prepare_texture_render(raydium_texture_current_main); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(0,0,0); glTexCoord2f(1,0); glVertex3f(raydium_osd_cursor_xsize,0,0); glTexCoord2f(1,1); glVertex3f(raydium_osd_cursor_xsize,-raydium_osd_cursor_ysize,0); glTexCoord2f(0,1); glVertex3f(0,-raydium_osd_cursor_ysize,0); glEnd(); raydium_rendering_internal_restore_render_state(); raydium_osd_stop(); } void raydium_osd_internal_vertex(GLfloat x, GLfloat y, GLfloat top) { if(y>top) y=top; glVertex3f(x,y,0); } void raydium_osd_network_stat_draw(GLfloat px, GLfloat py, GLfloat size) { #define RAYDIUM_OSD_NET_SAMPLES 32 #define RAYDIUM_OSD_NET_STEP 0.3 static GLfloat past_delay[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat past_rx[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat past_tx[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat step=0; static int last_rx,last_tx; static GLfloat past_reemitted[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat past_double[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat past_lost[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat past_bogus[RAYDIUM_OSD_NET_SAMPLES]; static GLfloat last_reemitted; static GLfloat last_double; static GLfloat last_lost; static GLfloat last_bogus; int i; GLfloat fact_x,fact_y_delay,fact_y_rxtx; fact_x=size/RAYDIUM_OSD_NET_SAMPLES; fact_y_delay=size/(RAYDIUM_NETWORK_ACK_DELAY_MAX*1000); fact_y_rxtx=size/50; // 50 KB step+=raydium_frame_time; if(step>=RAYDIUM_OSD_NET_STEP) { step=0; // shift array to the left for(i=1;i0) { raydium_osd_fade_color_timeleft-=raydium_frame_time; for(i=0;i<4;i++) raydium_osd_fade_color_current[i]+= raydium_osd_fade_color_increment[i]*raydium_frame_time; raydium_osd_mask(raydium_osd_fade_color_current); if(raydium_osd_fade_color_timeleft<=0 && raydium_osd_fade_OnFadeEnd) { f=raydium_osd_fade_OnFadeEnd; f(); return; // fade may have changed during playback ... } } } void raydium_osd_fade_init(void) { raydium_osd_fade_color_timeleft=-1; memset(raydium_osd_fade_color_increment,0,raydium_internal_size_vector_float_4); memset(raydium_osd_fade_color_current,0,raydium_internal_size_vector_float_4); raydium_osd_fade_OnFadeEnd=NULL; } void raydium_osd_fade_from(GLfloat *from4, GLfloat *to4, GLfloat time_len, void *OnFadeEnd) { int i; raydium_osd_fade_color_timeleft=time_len; memcpy(raydium_osd_fade_color_current,from4,raydium_internal_size_vector_float_4); raydium_osd_fade_OnFadeEnd=OnFadeEnd; for(i=0;i<4;i++) raydium_osd_fade_color_increment[i]=(to4[i]-from4[i])/time_len; // per sec }