diff --git a/engine/client/cl_cg.c b/engine/client/cl_cg.c index c4ac73287..529d7c234 100644 --- a/engine/client/cl_cg.c +++ b/engine/client/cl_cg.c @@ -2,8 +2,6 @@ //#include "cg_public.h" #ifdef VM_CG -#ifdef GLQUAKE - #include "shader.h" #if 1 @@ -31,7 +29,6 @@ extern int mod_numknown; #define VM_FROMMHANDLE(a) ((a&&((unsigned int)a)<=mod_numknown)?mod_known+a-1:NULL) #define VM_TOMHANDLE(a) (a?a-mod_known+1:0) -extern shader_t r_shaders[]; #define VM_FROMSHANDLE(a) (a?r_shaders+a-1:NULL) #define VM_TOSHANDLE(a) (a?a-r_shaders+1:0) @@ -771,18 +768,14 @@ static int CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const int * case CG_R_REGISTERSHADER: if (!*(char*)VM_POINTER(arg[0])) VM_LONG(ret) = 0; - else if (qrenderer == QR_OPENGL) + else VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0]))); -//FIXME: 64bit else -// VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0]))); break; case CG_R_REGISTERSHADERNOMIP: if (!*(char*)VM_POINTER(arg[0])) VM_LONG(ret) = 0; - else if (qrenderer == QR_OPENGL) + else VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0]))); -//FIXME: 64bit else -// VM_LONG(ret) = VM_TOHANDLE(Draw_SafeCachePic(VM_POINTER(arg[0]))); break; case CG_R_CLEARSCENE: //clear scene (not rtlights, only dynamic ones) @@ -806,7 +799,7 @@ static int CG_SystemCallsEx(void *offset, unsigned int mask, int fn, const int * } break; case CG_R_RENDERSCENE: //render scene - GLR_PushDlights(); + R_PushDlights(); VQ3_RenderView(VM_POINTER(arg[0])); break; @@ -1085,11 +1078,8 @@ static int EXPORT_FN CG_SystemCalls(int arg, ...) return CG_SystemCallsEx(NULL, (unsigned)~0, arg, args); } -#endif - int CG_Refresh(void) { -#ifdef GLQUAKE int time; if (!cgvm) return false; @@ -1100,16 +1090,12 @@ int CG_Refresh(void) Draw_ImageColours(1, 1, 1, 1); return true; -#else - return false; -#endif } void CG_Stop (void) { -#ifdef GLQUAKE keycatcher &= ~2; if (cgvm) { @@ -1118,7 +1104,6 @@ void CG_Stop (void) VM_fcloseall(1); cgvm = NULL; } -#endif } void CG_Start (void) @@ -1130,7 +1115,6 @@ void CG_Start (void) return; } -#if defined(GLQUAKE) || defined(DIRECT3D) if (!Draw_SafeCachePic) //no renderer loaded { CG_Stop(); @@ -1158,21 +1142,14 @@ void CG_Start (void) SCR_EndLoadingPlaque(); Host_EndGame("Failed to initialise cgame module\n"); } -#else - Host_EndGame("Unable to connect to q3 servers without opengl.\n"); -#endif } qboolean CG_Command(void) { -#ifdef GLQUAKE if (!cgvm) return false; Con_DPrintf("CG_Command: %s %s\n", Cmd_Argv(0), Cmd_Args()); return VM_Call(cgvm, CG_CONSOLE_COMMAND); -#else - return false; -#endif } void CG_Command_f(void) diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index d06bbb340..d1e94761f 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -3574,26 +3574,12 @@ void Host_Init (quakeparms_t *parms) Key_Init (); Con_Init (); M_Init (); - - //fixme: this difference needs to go. -#ifndef _WIN32 IN_Init (); - CDAudio_Init (); - S_Init (); - - cls.state = ca_disconnected; - Sbar_Init (); - CL_Init (); -#else - S_Init (); - cls.state = ca_disconnected; CDAudio_Init (); Sbar_Init (); CL_Init (); - IN_Init (); -#endif TranslateInit(); #ifndef CLIENTONLY @@ -3634,7 +3620,6 @@ void Host_FinishInit(void) int qrc, hrc, def; #endif - Cbuf_AddText ("cl_warncmd 0\n", RESTRICT_LOCAL); Cbuf_AddText ("+mlook\n", RESTRICT_LOCAL); //fixme: this is bulky, only exec one of these. @@ -3660,7 +3645,10 @@ void Host_FinishInit(void) Cbuf_AddText ("exec fte.cfg\n", RESTRICT_LOCAL); Cbuf_AddText ("cl_warncmd 1\n", RESTRICT_LOCAL); //and then it's allowed to start moaning. - + { + extern cvar_t com_parseutf8; + com_parseutf8.ival = com_parseutf8.value; + } Cbuf_Execute (); //if the server initialisation causes a problem, give it a place to abort to diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 8a3764b48..d01298928 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -297,7 +297,6 @@ extern model_t mod_known[]; #define VM_FROMMHANDLE(a) (a?mod_known+a-1:NULL) #define VM_TOMHANDLE(a) (a?a-mod_known+1:0) -extern shader_t r_shaders[]; #define VM_FROMSHANDLE(a) (a?r_shaders+a-1:NULL) #define VM_TOSHANDLE(a) (a?a-r_shaders+1:0) @@ -454,7 +453,7 @@ void VQ3_AddPoly(shader_t *s, int num, q3polyvert_t *verts) if (cl_maxstrisvert < cl_numstrisvert+num) { cl_maxstrisvert = cl_numstrisvert+num + 64; - cl_strisvertv = BZ_Realloc(cl_strisvertv, sizeof(vec3_t)*cl_maxstrisvert); + cl_strisvertv = BZ_Realloc(cl_strisvertv, sizeof(*cl_strisvertv)*cl_maxstrisvert); cl_strisvertt = BZ_Realloc(cl_strisvertt, sizeof(vec2_t)*cl_maxstrisvert); cl_strisvertc = BZ_Realloc(cl_strisvertc, sizeof(vec4_t)*cl_maxstrisvert); } @@ -565,7 +564,7 @@ struct q3refdef_s { // text messages for deform text shaders char text[MAX_RENDER_STRINGS][MAX_RENDER_STRING_LENGTH]; }; - +void D3D9_Set2D (void); void VQ3_RenderView(const q3refdef_t *ref) { extern cvar_t r_torch; @@ -615,16 +614,15 @@ void VQ3_RenderView(const q3refdef_t *ref) GL_Set2D (); qglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); GL_TexEnv(GL_MODULATE); - } -#endif -#ifdef GLQUAKE - if (qrenderer == QR_OPENGL) - { qglDisable(GL_ALPHA_TEST); qglEnable(GL_BLEND); } #endif +#ifdef D3DQUAKE + if (qrenderer == QR_DIRECT3D) + D3D9_Set2D(); +#endif vid.recalc_refdef = 1; r_refdef.time = 0; @@ -878,10 +876,8 @@ int UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg) case UI_R_REGISTERSHADERNOMIP: if (!*(char*)VM_POINTER(arg[0])) VM_LONG(ret) = 0; - else if (qrenderer == QR_OPENGL) + else VM_LONG(ret) = VM_TOSHANDLE(R_RegisterPic(VM_POINTER(arg[0]))); -//FIXME: 64bit else -// VM_LONG(ret) = (long)Draw_SafeCachePic(VM_POINTER(arg[0])); break; case UI_R_CLEARSCENE: //clear scene @@ -1198,22 +1194,6 @@ int UI_SystemCallsEx(void *offset, unsigned int mask, int fn, const int *arg) VM_FLOAT(ret)=(float)ceil(VM_FLOAT(arg[0])); break; /* - case UI_CACHE_PIC: - if (!Draw_SafeCachePic) - VM_LONG(ret) = 0; - else - { - VM_LONG(ret) = 0;//FIXME: 64bit (long)R_RegisterPic(VM_POINTER(arg[0])); - } - break; - case UI_PICFROMWAD: - if (!Draw_SafePicFromWad) - VM_LONG(ret) = 0; - else - { - VM_LONG(ret) = 0;//FIXME: 64bit (long)R_RegisterPic(VM_POINTER(arg[0])); - } - break; case UI_GETPLAYERINFO: if (arg[1] + sizeof(vmuiclientinfo_t) >= mask || VM_POINTER(arg[1]) < offset) break; //out of bounds. @@ -1450,7 +1430,7 @@ void UI_Reset(void) { keycatcher &= ~2; - if (!Draw_SafeCachePic || qrenderer != QR_OPENGL) //no renderer loaded + if (qrenderer == QR_NONE) //no renderer loaded UI_Stop(); else if (uivm) VM_Call(uivm, UI_INIT); @@ -1541,9 +1521,6 @@ void UI_Stop (void) void UI_Start (void) { int apiversion; - if (!Draw_SafeCachePic) //no renderer loaded - return; - if (qrenderer != QR_OPENGL && qrenderer != QR_DIRECT3D) return; diff --git a/engine/client/client.h b/engine/client/client.h index 23e8ebd4b..40966e8c8 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -1199,7 +1199,6 @@ texid_t Media_UpdateForShader(cin_t *cin); void Media_ShutdownCin(cin_t *cin); //these accept NULL for cin to mean the current fullscreen video -void Media_Gecko_KeyPress (struct cin_s *cin, int code, int event); 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); diff --git a/engine/client/console.c b/engine/client/console.c index d442fc8e9..b56676e51 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -803,6 +803,9 @@ void Con_DrawInput (int left, int right, int y) extern int con_commandmatch; conchar_t maskedtext[MAXCMDLINE]; conchar_t *endmtext; + conchar_t *cursor; + conchar_t *cchar; + qboolean cursorframe; int x; @@ -819,13 +822,12 @@ void Con_DrawInput (int left, int right, int y) //if it's not a command, and the cursor is at the end of the line, leave it as is, // but add to the end to show what the compleation will be. + i = text[key_linepos]; + text[key_linepos] = 0; + cursor = COM_ParseFunString(CON_WHITEMASK, text, maskedtext, sizeof(maskedtext)-1*sizeof(conchar_t), true); + text[key_linepos] = i; endmtext = COM_ParseFunString(CON_WHITEMASK, text, maskedtext, sizeof(maskedtext)-1*sizeof(conchar_t), true); - //FIXME: key_linepos is not corrected for multibyte codes. - if (endmtext < maskedtext+key_linepos) - key_linepos = endmtext-maskedtext; - - endmtext[1] = 0; i = 0; @@ -841,7 +843,7 @@ void Con_DrawInput (int left, int right, int y) // else // Plug_SpellCheckMaskedText(maskedtext+1, i-1, x, y, 8, si, con_current->linewidth); - if (!text[key_linepos]) //cursor is at end + if (cursor == endmtext) //cursor is at end { int cmdstart; cmdstart = text[1] == '/'?2:1; @@ -858,12 +860,11 @@ void Con_DrawInput (int left, int right, int y) // Plug_SpellCheckMaskedText(maskedtext+1, i-1, x, y, 8, si, con_current->linewidth); #ifdef _WIN32 - if (ActiveApp) + if (!ActiveApp) + cursorframe = 0; + else #endif - if (((int)(realtime*con_cursorspeed)&1)) - { - maskedtext[key_linepos] = 0xe000|11|CON_WHITEMASK; //make it blink - } + cursorframe = ((int)(realtime*con_cursorspeed)&1); for (lhs = 0, i = key_linepos-1; i >= 0; i--) { @@ -884,14 +885,25 @@ void Con_DrawInput (int left, int right, int y) x = lhs; lhs = x - lhs + left; - for (i = 0; i < key_linepos; i++) + for (cchar = maskedtext; cchar < cursor; cchar++) { - lhs = Font_DrawChar(lhs, y, maskedtext[i]); + lhs = Font_DrawChar(lhs, y, *cchar); } rhs = x + left; - for (i = key_linepos; maskedtext[i]; i++) + if (cursorframe) { - rhs = Font_DrawChar(rhs, y, maskedtext[i]); + extern cvar_t com_parseutf8; + if (com_parseutf8.ival) + Font_DrawChar(rhs, y, (*cursor&~(CON_BGMASK|CON_FGMASK)) | (COLOR_BLUE< con_main.linewidth - MINCOLUMNWIDTH - || (x && nextcolx + strlen(s) >= con_main.linewidth)) - { - Con_Printf ("\n"); - x=0; - } - - if (x) - { - Con_Printf (" "); - x++; - } - while (x % COLUMNWIDTH) - { - Con_Printf (" "); - x++; - }*/ Con_Printf ("%s\t", s); x+=strlen(s); @@ -420,20 +400,6 @@ void Con_Selectioncolour_Callback(struct cvar_s *var, char *oldvalue) SCR_StringToRGB(var->string, sccolor, 1); } -/* -// TODO: fix this to be used as the common coord function for selection logic -void GetSelectionCoords(int *selectcoords) -{ - extern cvar_t vid_conwidth, vid_conheight; - extern int mousecursor_x, mousecursor_y; - int xpos, ypos; - - // convert to console coords - xpos = (int)(mousecursor_x*vid_conwidth.value)/vid.width; - ypos = (int)(mousecursor_y*vid_conheight.value)/vid.height; -} -*/ - qboolean Key_GetConsoleSelectionBox(int *sx, int *sy, int *ex, int *ey) { extern int mousecursor_x, mousecursor_y; @@ -478,6 +444,7 @@ Interactive line editing and console scrollback */ void Key_Console (unsigned int unicode, int key) { + extern cvar_t com_parseutf8; char *clipText; if (con_current->redirect) @@ -590,9 +557,17 @@ void Key_Console (unsigned int unicode, int key) if (key == K_DEL) { - if (strlen(key_lines[edit_line]+key_linepos)) + if (key_lines[edit_line][key_linepos]) { - memmove(key_lines[edit_line]+key_linepos, key_lines[edit_line]+key_linepos+1, strlen(key_lines[edit_line]+key_linepos+1)+1); + int charlen = 1; + if (com_parseutf8.ival && + (key_lines[edit_line][key_linepos] & 0xc0) != 0x80) + { + while((key_lines[edit_line][key_linepos+charlen] & 0xc0) == 0x80) + charlen++; + } + + memmove(key_lines[edit_line]+key_linepos, key_lines[edit_line]+key_linepos+charlen, strlen(key_lines[edit_line]+key_linepos+charlen)+charlen); return; } else @@ -603,8 +578,14 @@ void Key_Console (unsigned int unicode, int key) { if (key_linepos > 1) { - memmove(key_lines[edit_line]+key_linepos-1, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+1); - key_linepos--; + int charlen = 1; + if (com_parseutf8.ival) + { + while (key_linepos > charlen && (key_lines[edit_line][key_linepos-charlen] & 0xc0) == 0x80) + charlen++; + } + memmove(key_lines[edit_line]+key_linepos-charlen, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+charlen); + key_linepos -= charlen; } return; } @@ -745,65 +726,89 @@ void Key_Console (unsigned int unicode, int key) { unsigned char c1; unsigned char c2; + unsigned char c3; if (unicode > 127) { extern cvar_t com_parseutf8; - if (com_parseutf8.value) + if (com_parseutf8.ival) { - c1 = 0xc0 | ((unicode>>6)&0x1f); - c2 = 0x80 | (unicode&0x3f); - if (key_linepos < MAXCMDLINE-2) + if (unicode > 0xffff) { - memmove(key_lines[edit_line]+key_linepos+2, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+1); - key_lines[edit_line][key_linepos] = c1; - key_linepos++; - key_lines[edit_line][key_linepos] = c2; - key_linepos++; - // key_lines[edit_line][key_linepos] = 0; } - return; + else if (unicode > 0x7ff) + { + c1 = 0xe0 | ((unicode>>12)&0x0f); + c2 = 0x80 | ((unicode>> 6)&0x3f); + c3 = 0x80 | ((unicode>> 0)&0x3f); + if (key_linepos < MAXCMDLINE-3) + { + memmove(key_lines[edit_line]+key_linepos+2, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+1); + key_lines[edit_line][key_linepos] = c1; + key_linepos++; + key_lines[edit_line][key_linepos] = c2; + key_linepos++; + key_lines[edit_line][key_linepos] = c3; + key_linepos++; + } + return; + } + else + { + c1 = 0xc0 | ((unicode>>6)&0x1f); + c2 = 0x80 | ((unicode>>0)&0x3f); + if (key_linepos < MAXCMDLINE-2) + { + memmove(key_lines[edit_line]+key_linepos+2, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+1); + key_lines[edit_line][key_linepos] = c1; + key_linepos++; + key_lines[edit_line][key_linepos] = c2; + key_linepos++; + } + return; + } } unicode = '?'; //sorry } } - if (keydown[K_CTRL]) { - if (key >= '0' && key <= '9') - key = key - '0' + 0x12; // yellow number - else switch (key) { - case '[': key = 0x10; break; - case ']': key = 0x11; break; - case 'g': key = 0x86; break; - case 'r': key = 0x87; break; - case 'y': key = 0x88; break; - case 'b': key = 0x89; break; - case '(': key = 0x80; break; - case '=': key = 0x81; break; - case ')': key = 0x82; break; - case 'a': key = 0x83; break; - case '<': key = 0x1d; break; - case '-': key = 0x1e; break; - case '>': key = 0x1f; break; - case ',': key = 0x1c; break; - case '.': key = 0x9c; break; - case 'B': key = 0x8b; break; - case 'C': key = 0x8d; break; - case 'n': key = '\r'; break; + if (!com_parseutf8.ival) + { + if (keydown[K_CTRL]) { + if (key >= '0' && key <= '9') + key = key - '0' + 0x12; // yellow number + else switch (key) { + case '[': key = 0x10; break; + case ']': key = 0x11; break; + case 'g': key = 0x86; break; + case 'r': key = 0x87; break; + case 'y': key = 0x88; break; + case 'b': key = 0x89; break; + case '(': key = 0x80; break; + case '=': key = 0x81; break; + case ')': key = 0x82; break; + case 'a': key = 0x83; break; + case '<': key = 0x1d; break; + case '-': key = 0x1e; break; + case '>': key = 0x1f; break; + case ',': key = 0x1c; break; + case '.': key = 0x9c; break; + case 'B': key = 0x8b; break; + case 'C': key = 0x8d; break; + case 'n': key = '\r'; break; + } } + + if (keydown[K_ALT]) + key |= 128; // red char } - if (keydown[K_ALT]) - key |= 128; // red char - - if (strlen(key_lines[edit_line])+1 < MAXCMDLINE-1) { memmove(key_lines[edit_line]+key_linepos+1, key_lines[edit_line]+key_linepos, strlen(key_lines[edit_line]+key_linepos)+1); key_lines[edit_line][key_linepos] = key; key_linepos++; -// key_lines[edit_line][key_linepos] = 0; } } diff --git a/engine/client/m_mp3.c b/engine/client/m_mp3.c index 18454eb0b..efd617b2a 100644 --- a/engine/client/m_mp3.c +++ b/engine/client/m_mp3.c @@ -1316,22 +1316,22 @@ cin_t *Media_Cin_TryLoad(char *name) #ifdef OFFSCREENGECKO -int (*posgk_release) (OSGK_BaseObject* obj); +int (VARGS *posgk_release) (OSGK_BaseObject* obj); -OSGK_Browser* (*posgk_browser_create) (OSGK_Embedding* embedding, int width, int height); -void (*posgk_browser_resize) (OSGK_Browser* browser, int width, int height); -void (*posgk_browser_navigate) (OSGK_Browser* browser, const char* uri); -const unsigned char* (*posgk_browser_lock_data) (OSGK_Browser* browser, int* isDirty); -void (*posgk_browser_unlock_data) (OSGK_Browser* browser, const unsigned char* data); +OSGK_Browser* (VARGS *posgk_browser_create) (OSGK_Embedding* embedding, int width, int height); +void (VARGS *posgk_browser_resize) (OSGK_Browser* browser, int width, int height); +void (VARGS *posgk_browser_navigate) (OSGK_Browser* browser, const char* uri); +const unsigned char* (VARGS *posgk_browser_lock_data) (OSGK_Browser* browser, int* isDirty); +void (VARGS *posgk_browser_unlock_data) (OSGK_Browser* browser, const unsigned char* data); -void (*posgk_browser_event_mouse_move) (OSGK_Browser* browser, int x, int y); -void (*posgk_browser_event_mouse_button) (OSGK_Browser* browser, OSGK_MouseButton button, OSGK_MouseButtonEventType eventType); -int (*posgk_browser_event_key) (OSGK_Browser* browser, unsigned int key, OSGK_KeyboardEventType eventType); +void (VARGS *posgk_browser_event_mouse_move) (OSGK_Browser* browser, int x, int y); +void (VARGS *posgk_browser_event_mouse_button) (OSGK_Browser* browser, OSGK_MouseButton button, OSGK_MouseButtonEventType eventType); +int (VARGS *posgk_browser_event_key) (OSGK_Browser* browser, unsigned int key, OSGK_KeyboardEventType eventType); -OSGK_EmbeddingOptions* (*posgk_embedding_options_create) (void); -OSGK_Embedding* (*posgk_embedding_create2) (unsigned int apiVer, OSGK_EmbeddingOptions* options, OSGK_GeckoResult* geckoResult); -void (*posgk_embedding_options_set_profile_dir) (OSGK_EmbeddingOptions* options, const char* profileDir, const char* localProfileDir); -void (*posgk_embedding_options_add_search_path) (OSGK_EmbeddingOptions* options, const char* path); +OSGK_EmbeddingOptions* (VARGS *posgk_embedding_options_create) (void); +OSGK_Embedding* (VARGS *posgk_embedding_create2) (unsigned int apiVer, OSGK_EmbeddingOptions* options, OSGK_GeckoResult* geckoResult); +void (VARGS *posgk_embedding_options_set_profile_dir) (OSGK_EmbeddingOptions* options, const char* profileDir, const char* localProfileDir); +void (VARGS *posgk_embedding_options_add_search_path) (OSGK_EmbeddingOptions* options, const char* path); dllhandle_t geckodll; dllfunction_t gecko_functions[] = @@ -1367,7 +1367,7 @@ qboolean Media_Gecko_DecodeFrame(cin_t *cin, qboolean nosound) cin->outdata = (char*)posgk_browser_lock_data(cin->gecko.gbrowser, &cin->outunchanged); cin->outwidth = cin->gecko.bwidth; cin->outheight = cin->gecko.bheight; - cin->outtype = MOT_BGRA; + cin->outtype = TF_BGRA32; return !!cin->gecko.gbrowser; } @@ -1382,7 +1382,7 @@ void Media_Gecko_MoveCursor (struct cin_s *cin, float posx, float posy) posgk_browser_event_mouse_move(cin->gecko.gbrowser, posx*cin->gecko.bwidth, posy*cin->gecko.bheight); } -void Media_Gecko_KeyPress (struct cin_s *cin, int code, int event) +void Media_Gecko_KeyPress (struct cin_s *cin, int code, int unicode, int event) { if (code >= K_MOUSE1 && code < K_MOUSE10) { @@ -1494,8 +1494,10 @@ void Media_Gecko_KeyPress (struct cin_s *cin, int code, int event) case K_LWIN: code = OSGKKey_Meta; break; + default: + code = unicode; + break; } - Con_Printf("Sending %c\n", code); posgk_browser_event_key(cin->gecko.gbrowser, code, kePress); //posgk_browser_event_key(cin->gecko.gbrowser, code, event); } @@ -1548,7 +1550,7 @@ cin_t *Media_Gecko_TryLoad(char *name) return NULL; posgk_embedding_options_add_search_path(opts, "./xulrunner/"); - if (FS_NativePath("xulrunner_profile/", FS_GAMEONLY, xulprofiledir, sizeof(xulprofiledir)); + if (FS_NativePath("xulrunner_profile/", FS_ROOT, xulprofiledir, sizeof(xulprofiledir))) posgk_embedding_options_set_profile_dir(opts, xulprofiledir, 0); gecko_embedding = posgk_embedding_create2(OSGK_API_VERSION, opts, &result); @@ -1575,6 +1577,7 @@ cin_t *Media_Gecko_TryLoad(char *name) cin->gecko.gbrowser = posgk_browser_create(gecko_embedding, cin->gecko.bwidth, cin->gecko.bheight); if (!cin->gecko.gbrowser) { + Con_Printf("osgk_browser_create failed, your version of xulrunner is likely unsupported\n"); Z_Free(cin); return NULL; } @@ -1688,7 +1691,8 @@ qboolean Media_ShowFilm(void) switch(fullscreenvid->outtype) { case TF_RGBA32: - Media_ShowFrameRGBA_32(fullscreenvid->outdata, fullscreenvid->outwidth, fullscreenvid->outheight); + if (Media_ShowFrameRGBA_32) + Media_ShowFrameRGBA_32(fullscreenvid->outdata, fullscreenvid->outwidth, fullscreenvid->outheight); break; case TF_TRANS8: case TF_SOLID8: @@ -1710,7 +1714,7 @@ qboolean Media_ShowFilm(void) return true; } -#ifdef GLQUAKE +#if defined(GLQUAKE) || defined(D3DQUAKE) texid_t Media_UpdateForShader(cin_t *cin) { if (!cin) diff --git a/engine/client/m_options.c b/engine/client/m_options.c index 4ecf16e87..044bae6ca 100644 --- a/engine/client/m_options.c +++ b/engine/client/m_options.c @@ -75,16 +75,16 @@ void M_Menu_Options_f (void) MC_AddSlider(menu, 16, y, " Mouse Speed", &sensitivity, 1, 10, 0.5); y+=8; MC_AddSlider(menu, 16, y, " Crosshair", &crosshair, 0, 22, 1); y+=8; - MC_AddCheckBox(menu, 16, y, " Always Run", NULL,0)->func = M_Options_AlwaysRun; y+=8; - MC_AddCheckBox(menu, 16, y, " Invert Mouse", NULL,0)->func = M_Options_InvertMouse; y+=8; - MC_AddCheckBox(menu, 16, y, " Lookspring", &lookspring,0); y+=8; - MC_AddCheckBox(menu, 16, y, " Lookstrafe", &lookstrafe,0); y+=8; - MC_AddCheckBox(menu, 16, y, " Use old status bar", &cl_sbar,0); y+=8; - MC_AddCheckBox(menu, 16, y, " HUD on left side", &cl_hudswap,0); y+=8; - MC_AddCheckBox(menu, 16, y, " Old-style chatting", &cl_standardchat,0);y+=8; - MC_AddCheckBox(menu, 16, y, " Old-style messages", &cl_standardmsg,0);y+=8; - y+=4;MC_AddEditCvar(menu, 16, y," Imitate FPS", "cl_netfps"); y+=8+4; - y+=4;MC_AddEditCvar(menu, 16, y," Auto status format", "tp_autostatus"); y+=8+4; + MC_AddCheckBox(menu, 16, y, " Always Run", NULL,0)->func = M_Options_AlwaysRun; y+=8; + MC_AddCheckBox(menu, 16, y, " Invert Mouse", NULL,0)->func = M_Options_InvertMouse; y+=8; + MC_AddCheckBox(menu, 16, y, " Lookspring", &lookspring,0); y+=8; + MC_AddCheckBox(menu, 16, y, " Lookstrafe", &lookstrafe,0); y+=8; + MC_AddCheckBox(menu, 16, y, " Use old status bar", &cl_sbar,0); y+=8; + MC_AddCheckBox(menu, 16, y, " HUD on left side", &cl_hudswap,0); y+=8; + MC_AddCheckBox(menu, 16, y, " Old-style chatting", &cl_standardchat,0);y+=8; + MC_AddCheckBox(menu, 16, y, " Old-style messages", &cl_standardmsg,0);y+=8; + y+=4;MC_AddEditCvar(menu, 16, y, " Imitate FPS", "cl_netfps"); y+=8+4; + y+=4;MC_AddEditCvar(menu, 16, y, " Auto status format", "tp_autostatus"); y+=8+4; MC_AddConsoleCommand(menu, 16, y, " Video Options", "menu_video\n"); y+=8; MC_AddConsoleCommand(menu, 16, y, " FPS Options", "menu_fps\n"); y+=8; diff --git a/engine/client/p_classic.c b/engine/client/p_classic.c index 758c647d9..5516f9165 100644 --- a/engine/client/p_classic.c +++ b/engine/client/p_classic.c @@ -273,8 +273,16 @@ static void PClassic_DrawParticles(void) vec3_t up, right; float dist, scale, r_partscale=0; union c usecolours; + unsigned int *palette; RSpeedMark(); +/*#ifdef D3DQUAKE + if (qrenderer == QR_DIRECT3D) + palette = d_8to24bgrtable; + else +#endif*/ + palette = d_8to24rgbtable; + //make sure all ents are pushed through first RQ_RenderBatchClear(); @@ -336,7 +344,7 @@ static void PClassic_DrawParticles(void) scale = 1 + dist * r_partscale; - usecolours.i = d_8to24rgbtable[(int)p->color]; + usecolours.i = palette[(int)p->color]; if (p->type == pt_fire) usecolours.b[3] = 255 * (6 - p->ramp) / 6; else diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index a5aba8a05..880b63fd5 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -3704,53 +3704,63 @@ static void PF_skel_find_bone (progfuncs_t *prinst, struct globalvars_s *pr_glob G_FLOAT(OFS_RETURN) = Mod_TagNumForName(skelobj->model, bname); } +static void bonemat_fromqcvectors(float *out, const float vx[3], const float vy[3], const float vz[3], const float t[3]) +{ + out[0] = vx[0]; + out[1] = -vy[0]; + out[2] = vz[0]; + out[3] = t[0]; + out[4] = vx[1]; + out[5] = -vy[1]; + out[6] = vz[1]; + out[7] = t[1]; + out[8] = vx[2]; + out[9] = -vy[2]; + out[10] = vz[2]; + out[11] = t[2]; +} +void bonemat_toqcvectors(const float *in, float vx[3], float vy[3], float vz[3], float t[3]) +{ + vx[0] = in[0]; + vx[1] = in[4]; + vx[2] = in[8]; + vy[0] = -in[1]; + vy[1] = -in[5]; + vy[2] = -in[9]; + vz[0] = in[2]; + vz[1] = in[6]; + vz[2] = in[10]; + t [0] = in[3]; + t [1] = in[7]; + t [2] = in[11]; +} + +void bonematident_toqcvectors(float vx[3], float vy[3], float vz[3], float t[3]) +{ + vx[0] = 1; + vx[1] = 0; + vx[2] = 0; + vy[0] = -0; + vy[1] = -1; + vy[2] = -0; + vz[0] = 0; + vz[1] = 0; + vz[2] = 1; + t [0] = 0; + t [1] = 0; + t [2] = 0; +} + //vector(float skel, float bonenum) skel_get_bonerel (FTE_CSQC_SKELETONOBJECTS) (sets v_forward etc) static void PF_skel_get_bonerel (progfuncs_t *prinst, struct globalvars_s *pr_globals) { int skelidx = G_FLOAT(OFS_PARM0); int boneidx = G_FLOAT(OFS_PARM1)-1; - float *matrix[4]; - skelobject_t *skelobj; - matrix[0] = csqcg.forward; - matrix[1] = csqcg.right; - matrix[2] = csqcg.up; - matrix[3] = G_VECTOR(OFS_RETURN); - - skelobj = skel_get(prinst, skelidx, 0); + skelobject_t *skelobj = skel_get(prinst, skelidx, 0); if (!skelobj || skelobj->absolute || (unsigned int)boneidx >= skelobj->numbones) - { - matrix[0][0] = 1; - matrix[1][0] = 0; - matrix[2][0] = 0; - - matrix[0][1] = 0; - matrix[1][1] = 1; - matrix[2][1] = 0; - - matrix[0][2] = 0; - matrix[1][2] = 0; - matrix[2][2] = 1; - - matrix[3][0] = 0; - matrix[3][1] = 0; - matrix[3][2] = 0; - } + bonematident_toqcvectors(csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_RETURN)); else - { - float *bone = skelobj->bonematrix+12*boneidx; - matrix[0][0] = bone[0]; - matrix[1][0] = bone[1]; - matrix[2][0] = bone[2]; - matrix[3][0] = bone[3]; - matrix[0][1] = bone[4]; - matrix[1][1] = bone[5]; - matrix[2][1] = bone[6]; - matrix[3][1] = bone[7]; - matrix[0][2] = bone[8]; - matrix[1][2] = bone[9]; - matrix[2][2] = bone[10]; - matrix[3][2] = bone[11]; - } + bonemat_toqcvectors(skelobj->bonematrix+12*boneidx, csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_RETURN)); } //vector(float skel, float bonenum) skel_get_boneabs (FTE_CSQC_SKELETONOBJECTS) (sets v_forward etc) @@ -3758,42 +3768,16 @@ static void PF_skel_get_boneabs (progfuncs_t *prinst, struct globalvars_s *pr_gl { int skelidx = G_FLOAT(OFS_PARM0); int boneidx = G_FLOAT(OFS_PARM1)-1; - float *rmatrix[4]; float workingm[12], tempmatrix[3][4]; - skelobject_t *skelobj; int i; - rmatrix[0] = csqcg.forward; - rmatrix[1] = csqcg.right; - rmatrix[2] = csqcg.up; - rmatrix[3] = G_VECTOR(OFS_RETURN); - - skelobj = skel_get(prinst, skelidx, 0); + skelobject_t *skelobj = skel_get(prinst, skelidx, 0); if (!skelobj || (unsigned int)boneidx >= skelobj->numbones) - { - rmatrix[0][0] = 1; - rmatrix[0][1] = 0; - rmatrix[0][2] = 0; - - rmatrix[1][0] = 0; - rmatrix[1][1] = 1; - rmatrix[1][2] = 0; - - rmatrix[2][0] = 0; - rmatrix[2][1] = 0; - rmatrix[2][2] = 1; - - rmatrix[3][0] = 0; - rmatrix[3][1] = 0; - rmatrix[3][2] = 0; - } + bonematident_toqcvectors(csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_RETURN)); else if (skelobj->absolute) { //can just copy it out - memcpy(rmatrix[0], skelobj->bonematrix + boneidx*12 + 0, sizeof(vec3_t)); - memcpy(rmatrix[1], skelobj->bonematrix + boneidx*12 + 3, sizeof(vec3_t)); - memcpy(rmatrix[2], skelobj->bonematrix + boneidx*12 + 6, sizeof(vec3_t)); - memcpy(rmatrix[3], skelobj->bonematrix + boneidx*12 + 9, sizeof(vec3_t)); + bonemat_toqcvectors(skelobj->bonematrix + boneidx*12, csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_RETURN)); } else { @@ -3816,10 +3800,7 @@ static void PF_skel_get_boneabs (progfuncs_t *prinst, struct globalvars_s *pr_gl boneidx = Mod_GetBoneParent(skelobj->model, boneidx+1)-1; } - memcpy(rmatrix[0], (workingm+0), sizeof(vec3_t)); - memcpy(rmatrix[1], (workingm+3), sizeof(vec3_t)); - memcpy(rmatrix[2], (workingm+6), sizeof(vec3_t)); - memcpy(rmatrix[3], (workingm+9), sizeof(vec3_t)); + bonemat_toqcvectors(workingm, csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_RETURN)); } } @@ -3828,13 +3809,12 @@ static void PF_skel_set_bone (progfuncs_t *prinst, struct globalvars_s *pr_globa { int skelidx = G_FLOAT(OFS_PARM0); unsigned int boneidx = G_FLOAT(OFS_PARM1)-1; - float *matrix[4]; + float *matrix[3]; skelobject_t *skelobj; float *bone; if (*prinst->callargc > 5) { - matrix[3] = G_VECTOR(OFS_PARM2); matrix[0] = G_VECTOR(OFS_PARM3); matrix[1] = G_VECTOR(OFS_PARM4); matrix[2] = G_VECTOR(OFS_PARM5); @@ -3844,26 +3824,14 @@ static void PF_skel_set_bone (progfuncs_t *prinst, struct globalvars_s *pr_globa matrix[0] = csqcg.forward; matrix[1] = csqcg.right; matrix[2] = csqcg.up; - matrix[3] = G_VECTOR(OFS_PARM2); } skelobj = skel_get(prinst, skelidx, 0); if (!skelobj || boneidx >= skelobj->numbones) return; -//testme + bone = skelobj->bonematrix+12*boneidx; - bone[0] = matrix[0][0]; - bone[1] = matrix[1][0]; - bone[2] = matrix[2][0]; - bone[3] = matrix[3][0]; - bone[4] = matrix[0][1]; - bone[5] = matrix[1][1]; - bone[6] = matrix[2][1]; - bone[7] = matrix[3][1]; - bone[8] = matrix[0][2]; - bone[9] = matrix[1][2]; - bone[10]= matrix[2][2]; - bone[11]= matrix[3][2]; + bonemat_fromqcvectors(skelobj->bonematrix+12*boneidx, matrix[0], matrix[1], matrix[2], G_VECTOR(OFS_PARM2)); } //void(float skel, float bonenum, vector org) skel_mul_bone (FTE_CSQC_SKELETONOBJECTS) (reads v_forward etc) @@ -3875,28 +3843,17 @@ static void PF_skel_mul_bone (progfuncs_t *prinst, struct globalvars_s *pr_globa float mult[3][4]; skelobject_t *skelobj; if (*prinst->callargc > 5) - { - VectorCopy(G_VECTOR(OFS_PARM2), mult[3]); - VectorCopy(G_VECTOR(OFS_PARM3), mult[0]); - VectorCopy(G_VECTOR(OFS_PARM4), mult[1]); - VectorCopy(G_VECTOR(OFS_PARM5), mult[2]); - } + bonemat_fromqcvectors((float*)mult, G_VECTOR(OFS_PARM3), G_VECTOR(OFS_PARM4), G_VECTOR(OFS_PARM5), G_VECTOR(OFS_PARM2)); else - { - VectorCopy(csqcg.forward, mult[0]); - VectorCopy(csqcg.right, mult[1]); - VectorCopy(csqcg.up, mult[2]); - VectorCopy(G_VECTOR(OFS_PARM2), mult[3]); - } + bonemat_fromqcvectors((float*)mult, csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_PARM2)); skelobj = skel_get(prinst, skelidx, 0); if (!skelobj || boneidx >= skelobj->numbones) return; //testme - VectorCopy(skelobj->bonematrix+12*boneidx+0, temp[0]); - VectorCopy(skelobj->bonematrix+12*boneidx+3, temp[1]); - VectorCopy(skelobj->bonematrix+12*boneidx+6, temp[2]); - VectorCopy(skelobj->bonematrix+12*boneidx+9, temp[3]); + Vector4Copy(skelobj->bonematrix+12*boneidx+0, temp[0]); + Vector4Copy(skelobj->bonematrix+12*boneidx+4, temp[1]); + Vector4Copy(skelobj->bonematrix+12*boneidx+8, temp[2]); R_ConcatTransforms(mult, temp, (float(*)[4])(skelobj->bonematrix+12*boneidx)); } @@ -3910,19 +3867,9 @@ static void PF_skel_mul_bones (progfuncs_t *prinst, struct globalvars_s *pr_glob float mult[3][4]; skelobject_t *skelobj; if (*prinst->callargc > 6) - { - VectorCopy(G_VECTOR(OFS_PARM3), mult[3]); - VectorCopy(G_VECTOR(OFS_PARM4), mult[0]); - VectorCopy(G_VECTOR(OFS_PARM5), mult[1]); - VectorCopy(G_VECTOR(OFS_PARM6), mult[2]); - } + bonemat_fromqcvectors((float*)mult, G_VECTOR(OFS_PARM4), G_VECTOR(OFS_PARM5), G_VECTOR(OFS_PARM6), G_VECTOR(OFS_PARM3)); else - { - VectorCopy(csqcg.forward, mult[0]); - VectorCopy(csqcg.right, mult[1]); - VectorCopy(csqcg.up, mult[2]); - VectorCopy(G_VECTOR(OFS_PARM3), mult[3]); - } + bonemat_fromqcvectors((float*)mult, csqcg.forward, csqcg.right, csqcg.up, G_VECTOR(OFS_PARM3)); skelobj = skel_get(prinst, skelidx, 0); if (!skelobj) @@ -3933,10 +3880,9 @@ static void PF_skel_mul_bones (progfuncs_t *prinst, struct globalvars_s *pr_glob //testme while(startbone < endbone && startbone < skelobj->numbones) { - VectorCopy(skelobj->bonematrix+12*startbone+0, temp[0]); - VectorCopy(skelobj->bonematrix+12*startbone+3, temp[1]); - VectorCopy(skelobj->bonematrix+12*startbone+6, temp[2]); - VectorCopy(skelobj->bonematrix+12*startbone+9, temp[3]); + Vector4Copy(skelobj->bonematrix+12*startbone+0, temp[0]); + Vector4Copy(skelobj->bonematrix+12*startbone+4, temp[1]); + Vector4Copy(skelobj->bonematrix+12*startbone+8, temp[2]); R_ConcatTransforms(mult, temp, (float(*)[4])(skelobj->bonematrix+12*startbone)); } } @@ -3964,10 +3910,9 @@ static void PF_skel_copybones (progfuncs_t *prinst, struct globalvars_s *pr_glob //testme while(startbone < endbone && startbone < skelobjdst->numbones && startbone < skelobjsrc->numbones) { - VectorCopy(skelobjsrc->bonematrix+12*startbone+0, skelobjdst->bonematrix+12*startbone+0); - VectorCopy(skelobjsrc->bonematrix+12*startbone+3, skelobjdst->bonematrix+12*startbone+3); - VectorCopy(skelobjsrc->bonematrix+12*startbone+6, skelobjdst->bonematrix+12*startbone+6); - VectorCopy(skelobjsrc->bonematrix+12*startbone+9, skelobjdst->bonematrix+12*startbone+9); + Vector4Copy(skelobjsrc->bonematrix+12*startbone+0, skelobjdst->bonematrix+12*startbone+0); + Vector4Copy(skelobjsrc->bonematrix+12*startbone+4, skelobjdst->bonematrix+12*startbone+4); + Vector4Copy(skelobjsrc->bonematrix+12*startbone+8, skelobjdst->bonematrix+12*startbone+8); } } diff --git a/engine/client/quakedef.h b/engine/client/quakedef.h index 34a17bddd..81c71802b 100644 --- a/engine/client/quakedef.h +++ b/engine/client/quakedef.h @@ -271,11 +271,6 @@ extern qboolean isDedicated; void FTE_DEPRECATED R_RenderMeshBuffer(struct meshbuffer_s *mb, qboolean shadowpass); - - - - - #ifdef __cplusplus } #endif diff --git a/engine/client/r_2d.c b/engine/client/r_2d.c index 7834d6e5d..385ff4cb9 100644 --- a/engine/client/r_2d.c +++ b/engine/client/r_2d.c @@ -9,15 +9,19 @@ static mpic_t *draw_backtile; static mpic_t *draw_fill, *draw_fill_trans; mpic_t *draw_disc; +shader_t *shader_brighten; +shader_t *shader_polyblend; + static mesh_t draw_mesh; static vecV_t draw_mesh_xyz[4]; static vec2_t draw_mesh_st[4]; static avec4_t draw_mesh_colors[4]; -static index_t r_quad_indexes[6] = {0, 1, 2, 0, 2, 3}; +index_t r_quad_indexes[6] = {0, 1, 2, 2, 3, 0}; extern cvar_t scr_conalpha; extern cvar_t gl_conback; extern cvar_t gl_font; +extern cvar_t gl_contrast; void R2D_Conback_Callback(struct cvar_s *var, char *oldvalue); @@ -57,7 +61,10 @@ Image loading code must be ready for use at this point. */ void R2D_Init(void) { + Shader_Init(); + BE_Init(); + draw_mesh.istrifan = true; draw_mesh.numvertexes = 4; draw_mesh.numindexes = 6; draw_mesh.xyz_array = draw_mesh_xyz; @@ -99,6 +106,26 @@ void R2D_Init(void) "blendfunc blend\n" "}\n" "}\n"); + shader_brighten = R_RegisterShader("constrastshader", + "{\n" + "{\n" + "map $whiteimage\n" + "blendfunc gl_dst_color gl_one\n" + "rgbgen vertex\n" + "alphagen vertex\n" + "}\n" + "}\n" + ); + shader_polyblend = R_RegisterShader("polyblendshader", + "{\n" + "{\n" + "map $whiteimage\n" + "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" + "rgbgen vertex\n" + "alphagen vertex\n" + "}\n" + "}\n" + ); Cvar_Hook(&gl_conback, R2D_Conback_Callback); } @@ -318,10 +345,57 @@ void R2D_Conback_Callback(struct cvar_s *var, char *oldvalue) { if (*var->string) conback = R_RegisterPic(var->string); - if (!conback || !conback->width) + if (!conback) conback = R_RegisterCustom("console", NULL, NULL); - if (!conback || !conback->width) + if (!conback) conback = R_RegisterPic("gfx/conback.lmp"); } + +/* +============ +R_PolyBlend +============ +*/ +//bright flashes and stuff +void R2D_PolyBlend (void) +{ + if (!sw_blend[3]) + return; + + if (r_refdef.flags & Q2RDF_NOWORLDMODEL) + return; + + R2D_ImageColours (sw_blend[0], sw_blend[1], sw_blend[2], sw_blend[3]); + R2D_ScalePic(0, 0, vid.width, vid.height, shader_polyblend); +} + +//for lack of hardware gamma +void R2D_BrightenScreen (void) +{ + float f; + + RSpeedMark(); + + if (gl_contrast.value <= 1.0) + return; + + if (r_refdef.flags & Q2RDF_NOWORLDMODEL) + return; + + f = gl_contrast.value; + f = min (f, 3); + + while (f > 1) + { + if (f >= 2) + R2D_ImageColours (1, 1, 1, 1); + else + R2D_ImageColours (f - 1, f - 1, f - 1, 1); + R2D_ScalePic(0, 0, vid.width, vid.height, shader_brighten); + f *= 0.5; + } + + RSpeedEnd(RSPEED_PALETTEFLASHES); +} #endif diff --git a/engine/client/r_part.c b/engine/client/r_part.c index 0a34f80d5..45601d7f6 100644 --- a/engine/client/r_part.c +++ b/engine/client/r_part.c @@ -79,21 +79,24 @@ void R_ParticleSystem_Callback(struct cvar_s *var, char *oldvalue) if (pe) pe->ShutdownParticles(); - pe = NULL; - - for (i = 0; particlesystem[i]; i++) + if (!qrenderer) + pe = &pe_null; + else { - if ( (particlesystem[i]->name1 && !stricmp(var->string, particlesystem[i]->name1)) - || (particlesystem[i]->name2 && !stricmp(var->string, particlesystem[i]->name2))) + pe = NULL; + for (i = 0; particlesystem[i]; i++) { - pe = particlesystem[i]; - break; - } - if (!pe) - if (particlesystem[i]->name1) + if ( (particlesystem[i]->name1 && !stricmp(var->string, particlesystem[i]->name1)) + || (particlesystem[i]->name2 && !stricmp(var->string, particlesystem[i]->name2))) + { pe = particlesystem[i]; + break; + } + if (!pe) + if (particlesystem[i]->name1) + pe = particlesystem[i]; + } } - if (!pe) Sys_Error("No particle system available. Please recompile."); diff --git a/engine/client/r_surf.c b/engine/client/r_surf.c index e7c0057be..6e0f91575 100644 --- a/engine/client/r_surf.c +++ b/engine/client/r_surf.c @@ -32,9 +32,10 @@ static vec3_t modelorg; /*set before recursively entering the visible surface static qbyte areabits[MAX_Q2MAP_AREAS/8]; model_t *currentmodel; - +mesh_t nullmesh; int lightmap_bytes; // 1, 3 or 4 +qboolean lightmap_bgra; texid_t *lightmap_textures; texid_t *deluxmap_textures; @@ -768,24 +769,30 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest, { if (currentmodel->fromgame == fg_quake3) //rgb { - /* for (maps = 0 ; maps < MAXLIGHTMAPS && surf->styles[maps] != 255 ; - maps++) //no light styles in q3 apparently. + if (lightmap_bgra) { - scale = d_lightstylevalue[surf->styles[maps]]; - surf->cached_light[maps] = scale; // 8.8 fraction - surf->cached_colour[maps] = cl_lightstyle[surf->styles[maps]].colour; - } - */ - for (i = 0; i < tmax; i++) //q3 maps store their light in a block fashion, q1/q2/hl store it in a linear fashion. - { - for (j = 0; j < smax; j++) + for (i = 0; i < tmax; i++) //q3 maps store their light in a block fashion, q1/q2/hl store it in a linear fashion. { - blocklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3]; - greenblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+1]; - blueblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+2]; + for (j = 0; j < smax; j++) + { + blocklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+2]; + greenblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+1]; + blueblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3 ]; + } + } + } + else + { + for (i = 0; i < tmax; i++) //q3 maps store their light in a block fashion, q1/q2/hl store it in a linear fashion. + { + for (j = 0; j < smax; j++) + { + blocklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3]; + greenblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+1]; + blueblklights[i*smax+j] = 255*lightmap[(i*LMBLOCK_WIDTH+j)*3+2]; + } } } -// memset(blocklights, 255, sizeof(blocklights)); } else if (currentmodel->engineflags & MDLF_RGBLIGHTING) //rgb { @@ -796,27 +803,53 @@ static void Surf_BuildLightMap (msurface_t *surf, qbyte *dest, qbyte *deluxdest, surf->cached_light[maps] = scale; // 8.8 fraction surf->cached_colour[maps] = cl_lightstyle[surf->styles[maps]].colour; - - if (cl_lightstyle[surf->styles[maps]].colour == 7) //hopefully a faster alternative. + if (lightmap_bgra) { - for (i=0 ; istyles[maps]].colour == 7) //hopefully a faster alternative. { - blocklights[i] += lightmap[i*3 ] * scale; - greenblklights[i] += lightmap[i*3+1] * scale; - blueblklights[i] += lightmap[i*3+2] * scale; + for (i=0 ; istyles[maps]].colour & 1) + for (i=0 ; istyles[maps]].colour & 2) + for (i=0 ; istyles[maps]].colour & 4) + for (i=0 ; istyles[maps]].colour & 1) + if (cl_lightstyle[surf->styles[maps]].colour == 7) //hopefully a faster alternative. + { for (i=0 ; istyles[maps]].colour & 2) - for (i=0 ; istyles[maps]].colour & 4) - for (i=0 ; istyles[maps]].colour & 1) + for (i=0 ; istyles[maps]].colour & 2) + for (i=0 ; istyles[maps]].colour & 4) + for (i=0 ; i 255) dest[0] = 0; //inverse lighting else if ((r+cr) < 0) @@ -1412,7 +1445,7 @@ store: dest[2] = 0; else dest[2] = (b+cb); -*/ +//*/ @@ -2440,6 +2473,10 @@ static int Surf_LM_FillBlock (int texnum, int w, int h, int x, int y) { lightmap[i]->allocated[l] = LMBLOCK_HEIGHT; } + lightmap[i]->rectchange.l = 0; + lightmap[i]->rectchange.t = 0; + lightmap[i]->rectchange.w = LMBLOCK_WIDTH; + lightmap[i]->rectchange.h = LMBLOCK_HEIGHT; //clear out the deluxmaps incase there is none on the map. for (l = 0; l < LMBLOCK_HEIGHT*LMBLOCK_HEIGHT*3; l+=3) @@ -2449,8 +2486,6 @@ static int Surf_LM_FillBlock (int texnum, int w, int h, int x, int y) lightmap[i]->deluxmaps[l+2] = 255; } - //maybe someone screwed with my lightmap... - memset(lightmap[i]->lightmaps, 255, LMBLOCK_HEIGHT*LMBLOCK_HEIGHT*3); if (cl.worldmodel->lightdata) { memcpy(lightmap[i]->lightmaps, cl.worldmodel->lightdata+3*LMBLOCK_HEIGHT*LMBLOCK_HEIGHT*i, LMBLOCK_HEIGHT*LMBLOCK_HEIGHT*3); @@ -2458,6 +2493,9 @@ static int Surf_LM_FillBlock (int texnum, int w, int h, int x, int y) else { char basename[MAX_QPATH]; + //maybe someone screwed with my lightmap... + memset(lightmap[i]->lightmaps, 255, LMBLOCK_HEIGHT*LMBLOCK_HEIGHT*3); + COM_StripExtension(cl.worldmodel->name, basename, sizeof(basename)); lightmap_textures[i] = R_LoadHiResTexture(va("%s/lm_%04i", basename, i), NULL, IF_NOALPHA|IF_NOGAMMA); lightmap[i]->modified = false; @@ -2486,7 +2524,6 @@ void Surf_BuildSurfaceDisplayList (model_t *model, msurface_t *fa) float *vec; float s, t; int lm; - extern mesh_t nullmesh; // reconstruct the polygon pedges = model->edges; @@ -2625,6 +2662,7 @@ static void Surf_CreateSurfaceLightmap (msurface_t *surf, int shift) void Surf_DeInit(void) { int i; + for (i = 0; i < numlightmaps; i++) { if (!lightmap[i]) @@ -2674,7 +2712,11 @@ void Surf_BuildLightmaps (void) if (cl.worldmodel->fromgame == fg_doom) return; //no lightmaps. - if ((cl.worldmodel->engineflags & MDLF_RGBLIGHTING) || cl.worldmodel->deluxdata || r_loadlits.value) + lightmap_bgra = (qrenderer == QR_DIRECT3D); + + if (qrenderer == QR_DIRECT3D) + lightmap_bytes = 4; + else if ((cl.worldmodel->engineflags & MDLF_RGBLIGHTING) || cl.worldmodel->deluxdata || r_loadlits.value) lightmap_bytes = 3; else lightmap_bytes = 1; diff --git a/engine/client/render.h b/engine/client/render.h index b2464a9a1..0f3f44577 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -48,10 +48,12 @@ static const texid_t r_nulltex = {0}; #define GL_INDEX_TYPE GL_UNSIGNED_SHORT #define D3DFMT_QINDEX D3DFMT_INDEX16 typedef unsigned short index_t; + #define MAX_INDICIES 0xffff #else #define GL_INDEX_TYPE GL_UNSIGNED_INT #define D3DFMT_QINDEX D3DFMT_INDEX32 typedef unsigned int index_t; + #define MAX_INDICIES 0xffffffff #endif //============================================================================= @@ -292,8 +294,8 @@ enum uploadfmt #define R_FindTexture(name) ((qrenderer == QR_DIRECT3D)?D3D_FindTexture(name):GL_FindTexture(name)) #define R_LoadCompressed(name) ((qrenderer == QR_DIRECT3D)?D3D_LoadCompressed(name):GL_LoadCompressed(name)) #elif defined(D3DQUAKE) -// #define R_LoadTexture8Pal32 -// #define R_LoadTexture8Pal24 + #define R_LoadTexture8Pal32 D3D_LoadTexture8Pal32 + #define R_LoadTexture8Pal24 D3D_LoadTexture8Pal24 #define R_FindTexture D3D_FindTexture #define R_LoadCompressed D3D_LoadCompressed @@ -334,6 +336,9 @@ texid_t D3D_LoadTextureFmt (char *identifier, int width, int height, enum upload texid_t D3D_LoadCompressed(char *name); texid_t D3D_FindTexture (char *identifier); + +texid_t D3D_LoadTexture8Pal32 (char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags); +texid_t D3D_LoadTexture8Pal24 (char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags); #endif extern int image_width, image_height; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index d43b5bc8a..873ce326c 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -417,7 +417,6 @@ void GLRenderer_Init(void) Cvar_Register (&vid_multisample, GLRENDEREROPTIONS); Cvar_Register (&gl_fontinwardstep, GRAPHICALNICETIES); - Cvar_Register (&gl_font, GRAPHICALNICETIES); Cvar_Register (&gl_smoothfont, GRAPHICALNICETIES); Cvar_Register (&gl_smoothcrosshair, GRAPHICALNICETIES); @@ -592,6 +591,7 @@ void Renderer_Init(void) //screen + Cvar_Register (&gl_font, GRAPHICALNICETIES); Cvar_Register (&scr_conspeed, SCREENOPTIONS); Cvar_Register (&scr_conalpha, SCREENOPTIONS); Cvar_Register (&scr_showturtle, SCREENOPTIONS); @@ -2205,7 +2205,7 @@ qbyte *R_MarkLeaves_Q3 (void) r_visframecount++; r_oldviewcluster = r_viewcluster; - if (r_novis.value || r_viewcluster == -1 || !cl.worldmodel->vis ) + if (r_novis.ival || r_viewcluster == -1 || !cl.worldmodel->vis ) { // mark everything for (i=0,leaf=cl.worldmodel->leafs ; inumleafs ; i++, leaf++) @@ -2260,10 +2260,10 @@ qbyte *R_MarkLeaves_Q2 (void) r_oldviewcluster = r_viewcluster; r_oldviewcluster2 = r_viewcluster2; - if (r_novis.value == 2) + if (r_novis.ival == 2) return vis; r_visframecount++; - if (r_novis.value || r_viewcluster == -1 || !cl.worldmodel->vis) + if (r_novis.ival || r_viewcluster == -1 || !cl.worldmodel->vis) { // mark everything for (i=0 ; inumleafs ; i++) @@ -2318,7 +2318,7 @@ qbyte *R_CalcVis_Q1 (void) r_oldviewleaf = r_viewleaf; r_oldviewleaf2 = r_viewleaf2; - if ((int)r_novis.value&1) + if (r_novis.ival&1) { vis = curframevis; memset (vis, 0xff, (cl.worldmodel->numleafs+7)>>3); @@ -2347,7 +2347,7 @@ qbyte *R_MarkLeaves_Q1 (void) int i; qbyte solid[4096]; - if (((r_oldviewleaf == r_viewleaf && r_oldviewleaf2 == r_viewleaf2) && !r_novis.value) || r_novis.value == 2) + if (((r_oldviewleaf == r_viewleaf && r_oldviewleaf2 == r_viewleaf2) && !r_novis.ival) || r_novis.ival & 2) return vis; // if (mirror) @@ -2489,7 +2489,7 @@ void R_SetFrustum (float projmat[16], float viewmat[16]) int i; float mvp[16]; - if ((int)r_novis.value & 4) + if (r_novis.ival & 4) return; Matrix4_Multiply(projmat, viewmat, mvp); @@ -2526,7 +2526,7 @@ void R_SetFrustum (void) { int i; - if ((int)r_novis.value & 4) + if (r_novis.ival & 4) return; /* removed - assumes fov_x == fov_y diff --git a/engine/client/sys_linux.c b/engine/client/sys_linux.c index 2d7624ac1..0ee0c0a5e 100644 --- a/engine/client/sys_linux.c +++ b/engine/client/sys_linux.c @@ -376,6 +376,8 @@ void *Sys_GetGameAPI(void *parms) void *ret; getcwd(curpath, sizeof(curpath)); + + Con_DPrintf("Searching for %s\n", gamename); searchpath = 0; while((searchpath = COM_NextPath(searchpath))) diff --git a/engine/client/sys_npfte.c b/engine/client/sys_npfte.c index 4d1e5df61..e4c6c7a62 100644 --- a/engine/client/sys_npfte.c +++ b/engine/client/sys_npfte.c @@ -50,6 +50,11 @@ qboolean NPFTE_BeginDownload(void *ctx, struct pipetype *ftype, char *url) return NPERR_NO_ERROR==browserfuncs->geturlnotify(ctx, url, NULL, ftype); } +void NPFTE_StatusChanged(struct context *ctx) +{ + struct contextpublic *pub = (struct contextpublic*)ctx; + InvalidateRgn(pub->oldwnd, NULL, FALSE); +} #ifdef _WIN32 void DrawWndBack(struct context *ctx, HWND hWnd, HDC hdc, PAINTSTRUCT *p) @@ -59,10 +64,12 @@ void DrawWndBack(struct context *ctx, HWND hWnd, HDC hdc, PAINTSTRUCT *p) if (bmp) { HDC memDC; + RECT irect; memDC = CreateCompatibleDC(hdc); SelectObject(memDC, bmp); - StretchBlt(hdc, p->rcPaint.left, p->rcPaint.top, p->rcPaint.right-p->rcPaint.left,p->rcPaint.bottom-p->rcPaint.top, memDC, 0, 0, width, height, SRCCOPY); + GetClientRect(hWnd, &irect); + StretchBlt(hdc, irect.left, irect.top, irect.right-irect.left,irect.bottom-irect.top, memDC, 0, 0, width, height, SRCCOPY); SelectObject(memDC, NULL); DeleteDC(memDC); Plug_ReleaseSplashBack(ctx, bmp); @@ -102,29 +109,16 @@ LRESULT CALLBACK MyPluginWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar return TRUE; case WM_PAINT: -/* if (ctx->waitingfordatafiles) + if (pub->downloading) { HDC hdc; PAINTSTRUCT paint; char *s; unsigned int progress; unsigned int total; - bool sizeknown = true; - struct qstream *strm; - progress = 0; - total = 0; - if (Sys_TryLockMutex(ctx->mutex)) //this lock doesn't have to be here - { - for (strm = ctx->activestreams; strm; strm = strm->next) - { - progress += strm->offset; - total += strm->size; - if (!total && progress) - sizeknown = false; - } - Plug_LockPlugin(ctx, false); - } + progress = pub->dldone; + total = pub->dlsize; hdc = BeginPaint(hWnd, &paint); DrawWndBack(ctx, hWnd, hdc, &paint); @@ -132,7 +126,7 @@ LRESULT CALLBACK MyPluginWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar TextOutA(hdc, 0, 0, "Downloading Data, please wait", 16); if (!progress && !total) s = "connecting"; - else if (sizeknown) + else if (total) s = va("%i bytes (%i%%)", progress, (int)((100.0f*progress)/total)); else s = va("%i bytes", progress); @@ -141,7 +135,7 @@ LRESULT CALLBACK MyPluginWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar return TRUE; } else -*/ { + { HDC hdc; PAINTSTRUCT paint; char *s; @@ -184,7 +178,8 @@ LRESULT CALLBACK MyPluginWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lPar static const struct browserfuncs npfte_browserfuncs = { - NPFTE_BeginDownload + NPFTE_BeginDownload, + NPFTE_StatusChanged }; NPError NP_LOADDS NPP_New(NPMIMEType pluginType, NPP instance, @@ -247,7 +242,6 @@ NPError NP_LOADDS NPP_SetWindow(NPP instance, NPWindow* window) struct contextpublic *pub = (struct contextpublic*)ctx; #ifdef _WIN32 - HWND oldwindow; WNDPROC p; if (!ctx) @@ -446,7 +440,6 @@ struct npscript NPObject *npscript_allocate(NPP npp, NPClass *aClass) { - struct npscript_property *prop; struct npscript *obj; obj = malloc(sizeof(*obj)); obj->obj._class = aClass; @@ -481,7 +474,6 @@ bool npscript_invokeDefault(NPObject *npobj, const NPVariant *args, uint32_t arg bool npscript_hasProperty(NPObject *npobj, NPIdentifier name) { struct npscript *obj = (struct npscript *)npobj; - struct npscript_property *prop; NPUTF8 *pname; pname = browserfuncs->utf8fromidentifier(name); diff --git a/engine/client/sys_plugfte.c b/engine/client/sys_plugfte.c index 9e32eb78f..1707dccdb 100644 --- a/engine/client/sys_plugfte.c +++ b/engine/client/sys_plugfte.c @@ -310,10 +310,24 @@ int Plug_PluginThread(void *ctxptr) Sys_UnlockMutex(ctx->mutex); } + ctx->pub.downloading = true; while(host_initialized && !ctx->shutdown && ctx->packagelist) { + int total=0, done=0; Sys_LockMutex(ctx->mutex); + for (dl = ctx->packagelist; dl; dl = dl->next) + { + total += dl->totalsize; + done += dl->completed; + } dl = ctx->packagelist; + if (total != ctx->pub.dlsize || done != ctx->pub.dldone) + { + ctx->pub.dlsize = total; + ctx->pub.dldone = done; + if (ctx->bfuncs.StatusChanged) + ctx->bfuncs.StatusChanged(&ctx->pub); + } if (!dl->file) ctx->packagelist = dl->next; else @@ -325,6 +339,7 @@ int Plug_PluginThread(void *ctxptr) DL_Close(dl); Sleep(10); } + ctx->pub.downloading = false; if (host_initialized && !ctx->shutdown) { @@ -337,6 +352,8 @@ int Plug_PluginThread(void *ctxptr) Host_FinishInit(); Sys_UnlockMutex(ctx->mutex); } + if (ctx->bfuncs.StatusChanged) + ctx->bfuncs.StatusChanged(&ctx->pub); VS_DebugLocation(__FILE__, __LINE__, "main loop"); while(host_initialized) @@ -354,7 +371,7 @@ int Plug_PluginThread(void *ctxptr) sys_parentwindow = ctx->windowhnd; sys_parentwidth = ctx->windowwidth; sys_parentheight = ctx->windowheight; -// R_RestartRenderer_f(); + Cbuf_AddText("vid_recenter\n", RESTRICT_LOCAL); } else NPQTV_Sys_MainLoop(); @@ -381,7 +398,8 @@ int Plug_PluginThread(void *ctxptr) } ctx->pub.running = false; Sys_UnlockMutex(ctx->mutex); - InvalidateRgn(ctx->windowhnd, NULL, FALSE); + if (ctx->bfuncs.StatusChanged) + ctx->bfuncs.StatusChanged(&ctx->pub); while(argc-- > 0) free(argv[argc]); @@ -637,7 +655,11 @@ void LoadSplashImage(struct dl_download *dl) free(image); if (!f) + { + if (ctx->bfuncs.StatusChanged) + ctx->bfuncs.StatusChanged(&ctx->pub); return; + } len = VFS_GETLEN(f); buffer = malloc(len); @@ -670,8 +692,8 @@ void LoadSplashImage(struct dl_download *dl) ctx->splashheight = height; BZ_Free(image); - if (ctx->windowhnd) - InvalidateRgn(ctx->windowhnd, NULL, FALSE); + if (ctx->bfuncs.StatusChanged) + ctx->bfuncs.StatusChanged(&ctx->pub); } } @@ -744,7 +766,7 @@ char *pscript_property_startserver_gets(struct context *ctx) } void pscript_property_startserver_sets(struct context *ctx, const char *val) { - ctx->qtvf.connectiontype = QTVCT_CONNECT; + ctx->qtvf.connectiontype = QTVCT_JOIN; Q_strncpyz(ctx->qtvf.server, val, sizeof(ctx->qtvf.server)); } char *pscript_property_curserver_gets(struct context *ctx) @@ -774,6 +796,20 @@ void pscript_property_stream_sets(struct context *ctx, const char *val) if (pscript_property_running_getb(ctx)) Cmd_ExecuteString(va("qtvplay \"%s\"\n", val), RESTRICT_INSECURE); } +void pscript_property_map_sets(struct context *ctx, const char *val) +{ + ctx->qtvf.connectiontype = QTVCT_MAP; + FILTER(val) + Q_strncpyz(ctx->qtvf.server, val, sizeof(ctx->qtvf.server)); + + if (pscript_property_running_getb(ctx)) + Cmd_ExecuteString(va("map \"%s\"\n", val), RESTRICT_INSECURE); +} + +float pscript_property_curver_getf(struct context *ctx) +{ + return build_number(); +} void pscript_property_availver_setf(struct context *ctx, float val) { @@ -816,13 +852,6 @@ void pscript_property_splash_sets(struct context *ctx, const char *val) DL_Close(ctx->splashdownload); ctx->splashdownload = NULL; } - -/* - if (ctx->browserfuncs.RequestDownload) - ctx->browserfuncs.RequestDownload(ctx->nppinstance, &SplashscreenImageDescriptor, ctx->qtvf.splashscreen); - else - HTTP_CL_Get(); -*/ } extern cvar_t skin, team, topcolor, bottomcolor, vid_fullscreen, cl_download_mapsrc; @@ -849,6 +878,7 @@ static struct pscript_property pscript_properties[] = {"splash", false, NULL, NULL, pscript_property_splash_sets}, {"stream", false, NULL, NULL, pscript_property_stream_sets}, + {"map", false, NULL, NULL, pscript_property_map_sets}, /* else if (!stricmp(argn[i], "connType")) @@ -907,12 +937,6 @@ static struct pscript_property pscript_properties[] = { ctx->ondemoend = strdup(argv[i]); } - else if (!stricmp(argn[i], "availVer")) - { - ctx->availver = atof(argv[i]); - if (ctx->availver <= NPQTV_VERSION) - ctx->availver = 0; - } */ {NULL} }; diff --git a/engine/client/sys_plugfte.h b/engine/client/sys_plugfte.h index 2eafa44cd..03eaf5c2f 100644 --- a/engine/client/sys_plugfte.h +++ b/engine/client/sys_plugfte.h @@ -3,21 +3,19 @@ typedef enum qboolean; typedef void *vfsfile_t; #endif - -struct pipetype -{ - int dead; -}; - struct browserfuncs { qboolean (*RequestDownload)(void *ctx, struct pipetype *ftype, char *url); + void (*StatusChanged)(void *ctx); /*tells it that it needs to redraw the pre-active image*/ }; -/*the conext structure contains this at the start*/ +/*the conext structure contains this at the start (you can safely cast context->contextpublic)*/ struct contextpublic { qboolean running; /*set if the plugin context is actually active*/ + qboolean downloading; + unsigned int dlsize; + unsigned int dldone; float availver; /*this is the version of the plugin that is available, if current is better, use 0*/ #if defined(_WIN32) && defined(__QUAKEDEF_H__) @@ -25,6 +23,7 @@ struct contextpublic void *oldwnd; /*not used in the plugin itself*/ void *oldproc; /*not used in the plugin itself*/ #endif + void *user; }; #include diff --git a/engine/client/sys_sdl.c b/engine/client/sys_sdl.c index dfeafc03f..37d486816 100644 --- a/engine/client/sys_sdl.c +++ b/engine/client/sys_sdl.c @@ -139,18 +139,6 @@ void Sys_ServerActivity(void) { } - - -//Without these two we cannot run Q2 gamecode. -void Sys_UnloadGame (void) -{ -} -void *Sys_GetGameAPI (void *parms) -{ - return NULL; -} - - void Sys_CloseLibrary(dllhandle_t *lib) { SDL_UnloadObject((void*)lib); @@ -179,6 +167,60 @@ dllhandle_t *Sys_LoadLibrary(const char *name, dllfunction_t *funcs) return (dllhandle_t*)lib; } +//Without these two we cannot run Q2 gamecode. +dllhandle_t *q2gamedll; +void Sys_UnloadGame (void) +{ + if (q2gamedll) + Sys_CloseLibrary(q2gamedll); + q2gamedll = NULL; +} +void *Sys_GetGameAPI (void *parms) +{ + void *(*GetGameAPI)(void *); + dllfunction_t funcs[] = + { + {(void**)GetGameAPI, "GetGameAPI"}, + {NULL,NULL} + }; + + char name[MAX_OSPATH]; + char curpath[MAX_OSPATH]; + char *searchpath; + const char *gamename = "gamesdl.so"; + + void *ret; + + Con_DPrintf("Searching for %s\n", gamename); + + getcwd(curpath, sizeof(curpath)); + + searchpath = 0; + while((searchpath = COM_NextPath(searchpath))) + { + if (searchpath[0] == '/') + snprintf(name, sizeof(name), "%s/%s", searchpath, gamename); + else + snprintf(name, sizeof(name), "%s/%s/%s", curpath, searchpath, gamename); + + q2gamedll = Sys_LoadLibrary(name, funcs); + if (q2gamedll && gamename) + { + ret = GetGameAPI(parms); + if (ret) + { + return ret; + } + + Sys_CloseLibrary(q2gamedll); + q2gamedll = 0; + } + } + + return NULL; +} + + //used to see if a file exists or not. int Sys_FileTime (char *path) diff --git a/engine/common/bothdefs.h b/engine/common/bothdefs.h index 218d59017..8883aaf84 100644 --- a/engine/common/bothdefs.h +++ b/engine/common/bothdefs.h @@ -253,37 +253,30 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #undef VM_Q1 #endif -#if defined(D3DQUAKE) - //not supported in anything but GL. avoid bugs. - #undef AVAIL_FREETYPE -#endif - //remove any options that depend upon GL. #ifndef SERVERONLY - #if !defined(GLQUAKE) + #if !defined(GLQUAKE) && !defined(D3DQUAKE) #undef DOOMWADS #undef HALFLIFEMODELS #undef Q3BSPS #undef R_XFLIP #undef RUNTIMELIGHTING - #undef TERRAIN #undef Q3CLIENT #endif + #if !defined(GLQUAKE) + #undef TERRAIN + #endif + // undefine things not supported yet for D3D #if defined(D3DQUAKE) && !defined(GLQUAKE) #undef DDS // this is dumb #undef HALFLIFEMODELS - #undef Q3BSPS - #undef Q3CLIENT - #undef Q2BSPS - #undef Q2CLIENT - #undef Q2SERVER #endif #endif -#if !defined(GLQUAKE) && !defined(SERVERONLY) +#if !defined(GLQUAKE) && !defined(D3DQUAKE) && !defined(SERVERONLY) #undef Q3BSPS #endif #if !defined(Q3BSPS) diff --git a/engine/common/com_mesh.c b/engine/common/com_mesh.c index 91abe4913..a5d92af95 100644 --- a/engine/common/com_mesh.c +++ b/engine/common/com_mesh.c @@ -397,7 +397,8 @@ static int Alias_BuildLerps(float plerp[4], float *pose[4], int numbones, galias int frame2; float mlerp; //minor lerp, poses within a group. int l = 0; - + if (fg1time < 0) + fg1time = 0; mlerp = (fg1time)*g1->rate; frame1=mlerp; frame2=frame1+1; @@ -422,6 +423,8 @@ static int Alias_BuildLerps(float plerp[4], float *pose[4], int numbones, galias if (lerpfrac) { + if (fg2time < 0) + fg2time = 0; mlerp = (fg2time)*g2->rate; frame1=mlerp; frame2=frame1+1; diff --git a/engine/common/com_phys_ode.c b/engine/common/com_phys_ode.c index 25fb12b2a..e303725fb 100644 --- a/engine/common/com_phys_ode.c +++ b/engine/common/com_phys_ode.c @@ -1636,6 +1636,7 @@ static qboolean GenerateCollisionMesh(world_t *world, model_t *mod, wedict_t *ed mesh_t *mesh; unsigned int numverts; unsigned int numindexes,i; + unsigned int ni; numverts = 0; numindexes = 0; @@ -1662,8 +1663,11 @@ static qboolean GenerateCollisionMesh(world_t *world, model_t *mod, wedict_t *ed Con_DPrintf("entity %i (classname %s) has no geometry\n", NUM_FOR_EDICT(world->progs, (edict_t*)ed), PR_GetString(world->progs, ed->v->classname)); return false; } - ed->ode.ode_element3i = BZ_Malloc(numindexes*sizeof(index_t)); + ed->ode.ode_element3i = BZ_Malloc(numindexes*sizeof(*ed->ode.ode_element3i)); ed->ode.ode_vertex3f = BZ_Malloc(numverts*sizeof(vec3_t)); + + ni = numindexes; + numverts = 0; numindexes = 0; for (sno = 0; sno < mod->nummodelsurfaces; sno++) diff --git a/engine/common/common.c b/engine/common/common.c index 35fe24971..5b65efd2b 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -1801,7 +1801,7 @@ conchar_t *COM_ParseFunString(conchar_t defaultflags, const char *str, conchar_t conchar_t extstack[4]; int extstackdepth = 0; unsigned int uc, l; - int utf8 = com_parseutf8.value; + int utf8 = com_parseutf8.ival; conchar_t ext; @@ -1821,7 +1821,7 @@ conchar_t *COM_ParseFunString(conchar_t defaultflags, const char *str, conchar_t if (*str == 1 || *str == 2) { - if (com_parseutf8.value) + if (com_parseutf8.ival) defaultflags = (defaultflags&~CON_FGMASK) | (COLOR_MAGENTA<surface = shaderref; + // find the degree of subdivision in the u and v directions - Patch_GetFlatness( cm_subdivlevel, verts[0], 3, patch_cp, flat ); + Patch_GetFlatness( cm_subdivlevel, verts, sizeof(vecV_t)/sizeof(vec_t), patch_cp, flat ); step[0] = 1 << flat[0]; step[1] = 1 << flat[1]; @@ -805,15 +807,15 @@ static void CM_CreatePatch( q3cpatch_t *patch, q2mapsurface_t *shaderref, const if( size[0] <= 0 || size[1] <= 0 ) return; - data = BZ_Malloc( size[0] * size[1] * sizeof( vec3_t ) + + data = BZ_Malloc( size[0] * size[1] * sizeof( vecV_t ) + ( size[0]-1 ) * ( size[1]-1 ) * 2 * ( sizeof( q2cbrush_t ) + 32 * sizeof( mplane_t ) ) ); - points = ( vec3_t * )data; data += size[0] * size[1] * sizeof( vec3_t ); + points = ( vec3_t * )data; data += size[0] * size[1] * sizeof( vecV_t ); facets = ( q2cbrush_t * )data; data += ( size[0]-1 ) * ( size[1]-1 ) * 2 * sizeof( q2cbrush_t ); brushplanes = ( mplane_t * )data; data += ( size[0]-1 ) * ( size[1]-1 ) * 2 * MAX_FACET_PLANES * sizeof( mplane_t ); // fill in - Patch_Evaluate( verts[0], patch_cp, step, points[0], 3 ); + Patch_Evaluate(verts, patch_cp, step, points[0], sizeof(vecV_t)/sizeof(vec_t)); totalsides = 0; patch->numfacets = 0; @@ -859,7 +861,7 @@ static void CM_CreatePatch( q3cpatch_t *patch, q2mapsurface_t *shaderref, const } } - if( patch->numfacets ) + if (patch->numfacets) { qbyte *data; @@ -886,8 +888,6 @@ static void CM_CreatePatch( q3cpatch_t *patch, q2mapsurface_t *shaderref, const } } - patch->surface = shaderref; - for( i = 0; i < 3; i++ ) { // spread the mins / maxs by a pixel @@ -1026,7 +1026,7 @@ qboolean CM_CreateBrush ( q2cbrush_t *brush, vec3_t *verts, q2mapsurface_t *surf return true; } -qboolean CM_CreatePatch ( q3cpatch_t *patch, int numverts, const vec3_t *verts, int *patch_cp ) +qboolean CM_CreatePatch ( q3cpatch_t *patch, int numverts, const vec_t *verts, int *patch_cp ) { int step[2], size[2], flat[2], i, u, v; vec4_t points[MAX_CM_PATCH_VERTS], pointss[MAX_CM_PATCH_VERTS]; @@ -1186,7 +1186,7 @@ qboolean CM_CreatePatchesForLeafs (void) checkout[k] = numpatches++; //gcc warns without this cast - CM_CreatePatch ( patch, surf, (const vec3_t *)map_verts + face->firstvert, face->patch_cp ); + CM_CreatePatch ( patch, surf, (const vec_t *)map_verts + face->firstvert, face->patch_cp ); } leaf->contents |= patch->surface->c.value; @@ -2355,10 +2355,10 @@ qboolean CModQ3_LoadIndexes (lump_t *l) return false; } count = l->filelen / sizeof(*in); - if (count < 1 || count >= MAX_Q3MAP_INDICES) + if (count < 1 || count >= MAX_Q3MAP_INDICES || count > MAX_INDICIES) { - Con_Printf (CON_ERROR "MOD_LoadBmodel: bad surfedges count in %s: %i\n", - loadmodel->name, count); + Con_Printf (CON_ERROR "MOD_LoadBmodel: too many indicies in %s: %i\n", + loadmodel->name, count); return false; } @@ -2459,7 +2459,7 @@ qboolean CModRBSP_LoadFaces (lump_t *l) return true; } -#ifdef GLQUAKE +#if defined(GLQUAKE) || defined(D3DQUAKE) /* ================= @@ -2554,9 +2554,6 @@ byte_vec4_t tempcolors_array[MAX_ARRAY_VERTS]; mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, int numverts, int firstvert) { int numindexes, patch_cp[2], step[2], size[2], flat[2], i, u, v, p; - vec4_t colors[MAX_ARRAY_VERTS], points[MAX_ARRAY_VERTS], normals[MAX_ARRAY_VERTS], - lm_st[MAX_ARRAY_VERTS], tex_st[MAX_ARRAY_VERTS]; - vec4_t colors2[MAX_ARRAY_VERTS], points2[MAX_ARRAY_VERTS], normals2[MAX_ARRAY_VERTS], lm_st2[MAX_ARRAY_VERTS], tex_st2[MAX_ARRAY_VERTS]; mesh_t *mesh; index_t *indexes; float subdivlevel; @@ -2575,14 +2572,6 @@ mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, in if ( subdivlevel < 1 ) subdivlevel = 1; - for ( i = 0; i < numverts; i++ ) { - VectorCopy ( map_verts[firstvert + i], points[i] ); - VectorCopy ( map_normals_array[firstvert + i], normals[i] ); - Vector4Copy ( map_colors4f_array[firstvert + i], colors[i] ); - Vector2Copy ( map_vertstmexcoords[firstvert + i], tex_st[i] ); - Vector2Copy ( map_vertlstmexcoords[firstvert + i], lm_st[i] ); - } - // find the degree of subdivision in the u and v directions Patch_GetFlatness ( subdivlevel, map_verts[firstvert], sizeof(vecV_t)/sizeof(vec_t), patch_cp, flat ); @@ -2593,11 +2582,9 @@ mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, in size[1] = (patch_cp[1] / 2) * step[1] + 1; numverts = size[0] * size[1]; - if ( numverts < 0 || numverts > MAX_ARRAY_VERTS ) { + if ( numverts < 0 || numverts > MAX_ARRAY_VERTS ) return NULL; - } - mesh = (mesh_t *)Hunk_Alloc ( sizeof(mesh_t)); sz = sizeof(mesh_t) + numverts * ( sizeof(vecV_t)+ sizeof(vec3_t)+ @@ -2607,36 +2594,31 @@ mesh_t *GL_CreateMeshForPatch (model_t *mod, int patchwidth, int patchheight, in sizeof(vec2_t)+ sizeof(vec4_t)); allocbuf = Hunk_Alloc(sz); - mesh = (mesh_t *)(allocbuf+(sz-=sizeof(mesh_t))); - mesh->xyz_array = (vecV_t *)(allocbuf+(sz-=numverts*sizeof(vecV_t))); - mesh->normals_array = (vec3_t *)(allocbuf+(sz-=numverts*sizeof(vec3_t))); - mesh->snormals_array = (vec3_t *)(allocbuf+(sz-=numverts*sizeof(vec3_t))); - mesh->tnormals_array = (vec3_t *)(allocbuf+(sz-=numverts*sizeof(vec3_t))); - mesh->st_array = (vec2_t *)(allocbuf+(sz-=numverts*sizeof(vec2_t))); - mesh->lmst_array = (vec2_t *)(allocbuf+(sz-=numverts*sizeof(vec2_t))); - mesh->colors4f_array = (vec4_t *)(allocbuf+(sz-=numverts*sizeof(vec4_t))); -#ifdef _DEBUG - if (sz) - Sys_Error("Bug\n"); -#endif - + sz-=sizeof(mesh_t); + mesh = (mesh_t *)(allocbuf+sz); + sz-=numverts*sizeof(vecV_t); + mesh->xyz_array = (vecV_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec3_t); + mesh->normals_array = (vec3_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec3_t); + mesh->snormals_array = (vec3_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec3_t); + mesh->tnormals_array = (vec3_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec2_t); + mesh->st_array = (vec2_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec2_t); + mesh->lmst_array = (vec2_t *)(allocbuf+sz); + sz-=numverts*sizeof(vec4_t); + mesh->colors4f_array = (vec4_t *)(allocbuf+sz); mesh->numvertexes = numverts; // fill in - Patch_Evaluate ( points[0], patch_cp, step, points2[0], 3 ); - Patch_Evaluate ( colors[0], patch_cp, step, colors2[0], 4 ); - Patch_Evaluate ( normals[0], patch_cp, step, normals2[0], 3 ); - Patch_Evaluate ( lm_st[0], patch_cp, step, lm_st2[0], 2 ); - Patch_Evaluate ( tex_st[0], patch_cp, step, tex_st2[0], 2 ); - for (i = 0; i < numverts; i++) - { - VectorCopy ( points2[i], mesh->xyz_array[i] ); - VectorNormalize2 ( normals2[i], mesh->normals_array[i] ); - ColorNormalize ( colors2[i], mesh->colors4f_array[i] ); - Vector2Copy ( tex_st2[i], mesh->st_array[i] ); - Vector2Copy ( lm_st2[i], mesh->lmst_array[i] ); - } + Patch_Evaluate ( map_verts[firstvert], patch_cp, step, mesh->xyz_array[0], sizeof(vecV_t)/sizeof(vec_t)); + Patch_Evaluate ( map_colors4f_array[firstvert], patch_cp, step, mesh->colors4f_array[0], 4 ); + Patch_Evaluate ( map_normals_array[firstvert], patch_cp, step, mesh->normals_array[0], 3 ); + Patch_Evaluate ( map_vertstmexcoords[firstvert], patch_cp, step, mesh->st_array[0], 2 ); + Patch_Evaluate ( map_vertlstmexcoords[firstvert], patch_cp, step, mesh->lmst_array[0], 2 ); // compute new indexes avoiding adding invalid triangles numindexes = 0; diff --git a/engine/d3d/d3d_backend.c b/engine/d3d/d3d_backend.c index 80fe9b566..287fe5d40 100644 --- a/engine/d3d/d3d_backend.c +++ b/engine/d3d/d3d_backend.c @@ -3,205 +3,997 @@ #include "shader.h" #include + +#include +#include "glsupp.h" + extern LPDIRECT3DDEVICE9 pD3DDev9; +#define MAX_ARRAY_VERTS 65535 +static avec4_t coloursarray[MAX_ARRAY_VERTS]; +static float texcoordarray[SHADER_PASS_MAX][MAX_ARRAY_VERTS*2]; +static vecV_t vertexarray[MAX_ARRAY_VERTS]; + +/*========================================== tables for deforms =====================================*/ +#define frand() (rand()*(1.0/RAND_MAX)) +#define FTABLE_SIZE 1024 +#define FTABLE_CLAMP(x) (((int)((x)*FTABLE_SIZE) & (FTABLE_SIZE-1))) +#define FTABLE_EVALUATE(table,x) (table ? table[FTABLE_CLAMP(x)] : frand()*((x)-floor(x))) + +static float r_sintable[FTABLE_SIZE]; +static float r_triangletable[FTABLE_SIZE]; +static float r_squaretable[FTABLE_SIZE]; +static float r_sawtoothtable[FTABLE_SIZE]; +static float r_inversesawtoothtable[FTABLE_SIZE]; + +static float *FTableForFunc ( unsigned int func ) +{ + switch (func) + { + case SHADER_FUNC_SIN: + return r_sintable; + + case SHADER_FUNC_TRIANGLE: + return r_triangletable; + + case SHADER_FUNC_SQUARE: + return r_squaretable; + + case SHADER_FUNC_SAWTOOTH: + return r_sawtoothtable; + + case SHADER_FUNC_INVERSESAWTOOTH: + return r_inversesawtoothtable; + } + + //bad values allow us to crash (so I can debug em) + return NULL; +} + +static void FTable_Init(void) +{ + unsigned int i; + double t; + for (i = 0; i < FTABLE_SIZE; i++) + { + t = (double)i / (double)FTABLE_SIZE; + + r_sintable[i] = sin(t * 2*M_PI); + + if (t < 0.25) + r_triangletable[i] = t * 4.0; + else if (t < 0.75) + r_triangletable[i] = 2 - 4.0 * t; + else + r_triangletable[i] = (t - 0.75) * 4.0 - 1.0; + + if (t < 0.5) + r_squaretable[i] = 1.0f; + else + r_squaretable[i] = -1.0f; + + r_sawtoothtable[i] = t; + r_inversesawtoothtable[i] = 1.0 - t; + } +} +/*================================================*/ + typedef struct { + float curtime; + entity_t *curentity; shader_t *curshader; texnums_t *curtexnums; texid_t curlightmap; texid_t curdeluxmap; + int curvertdecl; + unsigned int shaderbits; + unsigned int lastpasscount; + + D3DCOLOR passcolour; + + IDirect3DVertexBuffer9 *dynxyz_buff; + unsigned int dynxyz_offs; + + IDirect3DVertexBuffer9 *dynst_buff[2]; + unsigned int dynst_offs[2]; + + IDirect3DVertexBuffer9 *dyncol_buff; + unsigned int dyncol_offs; + + IDirect3DIndexBuffer9 *dynidx_buff; + unsigned int dynidx_offs; } d3dbackend_t; -static d3dbackend_t d3dbackend; +#define DYNVBUFFSIZE 65536 +#define DYNIBUFFSIZE 65536 + +static d3dbackend_t shaderstate; extern int be_maxpasses; +enum +{ + D3D_VDEC_COL4B = 1<<0, + D3D_VDEC_NORMS = 1<<1, + D3D_VDEC_ST0 = 1<<2, + D3D_VDEC_ST1 = 1<<3, + D3D_VDEC_ST2 = 1<<3, + D3D_VDEC_ST3 = 1<<3, +#define MAX_TMUS 4 + D3D_VDEC_MAX = 16 +}; +IDirect3DVertexDeclaration9 *vertexdecls[D3D_VDEC_MAX]; + void BE_Init(void) { + D3DVERTEXELEMENT9 decl[8], declend=D3DDECL_END(); + int elements; + int i, tmu; + be_maxpasses = 1; + shaderstate.curvertdecl = -1; + + FTable_Init(); + + IDirect3DDevice9_CreateVertexBuffer(pD3DDev9, DYNVBUFFSIZE, D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &shaderstate.dynxyz_buff, NULL); + for (tmu = 0; tmu < MAX_TMUS; tmu++) + IDirect3DDevice9_CreateVertexBuffer(pD3DDev9, DYNVBUFFSIZE, D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &shaderstate.dynst_buff[tmu], NULL); + IDirect3DDevice9_CreateVertexBuffer(pD3DDev9, DYNVBUFFSIZE, D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, 0, D3DPOOL_DEFAULT, &shaderstate.dyncol_buff, NULL); + IDirect3DDevice9_CreateIndexBuffer(pD3DDev9, DYNIBUFFSIZE, D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, D3DFMT_QINDEX, D3DPOOL_DEFAULT, &shaderstate.dynidx_buff, NULL); + + for (i = 0; i < D3D_VDEC_MAX; i++) + { + elements = 0; + + decl[elements].Stream = 0; + decl[elements].Offset = 0; + decl[elements].Type = D3DDECLTYPE_FLOAT3; + decl[elements].Method = D3DDECLMETHOD_DEFAULT; + decl[elements].Usage = D3DDECLUSAGE_POSITION; + decl[elements].UsageIndex = 0; + elements++; + + if (i & D3D_VDEC_COL4B) + { + decl[elements].Stream = 1; + decl[elements].Offset = 0; + decl[elements].Type = D3DDECLTYPE_D3DCOLOR; + decl[elements].Method = D3DDECLMETHOD_DEFAULT; + decl[elements].Usage = D3DDECLUSAGE_COLOR; + decl[elements].UsageIndex = 0; + elements++; + } + + if (i & D3D_VDEC_NORMS) + { + decl[elements].Stream = 2; + decl[elements].Offset = 0; + decl[elements].Type = D3DDECLTYPE_FLOAT2; + decl[elements].Method = D3DDECLMETHOD_DEFAULT; + decl[elements].Usage = D3DDECLUSAGE_TEXCOORD; + decl[elements].UsageIndex = 1; + elements++; + + decl[elements].Stream = 3; + decl[elements].Offset = 0; + decl[elements].Type = D3DDECLTYPE_FLOAT2; + decl[elements].Method = D3DDECLMETHOD_DEFAULT; + decl[elements].Usage = D3DDECLUSAGE_TEXCOORD; + decl[elements].UsageIndex = 1; + elements++; + + decl[elements].Stream = 4; + decl[elements].Offset = 0; + decl[elements].Type = D3DDECLTYPE_FLOAT2; + decl[elements].Method = D3DDECLMETHOD_DEFAULT; + decl[elements].Usage = D3DDECLUSAGE_TEXCOORD; + decl[elements].UsageIndex = 1; + elements++; + } + + for (tmu = 0; tmu < MAX_TMUS; tmu++) + { + if (i & (D3D_VDEC_ST0< DYNVBUFFSIZE) + { + boff = 0; + *offset = bytes; + } + else + { + boff = *offset; + *offset += bytes; + } + IDirect3DVertexBuffer9_Lock(buff, boff, bytes, data, boff?D3DLOCK_NOOVERWRITE:D3DLOCK_DISCARD); +} + +static unsigned int allocindexbuffer(void **dest, unsigned int entries) +{ + unsigned int bytes = entries*sizeof(index_t); + unsigned int offset; + + if (shaderstate.dynidx_offs + bytes > DYNIBUFFSIZE) + { + offset = 0; + shaderstate.dynidx_offs = 0; + } + else + { + offset = shaderstate.dynidx_offs; + shaderstate.dynidx_offs += bytes; + } + + IDirect3DIndexBuffer9_Lock(shaderstate.dynidx_buff, offset, entries, dest, offset?D3DLOCK_NOOVERWRITE:D3DLOCK_DISCARD); + return offset/sizeof(index_t); +} + +static void SelectPassTexture(unsigned int tu, shaderpass_t *pass) +{ + switch(pass->texgen) { default: - case 0: - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + case T_GEN_DIFFUSE: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->base.ptr); break; - case SBITS_MISC_DEPTHEQUALONLY: - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_EQUAL); + case T_GEN_NORMALMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->bump.ptr); break; - case SBITS_MISC_DEPTHCLOSERONLY: - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESS); + case T_GEN_SPECULAR: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->specular.ptr); + break; + case T_GEN_UPPEROVERLAY: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->upperoverlay.ptr); + break; + case T_GEN_LOWEROVERLAY: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->loweroverlay.ptr); + break; + case T_GEN_FULLBRIGHT: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curtexnums->fullbright.ptr); + break; + case T_GEN_ANIMMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, pass->anim_frames[(int)(pass->anim_fps * shaderstate.curtime) % pass->anim_numframes].ptr); + break; + /*fixme*/ + case T_GEN_SINGLEMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, pass->anim_frames[0].ptr); + break; + case T_GEN_DELUXMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curdeluxmap.ptr); + break; + case T_GEN_LIGHTMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, shaderstate.curlightmap.ptr); + break; + + /*case T_GEN_CURRENTRENDER: + fixme + break;*/ + case T_GEN_VIDEOMAP: + IDirect3DDevice9_SetTexture (pD3DDev9, tu, Media_UpdateForShader(pass->cin).ptr); + break; + } + + switch (pass->blendmode) + { + case GL_DOT3_RGB_ARB: + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3); + break; + case GL_REPLACE: + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + break; + case GL_ADD: + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); + if (tu) + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_ADD); + break; + case GL_DECAL: + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_MODULATE); + break; + default: + case GL_MODULATE: + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CURRENT); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLOROP, D3DTOP_MODULATE); + break; + } + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + + if (tu == 0) + { + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_COLORARG2, D3DTA_CONSTANT); + IDirect3DDevice9_SetTextureStageState(pD3DDev9, tu, D3DTSS_CONSTANT, shaderstate.passcolour); + } +} + +static void colourgenbyte(const shaderpass_t *pass, int cnt, const byte_vec4_t *src, byte_vec4_t *dst, const mesh_t *mesh) +{ + D3DCOLOR block; + switch (pass->rgbgen) + { + case RGB_GEN_ENTITY: + block = D3DCOLOR_COLORVALUE(shaderstate.curentity->shaderRGBAf[0], shaderstate.curentity->shaderRGBAf[1], shaderstate.curentity->shaderRGBAf[2], shaderstate.curentity->shaderRGBAf[3]); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + break; + case RGB_GEN_ONE_MINUS_ENTITY: + block = D3DCOLOR_COLORVALUE(1-shaderstate.curentity->shaderRGBAf[0], 1-shaderstate.curentity->shaderRGBAf[1], 1-shaderstate.curentity->shaderRGBAf[2], 1-shaderstate.curentity->shaderRGBAf[3]); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + break; + case RGB_GEN_VERTEX: + case RGB_GEN_EXACT_VERTEX: + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = ((D3DCOLOR*)src)[cnt]; + } + break; + case RGB_GEN_ONE_MINUS_VERTEX: + while((cnt)--) + { + dst[cnt][0] = 255-src[cnt][0]; + dst[cnt][1] = 255-src[cnt][1]; + dst[cnt][2] = 255-src[cnt][2]; + } + break; + case RGB_GEN_IDENTITY_LIGHTING: + //compensate for overbrights + while((cnt)--) + { + dst[cnt][0] = 255;//shaderstate.identitylighting; + dst[cnt][1] = 255;//shaderstate.identitylighting; + dst[cnt][2] = 255;//shaderstate.identitylighting; + } + break; + default: + case RGB_GEN_IDENTITY: + block = D3DCOLOR_RGBA(255, 255, 255, 255); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + break; + case RGB_GEN_CONST: + block = D3DCOLOR_COLORVALUE(pass->rgbgen_func.args[0], pass->rgbgen_func.args[1], pass->rgbgen_func.args[2], 1); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + break; + case RGB_GEN_LIGHTING_DIFFUSE: + //collect lighting details for mobile entities + // if (!mesh->normals_array) + { + block = D3DCOLOR_RGBA(255, 255, 255, 255); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + } + /* else + { + R_LightArraysByte(mesh->xyz_array, dst, cnt, mesh->normals_array); + }*/ + break; + case RGB_GEN_WAVE: + { + float *table; + float c; + + table = FTableForFunc(pass->rgbgen_func.type); + c = pass->rgbgen_func.args[2] + shaderstate.curtime * pass->rgbgen_func.args[3]; + c = FTABLE_EVALUATE(table, c) * pass->rgbgen_func.args[1] + pass->rgbgen_func.args[0]; + c = bound(0.0f, c, 1.0f); + block = D3DCOLOR_COLORVALUE(c, c, c, 1); + + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + } + break; + + case RGB_GEN_TOPCOLOR: + case RGB_GEN_BOTTOMCOLOR: +#pragma message("fix 24bit player colours") + block = D3DCOLOR_RGBA(255, 255, 255, 255); + while((cnt)--) + { + ((D3DCOLOR*)dst)[cnt] = block; + } + // Con_Printf("RGB_GEN %i not supported\n", pass->rgbgen); break; } } -unsigned int workingbuffer[65536]; -static void BE_DrawMeshChain_Internal(mesh_t *meshchain) +static void alphagenbyte(const shaderpass_t *pass, int cnt, const byte_vec4_t *src, byte_vec4_t *dst, const mesh_t *mesh) { - float *xyz; - unsigned int *colour; - float *st[1]; - unsigned int fmt = 0; - unsigned int stride; - int i; + float *table; + unsigned char t; + float f; + vec3_t v1, v2; - if (!d3dbackend.curshader) - return; - if (!d3dbackend.curtexnums) - return; - - stride = 0; -memset(workingbuffer, 0, sizeof(workingbuffer)); - xyz = (float*)(workingbuffer+stride); - stride += 3; - fmt |= D3DFVF_XYZ; - - colour = (unsigned int*)(workingbuffer+stride); - stride += 1; - fmt |= D3DFVF_DIFFUSE; - - st[0] = (float*)(workingbuffer+stride); - stride += 2; - fmt |= D3DFVF_TEX1; - - D3DBE_ApplyShaderBits(d3dbackend.curshader->passes[0].shaderbits); - - IDirect3DDevice9_SetFVF(pD3DDev9, fmt); - - switch(d3dbackend.curshader->passes[0].texgen) + switch (pass->alphagen) { default: - case T_GEN_DIFFUSE: - IDirect3DDevice9_SetTexture (pD3DDev9, 0, d3dbackend.curtexnums->base.ptr); + case ALPHA_GEN_IDENTITY: + while(cnt--) + dst[cnt][3] = 255; break; - case T_GEN_SINGLEMAP: - IDirect3DDevice9_SetTexture (pD3DDev9, 0, d3dbackend.curshader->passes[0].anim_frames[0].ptr); - break; - } - switch(d3dbackend.curshader->passes[1].texgen) - { - case T_GEN_LIGHTMAP: - IDirect3DDevice9_SetTexture (pD3DDev9, 1, d3dbackend.curlightmap.ptr); - IDirect3DDevice9_SetTextureStageState(pD3DDev9, 1, D3DTSS_COLORARG1, D3DTA_TEXTURE); - IDirect3DDevice9_SetTextureStageState(pD3DDev9, 1, D3DTSS_COLORARG2, D3DTA_CURRENT); - IDirect3DDevice9_SetTextureStageState(pD3DDev9, 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X); + case ALPHA_GEN_CONST: + t = pass->alphagen_func.args[0]*255; + while(cnt--) + dst[cnt][3] = t; break; - default: - IDirect3DDevice9_SetTexture (pD3DDev9, 1, NULL); - IDirect3DDevice9_SetTextureStageState(pD3DDev9, 1, D3DTSS_COLOROP, D3DTOP_DISABLE); - break; - } - if (meshchain->colors4b_array) - { - /*I'm guessing I ought to create a temp vertex buffer for this*/ - for (; meshchain; meshchain = meshchain->next) + case ALPHA_GEN_WAVE: + table = FTableForFunc(pass->alphagen_func.type); + f = pass->alphagen_func.args[2] + shaderstate.curtime * pass->alphagen_func.args[3]; + f = FTABLE_EVALUATE(table, f) * pass->alphagen_func.args[1] + pass->alphagen_func.args[0]; + t = bound(0.0f, f, 1.0f)*255; + while(cnt--) + dst[cnt][3] = t; + break; + + case ALPHA_GEN_PORTAL: + //FIXME: should this be per-vert? + VectorAdd(mesh->xyz_array[0], shaderstate.curentity->origin, v1); + VectorSubtract(r_origin, v1, v2); + f = VectorLength(v2) * (1.0 / 255.0); + t = bound(0.0f, f, 1.0f)*255; + + while(cnt--) + dst[cnt][3] = t; + break; + + case ALPHA_GEN_VERTEX: + if (!src) { - for (i = 0; i < meshchain->numvertexes; i++) + while(cnt--) { - VectorCopy(meshchain->xyz_array[i], (xyz+stride*i)); - *(colour+stride*i) = ((unsigned int)meshchain->colors4b_array[i][3]<<24) | ((unsigned int)meshchain->colors4b_array[i][0]<<16) | ((unsigned int)meshchain->colors4b_array[i][1]<<8) | ((unsigned int)meshchain->colors4b_array[i][2]); - Vector2Copy(meshchain->st_array[i], (st[0]+stride*i)); + dst[cnt][3] = 255; } - IDirect3DDevice9_DrawIndexedPrimitiveUP(pD3DDev9, D3DPT_TRIANGLELIST, 0, meshchain->numvertexes, meshchain->numindexes/3, meshchain->indexes, D3DFMT_QINDEX, workingbuffer, stride*4); + break; } + + while(cnt--) + { + dst[cnt][3] = src[cnt][3]; + } + break; + + case ALPHA_GEN_ENTITY: + t = bound(0, shaderstate.curentity->shaderRGBAf[3], 1)*255; + while(cnt--) + { + dst[cnt][3] = t; + } + break; + + + /*case ALPHA_GEN_SPECULAR: + { + mat3_t axis; + AngleVectors(shaderstate.curentity->angles, axis[0], axis[1], axis[2]); + VectorSubtract(r_origin, shaderstate.curentity->origin, v1); + + if (!Matrix3_Compare(axis, axisDefault)) + { + Matrix3_Multiply_Vec3(axis, v2, v2); + } + else + { + VectorCopy(v1, v2); + } + + for (i = 0; i < cnt; i++) + { + VectorSubtract(v2, mesh->xyz_array[i], v1); + f = DotProduct(v1, mesh->normals_array[i] ) * Q_rsqrt(DotProduct(v1,v1)); + f = f * f * f * f * f; + dst[i][3] = bound (0.0f, f, 1.0f); + } + } + break;*/ + } +} + +static unsigned int BE_GenerateColourMods(unsigned int vertcount, const shaderpass_t *pass, const mesh_t *meshlist) +{ + unsigned int ret = 0; + unsigned char *map; + const mesh_t *m; + qboolean usearray; + + if (pass->flags & SHADER_PASS_NOCOLORARRAY) + usearray = false; + else + usearray = true; + + if (usearray && meshlist->colors4b_array) + { + shaderstate.passcolour = D3DCOLOR_RGBA(255,255,255,255); + + ret |= D3D_VDEC_COL4B; + allocvertexbuffer(shaderstate.dyncol_buff, &shaderstate.dyncol_offs, (void**)&map, vertcount*sizeof(D3DCOLOR)); + for (m = meshlist, vertcount = 0; m; vertcount += m->numvertexes, m = m->next) + memcpy((char*)map+vertcount*sizeof(D3DCOLOR), m->colors4b_array, m->numvertexes*sizeof(D3DCOLOR)); + IDirect3DVertexBuffer9_Unlock(shaderstate.dyncol_buff); + IDirect3DDevice9_SetStreamSource(pD3DDev9, 1, shaderstate.dyncol_buff, shaderstate.dyncol_offs - vertcount*sizeof(D3DCOLOR), sizeof(D3DCOLOR)); + } + else if (usearray && meshlist->colors4f_array) + { + unsigned int v; + float *src; + shaderstate.passcolour = D3DCOLOR_RGBA(255,255,255,255); + + ret |= D3D_VDEC_COL4B; + allocvertexbuffer(shaderstate.dyncol_buff, &shaderstate.dyncol_offs, (void**)&map, vertcount*sizeof(D3DCOLOR)); + for (m = meshlist, vertcount = 0; m; vertcount += m->numvertexes, m = m->next) + { + src = m->colors4f_array[0]; + for (v = 0; v < m->numvertexes; v++) + { + map[0] = src[0]*255; + map[1] = src[1]*255; + map[2] = src[2]*255; + map[3] = src[3]*255; + map += 4; + src += 4; + } + } + map -= vertcount*4; + colourgenbyte(pass, vertcount, (byte_vec4_t*)map, (byte_vec4_t*)map, meshlist); + alphagenbyte(pass, vertcount, (byte_vec4_t*)map, (byte_vec4_t*)map, meshlist); + IDirect3DVertexBuffer9_Unlock(shaderstate.dyncol_buff); + IDirect3DDevice9_SetStreamSource(pD3DDev9, 1, shaderstate.dyncol_buff, shaderstate.dyncol_offs - vertcount*sizeof(D3DCOLOR), sizeof(D3DCOLOR)); } else { - /*I'm guessing I ought to create a temp vertex buffer for this*/ - for (; meshchain; meshchain = meshchain->next) + shaderstate.passcolour = D3DCOLOR_RGBA(255,255,255,255); + colourgenbyte(pass, 1, (byte_vec4_t*)&shaderstate.passcolour, (byte_vec4_t*)&shaderstate.passcolour, meshlist); + alphagenbyte(pass, 1, (byte_vec4_t*)&shaderstate.passcolour, (byte_vec4_t*)&shaderstate.passcolour, meshlist); + IDirect3DDevice9_SetStreamSource(pD3DDev9, 1, NULL, 0, 0); + } + return ret; +} +/*********************************************************************************************************/ +/*========================================== texture coord generation =====================================*/ + +static void tcgen_environment(float *st, unsigned int numverts, float *xyz, float *normal) +{ + /* + int i; + vec3_t viewer, reflected; + float d; + + vec3_t rorg; + + + RotateLightVector(shaderstate.curentity->axis, shaderstate.curentity->origin, r_origin, rorg); + + for (i = 0 ; i < numverts ; i++, xyz += 3, normal += 3, st += 2 ) + { + VectorSubtract (rorg, xyz, viewer); + VectorNormalizeFast (viewer); + + d = DotProduct (normal, viewer); + + reflected[0] = normal[0]*2*d - viewer[0]; + reflected[1] = normal[1]*2*d - viewer[1]; + reflected[2] = normal[2]*2*d - viewer[2]; + + st[0] = 0.5 + reflected[1] * 0.5; + st[1] = 0.5 - reflected[2] * 0.5; + } + */ +} + +static float *tcgen(const shaderpass_t *pass, int cnt, float *dst, const mesh_t *mesh) +{ + int i; + vecV_t *src; + switch (pass->tcgen) + { + default: + case TC_GEN_BASE: + return (float*)mesh->st_array; + case TC_GEN_LIGHTMAP: + return (float*)mesh->lmst_array; + case TC_GEN_NORMAL: + return (float*)mesh->normals_array; + case TC_GEN_SVECTOR: + return (float*)mesh->snormals_array; + case TC_GEN_TVECTOR: + return (float*)mesh->tnormals_array; + case TC_GEN_ENVIRONMENT: + tcgen_environment(dst, cnt, (float*)mesh->xyz_array, (float*)mesh->normals_array); + return dst; + +// case TC_GEN_DOTPRODUCT: +// return mesh->st_array[0]; + case TC_GEN_VECTOR: + src = mesh->xyz_array; + for (i = 0; i < cnt; i++, dst += 2) { - for (i = 0; i < meshchain->numvertexes; i++) - { - VectorCopy(meshchain->xyz_array[i], (xyz+stride*i)); - *(colour+stride*i) = 0xffffffff;//*(unsigned int*)meshchain->colors4b_array[i]; - Vector2Copy(meshchain->st_array[i], (st[0]+stride*i)); - } - IDirect3DDevice9_DrawIndexedPrimitiveUP(pD3DDev9, D3DPT_TRIANGLELIST, 0, meshchain->numvertexes, meshchain->numindexes/3, meshchain->indexes, D3DFMT_QINDEX, workingbuffer, stride*4); + static vec3_t tc_gen_s = { 1.0f, 0.0f, 0.0f }; + static vec3_t tc_gen_t = { 0.0f, 1.0f, 0.0f }; + + dst[0] = DotProduct(tc_gen_s, src[i]); + dst[1] = DotProduct(tc_gen_t, src[i]); } + return dst; + } +} + +/*src and dst can be the same address when tcmods are chained*/ +static void tcmod(const tcmod_t *tcmod, int cnt, const float *src, float *dst, const mesh_t *mesh) +{ + float *table; + float t1, t2; + float cost, sint; + int j; +#define R_FastSin(x) sin((x)*(2*M_PI)) + switch (tcmod->type) + { + case SHADER_TCMOD_ROTATE: + cost = tcmod->args[0] * shaderstate.curtime; + sint = R_FastSin(cost); + cost = R_FastSin(cost + 0.25); + + for (j = 0; j < cnt; j++, dst+=2,src+=2) + { + t1 = cost * (src[0] - 0.5f) - sint * (src[1] - 0.5f) + 0.5f; + t2 = cost * (src[1] - 0.5f) + sint * (src[0] - 0.5f) + 0.5f; + dst[0] = t1; + dst[1] = t2; + } + break; + + case SHADER_TCMOD_SCALE: + t1 = tcmod->args[0]; + t2 = tcmod->args[1]; + + for (j = 0; j < cnt; j++, dst+=2,src+=2) + { + dst[0] = src[0] * t1; + dst[1] = src[1] * t2; + } + break; + + case SHADER_TCMOD_TURB: + t1 = tcmod->args[2] + shaderstate.curtime * tcmod->args[3]; + t2 = tcmod->args[1]; + + for (j = 0; j < cnt; j++, dst+=2,src+=2) + { + dst[0] = src[0] + R_FastSin (src[0]*t2+t1) * t2; + dst[1] = src[1] + R_FastSin (src[1]*t2+t1) * t2; + } + break; + + case SHADER_TCMOD_STRETCH: + table = FTableForFunc(tcmod->args[0]); + t2 = tcmod->args[3] + shaderstate.curtime * tcmod->args[4]; + t1 = FTABLE_EVALUATE(table, t2) * tcmod->args[2] + tcmod->args[1]; + t1 = t1 ? 1.0f / t1 : 1.0f; + t2 = 0.5f - 0.5f * t1; + for (j = 0; j < cnt; j++, dst+=2,src+=2) + { + dst[0] = src[0] * t1 + t2; + dst[1] = src[1] * t1 + t2; + } + break; + + case SHADER_TCMOD_SCROLL: + t1 = tcmod->args[0] * shaderstate.curtime; + t2 = tcmod->args[1] * shaderstate.curtime; + + for (j = 0; j < cnt; j++, dst += 2, src+=2) + { + dst[0] = src[0] + t1; + dst[1] = src[1] + t2; + } + break; + + case SHADER_TCMOD_TRANSFORM: + for (j = 0; j < cnt; j++, dst+=2, src+=2) + { + t1 = src[0]; + t2 = src[1]; + dst[0] = t1 * tcmod->args[0] + t2 * tcmod->args[2] + tcmod->args[4]; + dst[1] = t2 * tcmod->args[1] + t1 * tcmod->args[3] + tcmod->args[5]; + } + break; + + default: + break; + } +} + +static void GenerateTCMods(const shaderpass_t *pass, float *dest, const mesh_t *meshlist) +{ + unsigned int fvertex = 0; + for (; meshlist; meshlist = meshlist->next) + { + int i; + float *src; + src = tcgen(pass, meshlist->numvertexes, dest, meshlist); + //tcgen might return unmodified info + if (pass->numtcmods) + { + tcmod(&pass->tcmods[0], meshlist->numvertexes, src, dest, meshlist); + for (i = 1; i < pass->numtcmods; i++) + { + tcmod(&pass->tcmods[i], meshlist->numvertexes, dest, dest, meshlist); + } + } + else if (src != dest) + { + memcpy(dest, src, 8*meshlist->numvertexes); + } + dest += meshlist->numvertexes*2; + } +} + +//end texture coords +/*******************************************************************************************************************/ + +/*does not do the draw call, does not consider indicies (except for billboard generation) */ +static void BE_DrawMeshChain_SetupPass(shaderpass_t *pass, unsigned int vertcount, mesh_t *meshchain) +{ + int vdec; + void *map; + int i; + unsigned int passno = 0; + + int lastpass = pass->numMergedPasses; + + for (i = 0; i < lastpass; i++) + { + if (pass[i].texgen == T_GEN_UPPEROVERLAY && !TEXVALID(shaderstate.curtexnums->upperoverlay)) + continue; + if (pass[i].texgen == T_GEN_LOWEROVERLAY && !TEXVALID(shaderstate.curtexnums->loweroverlay)) + continue; + if (pass[i].texgen == T_GEN_FULLBRIGHT && !TEXVALID(shaderstate.curtexnums->fullbright)) + continue; + break; + } + if (i == lastpass) + return; + + passno = 0; + + /*all meshes in a chain must have the same features*/ + + vdec = 0; + + /*we only use one colour, generated from the first pass*/ + vdec |= BE_GenerateColourMods(vertcount, pass, meshchain); + + for (; passno < lastpass; passno++) + { + SelectPassTexture(passno, pass+passno); + + vdec |= D3D_VDEC_ST0<normals_array && +// meshchain->2 && +// meshchain->tnormals_array) +// vdec |= D3D_VDEC_NORMS; + + if (vdec != shaderstate.curvertdecl) + { + shaderstate.curvertdecl = vdec; + IDirect3DDevice9_SetVertexDeclaration(pD3DDev9, vertexdecls[shaderstate.curvertdecl]); + } + + D3DBE_ApplyShaderBits(pass->shaderbits); +} + +static void BE_DrawMeshChain_Internal(mesh_t *meshchain) +{ + unsigned int vertcount, idxcount, idxfirst; + mesh_t *m; + void *map; + int i; + unsigned int passno = 0; + shaderpass_t *pass = shaderstate.curshader->passes; + + for (m = meshchain, vertcount = 0, idxcount = 0; m; m = m->next) + { + vertcount += m->numvertexes; + idxcount += m->numindexes; + } + + /*vertex buffers are common to all passes*/ + allocvertexbuffer(shaderstate.dynxyz_buff, &shaderstate.dynxyz_offs, &map, vertcount*sizeof(vecV_t)); + for (m = meshchain, vertcount = 0; m; vertcount += m->numvertexes, m = m->next) + { + /*fixme: no tcgen*/ + memcpy((char*)map+vertcount*sizeof(vecV_t), m->xyz_array, m->numvertexes*sizeof(vecV_t)); + } + IDirect3DVertexBuffer9_Unlock(shaderstate.dynxyz_buff); + IDirect3DDevice9_SetStreamSource(pD3DDev9, 0, shaderstate.dynxyz_buff, shaderstate.dynxyz_offs - vertcount*sizeof(vecV_t), sizeof(vecV_t)); + + /*so are index buffers*/ + idxfirst = allocindexbuffer(&map, idxcount); + for (m = meshchain, vertcount = 0; m; vertcount += m->numvertexes, m = m->next) + { + for (i = 0; i < m->numindexes; i++) + ((index_t*)map)[i] = m->indexes[i]+vertcount; + map = (char*)map + m->numindexes*sizeof(index_t); + } + IDirect3DIndexBuffer9_Unlock(shaderstate.dynidx_buff); + IDirect3DDevice9_SetIndices(pD3DDev9, shaderstate.dynidx_buff); + + /*now go through and flush each pass*/ + for (passno = 0; passno < shaderstate.curshader->numpasses; passno += pass->numMergedPasses) + { + BE_DrawMeshChain_SetupPass(pass+passno, vertcount, meshchain); + IDirect3DDevice9_DrawIndexedPrimitive(pD3DDev9, D3DPT_TRIANGLELIST, 0, 0, vertcount, idxfirst, idxcount/3); } } void BE_DrawMeshChain(shader_t *shader, mesh_t *meshchain, vbo_t *vbo, texnums_t *texnums) { - d3dbackend.curshader = shader; - d3dbackend.curtexnums = texnums; + shaderstate.curshader = shader; + shaderstate.curtexnums = texnums; + BE_DrawMeshChain_Internal(meshchain); } @@ -209,9 +1001,157 @@ void BE_SelectMode(backendmode_t mode, unsigned int flags) { } +void _CrtCheckMemory(void); + /*Generates an optimised vbo for each of the given model's textures*/ void BE_GenBrushModelVBO(model_t *mod) { + unsigned int maxvboverts; + unsigned int maxvboelements; + + unsigned int t; + unsigned int i; + unsigned int v; + unsigned int vcount, ecount; + unsigned int pervertsize; //erm, that name wasn't intentional + unsigned int meshes; + + vbo_t *vbo; + char *vboedata; + mesh_t *m; + char *vbovdata; + + if (!mod->numsurfaces) + return; + + for (t = 0; t < mod->numtextures; t++) + { + if (!mod->textures[t]) + continue; + vbo = &mod->textures[t]->vbo; + BE_ClearVBO(vbo); + + maxvboverts = 0; + maxvboelements = 0; + meshes = 0; + for (i=0 ; inumsurfaces ; i++) + { + if (mod->surfaces[i].texinfo->texture != mod->textures[t]) + continue; + m = mod->surfaces[i].mesh; + if (!m) + continue; + + meshes++; + maxvboelements += m->numindexes; + maxvboverts += m->numvertexes; + } +#if sizeof_index_t == 2 + if (maxvboverts > (1<<(sizeof(index_t)*8))-1) + continue; +#endif + if (!maxvboverts) + continue; + + //fixme: stop this from leaking! + vcount = 0; + ecount = 0; + + pervertsize = sizeof(vecV_t)+ //coord + sizeof(vec2_t)+ //tex + sizeof(vec2_t)+ //lm + sizeof(vec3_t)+ //normal + sizeof(vec3_t)+ //sdir + sizeof(vec3_t)+ //tdir + sizeof(vec4_t); //colours + + vbovdata = BZ_Malloc(maxvboverts*pervertsize); + vboedata = BZ_Malloc(maxvboelements*sizeof(index_t)); + + vbo->coord = (vecV_t*)(vbovdata); + vbo->texcoord = (vec2_t*)((char*)vbo->coord+maxvboverts*sizeof(*vbo->coord)); + vbo->lmcoord = (vec2_t*)((char*)vbo->texcoord+maxvboverts*sizeof(*vbo->texcoord)); + vbo->normals = (vec3_t*)((char*)vbo->lmcoord+maxvboverts*sizeof(*vbo->lmcoord)); + vbo->svector = (vec3_t*)((char*)vbo->normals+maxvboverts*sizeof(*vbo->normals)); + vbo->tvector = (vec3_t*)((char*)vbo->svector+maxvboverts*sizeof(*vbo->svector)); + vbo->colours4f = (vec4_t*)((char*)vbo->tvector+maxvboverts*sizeof(*vbo->tvector)); + vbo->indicies = (index_t*)vboedata; + + vbo->meshcount = meshes; + vbo->meshlist = BZ_Malloc(meshes*sizeof(*vbo->meshlist)); + + meshes = 0; + + for (i=0 ; inumsurfaces ; i++) + { + if (mod->surfaces[i].texinfo->texture != mod->textures[t]) + continue; + m = mod->surfaces[i].mesh; + if (!m) + continue; + + mod->surfaces[i].mark = &vbo->meshlist[meshes++]; + *mod->surfaces[i].mark = NULL; + + m->vbofirstvert = vcount; + m->vbofirstelement = ecount; + for (v = 0; v < m->numindexes; v++) + vbo->indicies[ecount++] = vcount + m->indexes[v]; + for (v = 0; v < m->numvertexes; v++) + { + vbo->coord[vcount+v][0] = m->xyz_array[v][0]; + vbo->coord[vcount+v][1] = m->xyz_array[v][1]; + vbo->coord[vcount+v][2] = m->xyz_array[v][2]; + if (m->st_array) + { + vbo->texcoord[vcount+v][0] = m->st_array[v][0]; + vbo->texcoord[vcount+v][1] = m->st_array[v][1]; + } + if (m->lmst_array) + { + vbo->lmcoord[vcount+v][0] = m->lmst_array[v][0]; + vbo->lmcoord[vcount+v][1] = m->lmst_array[v][1]; + } + if (m->normals_array) + { + vbo->normals[vcount+v][0] = m->normals_array[v][0]; + vbo->normals[vcount+v][1] = m->normals_array[v][1]; + vbo->normals[vcount+v][2] = m->normals_array[v][2]; + } + if (m->snormals_array) + { + vbo->svector[vcount+v][0] = m->snormals_array[v][0]; + vbo->svector[vcount+v][1] = m->snormals_array[v][1]; + vbo->svector[vcount+v][2] = m->snormals_array[v][2]; + } + if (m->tnormals_array) + { + vbo->tvector[vcount+v][0] = m->tnormals_array[v][0]; + vbo->tvector[vcount+v][1] = m->tnormals_array[v][1]; + vbo->tvector[vcount+v][2] = m->tnormals_array[v][2]; + } + if (m->colors4f_array) + { + vbo->colours4f[vcount+v][0] = m->colors4f_array[v][0]; + vbo->colours4f[vcount+v][1] = m->colors4f_array[v][1]; + vbo->colours4f[vcount+v][2] = m->colors4f_array[v][2]; + vbo->colours4f[vcount+v][3] = m->colors4f_array[v][3]; + } + } + vcount += v; + } + +// if (GL_BuildVBO(vbo, vbovdata, vcount*pervertsize, vboedata, ecount*sizeof(index_t))) + { + BZ_Free(vbovdata); + BZ_Free(vboedata); + } + } + //for (i=0 ; inumsurfaces ; i++) + //{ + // if (!mod->surfaces[i].mark) + // Host_EndGame("Surfaces with bad textures detected\n"); + //} } /*Wipes a vbo*/ void BE_ClearVBO(vbo_t *vbo) @@ -240,8 +1180,8 @@ static void DrawSurfaceChain(msurface_t *s, shader_t *shader, vbo_t *vbo) if (!vbo) return; - d3dbackend.curshader = shader; - d3dbackend.curtexnums = &shader->defaulttextures; + shaderstate.curshader = shader; + shaderstate.curtexnums = &shader->defaulttextures; ml = NULL; for (; s ; s=s->texturechain) @@ -277,22 +1217,37 @@ static void DrawSurfaceChain(msurface_t *s, shader_t *shader, vbo_t *vbo) { if (!lightmap[i] || !lightmap[i]->meshchain) continue; -/* + if (lightmap[i]->modified) { - glRect_t *theRect; - lightmap[i]->modified = false; - theRect = &lightmap[i]->rectchange; - GL_Bind(lightmap_textures[i]); - qglTexSubImage2D(GL_TEXTURE_2D, 0, 0, theRect->t, - LMBLOCK_WIDTH, theRect->h, gl_lightmap_format, GL_UNSIGNED_BYTE, - lightmap[i]->lightmaps+(theRect->t) *LMBLOCK_WIDTH*lightmap_bytes); - theRect->l = LMBLOCK_WIDTH; - theRect->t = LMBLOCK_HEIGHT; - theRect->h = 0; - theRect->w = 0; - checkerror(); + IDirect3DTexture9 *tex = lightmap_textures[i].ptr; + D3DLOCKED_RECT lock; + RECT rect; + glRect_t *theRect = &lightmap[i]->rectchange; + int r; + if (tex) + { + lightmap[i]->modified = 0; + rect.left = theRect->l; + rect.right = theRect->l + theRect->w; + rect.top = theRect->t; + rect.bottom = theRect->t + theRect->h; + IDirect3DTexture9_LockRect(tex, 0, &lock, &rect, 0); + for (r = 0; r < lightmap[i]->rectchange.h; r++) + { + memcpy((char*)lock.pBits + r*lock.Pitch, lightmap[i]->lightmaps+(theRect->l+((r+theRect->t)*LMBLOCK_WIDTH))*lightmap_bytes, lightmap[i]->rectchange.w*lightmap_bytes); + } + IDirect3DTexture9_UnlockRect(tex, 0); + theRect->l = LMBLOCK_WIDTH; + theRect->t = LMBLOCK_HEIGHT; + theRect->h = 0; + theRect->w = 0; + } + else + lightmap_textures[i] = D3D_AllocNewTexture(LMBLOCK_WIDTH, LMBLOCK_WIDTH); + +/* if (lightmap[i]->deluxmodified) { lightmap[i]->deluxmodified = false; @@ -307,10 +1262,11 @@ static void DrawSurfaceChain(msurface_t *s, shader_t *shader, vbo_t *vbo) theRect->w = 0; checkerror(); } + */ } -*/ - d3dbackend.curlightmap = lightmap_textures[i]; - d3dbackend.curdeluxmap = deluxmap_textures[i]; + + shaderstate.curlightmap = lightmap_textures[i]; + shaderstate.curdeluxmap = deluxmap_textures[i]; BE_DrawMeshChain_Internal(lightmap[i]->meshchain); lightmap[i]->meshchain = NULL; } @@ -392,6 +1348,8 @@ void BE_DrawWorld (qbyte *vis) { RSpeedLocals(); + shaderstate.curtime = realtime; + //make sure the world draws correctly r_worldentity.shaderRGBAf[0] = 1; r_worldentity.shaderRGBAf[1] = 1; diff --git a/engine/d3d/d3d_image.c b/engine/d3d/d3d_image.c index a9251df64..c32b6c50a 100644 --- a/engine/d3d/d3d_image.c +++ b/engine/d3d/d3d_image.c @@ -3,19 +3,52 @@ #include LPDIRECT3DDEVICE9 pD3DDev9; +typedef struct d3dtexture_s +{ + struct d3dtexture_s *next; + texid_t tex; + qboolean loaded; + char name[1]; +} d3dtexture_t; +static d3dtexture_t *d3dtextures; +static d3dtexture_t *d3d_lookup_texture(char *ident) +{ + d3dtexture_t *tex; + + if (ident) + { + for (tex = d3dtextures; tex; tex = tex->next) + if (!strcmp(tex->name, ident)) + return tex; + + tex = malloc(sizeof(*tex)+strlen(ident)); + strcpy(tex->name, ident); + } + else + { + tex = malloc(sizeof(*tex)); + tex->name[0] = '\0'; + } + tex->tex.ptr = NULL; + tex->next = d3dtextures; + d3dtextures = tex; + + return tex; +} extern cvar_t gl_picmip; extern cvar_t gl_picmip2d; texid_t D3D_AllocNewTexture(int width, int height) { - return r_nulltex; + IDirect3DTexture9 *tx; + texid_t ret = r_nulltex; + if (!FAILED(IDirect3DDevice9_CreateTexture(pD3DDev9, width, height, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &tx, NULL))) + ret.ptr = tx; + return ret; } - - - static void D3D9_RoundDimensions(int *scaled_width, int *scaled_height, qboolean mipmap) { // if (gl_config.arb_texture_non_power_of_two) //NPOT is a simple extension that relaxes errors. @@ -59,7 +92,7 @@ static void D3D9_RoundDimensions(int *scaled_width, int *scaled_height, qboolean *scaled_height = 1; } -static void Upload_Texture_32(LPDIRECT3DTEXTURE9 tex, unsigned int *data, int width, int height) +static void Upload_Texture_32(LPDIRECT3DTEXTURE9 tex, unsigned int *data, int width, int height, unsigned int flags) { int x, y; unsigned int *dest; @@ -121,10 +154,13 @@ static void Upload_Texture_32(LPDIRECT3DTEXTURE9 tex, unsigned int *data, int wi } IDirect3DTexture9_UnlockRect(tex, 0); + + if (!(flags & IF_NOMIPMAP)) + IDirect3DBaseTexture9_GenerateMipSubLevels(tex); } //create a basic shader from a 32bit image -static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_32(char *name, unsigned int *data, int width, int height, int flags) +static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_32(d3dtexture_t *tex, unsigned int *data, int width, int height, int flags) { int nwidth, nheight; @@ -141,20 +177,19 @@ static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_32(char *name, unsigned int *data nheight = height; D3D9_RoundDimensions(&nwidth, &nheight, !(flags & IF_NOMIPMAP)); - IDirect3DDevice9_CreateTexture(pD3DDev9, nwidth, nheight, 0, ((flags & IF_NOMIPMAP)?0:D3DUSAGE_AUTOGENMIPMAP), D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &newsurf, NULL); + newsurf = tex->tex.ptr; + if (!newsurf) + IDirect3DDevice9_CreateTexture(pD3DDev9, nwidth, nheight, 0, ((flags & IF_NOMIPMAP)?0:D3DUSAGE_AUTOGENMIPMAP), D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &newsurf, NULL); if (!newsurf) return NULL; - Upload_Texture_32(newsurf, data, width, height); - - if (!(flags & IF_NOMIPMAP)) - IDirect3DBaseTexture9_GenerateMipSubLevels(newsurf); + Upload_Texture_32(newsurf, data, width, height, flags); return (LPDIRECT3DBASETEXTURE9)newsurf; } -static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_8(char *name, unsigned char *data, int width, int height, int flags, enum uploadfmt fmt) +static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_8(d3dtexture_t *tex, unsigned char *data, int width, int height, int flags, enum uploadfmt fmt) { static unsigned trans[1024*1024]; int i, s; @@ -167,7 +202,22 @@ static LPDIRECT3DBASETEXTURE9 D3D9_LoadTexture_8(char *name, unsigned char *data s = width*height; // if there are no transparent pixels, make it a 3 component // texture even if it was specified as otherwise - if ((fmt!=TF_SOLID8) && !(flags & IF_NOALPHA)) + if (fmt == TF_TRANS8_FULLBRIGHT) + { + for (i=0 ; i 255-vid.fullbright) + trans[i] = d_8to24rgbtable[p]; + else + { + noalpha = false; + trans[i] = d_8to24rgbtable[p] & 0x00ffffff; + } + } + } + else if ((fmt!=TF_SOLID8) && !(flags & IF_NOALPHA)) { noalpha = true; for (i=0 ; itex; +} + +texid_t D3D_LoadTexture8Pal32 (char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags) +{ + return r_nulltex; +} +texid_t D3D_LoadTexture8Pal24 (char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags) { return r_nulltex; } diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index dba144255..0f08ae8c0 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -54,9 +54,9 @@ LPDIRECT3DDEVICE9 pD3DDev9; static qboolean vid_initializing; -extern qboolean scr_initialized; // ready to draw -extern qboolean scr_drawloading; - +extern qboolean scr_initialized; // ready to draw +extern qboolean scr_drawloading; +extern qboolean scr_con_forcedraw; cvar_t vid_hardwaregamma; @@ -313,8 +313,8 @@ static LRESULT WINAPI D3D9_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA { GetClientRect(mainwindow, &window_rect); // force width/height to be updated - vid.pixelwidth = window_rect.right - window_rect.left; - vid.pixelheight = window_rect.bottom - window_rect.top; + //vid.pixelwidth = window_rect.right - window_rect.left; + //vid.pixelheight = window_rect.bottom - window_rect.top; // Cvar_ForceCallback(&vid_conautoscale); // Cvar_ForceCallback(&vid_conwidth); } @@ -475,7 +475,7 @@ static void initD3D9(HWND hWnd, rendererstate_t *info) i, D3DDEVTYPE_HAL, hWnd, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, + D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pD3DDev9); @@ -761,7 +761,7 @@ void Matrix4_OrthographicD3D(float *proj, float xmin, float xmax, float ymax, fl float znear, float zfar); void d3dx_ortho(float *m); -static void D3D9_Set2D (void) +void D3D9_Set2D (void) { float m[16]; D3DVIEWPORT9 vport; @@ -804,80 +804,6 @@ static int d3d9error(int i) return i; } -typedef struct { - float x, y, z; - unsigned int colour; -} d3d9bsvert_t; -static void D3D9_BrightenScreen (void) -{ - d3d9bsvert_t d3d9bsvert[4]; - index_t d3d9quadindexes[6] = { - 0, 1, 2, - 0, 2, 3 - }; - - extern cvar_t gl_contrast; - float f; - unsigned int colour; - - RSpeedMark(); - - if (gl_contrast.value <= 1.0) - return; - - f = gl_contrast.value; - f = min (f, 3); - - IDirect3DDevice9_SetTexture (pD3DDev9, 0, NULL); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, TRUE); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_ONE); - - while (f > 1) - { - if (f >= 2) - colour = 0xffffffff; - else - { - colour = (f-1)*255; - colour = (colour * 0x010101) | 0xff000000; - } - - - d3d9bsvert[0].x = 0; - d3d9bsvert[0].y = 0; - d3d9bsvert[0].z = 0; - d3d9bsvert[0].colour = colour; - - d3d9bsvert[1].x = vid.width; - d3d9bsvert[1].y = 0; - d3d9bsvert[1].z = 0; - d3d9bsvert[1].colour = colour; - - d3d9bsvert[2].x = vid.width; - d3d9bsvert[2].y = vid.height; - d3d9bsvert[2].z = 0; - d3d9bsvert[2].colour = colour; - - d3d9bsvert[3].x = 0; - d3d9bsvert[3].y = vid.height; - d3d9bsvert[3].z = 0; - d3d9bsvert[3].colour = colour; - - IDirect3DDevice9_SetFVF(pD3DDev9, D3DFVF_XYZ|D3DFVF_DIFFUSE); - IDirect3DDevice9_DrawIndexedPrimitiveUP(pD3DDev9, D3DPT_TRIANGLELIST, 0, 4, 2, d3d9quadindexes, D3DFMT_QINDEX, d3d9bsvert, sizeof(d3d9bsvert[0])); - - - f *= 0.5; - } - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, FALSE); - - RSpeedEnd(RSPEED_PALETTEFLASHES); -} - static void (D3D9_SCR_UpdateScreen) (void) { extern int keydown[]; @@ -886,7 +812,7 @@ static void (D3D9_SCR_UpdateScreen) (void) #ifdef TEXTEDITOR extern qboolean editormodal; #endif - qboolean nohud; + qboolean nohud, noworld; RSpeedMark(); switch (IDirect3DDevice9_TestCooperativeLevel(pD3DDev9)) @@ -987,7 +913,7 @@ static void (D3D9_SCR_UpdateScreen) (void) #if defined(_WIN32) && defined(GLQUAKE) Media_RecordFrame(); #endif - GLR_BrightenScreen(); + R2D_BrightenScreen(); if (key_dest == key_console) Con_DrawConsole(vid_conheight.value/2, false); @@ -1005,7 +931,7 @@ static void (D3D9_SCR_UpdateScreen) (void) #if defined(_WIN32) Media_RecordFrame(); #endif -// GLR_BrightenScreen(); +// R2D_BrightenScreen(); IDirect3DDevice9_EndScene(pD3DDev9); IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); @@ -1026,6 +952,7 @@ static void (D3D9_SCR_UpdateScreen) (void) // SCR_SetUpToDrawConsole (); + noworld = false; nohud = false; #ifdef VM_CG @@ -1038,18 +965,32 @@ static void (D3D9_SCR_UpdateScreen) (void) nohud = true; else #endif - if (r_worldentity.model && uimenu != 1) + if (uimenu != 1) { - V_RenderView (); -// Q1BSP_TestClipDecal(); + if (r_worldentity.model && cls.state == ca_active) + V_RenderView (); + else + { + noworld = true; + } } D3D9_Set2D (); - D3D9_BrightenScreen(); + R2D_BrightenScreen(); - if (!nohud) + scr_con_forcedraw = false; + if (noworld) + { + if (scr_con_current != vid.height) + Draw_ConsoleBackground(0, vid.height, true); + else + scr_con_forcedraw = true; + + nohud = true; + } + else if (!nohud) SCR_TileClear (); SCR_DrawTwoDimensional(uimenu, nohud); @@ -1188,7 +1129,9 @@ static void (D3D9_R_RenderView) (void) { D3D9_SetupViewPort(); d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0)); - Surf_DrawWorld(); + R_SetFrustum (r_projection_matrix, r_view_matrix); + if (!(r_refdef.flags & Q2RDF_NOWORLDMODEL)) + Surf_DrawWorld(); P_DrawParticles (); } diff --git a/engine/d3d9/d3d9quake.h b/engine/d3d9/d3d9quake.h index 625b49fa4..a6a855788 100644 --- a/engine/d3d9/d3d9quake.h +++ b/engine/d3d9/d3d9quake.h @@ -104,7 +104,6 @@ void D3D9R_RenderDynamicLightmaps (msurface_t *fa, int shift); // // vid_d3d9.c // -void D3D9_BrightenScreen (void); void D3D9_D_BeginDirectRect (int x, int y, qbyte *pbitmap, int width, int height); void D3D9_D_EndDirectRect (int x, int y, int width, int height); void D3D9_GetBufferSize(int *width, int *height); diff --git a/engine/dotnet2005/ftequake.vcproj b/engine/dotnet2005/ftequake.vcproj index 7f41b70e8..a15dad268 100644 --- a/engine/dotnet2005/ftequake.vcproj +++ b/engine/dotnet2005/ftequake.vcproj @@ -12872,13 +12872,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 6487a9b74..3e6b079d1 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -881,6 +881,9 @@ static qboolean R_CalcModelLighting(entity_t *e, model_t *clmodel, unsigned int static shader_t reskinnedmodelshader; void R_DrawGAliasModel (entity_t *e, unsigned int rmode) { +#ifndef GLQUAKE +#pragma message("DISABLED MODEL RENDERING") +#else extern cvar_t r_drawflat; model_t *clmodel; galiasinfo_t *inf; @@ -1154,6 +1157,7 @@ void R_DrawGAliasModel (entity_t *e, unsigned int rmode) qglDepthRange (gldepthmin, gldepthmax); BE_SelectMode(rmode, 0); +#endif } //returns result in the form of the result vector diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index f7787a822..c895fa040 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -1244,7 +1244,7 @@ static void colourgen(const shaderpass_t *pass, int cnt, const avec4_t *src, ave } } -static void deformgen(const deformv_t *deformv, int cnt, const avec4_t *src, avec4_t *dst, const mesh_t *mesh) +static void deformgen(const deformv_t *deformv, int cnt, const vecV_t *src, vecV_t *dst, const mesh_t *mesh) { float *table; int j, k; @@ -1710,18 +1710,23 @@ static void BE_SendPassBlendAndDepth(unsigned int sbits) } if (shaderstate.flags) { - if (shaderstate.flags & BEF_FORCEADDITIVE) - sbits = (sbits & ~(SBITS_MISC_DEPTHWRITE|SBITS_BLEND_BITS|SBITS_ATEST_BITS)) | (SBITS_SRCBLEND_ONE | SBITS_DSTBLEND_ONE); - else if (shaderstate.flags & BEF_FORCETRANSPARENT) /*if transparency is forced, clear alpha test bits*/ - sbits = (sbits & ~(SBITS_MISC_DEPTHWRITE|SBITS_BLEND_BITS|SBITS_ATEST_BITS)) | (SBITS_SRCBLEND_SRC_ALPHA | SBITS_DSTBLEND_ONE_MINUS_SRC_ALPHA); + if (!(sbits & SBITS_BLEND_BITS)) + { /*only force blend bits if its not already blended*/ + if (shaderstate.flags & BEF_FORCEADDITIVE) + sbits = (sbits & ~(SBITS_MISC_DEPTHWRITE|SBITS_BLEND_BITS|SBITS_ATEST_BITS)) + | (SBITS_SRCBLEND_ONE | SBITS_DSTBLEND_ONE); + else if (shaderstate.flags & BEF_FORCETRANSPARENT) /*if transparency is forced, clear alpha test bits*/ + sbits = (sbits & ~(SBITS_MISC_DEPTHWRITE|SBITS_BLEND_BITS|SBITS_ATEST_BITS)) + | (SBITS_SRCBLEND_SRC_ALPHA | SBITS_DSTBLEND_ONE_MINUS_SRC_ALPHA); + } if (shaderstate.flags & BEF_FORCENODEPTH) /*EF_NODEPTHTEST dp extension*/ sbits |= SBITS_MISC_NODEPTHTEST; else { - if (shaderstate.flags & BEF_FORCEDEPTHTEST) /*if transparency is forced, clear alpha test bits*/ + if (shaderstate.flags & BEF_FORCEDEPTHTEST) sbits &= ~SBITS_MISC_NODEPTHTEST; - if (shaderstate.flags & BEF_FORCEDEPTHWRITE) /*if transparency is forced, clear alpha test bits*/ + if (shaderstate.flags & BEF_FORCEDEPTHWRITE) sbits |= SBITS_MISC_DEPTHWRITE; } } diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index f173888a5..68fad4e22 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -118,7 +118,7 @@ int sizeofuploadmemorybuffer; qbyte *uploadmemorybufferintermediate; int sizeofuploadmemorybufferintermediate; -index_t r_quad_indexes[6] = {0, 1, 2, 0, 2, 3}; +static index_t r_quad_indexes[6] = {0, 1, 2, 0, 2, 3}; extern qbyte gammatable[256]; @@ -383,10 +383,6 @@ TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n")); GL_EndRendering (); GL_DoSwap(); - Font_Init(); - - Shader_Init(); - cs_texture = GL_AllocNewTexture(); crosshair_shader = R_RegisterShader("crosshairshader", @@ -879,38 +875,6 @@ void GLDraw_EndDisc (void) { } -// conback/font callbacks -void GL_Smoothfont_Callback(struct cvar_s *var, char *oldvalue) -{ - //FIXME: reimplement -} - -void GL_Fontinwardstep_Callback(struct cvar_s *var, char *oldvalue) -{ - //FIXME: reimplement - if (var->value) - char_instep = custom_char_instep*bound(0, var->value, 1); - else - char_instep = 0; -} - -void GL_Font_Callback(struct cvar_s *var, char *oldvalue) -{ - //FIXME: reimplement - - GLVID_Console_Resize(); -} - -void GL_Conback_Callback(struct cvar_s *var, char *oldvalue) -{ - if (*var->string) - conback = R_RegisterPic(var->string); - if (!conback || !conback->width) - conback = R_RegisterCustom("console", NULL, NULL); - if (!conback || !conback->width) - conback = R_RegisterPic("gfx/conback.lmp"); -} - /* ================ GL_Set2D diff --git a/engine/gl/gl_draw.h b/engine/gl/gl_draw.h index b894ea92f..6a1ef5c64 100644 --- a/engine/gl/gl_draw.h +++ b/engine/gl/gl_draw.h @@ -46,3 +46,6 @@ void R2D_EditorBackground (void); void R2D_TileClear (int x, int y, int w, int h); void R2D_Init(void); void R2D_Shutdown(void); + +void R2D_PolyBlend (void); +void R2D_BrightenScreen (void); diff --git a/engine/gl/gl_font.c b/engine/gl/gl_font.c index 178eefb4d..8c3438093 100644 --- a/engine/gl/gl_font.c +++ b/engine/gl/gl_font.c @@ -282,6 +282,7 @@ static void Font_Flush(void) fontplanes.planechanged = false; } + font_mesh.istrifan = (font_mesh.numvertexes == 4); if (font_colourmask & CON_NONCLEARBG) { fontplanes.backshader->defaulttextures.base = r_nulltex; diff --git a/engine/gl/gl_model.c b/engine/gl/gl_model.c index ce244a0d2..a6b455242 100644 --- a/engine/gl/gl_model.c +++ b/engine/gl/gl_model.c @@ -565,7 +565,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) // fill it in // Mod_DoCRC(mod, (char*)buf, com_filesize); - + switch (LittleLong(*(unsigned *)buf)) { //The binary 3d mesh model formats @@ -573,7 +573,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) if (!Mod_LoadQ1Model(mod, buf)) continue; break; - + #ifdef MD2MODELS case MD2IDALIASHEADER: if (!Mod_LoadQ2Model(mod, buf)) @@ -623,7 +623,7 @@ model_t *RMod_LoadModel (model_t *mod, qboolean crash) //Binary Map formats -#ifdef Q2BSPS +#if defined(Q2BSPS) || defined(Q3BSPS) case ('F'<<0)+('B'<<8)+('S'<<16)+('P'<<24): case ('R'<<0)+('B'<<8)+('S'<<16)+('P'<<24): case IDBSPHEADER: //looks like id switched to have proper ids diff --git a/engine/gl/gl_rlight.c b/engine/gl/gl_rlight.c index df22f0c69..2c8d053c8 100644 --- a/engine/gl/gl_rlight.c +++ b/engine/gl/gl_rlight.c @@ -66,7 +66,7 @@ void R_AnimateLight (void) v2 = cl_lightstyle[j].map[v2] - 'a'; d_lightstylevalue[j] = (v1*(1-f) + v2*(f))*22; - } + } } /* @@ -509,26 +509,7 @@ void GLQ3_LightGrid(model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_a index[5] = index[1]+(index[1]<(lg->numlightgridelems-1)); index[6] = index[2]+(index[2]<(lg->numlightgridelems-1)); index[7] = index[3]+(index[3]<(lg->numlightgridelems-1)); -/* - qglDisable(GL_TEXTURE_2D); - qglDisable(GL_DEPTH_TEST); - GL_CullFace(0); - qglColor4f(1,1,1,1); - qglBegin(GL_QUADS); - for ( i = 0; i < 8; i++ ) - { - vec3_t pos; - for(j=0;j<3;j++) - pos[j] = (vi[j] - +((i&1)/1*(j==0)) - +((i&2)/2*(j==1)) - +((i&4)/4*(j==2)) - - )*lg->gridSize[j] + lg->gridMins[j]; - qglVertex3fv(pos); - } - qglEnd(); -*/ + for ( i = 0; i < 8; i++ ) { if ( index[i] < 0 || index[i] >= (lg->numlightgridelems) ) diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index ef7fa830e..dcaeb4808 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -114,7 +114,6 @@ cvar_t gl_maxdist = SCVAR("gl_maxdist", "8192"); cvar_t r_polygonoffset_submodel_factor = SCVAR("r_polygonoffset_submodel_factor", "0.05"); cvar_t r_polygonoffset_submodel_offset = SCVAR("r_polygonoffset_submodel_offset", "25"); -extern cvar_t gl_contrast; extern cvar_t gl_mindist; extern cvar_t ffov; @@ -158,9 +157,6 @@ int scenepp_fisheye_parm_fov; int scenepp_panorama_program; int scenepp_panorama_parm_fov; -shader_t *shader_brighten; -shader_t *shader_polyblend; - // KrimZon - init post processing - called in GL_CheckExtensions, when they're called // I put it here so that only this file need be changed when messing with the post // processing shaders @@ -340,28 +336,6 @@ void GL_InitSceneProcessingShaders_MenuTint(void) void GL_InitSceneProcessingShaders (void) { - shader_brighten = R_RegisterShader("constrastshader", - "{\n" - "{\n" - "map $whiteimage\n" - "blendfunc gl_dst_color gl_one\n" - "rgbgen vertex\n" - "alphagen vertex\n" - "}\n" - "}\n" - ); - shader_polyblend = R_RegisterShader("polyblendshader", - "{\n" - "{\n" - "map $whiteimage\n" - "blendfunc gl_src_alpha gl_one_minus_src_alpha\n" - "rgbgen vertex\n" - "alphagen vertex\n" - "}\n" - "}\n" - ); - - if (gl_config.arb_shader_objects) { GL_InitSceneProcessingShaders_WaterWarp(); @@ -889,53 +863,6 @@ void GLR_DrawEntitiesOnList (void) } } -/* -============ -R_PolyBlend -============ -*/ -//bright flashes and stuff -void R_PolyBlend (void) -{ - if (!sw_blend[3]) - return; - - if (r_refdef.flags & Q2RDF_NOWORLDMODEL) - return; - - R2D_ImageColours (sw_blend[0], sw_blend[1], sw_blend[2], sw_blend[3]); - R2D_ScalePic(0, 0, vid.width, vid.height, shader_polyblend); -} - -//for lack of hardware gamma -void GLR_BrightenScreen (void) -{ - float f; - - RSpeedMark(); - - if (gl_contrast.value <= 1.0) - return; - - if (r_refdef.flags & Q2RDF_NOWORLDMODEL) - return; - - f = gl_contrast.value; - f = min (f, 3); - - while (f > 1) - { - if (f >= 2) - R2D_ImageColours (1, 1, 1, 1); - else - R2D_ImageColours (f - 1, f - 1, f - 1, 1); - R2D_ScalePic(0, 0, vid.width, vid.height, shader_brighten); - f *= 0.5; - } - - RSpeedEnd(RSPEED_PALETTEFLASHES); -} - /* =============== R_SetupFrame @@ -1800,6 +1727,7 @@ static void R_RenderWaterWarp(void) } #ifdef FISH +/*FIXME: we could use geometry shaders to draw to all 6 faces at once*/ qboolean R_RenderScene_Fish(void) { int cmapsize = 512; diff --git a/engine/gl/gl_screen.c b/engine/gl/gl_screen.c index e6d39e6ba..f35ac074d 100644 --- a/engine/gl/gl_screen.c +++ b/engine/gl/gl_screen.c @@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifdef GLQUAKE #include "glquake.h" #include "shader.h" +#include "gl_draw.h" #include @@ -216,7 +217,7 @@ void GLSCR_UpdateScreen (void) #if defined(_WIN32) && defined(GLQUAKE) Media_RecordFrame(); #endif - GLR_BrightenScreen(); + R2D_BrightenScreen(); if (key_dest == key_console) Con_DrawConsole(vid_conheight.value/2, false); @@ -233,7 +234,7 @@ void GLSCR_UpdateScreen (void) #if defined(_WIN32) && defined(GLQUAKE) Media_RecordFrame(); #endif - GLR_BrightenScreen(); + R2D_BrightenScreen(); GL_EndRendering (); GL_DoSwap(); RSpeedEnd(RSPEED_TOTALREFRESH); @@ -280,8 +281,8 @@ void GLSCR_UpdateScreen (void) if (!noworld) { - R_PolyBlend (); - GLR_BrightenScreen(); + R2D_PolyBlend (); + R2D_BrightenScreen(); } scr_con_forcedraw = false; diff --git a/engine/gl/gl_shader.c b/engine/gl/gl_shader.c index aa7b80805..b8d744c4b 100644 --- a/engine/gl/gl_shader.c +++ b/engine/gl/gl_shader.c @@ -30,6 +30,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include +#include +#include "glsupp.h" + + + extern texid_t missing_texture; static qboolean shader_reload_needed; @@ -181,11 +186,11 @@ typedef struct shadercache_s { struct shadercache_s *hash_next; } shadercache_t; -static shadercache_t *shader_hash[HASH_SIZE]; +static shadercache_t **shader_hash; static char shaderbuf[MAX_QPATH * 256]; int shaderbuflen; -shader_t r_shaders[MAX_SHADERS]; +shader_t *r_shaders; //static char r_skyboxname[MAX_QPATH]; //static float r_skyheight; @@ -959,9 +964,19 @@ static void Shaderpass_VideoMap (shader_t *shader, shaderpass_t *pass, char **pt else Con_DPrintf (CON_WARNING "(shader %s) Couldn't load video %s\n", shader->name, token); - pass->flags |= SHADER_PASS_VIDEOMAP; - shader->flags |= SHADER_VIDEOMAP; - pass->texgen = T_GEN_VIDEOMAP; + if (pass->cin) + { + pass->flags |= SHADER_PASS_VIDEOMAP; + shader->flags |= SHADER_VIDEOMAP; + pass->texgen = T_GEN_VIDEOMAP; + } + else + { + pass->texgen = T_GEN_DIFFUSE; + pass->rgbgen = RGB_GEN_CONST; + pass->rgbgen_func.type = SHADER_FUNC_CONSTANT; + pass->rgbgen_func.args[0] = pass->rgbgen_func.args[1] = pass->rgbgen_func.args[2] = 0; + } #endif } @@ -1413,6 +1428,10 @@ qboolean Shader_Init (void) { shaderbuflen = 0; + r_shaders = calloc(MAX_SHADERS, sizeof(shader_t)); + + shader_hash = calloc (HASH_SIZE, sizeof(*shader_hash)); + Con_Printf ( "Initializing Shaders.\n" ); COM_EnumerateFiles("shaders/*.shader", Shader_InitCallback, NULL); @@ -1604,16 +1623,16 @@ void Shader_Shutdown (void) } } - memset (r_shaders, 0, sizeof(shader_t)*MAX_SHADERS); - - memset (shader_hash, 0, sizeof(shader_hash)); + Z_Free(r_shaders); + r_shaders = NULL; + Z_Free(shader_hash); + shader_hash = NULL; shader_reload_needed = false; } void Shader_SetBlendmode (shaderpass_t *pass) { -#ifdef GLQUAKE if (pass->texgen == T_GEN_DELUXMAP) { pass->blendmode = GL_DOT3_RGB_ARB; @@ -1626,7 +1645,7 @@ void Shader_SetBlendmode (shaderpass_t *pass) return; } - if (!(pass->shaderbits & SBITS_BLEND_BITS) && qglMTexCoord2fSGIS) + if (!(pass->shaderbits & SBITS_BLEND_BITS)) { if ((pass->rgbgen == RGB_GEN_IDENTITY) && (pass->alphagen == ALPHA_GEN_IDENTITY)) { @@ -1652,7 +1671,6 @@ void Shader_SetBlendmode (shaderpass_t *pass) pass->blendmode = GL_DECAL; else pass->blendmode = GL_MODULATE; -#endif } void Shader_Readpass (shader_t *shader, char **ptr) diff --git a/engine/gl/glquake.h b/engine/gl/glquake.h index fa2a7edfd..a41305a6d 100644 --- a/engine/gl/glquake.h +++ b/engine/gl/glquake.h @@ -57,8 +57,6 @@ void GL_InitFogTexture(void); void GL_BeginRendering (void); void GL_EndRendering (void); -void R_PolyBlend (void); -void GLR_BrightenScreen (void); void GLR_NetGraph (void); void GLR_FrameTimeGraph (int frametime); void GL_FlushSkinCache(void); @@ -235,12 +233,6 @@ extern const char *gl_vendor; extern const char *gl_renderer; extern const char *gl_version; - -#ifdef Q3SHADERS -FTE_DEPRECATED void R_UnlockArrays (void); -FTE_DEPRECATED void R_IBrokeTheArrays(void); -FTE_DEPRECATED void R_ClearArrays (void); -#endif FTE_DEPRECATED void PPL_RevertToKnownState(void); #ifdef GLQUAKE @@ -364,9 +356,8 @@ void GLR_MarkQ2Lights (dlight_t *light, int bit, mnode_t *node); void GLR_RenderDlights (void); void R_InitFlashblends (void); int GLR_LightPoint (vec3_t p); - -void GLQ3_LightGrid(model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir); #endif +void GLQ3_LightGrid(model_t *mod, vec3_t point, vec3_t res_diffuse, vec3_t res_ambient, vec3_t res_dir); // // gl_heightmap.c diff --git a/engine/gl/shader.h b/engine/gl/shader.h index a9c5b2ac7..9f9a60fcc 100644 --- a/engine/gl/shader.h +++ b/engine/gl/shader.h @@ -338,7 +338,7 @@ struct shader_s int registration_sequence; }; -extern shader_t r_shaders[]; +extern shader_t *r_shaders; extern int be_maxpasses; diff --git a/engine/http/httpclient.c b/engine/http/httpclient.c index 54f4b793a..975de52ee 100644 --- a/engine/http/httpclient.c +++ b/engine/http/httpclient.c @@ -6,6 +6,8 @@ #ifdef WEBCLIENT +qboolean HTTPDL_Decide(struct dl_download *dl); + /* This file does one thing. Connects to servers and grabs the specified file. It doesn't do any uploading whatsoever. Live with it. It doesn't use persistant connections. @@ -108,6 +110,7 @@ static qboolean HTTP_DL_Work(struct dl_download *dl) if (strnicmp(msg, "HTTP/", 5)) { //pre version 1. (lame servers. con->state = HC_GETTING; + dl->status = DL_ACTIVE; con->contentlength = -1; //meaning end of stream. } else @@ -176,7 +179,27 @@ static qboolean HTTP_DL_Work(struct dl_download *dl) else { HTTP_Cleanup(dl); - Q_strncpyz(dl->redir, Location, sizeof(dl->redir)); + if (*Location == '/') + { + char *cur = *dl->redir?dl->redir:dl->url; + char *curserver = cur; + char *curpath; + /*same server+protocol*/ + if (!strncmp(curserver, "http://", 7)) + curserver += 7; + curpath = strchr(curserver, '/'); + if (!curpath) + curpath = curserver + strlen(curserver); + if (cur == dl->redir) + *curpath = 0; + else + Q_strncpyz(dl->redir, cur, (curpath-cur) + 1); + Q_strncatz(dl->redir, Location, sizeof(dl->redir)); + } + else + Q_strncpyz(dl->redir, Location, sizeof(dl->redir)); + dl->poll = HTTPDL_Decide; + dl->status = DL_PENDING; } return true; } @@ -195,6 +218,8 @@ static qboolean HTTP_DL_Work(struct dl_download *dl) con->bufferused -= ammount; + dl->totalsize = con->contentlength; + if (!dl->file) { if (*dl->localname) @@ -216,6 +241,7 @@ static qboolean HTTP_DL_Work(struct dl_download *dl) con->state = HC_GETTING; + dl->status = DL_ACTIVE; } //Fall through @@ -313,6 +339,7 @@ static qboolean HTTP_DL_Work(struct dl_download *dl) dl->status = DL_FINISHED; return false; } + dl->completed = con->totalreceived; break; } @@ -412,7 +439,9 @@ qboolean HTTPDL_Poll(struct dl_download *dl) if (dl->ctx) { - HTTP_DL_Work(dl); + if (!HTTP_DL_Work(dl)) + if (dl->status != DL_FINISHED) + dl->status = DL_FAILED; if (dl->status == DL_FAILED) { HTTP_Cleanup(dl); @@ -512,6 +541,7 @@ void DL_Close(struct dl_download *dl) static struct dl_download *activedownloads; +static struct dl_download *showndownload; /*create a download context and add it to the list, for lazy people*/ struct dl_download *HTTP_CL_Get(const char *url, const char *localfile, void (*NotifyFunction)(struct dl_download *dl)) { @@ -549,7 +579,7 @@ void HTTP_CL_Think(void) if (cls.downloadmethod == DL_HTTP) { - if (!strcmp(cls.downloadlocalname, con->localname)) + if (showndownload == con) { cls.downloadmethod = DL_NONE; *cls.downloadlocalname = *cls.downloadremotename = 0; @@ -562,12 +592,13 @@ void HTTP_CL_Think(void) if (!cls.downloadmethod) { cls.downloadmethod = DL_HTTP; + showndownload = con; strcpy(cls.downloadlocalname, con->localname); - strcpy(cls.downloadremotename, con->localname); + strcpy(cls.downloadremotename, con->url); } if (cls.downloadmethod == DL_HTTP) { - if (!strcmp(cls.downloadlocalname, con->localname)) + if (showndownload == con) { if (con->status == DL_FINISHED) cls.downloadpercent = 100; diff --git a/engine/makeconfig.sh b/engine/makeconfig.sh index c03ac8b3a..7c271b655 100644 --- a/engine/makeconfig.sh +++ b/engine/makeconfig.sh @@ -93,7 +93,6 @@ query "Do you want to enable the text editor ?" TEXTEDITOR query "Do you want to enable the plugin support ?" PLUGINS query "Do you want to enable csqc support ?" CSQC_DAT query "Do you want to enable menu.dat support (used by nexuiz) ?" MENU_DAT -query "Do you want to enable quake3 shader support ?" Q3SHADERS query "Do you want to enable the built in irc client (note that there is also a plugin irc client, which cooler) ?" IRCCLIENT diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index 65b360baf..b6aef666d 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -548,6 +548,7 @@ pbool QCC_PR_CheckKeyword(int keywordenabled, char *string); void VARGS QCC_PR_ParseError (int errortype, char *error, ...); void VARGS QCC_PR_ParseWarning (int warningtype, char *error, ...); void VARGS QCC_PR_Warning (int type, char *file, int line, char *error, ...); +void VARGS QCC_PR_Note (int type, char *file, int line, char *error, ...); void QCC_PR_ParsePrintDef (int warningtype, QCC_def_t *def); void VARGS QCC_PR_ParseErrorPrintDef (int errortype, QCC_def_t *def, char *error, ...); @@ -827,6 +828,7 @@ extern int numtypeinfos; extern int maxtypeinfos; extern int ForcedCRC; +extern pbool defaultnoref; extern pbool defaultstatic; extern int *qcc_tempofs; diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index a76f2701e..e1ba6a032 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -8308,13 +8308,12 @@ void QCC_PR_ParseDefs (char *classname) QCC_function_t *f; QCC_dfunction_t *df; int i; - extern pbool defaultstatic; pbool shared=false; pbool isstatic=defaultstatic; pbool externfnc=false; pbool isconstant = false; pbool isvar = false; - pbool noref = false; + pbool noref = defaultnoref; pbool nosave = false; pbool allocatenew = true; pbool inlinefunction = false; diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 286da96f6..2441f40c9 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -202,6 +202,7 @@ void QCC_FindBestInclude(char *newfile, char *currentfile, char *rootpath) QCC_Include(fullname); } +pbool defaultnoref; pbool defaultstatic; int ForcedCRC; int QCC_PR_LexInteger (void); @@ -799,6 +800,10 @@ pbool QCC_PR_Precompiler(void) { ForcedCRC = atoi(msg); } + else if (!strncmp(qcc_token, "noref", 8)) + { + defaultnoref = atoi(msg); + } else if (!strncmp(qcc_token, "defaultstatic", 13)) { defaultstatic = atoi(msg); @@ -2710,6 +2715,30 @@ void VARGS QCC_PR_ParseWarning (int type, char *error, ...) } } +void VARGS QCC_PR_Note (int type, char *file, int line, char *error, ...) +{ + va_list argptr; + char string[1024]; + + if (qccwarningdisabled[type]) + return; + + va_start (argptr,error); + QC_vsnprintf (string,sizeof(string)-1, error,argptr); + va_end (argptr); + + QCC_PR_PrintScope(); + if (file) + { + if (flag_msvcstyle) + printf ("%s(%i) : note: %s\n", file, line, string); + else + printf ("%s:%i: note: %s\n", file, line, string); + } + else + printf ("note: %s\n", string); +} + void VARGS QCC_PR_Warning (int type, char *file, int line, char *error, ...) { va_list argptr; diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index 770fb44ea..1cabcaf9b 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -564,6 +564,7 @@ pbool QCC_WriteData (int crc) pbool debugtarget = false; pbool types = false; int outputsize = 16; + pbool warnedunref = false; if (numstatements==1 && numfunctions==1 && numglobaldefs==1 && numfielddefs==1) { @@ -704,6 +705,11 @@ pbool QCC_WriteData (int crc) QCC_PR_Warning(WARN_NOTREFERENCEDCONST, strings + def->s_file, def->s_line, "%s no references", def->name); else QCC_PR_Warning(WARN_NOTREFERENCED, strings + def->s_file, def->s_line, "%s no references", def->name); + if (!warnedunref) + { + QCC_PR_Note(WARN_NOTREFERENCED, NULL, 0, "You can use the noref prefix or pragma to silence this message."); + warnedunref = true; + } if (opt_unreferenced && def->type->type != ev_field) { @@ -2987,12 +2993,12 @@ memset(pr_immediate_string, 0, sizeof(pr_immediate_string)); if (!p || p >= argc-1 || argv[p+1][0] == '-') p = QCC_CheckParm ("-srcfile"); if (p && p < argc-1 ) - sprintf (qccmprogsdat, "%s%s", qccmsourcedir, argv[p+1]); + sprintf (qccmprogsdat, "%s", argv[p+1]); else { //look for a preprogs.src... :o) - sprintf (qccmprogsdat, "%spreprogs.src", qccmsourcedir); + sprintf (qccmprogsdat, "preprogs.src"); if (externs->FileSize(qccmprogsdat) <= 0) - sprintf (qccmprogsdat, "%sprogs.src", qccmsourcedir); + sprintf (qccmprogsdat, "progs.src"); } numsourcefiles = 0; @@ -3011,8 +3017,7 @@ memset(pr_immediate_string, 0, sizeof(pr_immediate_string)); if (currentsourcefile) printf("-------------------------------------\n"); - strcpy(qccmprogsdat, sourcefileslist[currentsourcefile++]); - + sprintf (qccmprogsdat, "%s%s", qccmsourcedir, sourcefileslist[currentsourcefile++]); printf ("Source file: %s\n", qccmprogsdat); if (QCC_LoadFile (qccmprogsdat, (void *)&qccmsrc) == -1) diff --git a/engine/server/pr_cmds.c b/engine/server/pr_cmds.c index 8baf683fd..fb642d210 100644 --- a/engine/server/pr_cmds.c +++ b/engine/server/pr_cmds.c @@ -2018,7 +2018,7 @@ void PF_setmodel (progfuncs_t *prinst, struct globalvars_s *pr_globals) PF_setmodel_Internal(prinst, e, m); } -void PF_set_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2set_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) { //qc/hc lacks string manipulation. edict_t *e; char *shortname; @@ -3227,7 +3227,7 @@ void PF_conprint (progfuncs_t *prinst, struct globalvars_s *pr_globals) } -void PF_printf (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2printf (progfuncs_t *prinst, struct globalvars_s *pr_globals) { char temp[256]; float v; @@ -3242,7 +3242,7 @@ void PF_printf (progfuncs_t *prinst, struct globalvars_s *pr_globals) Con_Printf (PR_GetStringOfs(prinst, OFS_PARM0),temp); } -void PF_printv (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2printv (progfuncs_t *prinst, struct globalvars_s *pr_globals) { char temp[256]; @@ -3251,7 +3251,7 @@ void PF_printv (progfuncs_t *prinst, struct globalvars_s *pr_globals) Con_Printf (PR_GetStringOfs(prinst, OFS_PARM0),temp); } -void PF_spawn_temp (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2spawn_temp (progfuncs_t *prinst, struct globalvars_s *pr_globals) { edict_t *ed; ed = ED_Alloc(prinst); @@ -3400,7 +3400,7 @@ void PF_precache_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) PF_precache_model_Internal(prinst, s); } -void PF_precache_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2precache_puzzle_model (progfuncs_t *prinst, struct globalvars_s *pr_globals) { //qc/hc lacks string manipulation. char *shortname; char fullname[MAX_QPATH]; @@ -4413,68 +4413,68 @@ void PF_WriteString2 (progfuncs_t *prinst, struct globalvars_s *pr_globals) G_FLOAT(OFS_PARM1) = old; } -void PF_Single_WriteByte (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteByte (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteByte(MSG_PRERELONE, (qbyte)G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteChar (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteChar (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteChar(MSG_PRERELONE, (char)G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteShort (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteShort (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteShort(MSG_PRERELONE, (short)G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteLong (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteLong (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteLong(MSG_PRERELONE, G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteAngle (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteAngle (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteAngle(MSG_PRERELONE, G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteCoord (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteCoord (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteCoord(MSG_PRERELONE, G_FLOAT(OFS_PARM1)); } -void PF_Single_WriteString (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteString (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteString(MSG_PRERELONE, PF_VarString(prinst, 1, pr_globals)); } -void PF_Single_WriteEntity (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtSingle_WriteEntity (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteEntity(MSG_PRERELONE, (short)G_EDICTNUM(prinst, OFS_PARM1)); } -void PF_Broadcast_WriteByte (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteByte (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteByte(MSG_BROADCAST, (qbyte)G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteChar (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteChar (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteChar(MSG_BROADCAST, (char)G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteShort (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteShort (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteShort(MSG_BROADCAST, (short)G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteLong (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteLong (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteLong(MSG_BROADCAST, G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteAngle (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteAngle (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteAngle(MSG_BROADCAST, G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteCoord (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteCoord (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteCoord(MSG_BROADCAST, G_FLOAT(OFS_PARM0)); } -void PF_Broadcast_WriteString (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteString (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteString(MSG_BROADCAST, PF_VarString(prinst, 0, pr_globals)); } -void PF_Broadcast_WriteEntity (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_qtBroadcast_WriteEntity (progfuncs_t *prinst, struct globalvars_s *pr_globals) { NPP_NQWriteEntity(MSG_BROADCAST, (short)G_EDICTNUM(prinst, OFS_PARM0)); } @@ -6734,7 +6734,7 @@ void PF_clientcommand (progfuncs_t *prinst, struct globalvars_s *pr_globals) -void PF_AdvanceFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2AdvanceFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) { edict_t *Ent; float Start,End,Result; @@ -6779,7 +6779,7 @@ void PF_AdvanceFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) G_FLOAT(OFS_RETURN) = Result; } -void PF_RewindFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2RewindFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) { edict_t *Ent; float Start,End,Result; @@ -6813,7 +6813,7 @@ void PF_RewindFrame(progfuncs_t *prinst, struct globalvars_s *pr_globals) #define WF_CYCLE_WRAPPED 2 #define WF_LAST_FRAME 3 -void PF_advanceweaponframe (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2advanceweaponframe (progfuncs_t *prinst, struct globalvars_s *pr_globals) { edict_t *ent; float startframe,endframe; @@ -6850,7 +6850,7 @@ void PF_advanceweaponframe (progfuncs_t *prinst, struct globalvars_s *pr_globals G_FLOAT(OFS_RETURN) = state; } -void PR_SetPlayerClass(client_t *cl, int classnum, qboolean fromqc) +void PRH2_SetPlayerClass(client_t *cl, int classnum, qboolean fromqc) { char temp[16]; if (classnum < 1) @@ -6877,7 +6877,7 @@ void PR_SetPlayerClass(client_t *cl, int classnum, qboolean fromqc) } } -void PF_setclass (progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2setclass (progfuncs_t *prinst, struct globalvars_s *pr_globals) { float NewClass; int entnum; @@ -6906,7 +6906,7 @@ void PF_setclass (progfuncs_t *prinst, struct globalvars_s *pr_globals) client->sendinfo = true; } -void PF_v_factor(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2v_factor(progfuncs_t *prinst, struct globalvars_s *pr_globals) // returns (v_right * factor_x) + (v_forward * factor_y) + (v_up * factor_z) { float *range; @@ -6929,7 +6929,7 @@ void PF_v_factor(progfuncs_t *prinst, struct globalvars_s *pr_globals) VectorCopy (result, G_VECTOR(OFS_RETURN)); } -void PF_v_factorrange(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2v_factorrange(progfuncs_t *prinst, struct globalvars_s *pr_globals) // returns (v_right * factor_x) + (v_forward * factor_y) + (v_up * factor_z) { float num,*minv,*maxv; @@ -6961,7 +6961,7 @@ void PF_v_factorrange(progfuncs_t *prinst, struct globalvars_s *pr_globals) } char *T_GetString(int num); -void PF_plaque_draw(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2plaque_draw(progfuncs_t *prinst, struct globalvars_s *pr_globals) { char *s; @@ -7009,7 +7009,7 @@ void PF_plaque_draw(progfuncs_t *prinst, struct globalvars_s *pr_globals) } } -static void PF_movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals) +static void PF_h2movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals) { vec3_t v; edict_t *ent; @@ -7032,7 +7032,7 @@ static void PF_movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals) pr_global_struct->self = oldself; } -void PF_concatv(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2concatv(progfuncs_t *prinst, struct globalvars_s *pr_globals) { float *in,*range; vec3_t result; @@ -7051,7 +7051,7 @@ void PF_concatv(progfuncs_t *prinst, struct globalvars_s *pr_globals) VectorCopy (result, G_VECTOR(OFS_RETURN)); } -void PF_matchAngleToSlope(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2matchAngleToSlope(progfuncs_t *prinst, struct globalvars_s *pr_globals) { edict_t *actor; vec3_t v_forward, old_forward, old_right, new_angles2 = { 0, 0, 0 }; @@ -7083,25 +7083,25 @@ void PF_matchAngleToSlope(progfuncs_t *prinst, struct globalvars_s *pr_globals) actor->v->angles[2] = (1-fabs(dot))*pitch*mod; } -void PF_starteffect(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2starteffect(progfuncs_t *prinst, struct globalvars_s *pr_globals) { Con_DPrintf("Start effect %i\n", (int)G_FLOAT(OFS_PARM0)); } -void PF_endeffect(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2endeffect(progfuncs_t *prinst, struct globalvars_s *pr_globals) { Con_DPrintf("Stop effect %i\n", (int)G_FLOAT(OFS_PARM0)); } -void PF_rain_go(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2rain_go(progfuncs_t *prinst, struct globalvars_s *pr_globals) { } -void PF_StopSound(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2StopSound(progfuncs_t *prinst, struct globalvars_s *pr_globals) { } -void PF_getstring(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void PF_h2getstring(progfuncs_t *prinst, struct globalvars_s *pr_globals) { char *s = T_GetString(G_FLOAT(OFS_PARM0)-1); RETURN_PSTRING(s); @@ -9042,39 +9042,39 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"writestring", PF_WriteString, 58, 58, 58}, //58 {"writeentity", PF_WriteEntity, 59, 59, 59}, //59 - {"swritebyte", PF_Single_WriteByte}, //52 - {"swritechar", PF_Single_WriteChar}, //53 - {"swriteshort", PF_Single_WriteShort}, //54 - {"swritelong", PF_Single_WriteLong}, //55 - {"swritecoord", PF_Single_WriteCoord}, //56 - {"swriteangle", PF_Single_WriteAngle}, //57 - {"swritestring", PF_Single_WriteString}, //58 - {"swriteentity", PF_Single_WriteEntity}, + {"swritebyte", PF_qtSingle_WriteByte}, //52 + {"swritechar", PF_qtSingle_WriteChar}, //53 + {"swriteshort", PF_qtSingle_WriteShort}, //54 + {"swritelong", PF_qtSingle_WriteLong}, //55 + {"swritecoord", PF_qtSingle_WriteCoord}, //56 + {"swriteangle", PF_qtSingle_WriteAngle}, //57 + {"swritestring", PF_qtSingle_WriteString}, //58 + {"swriteentity", PF_qtSingle_WriteEntity}, - {"bwritebyte", PF_Broadcast_WriteByte}, //59 - {"bwritechar", PF_Broadcast_WriteChar}, //60 - {"bwriteshort", PF_Broadcast_WriteShort}, //61 - {"bwritelong", PF_Broadcast_WriteLong}, //62 - {"bwritecoord", PF_Broadcast_WriteCoord}, //63 - {"bwriteangle", PF_Broadcast_WriteAngle}, //64 - {"bwritestring", PF_Broadcast_WriteString}, //65 - {"bwriteentity", PF_Broadcast_WriteEntity}, //66 + {"bwritebyte", PF_qtBroadcast_WriteByte}, //59 + {"bwritechar", PF_qtBroadcast_WriteChar}, //60 + {"bwriteshort", PF_qtBroadcast_WriteShort}, //61 + {"bwritelong", PF_qtBroadcast_WriteLong}, //62 + {"bwritecoord", PF_qtBroadcast_WriteCoord}, //63 + {"bwriteangle", PF_qtBroadcast_WriteAngle}, //64 + {"bwritestring", PF_qtBroadcast_WriteString}, //65 + {"bwriteentity", PF_qtBroadcast_WriteEntity}, //66 - {"printfloat", PF_printf, 0, 0, 60}, //60 + {"printfloat", PF_h2printf, 0, 0, 60}, //60 {"sin", PF_Sin, 0, 0, 62, 60}, //60 {"cos", PF_Cos, 0, 0, 61, 61}, //61 {"sqrt", PF_Sqrt, 0, 0, 84, 62}, //62 - {"AdvanceFrame", PF_AdvanceFrame, 0, 0, 63, 0}, - {"printvec", PF_printv, 0, 0, 64, 0}, //64 - {"RewindFrame", PF_RewindFrame, 0, 0, 65, 0}, + {"AdvanceFrame", PF_h2AdvanceFrame, 0, 0, 63, 0}, + {"printvec", PF_h2printv, 0, 0, 64, 0}, //64 + {"RewindFrame", PF_h2RewindFrame, 0, 0, 65, 0}, {"particleexplosion",PF_h2particleexplosion,0, 0, 81, 0}, - {"movestep", PF_movestep, 0, 0, 82, 0}, - {"advanceweaponframe",PF_advanceweaponframe,0, 0, 83, 0}, + {"movestep", PF_h2movestep, 0, 0, 82, 0}, + {"advanceweaponframe",PF_h2advanceweaponframe,0, 0, 83, 0}, - {"setclass", PF_setclass, 0, 0, 66, 0}, + {"setclass", PF_h2setclass, 0, 0, 66, 0}, {"changepitch", PF_changepitch, 0, 0, 0, 63}, {"tracetoss", PF_TraceToss, 0, 0, 0, 64}, @@ -9097,7 +9097,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"precache_file2", PF_precache_file, 77, 77, 0}, //77 {"setspawnparms", PF_setspawnparms, 78, 78, 78}, //78 - {"plaque_draw", PF_plaque_draw, 0, 0, 79}, //79 + {"plaque_draw", PF_h2plaque_draw, 0, 0, 79}, //79 {"logfrag", PF_logfrag, 0, 79, 0, 79}, //79 // Tomaz - QuakeC String Manipulation Begin @@ -9117,7 +9117,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"tq_fputs", PF_fputs, 0, 0, 0, 89, true},// #89 void(float fhandle, string s) fputs (QSG_FILE) // Tomaz - QuakeC File System End - {"rain_go", PF_rain_go, 0, 0, 80, 0}, //80 + {"rain_go", PF_h2rain_go, 0, 0, 80, 0}, //80 {"infokey", PF_infokey, 0, 80, 0, 80}, //80 {"stof", PF_stof, 0, 81, 0, 81}, //81 @@ -9154,25 +9154,25 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs {"forcedemoframe", PF_forcedemoframe, 0, 0, 0, 103, true}, //end of mvdsv - {"setpuzzlemodel", PF_set_puzzle_model,0, 0, 87, 0}, - {"starteffect", PF_starteffect, 0, 0, 88, 0}, //FIXME - {"endeffect", PF_endeffect, 0, 0, 89, 0}, //FIXME - {"getstring", PF_getstring, 0, 0, 92, 0}, //FIXME - {"spawntemp", PF_spawn_temp, 0, 0, 93, 0}, + {"setpuzzlemodel", PF_h2set_puzzle_model,0, 0, 87, 0}, + {"starteffect", PF_h2starteffect, 0, 0, 88, 0}, //FIXME + {"endeffect", PF_h2endeffect, 0, 0, 89, 0}, //FIXME + {"getstring", PF_h2getstring, 0, 0, 92, 0}, //FIXME + {"spawntemp", PF_h2spawn_temp, 0, 0, 93, 0}, - {"v_factor", PF_v_factor, 0, 0, 94, 0}, - {"v_factorrange", PF_v_factorrange, 0, 0, 95, 0}, + {"v_factor", PF_h2v_factor, 0, 0, 94, 0}, + {"v_factorrange", PF_h2v_factorrange, 0, 0, 95, 0}, - {"precache_puzzle_model", PF_precache_puzzle_model, 0, 0, 90, 0}, - {"concatv", PF_concatv, 0, 0, 91, 0}, + {"precache_puzzle_model", PF_h2precache_puzzle_model, 0, 0, 90, 0}, + {"concatv", PF_h2concatv, 0, 0, 91, 0}, {"precache_sound3", PF_precache_sound, 0, 0, 96, 0}, {"precache_model3", PF_precache_model, 0, 0, 97, 0},//please don't use... - {"matchangletoslope",PF_matchAngleToSlope,0, 0, 99, 0}, + {"matchangletoslope",PF_h2matchAngleToSlope,0, 0, 99, 0}, {"precache_sound4", PF_precache_sound, 0, 0, 101, 0}, {"precache_model4", PF_precache_model, 0, 0, 102, 0}, {"precache_file4", PF_precache_file, 0, 0, 103, 0}, - {"stopsound", PF_StopSound, 0, 0, 106, 0}, + {"stopsound", PF_h2StopSound, 0, 0, 106, 0}, {"precache_model4", PF_precache_model, 0, 0, 116, 0},//please don't use... {"precache_sound4", PF_precache_sound, 0, 0, 117, 0}, @@ -9588,23 +9588,23 @@ void PR_ResetBuiltins(progstype_t type) //fix all nulls to PF_FIXME and add any if (type == PROG_PREREL) { - pr_builtin[52] = PF_Single_WriteByte; - pr_builtin[53] = PF_Single_WriteChar; - pr_builtin[54] = PF_Single_WriteShort; - pr_builtin[55] = PF_Single_WriteLong; - pr_builtin[56] = PF_Single_WriteCoord; - pr_builtin[57] = PF_Single_WriteAngle; - pr_builtin[58] = PF_Single_WriteString; + pr_builtin[52] = PF_qtSingle_WriteByte; + pr_builtin[53] = PF_qtSingle_WriteChar; + pr_builtin[54] = PF_qtSingle_WriteShort; + pr_builtin[55] = PF_qtSingle_WriteLong; + pr_builtin[56] = PF_qtSingle_WriteCoord; + pr_builtin[57] = PF_qtSingle_WriteAngle; + pr_builtin[58] = PF_qtSingle_WriteString; //lack of writeentity is intentional (prerel doesn't have it. - pr_builtin[59] = PF_Broadcast_WriteByte; - pr_builtin[60] = PF_Broadcast_WriteChar; - pr_builtin[61] = PF_Broadcast_WriteShort; - pr_builtin[62] = PF_Broadcast_WriteLong; - pr_builtin[63] = PF_Broadcast_WriteCoord; - pr_builtin[64] = PF_Broadcast_WriteAngle; - pr_builtin[65] = PF_Broadcast_WriteString; - pr_builtin[66] = PF_Broadcast_WriteEntity; + pr_builtin[59] = PF_qtBroadcast_WriteByte; + pr_builtin[60] = PF_qtBroadcast_WriteChar; + pr_builtin[61] = PF_qtBroadcast_WriteShort; + pr_builtin[62] = PF_qtBroadcast_WriteLong; + pr_builtin[63] = PF_qtBroadcast_WriteCoord; + pr_builtin[64] = PF_qtBroadcast_WriteAngle; + pr_builtin[65] = PF_qtBroadcast_WriteString; + pr_builtin[66] = PF_qtBroadcast_WriteEntity; } if (!pr_compatabilitytest.value) diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index c9ee5cd68..62ef0b012 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -221,7 +221,7 @@ vfsfile_t *sv_fraglogfile; void SV_FixupName(char *in, char *out, unsigned int outlen); void SV_AcceptClient (netadr_t adr, int userid, char *userinfo); void Master_Shutdown (void); -void PR_SetPlayerClass(client_t *cl, int classnum, qboolean fromqc); +void PRH2_SetPlayerClass(client_t *cl, int classnum, qboolean fromqc); char *SV_BannedReason (netadr_t *a); #ifdef SQL @@ -4270,7 +4270,7 @@ void SV_ExtractFromUserinfo (client_t *cl) val = Info_ValueForKey (cl->userinfo, "cl_playerclass"); if (val) { - PR_SetPlayerClass(cl, atoi(val), false); + PRH2_SetPlayerClass(cl, atoi(val), false); } // msg command diff --git a/fteqtv/httpsv.c b/fteqtv/httpsv.c index af43aaabf..ca83819e5 100644 --- a/fteqtv/httpsv.c +++ b/fteqtv/httpsv.c @@ -740,7 +740,7 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest) Net_ProxySend(cluster, dest, html, strlen(html)); Net_ProxySend(cluster, dest, hostname, strlen(hostname)); html = - "/plugimg.jpg\">" + "/qtvsplash.jpg\">" "" "" /*once again for firefox and similar friends*/ @@ -754,7 +754,7 @@ static void HTTPSV_GeneratePlugin(cluster_t *cluster, oproxy_t *dest) Net_ProxySend(cluster, dest, html, strlen(html)); Net_ProxySend(cluster, dest, hostname, strlen(hostname)); html = - "/plugimg.jpg\">" + "/qtvsplash.jpg\">" "" "" "It looks like you either don't have the required plugin or its not supported by your browser.
" @@ -1068,7 +1068,7 @@ void HTTPSV_GetMethod(cluster_t *cluster, oproxy_t *pend) else REDIRECTIF("/", "/plugin.html") else REDIRECTIF("/", "/nowplaying.html") else REDIRECTIF("/about.html", "http://www.fteqw.com/") - else REDIRECTIF("/plugimg.jpg", "/file/plugimg.jpg") /*lame, very lame*/ + else REDIRECTIF("/qtvsplash.jpg", "/file/qtvsplash.jpg") /*lame, very lame*/ else REDIRECTIF("/npfte.xpi", "/file/npfte.xpi") /*lame, very lame*/ else REDIRECTIF("/npfte.exe", "/file/npfte.exe") /*lame, very lame*/ else REDIRECTIF("/iefte.exe", "/file/iefte.exe") /*lame, very lame*/