From 10accd2908ad63f441958a90d04996c5f0bd1ae9 Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 25 Jul 2009 11:05:06 +0000 Subject: [PATCH] Cleaned up GL a minor amount more. Sounds can now be recorded while capturing to tga sequences (as raw sound). Fixed frame limits a little. Passed the unicode key values around to a few more key input functions. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3332 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/client/cl_cg.c | 2 +- engine/client/cl_ents.c | 3 +- engine/client/cl_ui.c | 2 +- engine/client/client.h | 4 +- engine/client/console.c | 6 +- engine/client/in_win.c | 9 +- engine/client/keys.c | 39 +++--- engine/client/m_mp3.c | 55 +++++++-- engine/client/menu.c | 8 +- engine/client/menu.h | 8 +- engine/client/p_classic.c | 2 +- engine/client/p_script.c | 2 +- engine/client/pr_csqc.c | 6 +- engine/client/pr_menu.c | 20 ++- engine/client/sys_win.c | 2 +- engine/client/textedit.c | 17 +-- engine/common/bothdefs.h | 4 +- engine/common/gl_q2bsp.c | 6 +- engine/common/vm.h | 4 +- engine/gl/gl_alias.c | 4 +- engine/gl/gl_backend.c | 46 ++++++- engine/gl/gl_draw.c | 42 +------ engine/gl/gl_model.h | 3 + engine/gl/gl_ppl.c | 143 +--------------------- engine/gl/gl_rmain.c | 248 +++++++++++++++++++++++++++++++++++++- engine/gl/gl_rsurf.c | 4 + engine/gl/gl_vidnt.c | 4 +- engine/gl/gl_warp.c | 9 +- engine/server/sv_ccmds.c | 2 + engine/server/svq3_game.c | 2 +- 30 files changed, 434 insertions(+), 272 deletions(-) diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index 6dcc2ee61..a0d3e4b10 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -1179,7 +1179,7 @@ void CG_Command_f(void) } } -qboolean CG_KeyPress(int key, int down) +qboolean CG_KeyPress(int key, int unicode, int down) { if (!cgvm || !(keycatcher&8)) return false; diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 763c4ca0a..8fc908d39 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -2622,7 +2622,8 @@ void CL_LinkPlayers (void) ent->forcedshader = NULL; #endif - if (state->command.impulse && cl.model_precache_vwep[0]) + //the extra modelindex check is to stop lame mods from using vweps with rings + if (state->command.impulse && cl.model_precache_vwep[0] && state->modelindex == cl_playerindex) ent->model = cl.model_precache_vwep[0]; else ent->model = cl.model_precache[state->modelindex]; diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 6f61bee15..3ee6240ad 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -1411,7 +1411,7 @@ int UI_MenuState(void) return 0; } -qboolean UI_KeyPress(int key, qboolean down) +qboolean UI_KeyPress(int key, int unicode, qboolean down) { extern qboolean keydown[256]; extern int keyshift[256]; // key to map to if shift held down in console diff --git a/engine/client/client.h b/engine/client/client.h index a086fe559..3f65c1a49 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -976,7 +976,7 @@ void CSQC_Input_Frame(int lplayernum, usercmd_t *cmd); void CSQC_WorldLoaded(void); qboolean CSQC_ParseTempEntity(unsigned char firstbyte); qboolean CSQC_ConsoleCommand(char *cmd); -qboolean CSQC_KeyPress(int key, qboolean down); +qboolean CSQC_KeyPress(int key, int unicode, qboolean down); int CSQC_StartSound(int entnum, int channel, char *soundname, vec3_t pos, float vol, float attenuation); void CSQC_ParseEntities(void); qboolean CSQC_SettingListener(void); @@ -1168,7 +1168,7 @@ void Media_Send_Command(cin_t *cin, char *command); void Media_Send_MouseMove(cin_t *cin, float x, float y); void Media_Send_Resize(cin_t *cin, int x, int y); void Media_Send_GetSize(cin_t *cin, int *x, int *y); -void Media_Send_KeyEvent(cin_t *cin, int button, int event); +void Media_Send_KeyEvent(cin_t *cin, int button, int unicode, int event); void MVD_Interpolate(void); diff --git a/engine/client/console.c b/engine/client/console.c index ee66681e3..668989306 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -547,8 +547,7 @@ void Con_PrintCon (console_t *con, char *txt) cr = true; break; case '\n': - if (cr) - cr = false; + cr = false; while (con->linecount >= con_maxlines.value) { if (con->oldest == con->current) @@ -578,7 +577,10 @@ void Con_PrintCon (console_t *con, char *txt) break; default: if (cr) + { con->current->length = 0; + cr = false; + } if (selstartline == con->current) selstartline = NULL; diff --git a/engine/client/in_win.c b/engine/client/in_win.c index 2c1908bef..32b64df78 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -1371,7 +1371,7 @@ void IN_MouseEvent (int mstate) { int i; - if (dinput) + if (dinput && mouseactive) return; #ifdef HLCLIENT @@ -1379,7 +1379,7 @@ void IN_MouseEvent (int mstate) return; #endif - if (mouseactive || (key_dest != key_game)) + if (1)//mouseactive || (key_dest != key_game)) { // perform button actions for (i=0 ; iredirect) { @@ -1301,12 +1300,12 @@ qboolean Key_MouseShouldBeFree(void) //if true, the input code is expected to return mouse cursor positions rather than deltas extern int mouseusedforgui; - if (mouseusedforgui) //I don't like this - return true; +// if (mouseusedforgui) //I don't like this +// return true; if (key_dest == key_menu) { - if (m_state == m_complex || m_state == m_plugin || m_state == m_menu_dat) + if (m_state == m_complex || m_state == m_plugin /*|| m_state == m_menu_dat*/) return true; } if (key_dest == key_console) @@ -1463,11 +1462,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down) if (key_dest == key_game) { #ifdef CSQC_DAT - if (CSQC_KeyPress(key, down)) //give csqc a chance to handle it. + if (CSQC_KeyPress(key, unicode, down)) //give csqc a chance to handle it. return; #endif #ifdef VM_CG - if (CG_KeyPress(key, down)) + if (CG_KeyPress(key, unicode, down)) return; #endif } @@ -1482,7 +1481,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) if (key_dest == key_game) #endif { - if (UI_KeyPress(key, down)) //Allow the UI to see the escape key. It is possible that a developer may get stuck at a menu. + if (UI_KeyPress(key, unicode, down)) //Allow the UI to see the escape key. It is possible that a developer may get stuck at a menu. return; } #endif @@ -1490,7 +1489,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) if (!down) { if (key_dest == key_menu) - M_Keyup (key); + M_Keyup (key, unicode); return; } switch (key_dest) @@ -1499,11 +1498,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down) Key_Message (key, unicode); break; case key_menu: - M_Keydown (key); + M_Keydown (key, unicode); break; #ifdef TEXTEDITOR case key_editor: - Editor_Key (key); + Editor_Key (key, unicode); break; #endif case key_game: @@ -1524,7 +1523,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) #ifndef NOMEDIA if (key_dest == key_game && Media_PlayingFullScreen()) { - Media_Send_KeyEvent(NULL, key, down?0:1); + Media_Send_KeyEvent(NULL, key, unicode, down?0:1); return; } #endif @@ -1541,10 +1540,10 @@ void Key_Event (int key, unsigned int unicode, qboolean down) switch (key_dest) { case key_menu: - M_Keyup (key); + M_Keyup (key, unicode); break; case key_console: - Key_ConsoleRelease(key); + Key_ConsoleRelease(key, unicode); break; default: break; @@ -1589,7 +1588,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) if (key != '`' && key != '~') if (key_dest == key_game || !down) { - if (UI_KeyPress(key, down) && down) //UI is allowed to take these keydowns. Keyups are always maintained. + if (UI_KeyPress(key, unicode, down) && down) //UI is allowed to take these keydowns. Keyups are always maintained. return; } #endif @@ -1617,7 +1616,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) return; } - if (shift_down) + if (shift_down && unicode < K_MAX && keyshift[unicode]) unicode = keyshift[unicode]; if (!down) @@ -1625,7 +1624,7 @@ void Key_Event (int key, unsigned int unicode, qboolean down) switch (key_dest) { case key_menu: - M_Keyup (key); + M_Keyup (key, unicode); break; default: break; @@ -1639,11 +1638,11 @@ void Key_Event (int key, unsigned int unicode, qboolean down) Key_Message (key, unicode); break; case key_menu: - M_Keydown (key); + M_Keydown (key, unicode); break; #ifdef TEXTEDITOR case key_editor: - Editor_Key (key); + Editor_Key (key, unicode); break; #endif case key_game: diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index ef84bfecb..63ffbb466 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -814,7 +814,7 @@ struct cin_s { void (*shutdown)(cin_t *cin); //warning: don't free cin_t //these are any interactivity functions you might want... void (*cursormove) (struct cin_s *cin, float posx, float posy); //pos is 0-1 - void (*key) (struct cin_s *cin, int code, int event); + void (*key) (struct cin_s *cin, int code, int unicode, int event); qboolean (*setsize) (struct cin_s *cin, int width, int height); void (*getsize) (struct cin_s *cin, int *width, int *height); void (*changestream) (struct cin_s *cin, char *streamname); @@ -833,7 +833,6 @@ struct cin_s { PGETFRAME pgf; LPWAVEFORMAT pWaveFormat; - HWND capturewindow; //sound stuff int soundpos; @@ -1746,13 +1745,13 @@ void Media_Send_Command(cin_t *cin, char *command) return; cin->changestream(cin, command); } -void Media_Send_KeyEvent(cin_t *cin, int button, int event) +void Media_Send_KeyEvent(cin_t *cin, int button, int unicode, int event) { if (!cin) cin = fullscreenvid; if (!cin || !cin->key) return; - cin->key(cin, button, event); + cin->key(cin, button, unicode, event); } void Media_Send_MouseMove(cin_t *cin, float x, float y) { @@ -1828,6 +1827,7 @@ float recordavi_audiotime; int capturesize; int capturewidth; char *capturevideomem; +vfsfile_t *captureaudiorawfile; //short *captureaudiomem; int captureaudiosamples; int captureframe; @@ -1867,7 +1867,7 @@ qboolean Media_PausedDemo (void) //capturedemo doesn't record any frames when the console is visible //but that's okay, as we don't load any demo frames either. if ((cls.demoplayback && Media_Capturing()) || capturepaused) - if (scr_con_current > 0 || !cl.validsequence || capturepaused) + if (key_dest != key_game || scr_con_current > 0 || !cl.validsequence || capturepaused) return true; return false; @@ -1875,7 +1875,7 @@ qboolean Media_PausedDemo (void) double Media_TweekCaptureFrameTime(double time) { - if (cls.demoplayback && Media_Capturing() && recordavi_frametime>0.01) + if (cls.demoplayback && Media_Capturing() && recordavi_frametime) { return time = recordavi_frametime; } @@ -2053,6 +2053,16 @@ static void MSD_Submit(soundcardinfo_t *sc) case CT_NONE: break; case CT_SCREENSHOT: + if ((sc->snd_completed % (sc->sn.samples/sc->sn.numchannels)) < offset) + { + int partialsamplestosubmit; + //wraped, two chunks to send + partialsamplestosubmit = ((sc->sn.samples/sc->sn.numchannels)) - offset; + VFS_WRITE(captureaudiorawfile, sc->sn.buffer+offset*bytespersample, partialsamplestosubmit*bytespersample); + samplestosubmit -= partialsamplestosubmit; + offset = 0; + } + VFS_WRITE(captureaudiorawfile, sc->sn.buffer+offset*bytespersample, samplestosubmit*bytespersample); break; } } @@ -2116,9 +2126,17 @@ void Media_StopRecordFilm_f (void) recordavi_file = NULL; #endif /* WINAVI */ - if (capturevideomem) BZ_Free(capturevideomem); + if (capturevideomem) + BZ_Free(capturevideomem); + capturevideomem = NULL; - if (capture_fakesounddevice) S_ShutdownCard(capture_fakesounddevice); + if (capture_fakesounddevice) + S_ShutdownCard(capture_fakesounddevice); + capture_fakesounddevice = NULL; + + if (captureaudiorawfile) + VFS_CLOSE(captureaudiorawfile); + captureaudiorawfile = NULL; capturevideomem = NULL; @@ -2153,6 +2171,8 @@ void Media_RecordFilm_f (void) } recordavi_frametime = 1/capturerate.value; + if (recordavi_frametime < 0.001) + recordavi_frametime = 0.001; //no more than 1000 images per second. captureframe = 0; if (*fourcc) @@ -2181,6 +2201,23 @@ void Media_RecordFilm_f (void) } else if (capturetype == CT_SCREENSHOT) { + if (capturesound.value && capturesoundchannels.value >= 1) + { + char filename[MAX_OSPATH]; + int chans = capturesoundchannels.value; + int sbits = capturesoundbits.value; + if (sbits < 8) + sbits = 8; + if (sbits != 8) + sbits = 16; + if (chans > 6) + chans = 6; + sprintf(filename, "%s/audio_%ichan_%ikhz_%ib.raw", capturefilenameprefix, chans, snd_speed/1000, sbits); + captureaudiorawfile = FS_OpenVFS(filename, "wb", FS_GAMEONLY); + + if (captureaudiorawfile) + Media_InitFakeSoundDevice(chans, sbits); + } } #if defined(WINAVI) else if (capturetype == CT_AVI) @@ -2401,7 +2438,7 @@ void Media_StopRecordFilm_f (void) {} void Media_RecordFilm_f (void){} void M_Menu_Media_f (void) {} -char *Media_NextTrack(void) {return NULL;} +char *Media_NextTrack(int musicchannelnum) {return NULL;} qboolean Media_PausedDemo(void) {return false;} qboolean Media_PlayingFullScreen(void) {return false;} diff --git a/engine/client/menu.c b/engine/client/menu.c index 174ef1af0..a549f4f3a 100644 --- a/engine/client/menu.c +++ b/engine/client/menu.c @@ -1081,7 +1081,7 @@ void M_Draw (int uimenu) } -void M_Keydown (int key) +void M_Keydown (int key, int unicode) { switch (m_state) { @@ -1115,14 +1115,14 @@ void M_Keydown (int key) #endif #ifdef MENU_DAT case m_menu_dat: - MP_Keydown(key); + MP_Keydown(key, unicode); return; #endif } } -void M_Keyup (int key) +void M_Keyup (int key, int unicode) { switch (m_state) { @@ -1133,7 +1133,7 @@ void M_Keyup (int key) #endif #ifdef MENU_DAT case m_menu_dat: - MP_Keyup(key); + MP_Keyup(key, unicode); return; #endif default: diff --git a/engine/client/menu.h b/engine/client/menu.h index e530ee0fe..c52ea1a14 100644 --- a/engine/client/menu.h +++ b/engine/client/menu.h @@ -102,8 +102,8 @@ void M_SomeInitialisationFunctionCalledAtStartup(void) // menus // void M_Init (void); -void M_Keydown (int key); -void M_Keyup (int key); +void M_Keydown (int key, int unicode); +void M_Keyup (int key, int unicode); void M_Draw (int uimenu); void M_ToggleMenu_f (void); mpic_t *M_CachePic (char *path); @@ -400,8 +400,8 @@ void MP_Init (void); qboolean MP_Toggle(void); void MP_Draw(void); void MP_RegisterCvarsAndCmds(void); -void MP_Keydown(int key); -void MP_Keyup(int key); +void MP_Keydown(int key, int unicode); +void MP_Keyup(int key, int unicode); #define MGT_BAD ~0 #define MGT_QUAKE1 0 diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index 255d1a5fe..cb3fe1640 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -187,7 +187,7 @@ static void PClassic_InitParticles (void) { mod->particleeffect = P_INVALID; mod->particletrail = P_INVALID; - mod->engineflags &= ~MDLF_NODEFAULTTRAIL; + mod->engineflags &= ~(MDLF_NODEFAULTTRAIL | MDLF_ENGULPHS); P_DefaultTrail(mod); } diff --git a/engine/client/p_script.c b/engine/client/p_script.c index 6f0415924..09c09dd97 100644 --- a/engine/client/p_script.c +++ b/engine/client/p_script.c @@ -1546,7 +1546,7 @@ static void R_ParticlesDesc_Callback(struct cvar_s *var, char *oldvalue) { mod->particleeffect = P_INVALID; mod->particletrail = P_INVALID; - mod->engineflags &= ~MDLF_NODEFAULTTRAIL; + mod->engineflags &= ~(MDLF_NODEFAULTTRAIL | MDLF_ENGULPHS); P_DefaultTrail(mod); } diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index b621a7656..a703de00a 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -3334,7 +3334,7 @@ static void PF_cs_gecko_keyevent (progfuncs_t *prinst, struct globalvars_s *pr_g if (!cin) return; - Media_Send_KeyEvent(cin, MP_TranslateDPtoFTECodes(key), eventtype); + Media_Send_KeyEvent(cin, MP_TranslateDPtoFTECodes(key), (key>127)?0:key, eventtype); } // #491 void gecko_mousemove( string name, float x, float y ) static void PF_cs_gecko_mousemove (progfuncs_t *prinst, struct globalvars_s *pr_globals) @@ -5959,7 +5959,7 @@ qboolean CSQC_DrawView(void) return true; } -qboolean CSQC_KeyPress(int key, qboolean down) +qboolean CSQC_KeyPress(int key, int unicode, qboolean down) { void *pr_globals; @@ -5969,7 +5969,7 @@ qboolean CSQC_KeyPress(int key, qboolean down) pr_globals = PR_globals(csqcprogs, PR_CURRENT); G_FLOAT(OFS_PARM0) = !down; G_FLOAT(OFS_PARM1) = MP_TranslateFTEtoDPCodes(key); - G_FLOAT(OFS_PARM2) = 0; + G_FLOAT(OFS_PARM2) = unicode; PR_ExecuteProgram (csqcprogs, csqcg.input_event); diff --git a/engine/client/pr_menu.c b/engine/client/pr_menu.c index 7e4ba8e70..7cd5140c3 100644 --- a/engine/client/pr_menu.c +++ b/engine/client/pr_menu.c @@ -419,7 +419,7 @@ void PF_CL_stringwidth(progfuncs_t *prinst, struct globalvars_s *pr_globals) if (*prinst->callargc > 2) fontsize = G_FLOAT(OFS_PARM2); else - fontsize = 8; + fontsize = 1; if (usecolours) { G_FLOAT(OFS_RETURN) = COM_FunStringLength(text)*fontsize; @@ -788,8 +788,8 @@ void PF_cl_getmousepos (progfuncs_t *prinst, struct globalvars_s *pr_globals) mousemove_x=0; mousemove_y=0; - ret[0] = mousecursor_x; - ret[1] = mousecursor_y; +// ret[0] = mousecursor_x; +// ret[1] = mousecursor_y; ret[2] = 0; } @@ -1986,7 +1986,7 @@ int MP_TranslateDPtoFTECodes(int code) } } -void MP_Keydown(int key) +void MP_Keydown(int key, int unicode) { extern qboolean keydown[K_MAX]; if (setjmp(mp_abort)) @@ -2018,16 +2018,13 @@ void MP_Keydown(int key) { void *pr_globals = PR_globals(menuprogs, PR_CURRENT); G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key); - if (G_FLOAT(OFS_PARM0) > 127) - G_FLOAT(OFS_PARM1) = 0; - else - G_FLOAT(OFS_PARM1) = G_FLOAT(OFS_PARM0); + G_FLOAT(OFS_PARM1) = unicode; PR_ExecuteProgram(menuprogs, mp_keydown_function); } inmenuprogs--; } -void MP_Keyup(int key) +void MP_Keyup(int key, int unicode) { if (setjmp(mp_abort)) return; @@ -2041,10 +2038,7 @@ void MP_Keyup(int key) { void *pr_globals = PR_globals(menuprogs, PR_CURRENT); G_FLOAT(OFS_PARM0) = MP_TranslateFTEtoDPCodes(key); - if (G_FLOAT(OFS_PARM0) > 127) - G_FLOAT(OFS_PARM1) = 0; - else - G_FLOAT(OFS_PARM1) = G_FLOAT(OFS_PARM0); + G_FLOAT(OFS_PARM1) = unicode; PR_ExecuteProgram(menuprogs, mp_keyup_function); } inmenuprogs--; diff --git a/engine/client/sys_win.c b/engine/client/sys_win.c index 845fb1872..26bb4951e 100644 --- a/engine/client/sys_win.c +++ b/engine/client/sys_win.c @@ -1802,4 +1802,4 @@ void Sys_DestroyConditional(void *condv) DeleteCriticalSection(&cv->mainlock); free(cv); } -#endif \ No newline at end of file +#endif diff --git a/engine/client/textedit.c b/engine/client/textedit.c index de264a9c8..0fa8a0bf8 100644 --- a/engine/client/textedit.c +++ b/engine/client/textedit.c @@ -350,7 +350,7 @@ void EditorOpenFile(char *name) editoractive = true; } -void Editor_Key(int key) +void Editor_Key(int key, int unicode) { int i; if (keybindings[key][0]) @@ -420,9 +420,12 @@ void Editor_Key(int key) evalstring[i-1] = '\0'; break; default: - i = strlen(evalstring); - evalstring[i] = key; - evalstring[i+1] = '\0'; + if (unicode) + { + i = strlen(evalstring); + evalstring[i] = unicode; + evalstring[i+1] = '\0'; + } break; } return; @@ -700,7 +703,7 @@ void Editor_Key(int key) insertkeyhit = insertkeyhit?false:true; break; default: - if ((key < ' ' || key > 127) && key != '\t') //we deem these as unprintable + if (unicode < ' ' && unicode != '\t') //we deem these as unprintable break; if (insertkeyhit) //insert a char @@ -719,13 +722,13 @@ void Editor_Key(int key) } cursorx++; cursorblock->datalength++; - *(s+1) = key; + *(s+1) = unicode; } else //over write a char { MakeNewSize(cursorblock, cursorblock->datalength+5); //not really needed - cursorblock->data[cursorx] = key; + cursorblock->data[cursorx] = unicode; cursorx++; if (cursorx > cursorblock->datalength) cursorblock->datalength = cursorx; diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index e5e0f2250..6f2a06e3e 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -145,7 +145,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // #define HLCLIENT //we can run HL gamecode (not protocol compatible) // #define HLSERVER //we can run HL gamecode (not protocol compatible) #define NQPROT //server and client are capable of using quake1/netquake protocols. (qw is still prefered. uses the command 'nqconnect') - #define FISH //sw rendering only + #define FISH //fisheye distortion stuff #define ZLIB //zip/pk3 support #define WEBSERVER //http/ftp servers #define WEBCLIENT //http/ftp clients. @@ -187,7 +187,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif //temporarily disable stuff here, so as to not break any custom configs +#ifdef Q3SHADERS //#define NEWBACKEND +#endif //fix things a little... diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index a2a4e6fb0..2c4724e88 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -2305,9 +2305,6 @@ qboolean CModQ3_LoadFogs (lump_t *l) } } - if (count) - GL_InitFogTexture(); - return true; } @@ -2412,7 +2409,8 @@ mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, in patch_cp[0] = patchwidth; patch_cp[1] = patchheight; - if ( !patch_cp[0] || !patch_cp[1] ) { + if ( !patch_cp[0] || !patch_cp[1] ) + { return NULL; } diff --git a/engine/common/vm.h b/engine/common/vm.h index 1680981b2..a35f25a1f 100644 --- a/engine/common/vm.h +++ b/engine/common/vm.h @@ -90,7 +90,7 @@ qboolean UI_Q2LayoutChanged(void); void UI_StringChanged(int num); void UI_MousePosition(int xpos, int ypos); int UI_MenuState(void); -qboolean UI_KeyPress(int key, qboolean down); +qboolean UI_KeyPress(int key, int unicode, qboolean down); void UI_Reset(void); void UI_DrawMenu(void); qboolean UI_DrawStatusBar(int scores); @@ -121,7 +121,7 @@ void CG_Stop (void); void CG_Start (void); int CG_Refresh(void); qboolean CG_Command(void); -qboolean CG_KeyPress(int key, int down); +qboolean CG_KeyPress(int key, int unicode, int down); #endif typedef struct { diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index a12b00a9c..c69de96f1 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -1307,7 +1307,7 @@ void R_DrawGAliasModel (entity_t *e) R_IBrokeTheArrays(); - mb.entity = &r_worldentity; + mb.entity = currententity; mb.shader = currententity->forcedshader; mb.fog = fog; mb.mesh = &mesh; @@ -1346,7 +1346,7 @@ void R_DrawGAliasModel (entity_t *e) skin->shader->passes[0].flags &= ~SHADER_PASS_DEPTHWRITE; } - mb.entity = &r_worldentity; + mb.entity = currententity; mb.shader = skin->shader; mb.fog = fog; mb.mesh = &mesh; diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index 3e96c5d77..0a4d40bd6 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -2,6 +2,8 @@ #include "glquake.h" #include "shader.h" +#ifndef NEWBACKEND + #ifdef RGLQUAKE #define MAX_TEXTURE_UNITS 8 @@ -23,6 +25,7 @@ void GL_SetShaderState2D(qboolean is2d) extern int *lightmap_textures; extern int *deluxmap_textures; +extern int gl_filter_max; void GL_SelectTexture (GLenum target) { @@ -310,6 +313,43 @@ void R_FetchBottomColour(int *retred, int *retgreen, int *retblue) } } +#define FOG_TEXTURE_WIDTH 32 +#define FOG_TEXTURE_HEIGHT 32 +int r_fogtexture; +void GL_InitFogTexture (void) +{ + qbyte data[FOG_TEXTURE_WIDTH*FOG_TEXTURE_HEIGHT]; + int x, y; + float tw = 1.0f / ((float)FOG_TEXTURE_WIDTH - 1.0f); + float th = 1.0f / ((float)FOG_TEXTURE_HEIGHT - 1.0f); + float tx, ty, t; + + if (r_fogtexture) + return; + + // + // fog texture + // + for ( y = 0, ty = 0.0f; y < FOG_TEXTURE_HEIGHT; y++, ty += th ) + { + for ( x = 0, tx = 0.0f; x < FOG_TEXTURE_WIDTH; x++, tx += tw ) + { + t = (float)(sqrt( tx ) * 255.0); + data[x+y*FOG_TEXTURE_WIDTH] = (qbyte)(min( t, 255.0f )); + } + } + + r_fogtexture = GL_AllocNewTexture(); + GL_Bind(r_fogtexture); + qglTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, FOG_TEXTURE_WIDTH, FOG_TEXTURE_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data); + + qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_max); + qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max); + + qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); +} + void R_InitDynamicLightTexture (void) { int x, y; @@ -544,6 +584,8 @@ void R_BackendInit (void) currentColor = inColorsArray[0]; + r_fogtexture = 0; + r_arrays_locked = false; r_blocked = false; @@ -577,6 +619,7 @@ void R_BackendInit (void) } R_InitDynamicLightTexture(); + GL_InitFogTexture(); } qboolean varrayactive; @@ -2199,7 +2242,6 @@ R_RenderFogOnMesh ================ */ -int r_fogtexture; #define PlaneDiff(point,plane) (((plane)->type < 3 ? (point)[(plane)->type] : DotProduct((point), (plane)->normal)) - (plane)->dist) void R_RenderFogOnMesh ( shader_t *shader, struct mfog_s *fog ) { @@ -2531,4 +2573,6 @@ void R_FinishMeshBuffer ( meshbuffer_t *mb ) +#endif + #endif diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 2bb3e2046..faa412e69 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -713,42 +713,6 @@ void GL_Texturemode2d_Callback (struct cvar_s *var, char *oldvalue) } #ifdef Q3SHADERS -#define FOG_TEXTURE_WIDTH 32 -#define FOG_TEXTURE_HEIGHT 32 -extern int r_fogtexture; -void GL_InitFogTexture (void) -{ - qbyte data[FOG_TEXTURE_WIDTH*FOG_TEXTURE_HEIGHT]; - int x, y; - float tw = 1.0f / ((float)FOG_TEXTURE_WIDTH - 1.0f); - float th = 1.0f / ((float)FOG_TEXTURE_HEIGHT - 1.0f); - float tx, ty, t; - - if (r_fogtexture) - return; - - // - // fog texture - // - for ( y = 0, ty = 0.0f; y < FOG_TEXTURE_HEIGHT; y++, ty += th ) - { - for ( x = 0, tx = 0.0f; x < FOG_TEXTURE_WIDTH; x++, tx += tw ) - { - t = (float)(sqrt( tx ) * 255.0); - data[x+y*FOG_TEXTURE_WIDTH] = (qbyte)(min( t, 255.0f )); - } - } - - r_fogtexture = GL_AllocNewTexture(); - GL_Bind(r_fogtexture); - qglTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, FOG_TEXTURE_WIDTH, FOG_TEXTURE_HEIGHT, 0, GL_ALPHA, GL_UNSIGNED_BYTE, data); - - qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_max); - qglTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max); - - qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - qglTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -} #endif /* =============== @@ -800,9 +764,6 @@ void GLDraw_ReInit (void) draw_mesh.colors_array = NULL; draw_mesh.indexes = r_quad_indexes; -#ifdef Q3SHADERS - r_fogtexture=0; -#endif GL_FlushBackEnd(); // GL_FlushSkinCache(); TRACE(("dbg: GLDraw_ReInit: GL_GAliasFlushSkinCache\n")); @@ -1198,6 +1159,9 @@ void GLDraw_Init (void) GLDraw_ReInit(); R_BackendInit(); +#ifdef NEWBACKEND + BE_Init(); +#endif diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index e93240e34..f3b1b8e29 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -193,6 +193,9 @@ typedef struct vec3_t *svector; int vbotvector; vec3_t *tvector; + + int vbocolours; + byte_vec4_t *colours; } vbo_t; typedef struct texture_s diff --git a/engine/gl/gl_ppl.c b/engine/gl/gl_ppl.c index c4b4ff801..dc28fc60a 100644 --- a/engine/gl/gl_ppl.c +++ b/engine/gl/gl_ppl.c @@ -18,6 +18,7 @@ void R_MirrorChain (msurface_t *s); void GL_SelectTexture (GLenum target); void R_RenderDynamicLightmaps (msurface_t *fa, int shift); void R_BlendLightmaps (void); +void PPL_SchematicsTextureChain(msurface_t *first); void PPL_BeginShadowMesh(dlight_t *dl); @@ -2299,148 +2300,6 @@ void PPL_BaseBModelTextures(entity_t *e) R_IBrokeTheArrays(); } -#ifdef Q3SHADERS -void R_DrawLightning(entity_t *e) -{ - vec3_t v; - vec3_t dir, cr; - float scale = e->scale; - float length; - - vec3_t points[4]; - vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; - index_t indexarray[6] = {0, 1, 2, 0, 2, 3}; - - mesh_t mesh; - meshbuffer_t mb; - - if (!e->forcedshader) - return; - - if (!scale) - scale = 10; - - - VectorSubtract(e->origin, e->oldorigin, dir); - length = Length(dir); - - //this seems to be about right. - texcoords[2][0] = length/128; - texcoords[3][0] = length/128; - - VectorSubtract(r_refdef.vieworg, e->origin, v); - CrossProduct(v, dir, cr); - VectorNormalize(cr); - - VectorMA(e->origin, -scale/2, cr, points[0]); - VectorMA(e->origin, scale/2, cr, points[1]); - - VectorSubtract(r_refdef.vieworg, e->oldorigin, v); - CrossProduct(v, dir, cr); - VectorNormalize(cr); - - VectorMA(e->oldorigin, scale/2, cr, points[2]); - VectorMA(e->oldorigin, -scale/2, cr, points[3]); - - mesh.xyz_array = points; - mesh.indexes = indexarray; - mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]); - mesh.colors_array = NULL; - mesh.lmst_array = NULL; - mesh.normals_array = NULL; - mesh.numvertexes = 4; - mesh.st_array = texcoords; - - mb.entity = e; - mb.mesh = &mesh; - mb.shader = e->forcedshader; - mb.infokey = 0; - mb.fog = NULL; - mb.infokey = currententity->keynum; - mb.dlightbits = 0; - - - R_IBrokeTheArrays(); - - R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED); - - R_RenderMeshBuffer ( &mb, false ); -} -void R_DrawRailCore(entity_t *e) -{ - vec3_t v; - vec3_t dir, cr; - float scale = e->scale; - float length; - - mesh_t mesh; - meshbuffer_t mb; - vec3_t points[4]; - vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; - index_t indexarray[6] = {0, 1, 2, 0, 2, 3}; - int colors[4]; - qbyte colorsb[4]; - - if (!e->forcedshader) - return; - - if (!scale) - scale = 10; - - - VectorSubtract(e->origin, e->oldorigin, dir); - length = Length(dir); - - //this seems to be about right. - texcoords[2][0] = length/128; - texcoords[3][0] = length/128; - - VectorSubtract(r_refdef.vieworg, e->origin, v); - CrossProduct(v, dir, cr); - VectorNormalize(cr); - - VectorMA(e->origin, -scale/2, cr, points[0]); - VectorMA(e->origin, scale/2, cr, points[1]); - - VectorSubtract(r_refdef.vieworg, e->oldorigin, v); - CrossProduct(v, dir, cr); - VectorNormalize(cr); - - VectorMA(e->oldorigin, scale/2, cr, points[2]); - VectorMA(e->oldorigin, -scale/2, cr, points[3]); - - colorsb[0] = e->shaderRGBAf[0]*255; - colorsb[1] = e->shaderRGBAf[1]*255; - colorsb[2] = e->shaderRGBAf[2]*255; - colorsb[3] = e->shaderRGBAf[3]*255; - colors[0] = colors[1] = colors[2] = colors[3] = *(int*)colorsb; - - mesh.xyz_array = points; - mesh.indexes = indexarray; - mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]); - mesh.colors_array = (byte_vec4_t*)colors; - mesh.lmst_array = NULL; - mesh.normals_array = NULL; - mesh.numvertexes = 4; - mesh.st_array = texcoords; - - mb.entity = e; - mb.mesh = &mesh; - mb.shader = e->forcedshader; - mb.infokey = 0; - mb.fog = NULL; - mb.infokey = currententity->keynum; - mb.dlightbits = 0; - - - R_IBrokeTheArrays(); - - R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED | MF_COLORS); - - R_RenderMeshBuffer ( &mb, false ); -} -#endif - void RotatePointAroundVector( vec3_t dst, const vec3_t dir, const vec3_t point, float degrees ); void PerpendicularVector( vec3_t dst, const vec3_t src ); void R_DrawBeam( entity_t *e ) diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index d932f6ba5..07b17d729 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -595,16 +595,18 @@ void R_DrawSpriteModel (entity_t *e) coloursb[3] = e->shaderRGBAf[3]*255; *(int*)colours[0] = *(int*)colours[1] = *(int*)colours[2] = *(int*)colours[3] = *(int*)coloursb; + mesh.vbofirstelement = 0; + mesh.vbofirstvert = 0; + mesh.colors_array = colours; mesh.indexes = indexes; mesh.lmst_array = NULL; mesh.st_array = texcoords; mesh.normals_array = NULL; + mesh.xyz_array = vertcoords; mesh.numvertexes = 4; mesh.numindexes = 6; mesh.radius = e->scale; - mesh.xyz_array = vertcoords; - mesh.normals_array = NULL; R_IBrokeTheArrays(); @@ -741,8 +743,101 @@ void R_DrawSpriteModel (entity_t *e) //================================================================================== +static void R_DrawShadedSpriteModels(int count, void **entlist, void *parm) +{ + vec3_t point; + mspriteframe_t *frame; + vec3_t forward, right, up; + msprite_t *psprite; + + qbyte coloursb[4]; + + meshbuffer_t mb; + mesh_t mesh; + vec2_t texcoords[4]={{0, 1},{0,0},{1,0},{1,1}}; + vec3_t vertcoords[4]; + index_t indexes[6] = {0, 1, 2, 0, 2, 3}; + byte_vec4_t colours[4]; + float x, y; + + int vnum = 0, inum = 0; + + shader_t *lastshader = NULL; + + mesh.vbofirstelement = 0; + mesh.vbofirstvert = 0; + + mesh.colors_array = colours; + mesh.indexes = indexes; + mesh.lmst_array = NULL; + mesh.st_array = texcoords; + mesh.normals_array = NULL; + mesh.xyz_array = vertcoords; + + mb.fog = NULL;//fog; + mb.mesh = NULL; + mb.infokey = -1; + mb.dlightbits = 0; + + R_IBrokeTheArrays(); + + while (count--) + { + currententity = *entlist++; + if (currententity->forcedshader != lastshader || 1) + { + if (lastshader) + { + mesh.numvertexes = vnum; + mesh.numindexes = inum; + mesh.radius = currententity->scale; + R_PushMesh(&mesh, lastshader->features | MF_NONBATCHED|MF_COLORS); + + mb.entity = currententity; + mb.shader = currententity->forcedshader; + R_RenderMeshBuffer (&mb, false); + } + + lastshader = currententity->forcedshader; + } + + + #define VectorSet(a,b,c,v) {v[0]=a;v[1]=b;v[2]=c;} + x = cos(currententity->rotation+225*M_PI/180)*currententity->scale; + y = sin(currententity->rotation+225*M_PI/180)*currententity->scale; + VectorSet (currententity->origin[0] - y*vright[0] + x*vup[0], currententity->origin[1] - y*vright[1] + x*vup[1], currententity->origin[2] - y*vright[2] + x*vup[2], vertcoords[3]); + VectorSet (currententity->origin[0] - x*vright[0] - y*vup[0], currententity->origin[1] - x*vright[1] - y*vup[1], currententity->origin[2] - x*vright[2] - y*vup[2], vertcoords[2]); + VectorSet (currententity->origin[0] + y*vright[0] - x*vup[0], currententity->origin[1] + y*vright[1] - x*vup[1], currententity->origin[2] + y*vright[2] - x*vup[2], vertcoords[1]); + VectorSet (currententity->origin[0] + x*vright[0] + y*vup[0], currententity->origin[1] + x*vright[1] + y*vup[1], currententity->origin[2] + x*vright[2] + y*vup[2], vertcoords[0]); + + coloursb[0] = currententity->shaderRGBAf[0]*255; + coloursb[1] = currententity->shaderRGBAf[1]*255; + coloursb[2] = currententity->shaderRGBAf[2]*255; + coloursb[3] = currententity->shaderRGBAf[3]*255; + *(int*)colours[0] = *(int*)colours[1] = *(int*)colours[2] = *(int*)colours[3] = *(int*)coloursb; + + vnum += 4; + inum += 6; + } + + if (lastshader) + { + mesh.numvertexes = vnum; + mesh.numindexes = inum; + mesh.radius = currententity->scale; + R_PushMesh(&mesh, lastshader->features | MF_NONBATCHED|MF_COLORS); + + mb.entity = currententity; + mb.shader = currententity->forcedshader; + R_RenderMeshBuffer (&mb, false); + } +} + void GLR_DrawSprite(int count, void **e, void *parm) { +// R_DrawShadedSpriteModels(count, e, parm); +// return; + while(count--) { currententity = *e++; @@ -751,6 +846,155 @@ void GLR_DrawSprite(int count, void **e, void *parm) R_DrawSpriteModel (currententity); } } + + + +//q3 lightning gun +void R_DrawLightning(entity_t *e) +{ + vec3_t v; + vec3_t dir, cr; + float scale = e->scale; + float length; + + vec3_t points[4]; + vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + index_t indexarray[6] = {0, 1, 2, 0, 2, 3}; + + mesh_t mesh; + meshbuffer_t mb; + + if (!e->forcedshader) + return; + + if (!scale) + scale = 10; + + + VectorSubtract(e->origin, e->oldorigin, dir); + length = Length(dir); + + //this seems to be about right. + texcoords[2][0] = length/128; + texcoords[3][0] = length/128; + + VectorSubtract(r_refdef.vieworg, e->origin, v); + CrossProduct(v, dir, cr); + VectorNormalize(cr); + + VectorMA(e->origin, -scale/2, cr, points[0]); + VectorMA(e->origin, scale/2, cr, points[1]); + + VectorSubtract(r_refdef.vieworg, e->oldorigin, v); + CrossProduct(v, dir, cr); + VectorNormalize(cr); + + VectorMA(e->oldorigin, scale/2, cr, points[2]); + VectorMA(e->oldorigin, -scale/2, cr, points[3]); + + mesh.vbofirstelement = 0; + mesh.vbofirstvert = 0; + mesh.xyz_array = points; + mesh.indexes = indexarray; + mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]); + mesh.colors_array = NULL; + mesh.lmst_array = NULL; + mesh.normals_array = NULL; + mesh.numvertexes = 4; + mesh.st_array = texcoords; + + mb.entity = e; + mb.mesh = &mesh; + mb.shader = e->forcedshader; + mb.infokey = 0; + mb.fog = NULL; + mb.infokey = currententity->keynum; + mb.dlightbits = 0; + + + R_IBrokeTheArrays(); + + R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED); + + R_RenderMeshBuffer ( &mb, false ); +} +//q3 railgun beam +void R_DrawRailCore(entity_t *e) +{ + vec3_t v; + vec3_t dir, cr; + float scale = e->scale; + float length; + + mesh_t mesh; + meshbuffer_t mb; + vec3_t points[4]; + vec2_t texcoords[4] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}}; + index_t indexarray[6] = {0, 1, 2, 0, 2, 3}; + int colors[4]; + qbyte colorsb[4]; + + if (!e->forcedshader) + return; + + if (!scale) + scale = 10; + + + VectorSubtract(e->origin, e->oldorigin, dir); + length = Length(dir); + + //this seems to be about right. + texcoords[2][0] = length/128; + texcoords[3][0] = length/128; + + VectorSubtract(r_refdef.vieworg, e->origin, v); + CrossProduct(v, dir, cr); + VectorNormalize(cr); + + VectorMA(e->origin, -scale/2, cr, points[0]); + VectorMA(e->origin, scale/2, cr, points[1]); + + VectorSubtract(r_refdef.vieworg, e->oldorigin, v); + CrossProduct(v, dir, cr); + VectorNormalize(cr); + + VectorMA(e->oldorigin, scale/2, cr, points[2]); + VectorMA(e->oldorigin, -scale/2, cr, points[3]); + + colorsb[0] = e->shaderRGBAf[0]*255; + colorsb[1] = e->shaderRGBAf[1]*255; + colorsb[2] = e->shaderRGBAf[2]*255; + colorsb[3] = e->shaderRGBAf[3]*255; + colors[0] = colors[1] = colors[2] = colors[3] = *(int*)colorsb; + + mesh.vbofirstelement = 0; + mesh.vbofirstvert = 0; + mesh.xyz_array = points; + mesh.indexes = indexarray; + mesh.numindexes = sizeof(indexarray)/sizeof(indexarray[0]); + mesh.colors_array = (byte_vec4_t*)colors; + mesh.lmst_array = NULL; + mesh.normals_array = NULL; + mesh.numvertexes = 4; + mesh.st_array = texcoords; + + mb.entity = e; + mb.mesh = &mesh; + mb.shader = e->forcedshader; + mb.infokey = 0; + mb.fog = NULL; + mb.infokey = currententity->keynum; + mb.dlightbits = 0; + + + R_IBrokeTheArrays(); + + R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED | MF_COLORS); + + R_RenderMeshBuffer ( &mb, false ); +} + /* ============= R_DrawEntitiesOnList diff --git a/engine/gl/gl_rsurf.c b/engine/gl/gl_rsurf.c index ec427be30..c3007daba 100644 --- a/engine/gl/gl_rsurf.c +++ b/engine/gl/gl_rsurf.c @@ -3069,6 +3069,8 @@ static void GL_GenBrushModelVBO(model_t *mod) if (mod->surfaces[i].texinfo->texture != mod->textures[t]) continue; m = mod->surfaces[i].mesh; + if (!m) + continue; maxvboelements += m->numindexes; maxvboverts += m->numvertexes; @@ -3105,6 +3107,8 @@ static void GL_GenBrushModelVBO(model_t *mod) if (mod->surfaces[i].texinfo->texture != mod->textures[t]) continue; m = mod->surfaces[i].mesh; + if (!m) + continue; m->vbofirstvert = vcount; m->vbofirstelement = ecount; diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index d5e3c6542..802e509d6 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -435,7 +435,7 @@ qboolean VID_SetWindowedMode (rendererstate_t *info) SetWindowLong(dibwindow, GWL_EXSTYLE, GetWindowLong(dibwindow, GWL_EXSTYLE) | WS_EX_LAYERED); // Make this window 70% alpha - pSetLayeredWindowAttributes(dibwindow, 0, av, LWA_ALPHA); + pSetLayeredWindowAttributes(dibwindow, 0, (BYTE)av, LWA_ALPHA); } } #endif @@ -1031,7 +1031,7 @@ void VID_WndAlpha_Override_Callback(struct cvar_s *var, char *oldvalue) SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) | WS_EX_LAYERED); // Make this window 70% alpha - pSetLayeredWindowAttributes(mainwindow, 0, av, LWA_ALPHA); + pSetLayeredWindowAttributes(mainwindow, 0, (BYTE)av, LWA_ALPHA); } else SetWindowLong(mainwindow, GWL_EXSTYLE, GetWindowLong(mainwindow, GWL_EXSTYLE) & ~WS_EX_LAYERED); diff --git a/engine/gl/gl_warp.c b/engine/gl/gl_warp.c index 7b391295c..9cba549a9 100644 --- a/engine/gl/gl_warp.c +++ b/engine/gl/gl_warp.c @@ -390,18 +390,21 @@ void GL_DrawSkyChain (msurface_t *s) if (r_fastsky.value>0) //this is for visability only... we'd otherwise not stoop this low (and this IS low) { + R_IBrokeTheArrays(); + qglDisable(GL_BLEND); qglDisable(GL_TEXTURE_2D); + qglDisable(GL_ALPHA_TEST); qglColor3f(glskycolor[0], glskycolor[1], glskycolor[2]); qglDisableClientState( GL_COLOR_ARRAY ); + qglEnableClientState( GL_VERTEX_ARRAY ); for (fa=s ; fa ; fa=fa->texturechain) { qglVertexPointer(3, GL_FLOAT, 0, fa->mesh->xyz_array); qglDrawElements(GL_TRIANGLES, fa->mesh->numindexes, GL_INDEX_TYPE, fa->mesh->indexes); } - R_IBrokeTheArrays(); - qglColor3f(1, 1, 1); qglEnable(GL_TEXTURE_2D); + R_IBrokeTheArrays(); return; } @@ -1092,6 +1095,8 @@ static void GL_SkyForceDepth(msurface_t *fa) qglBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); qglBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); + + R_IBrokeTheArrays(); } } diff --git a/engine/server/sv_ccmds.c b/engine/server/sv_ccmds.c index 346ca2d3f..e13c01244 100644 --- a/engine/server/sv_ccmds.c +++ b/engine/server/sv_ccmds.c @@ -613,6 +613,8 @@ void SV_Map_f (void) { if (host_client->protocol == SCP_QUAKE3) continue; + if (host_client->protocol == SCP_BAD) + continue; if (ISNQCLIENT(host_client)) SVNQ_New_f(); diff --git a/engine/server/svq3_game.c b/engine/server/svq3_game.c index 364c579c1..de05ec8f6 100644 --- a/engine/server/svq3_game.c +++ b/engine/server/svq3_game.c @@ -7,7 +7,7 @@ float RadiusFromBounds (vec3_t mins, vec3_t maxs); -//#define USEBOTLIB +#define USEBOTLIB #ifdef USEBOTLIB