diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index a115f3caf..62be1db88 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -1288,7 +1288,7 @@ void CL_LinkPacketEntities (void) s1 = &pack->entities[pnum]; //bots or powerup glows. Bots always glow, powerups can be disabled - if (s1->modelindex == cl_playerindex || r_powerupglow.value); + if (s1->modelindex != cl_playerindex && r_powerupglow.value); { flicker = r_lightflicker.value?(rand()&31):0; // spawn light flashes, even ones coming from invisible objects @@ -2065,7 +2065,7 @@ void CL_LinkPlayers (void) continue; // not present this frame // spawn light flashes, even ones coming from invisible objects - if (!r_flashblend.value || j != cl.playernum[0]) + if ((!r_flashblend.value || j != cl.playernum[0]) && r_powerupglow.value) { if ((state->effects & (EF_BLUE | EF_RED)) == (EF_BLUE | EF_RED)) CL_NewDlight (j+1, state->origin[0], state->origin[1], state->origin[2], 200 + (rand()&31), 0.1, 3)->noppl = (j != cl.playernum[0]); diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 1eb9fafa8..018d91717 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -344,7 +344,9 @@ void CL_SendConnectPacket ( fteprotextsupported |= PEXT_FLOATCOORDS; #endif fteprotextsupported |= PEXT_SPAWNSTATIC2; +#ifdef PEXT_SEEF1 fteprotextsupported |= PEXT_SEEF1; +#endif fteprotextsupported |= PEXT_SPLITSCREEN; fteprotextsupported |= PEXT_HEXEN2; fteprotextsupported |= PEXT_CUSTOMTEMPEFFECTS; @@ -848,8 +850,10 @@ void CL_Disconnect (void) #ifdef VM_CG CG_Stop(); #endif - -// if running a local server, shut it down +#ifdef CSQC_DAT + CSQC_Shutdown(); +#endif + // if running a local server, shut it down if (cls.demoplayback != DPB_NONE) CL_StopPlayback (); else if (cls.state != ca_disconnected) diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index 5e51efb78..5682558f9 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -791,8 +791,6 @@ void Model_NextDownload (void) } #endif -Hunk_Check(); - cls.downloadtype = dl_model; for ( @@ -819,8 +817,6 @@ Hunk_Check(); return; } - Hunk_Check(); - if (cl.playernum[0] == -1) { //q2 cinematic - don't load the models. cl.worldmodel = cl.model_precache[1] = Mod_ForName ("", false); @@ -1624,6 +1620,9 @@ void CL_ParseServerData (void) #ifdef VM_CG CG_Stop(); #endif +#ifdef CSQC_DAT + CSQC_Shutdown(); +#endif } void CLQ2_ParseServerData (void) @@ -1882,6 +1881,9 @@ Con_DPrintf ("CL_SignonReply: %i\n", cls.signon); Cache_Report (); // print remaining memory #ifdef VM_CG CG_Start(); +#endif +#ifdef CSQC_DAT + CSQC_Init(); #endif break; diff --git a/engine/client/cl_ui.c b/engine/client/cl_ui.c index 9034ae0aa..79627dc61 100644 --- a/engine/client/cl_ui.c +++ b/engine/client/cl_ui.c @@ -344,7 +344,9 @@ void VQ3_AddEntity(const q3refEntity_t *q3) ent.lerpfrac = ent.lerptime = q3->backlerp; ent.alpha = 1; ent.scale = 1; + ent.forcedshader = q3->customShader; *(int*)ent.shaderRGBA = *(int*)q3->shaderRGBA; + ent.shaderTime = q3->shaderTime; if (q3->renderfx & Q3RF_DEPTHHACK) ent.flags |= Q2RF_DEPTHHACK; if (q3->renderfx & Q3RF_THIRD_PERSON) @@ -468,6 +470,7 @@ void VQ3_RenderView(const q3refdef_t *ref) r_refdef.vrect.y = ref->y; r_refdef.vrect.width = ref->width; r_refdef.vrect.height = ref->height; + r_refdef.time = ref->time/1000.0f; memcpy(cl.q2frame.areabits, ref->areamask, sizeof(cl.q2frame.areabits)); #ifdef RGLQUAKE @@ -498,6 +501,7 @@ void VQ3_RenderView(const q3refdef_t *ref) #endif vid.recalc_refdef = 1; + r_refdef.time = 0; } diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index f3efa5809..129131430 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -8,6 +8,7 @@ progfuncs_t *csqcprogs; +//note: doesn't even have to match the clprogs.dat :) typedef struct { //CHANGING THIS STRUCTURE REQUIRES CHANGES IN CSQC_InitFields //fields the client will pull out of the edict for rendering. @@ -22,9 +23,11 @@ typedef struct { float frame; float oldframe; float lerpfrac; + + float drawmask; //drawentities uses this mask for it. } csqcentvars_t; -typedef struct menuedict_s +typedef struct csqcedict_s { qboolean isfree; float freetime; // sv.time when the object was freed @@ -54,6 +57,7 @@ void CSQC_InitFields(void) fieldfloat(oldframe); fieldfloat(lerpfrac); + fieldfloat(drawmask); } #define RETURN_SSTRING(s) (*(char **)&((int *)pr_globals)[OFS_RETURN] = PR_SetString(prinst, s)) //static - exe will not change it. @@ -115,6 +119,18 @@ void PF_traceon (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_traceoff (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_eprint (progfuncs_t *prinst, struct globalvars_s *pr_globals); +//these functions are from pr_menu.dat +void PF_CL_is_cached_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_precache_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_free_pic (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawcharacter (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawstring (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawpic (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawfill (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawsetcliparea (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawresetcliparea (progfuncs_t *prinst, struct globalvars_s *pr_globals); +void PF_CL_drawgetimagesize (progfuncs_t *prinst, struct globalvars_s *pr_globals); + void PF_fclose_progs (progfuncs_t *prinst); char *PF_VarString (progfuncs_t *prinst, int first, struct globalvars_s *pr_globals); @@ -181,20 +197,57 @@ static void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) V_AddEntity(&ent); } +#define MASK_ENGINE 1 +static void PF_R_AddEntityMask(progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + int mask = G_FLOAT(OFS_PARM0); + csqcedict_t *ent; + int e; + + for (e=1; e < *prinst->parms->sv_num_edicts; e++) + { + ent = (void*)EDICT_NUM(prinst, e); + if (ent->isfree) + continue; + + if ((int)ent->v.drawmask & mask) + { + G_INT(OFS_PARM0) = EDICT_TO_PROG(prinst, (void*)ent); + PF_R_AddEntity(prinst, pr_globals); + } + } + + if (mask & MASK_ENGINE) + { + CL_EmitEntities(); + } +} + +float CalcFov (float fov_x, float width, float height); //clear scene, and set up the default stuff. static void PF_R_ClearScene (progfuncs_t *prinst, struct globalvars_s *pr_globals) { + extern frame_t *view_frame; + extern player_state_t *view_message; + cl_numvisedicts = 0; - + + view_frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK]; + view_message = &view_frame->playerstate[cl.playernum[0]]; + V_CalcRefdef(0); //set up the defaults (for player 0) + /* VectorCopy(cl.simangles[0], r_refdef.viewangles); + VectorCopy(cl.simorg[0], r_refdef.vieworg); r_refdef.flags = 0; - r_refdef.fov_x = 90; - r_refdef.fov_y = 90; r_refdef.vrect.x = 0; r_refdef.vrect.y = 0; r_refdef.vrect.width = vid.width; r_refdef.vrect.height = vid.height; + + r_refdef.fov_x = scr_fov.value; + r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.vrect.width, r_refdef.vrect.height); + */ } static void PF_R_SetViewFlag(progfuncs_t *prinst, struct globalvars_s *pr_globals) @@ -315,6 +368,8 @@ static void PF_R_SetViewFlag(progfuncs_t *prinst, struct globalvars_s *pr_global static void PF_R_RenderScene(progfuncs_t *prinst, struct globalvars_s *pr_globals) { + R_PushDlights (); + #ifdef RGLQUAKE if (qrenderer == QR_OPENGL) { @@ -491,8 +546,45 @@ PF_Fixme, PF_Fixme, +//120 +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, -PF_Fixme}; +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, + +//130 +PF_R_ClearScene, +PF_R_AddEntityMask, +PF_R_AddEntity, +PF_R_SetViewFlag, +PF_R_RenderScene, + +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, +PF_Fixme, + +//140 +PF_CL_is_cached_pic,//0 +PF_CL_precache_pic,//1 +PF_CL_free_pic,//2 +PF_CL_drawcharacter,//3 +PF_CL_drawstring,//4 +PF_CL_drawpic,//5 +PF_CL_drawfill,//6 +PF_CL_drawsetcliparea,//7 +PF_CL_drawresetcliparea,//8 +PF_CL_drawgetimagesize,//9 + +}; int csqc_numbuiltins = sizeof(csqc_builtins)/sizeof(csqc_builtins[0]); @@ -522,7 +614,7 @@ void *VARGS PR_Malloc(int size); //these functions should be tracked by the libr void VARGS PR_Free(void *mem); //Any menu builtin error or anything like that will come here. -void VARGS CSQC_Abort (char *format, ...) +void VARGS CSQC_Abort (char *format, ...) //an error occured. { va_list argptr; char string[1024]; @@ -544,6 +636,16 @@ void VARGS CSQC_Abort (char *format, ...) Host_EndGame("csqc error"); } +void CSQC_Shutdown(void) +{ + if (csqcprogs) + { + CloseProgs(csqcprogs); + Con_Printf("Closed csqc\n"); + } + csqcprogs = NULL; +} + void CSQC_FindGlobals(void) { csqc_time = (float*)PR_FindGlobal(csqcprogs, "time", 0); @@ -551,23 +653,23 @@ void CSQC_FindGlobals(void) *csqc_time = Sys_DoubleTime(); - csqc_init_function = PR_FindFunction(csqcprogs, "csqc_init", PR_ANY); - csqc_shutdown_function = PR_FindFunction(csqcprogs, "csqc_shutdown", PR_ANY); - csqc_draw_function = PR_FindFunction(csqcprogs, "csqc_draw", PR_ANY); - csqc_keydown_function = PR_FindFunction(csqcprogs, "csqc_keydown", PR_ANY); - csqc_keyup_function = PR_FindFunction(csqcprogs, "csqc_keyup", PR_ANY); - csqc_toggle_function = PR_FindFunction(csqcprogs, "csqc_toggle", PR_ANY); + csqc_init_function = PR_FindFunction(csqcprogs, "CSQC_Init", PR_ANY); + csqc_shutdown_function = PR_FindFunction(csqcprogs, "CSQC_Shutdown", PR_ANY); + csqc_draw_function = PR_FindFunction(csqcprogs, "CSQC_UpdateView", PR_ANY); + csqc_keydown_function = PR_FindFunction(csqcprogs, "CSQC_KeyDown", PR_ANY); + csqc_keyup_function = PR_FindFunction(csqcprogs, "CSQC_KeyUp", PR_ANY); } double csqctime; void CSQC_Init (void) { + CSQC_Shutdown(); + if (!qrenderer) { return; } - csqcprogparms.progsversion = PROGSTRUCT_VERSION; csqcprogparms.ReadFile = COM_LoadStackFile;//char *(*ReadFile) (char *fname, void *buffer, int *len); csqcprogparms.FileSize = COM_FileSize;//int (*FileSize) (char *fname); //-1 if file does not exist @@ -614,11 +716,13 @@ void CSQC_Init (void) if (PR_LoadProgs(csqcprogs, "csprogs.dat", 0, NULL, 0) < 0) //no per-progs builtins. { + CSQC_Shutdown(); //failed to load or something return; } if (setjmp(csqc_abort)) { + CSQC_Shutdown(); return; } @@ -632,6 +736,8 @@ void CSQC_Init (void) if (csqc_init_function) PR_ExecuteProgram(csqcprogs, csqc_init_function); + + Con_Printf("Loaded csqc\n"); } } @@ -640,9 +746,15 @@ qboolean CSQC_DrawView(void) if (!csqc_draw_function || !csqcprogs) return false; + R_LessenStains(); + PR_ExecuteProgram(csqcprogs, csqc_draw_function); return true; } +void CSQC_ParseEntities(void) +{ +} + #endif diff --git a/engine/client/render.h b/engine/client/render.h index 25e17bf47..c283dafcc 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -44,6 +44,7 @@ typedef struct entity_s vec3_t axis[3]; byte_vec4_t shaderRGBA; + float shaderTime; vec3_t oldorigin; vec3_t oldangles; @@ -73,6 +74,10 @@ typedef struct entity_s int flags; +#ifdef Q3SHADERS + struct shader_s *forcedshader; +#endif + #ifdef PEXT_SCALE float scale; #endif @@ -124,6 +129,8 @@ typedef struct int flags; int currentplayernum; + + float time; } refdef_t; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index 2ca8383c9..e8d90cf29 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -94,9 +94,6 @@ cvar_t r_stainfadetime = {"r_stainfadetime", "1"}; cvar_t r_stainfadeammount = {"r_stainfadeammount", "1"}; cvar_t _windowed_mouse = {"_windowed_mouse","1"}; -cvar_t _vid_default_mode = {"_vid_default_mode","0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; -// Note that 3 is MODE_FULLSCREEN_DEFAULT -cvar_t _vid_default_mode_win = {"_vid_default_mode_win","3", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; cvar_t vid_wait = {"vid_wait","0"}; cvar_t vid_nopageflip = {"vid_nopageflip","0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; cvar_t _vid_wait_override = {"_vid_wait_override", "0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; @@ -113,6 +110,7 @@ static cvar_t vid_width = {"vid_width", "640", NULL, CVAR_ARCHIVE|CVAR_RENDERERL static cvar_t vid_height = {"vid_height", "480", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; static cvar_t vid_refreshrate = {"vid_displayfrequency", "0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; +cvar_t gl_fontedgeclamp = {"gl_fontedgeclamp", "0"}; //gl blends. Set this to 1 to stop the outside of your conchars from being visible cvar_t gl_font = {"gl_font", ""}; cvar_t gl_conback = {"gl_conback", ""}; cvar_t gl_smoothfont = {"gl_smoothfont", "1"}; @@ -295,6 +293,7 @@ void GLRenderer_Init(void) Cvar_Register (&vid_conwidth, GLRENDEREROPTIONS); Cvar_Register (&vid_conheight, GLRENDEREROPTIONS); + Cvar_Register (&gl_fontedgeclamp, GRAPHICALNICETIES); Cvar_Register (&gl_font, GRAPHICALNICETIES); Cvar_Register (&gl_conback, GRAPHICALNICETIES); Cvar_Register (&gl_smoothfont, GRAPHICALNICETIES); @@ -444,8 +443,6 @@ void Renderer_Init(void) Cvar_Register (&vid_wait, VIDCOMMANDGROUP); Cvar_Register (&vid_nopageflip, VIDCOMMANDGROUP); Cvar_Register (&_vid_wait_override, VIDCOMMANDGROUP); - Cvar_Register (&_vid_default_mode, VIDCOMMANDGROUP); - Cvar_Register (&_vid_default_mode_win, VIDCOMMANDGROUP); Cvar_Register (&vid_stretch, VIDCOMMANDGROUP); Cvar_Register (&_windowed_mouse, VIDCOMMANDGROUP); Cvar_Register (&vid_renderer, VIDCOMMANDGROUP); diff --git a/engine/client/skin.c b/engine/client/skin.c index ced9ab877..3f979b8ee 100644 --- a/engine/client/skin.c +++ b/engine/client/skin.c @@ -491,6 +491,9 @@ void Skin_NextDownload (void) if (cls.state != ca_active) { // get next signon phase +#ifdef CSQC_DAT + CSQC_Init(); +#endif MSG_WriteByte (&cls.netchan.message, clc_stringcmd); MSG_WriteString (&cls.netchan.message, va("begin %i", cl.servercount)); diff --git a/engine/client/snd_sdl.c b/engine/client/snd_sdl.c index 1f136d7ca..8023c0428 100644 --- a/engine/client/snd_sdl.c +++ b/engine/client/snd_sdl.c @@ -68,7 +68,7 @@ int SNDDMA_Init(soundcardinfo_t *sc) } Con_Printf("SDL AUDIO INITING\n"); - if(SDL_InitSubSystem(SDL_INIT_AUDIO)) + if(SDL_InitSubSystem(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE)) { Con_Print("Couldn't initialize SDL audio subsystem\n"); return false; diff --git a/engine/client/view.c b/engine/client/view.c index b6b3dd3bb..d59f35d47 100644 --- a/engine/client/view.c +++ b/engine/client/view.c @@ -1099,9 +1099,9 @@ void V_CalcRefdef (int pnum) if (!cls.q2server) #endif { - if (view_message->flags & PF_GIB) + if (view_message && view_message->flags & PF_GIB) r_refdef.vieworg[2] += 8; // gib view height - else if (view_message->flags & PF_DEAD) + else if (view_message && view_message->flags & PF_DEAD) r_refdef.vieworg[2] -= 16; // corpse view height else r_refdef.vieworg[2] += cl.viewheight[pnum]; @@ -1109,7 +1109,7 @@ void V_CalcRefdef (int pnum) r_refdef.vieworg[2] += cl.crouch[pnum]; } - if (view_message->flags & PF_DEAD) // PF_GIB will also set PF_DEAD + if (view_message && view_message->flags & PF_DEAD) // PF_GIB will also set PF_DEAD { if (!cl.spectator || !cl_chasecam.value) r_refdef.viewangles[ROLL] = 80; // dead view angle @@ -1149,16 +1149,18 @@ void V_CalcRefdef (int pnum) view->model = NULL; else #endif - if (view_message->flags & (PF_GIB|PF_DEAD) ) + if (view_message && view_message->flags & (PF_GIB|PF_DEAD) ) view->model = NULL; else view->model = cl.model_precache[cl.stats[pnum][STAT_WEAPON]]; - view->frame = view_message->weaponframe; + view->frame = view_message?view_message->weaponframe:0; view->colormap = vid.colormap; // set up the refresh position r_refdef.viewangles[PITCH] += cl.punchangle[pnum]; + r_refdef.time = realtime; + // smooth out stair step ups diff --git a/engine/client/zqtp.c b/engine/client/zqtp.c index a596a61ee..a77eaefd4 100644 --- a/engine/client/zqtp.c +++ b/engine/client/zqtp.c @@ -2651,7 +2651,7 @@ static void CL_Say (qboolean team, char *extra) #ifdef Q3CLIENT if (cls.q2server==2) { - CL_SendClientCommand("%s %s%s", team ? "say_team " : "say ", extra?extra:"", sendtext); + CLQ3_SendClientCommand("%s %s%s", team ? "say_team " : "say ", extra?extra:"", sendtext); return; } #endif diff --git a/engine/common/cmd.c b/engine/common/cmd.c index b7a22eca7..26a8047b1 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -1550,7 +1550,7 @@ void Cmd_ForwardToServer (void) #ifdef Q3CLIENT if (cls.q2server == 2) { - CL_SendClientCommand("%s %s", Cmd_Argv(0), Cmd_Args()); + CLQ3_SendClientCommand("%s %s", Cmd_Argv(0), Cmd_Args()); return; } #endif @@ -1588,7 +1588,7 @@ void Cmd_ForwardToServer_f (void) #ifdef Q3CLIENT if (cls.q2server == 2) { - CL_SendClientCommand("%s", Cmd_Args()); + CLQ3_SendClientCommand("%s", Cmd_Args()); return; } #endif diff --git a/engine/email/pop3noti.c b/engine/email/pop3noti.c index 6d4789b08..34f815081 100644 --- a/engine/email/pop3noti.c +++ b/engine/email/pop3noti.c @@ -45,33 +45,8 @@ char *MD5_GetPop3APOPString(char *timestamp, char *secrit); -#define HASH_FILESYSTEM -#ifdef HASH_FILESYSTEM -//#include "hash.h" -#define Hash_BytesForBuckets(b) (sizeof(bucket_t)*b) - -#define STRCMP(s1,s2) (((*s1)!=(*s2)) || strcmp(s1+1,s2+1)) //saves about 2-6 out of 120 - expansion of idea from fastqcc -typedef struct bucket_s { - void *data; - char *keystring; - struct bucket_s *next; -} bucket_t; -typedef struct hashtable_s { - int numbuckets; - bucket_t **bucket; -} hashtable_t; - -void Hash_InitTable(hashtable_t *table, int numbucks, void *mem); //mem must be 0 filled. (memset(mem, 0, size)) -int Hash_Key(char *name, int modulus); -void *Hash_Get(hashtable_t *table, char *name); -void *Hash_GetKey(hashtable_t *table, int key); -void *Hash_GetNext(hashtable_t *table, char *name, void *old); -void *Hash_Add(hashtable_t *table, char *name, void *data); -void *Hash_Add2(hashtable_t *table, char *name, void *data, bucket_t *buck); -void *Hash_AddKey(hashtable_t *table, int key, void *data); -void Hash_Remove(hashtable_t *table, char *name); -#endif +#include "hash.h" @@ -100,7 +75,7 @@ qboolean POP3_IsMessageUnique(char *hash) buf = Z_Malloc(sizeof(bucket_t) + strlen(hash)+1); strcpy(buf+sizeof(bucket_t), hash); hash = buf+sizeof(bucket_t); - Hash_Add2(&pop3msghash, hash, hash, (bucket_t *)buf); + Hash_Add(&pop3msghash, hash, hash, (bucket_t *)buf); return true; } diff --git a/engine/email/sv_pop3.c b/engine/email/sv_pop3.c index 40a4c43f6..7a18f1b26 100644 --- a/engine/email/sv_pop3.c +++ b/engine/email/sv_pop3.c @@ -17,33 +17,8 @@ char *MD5_GetPop3APOPString(char *timestamp, char *secrit); -#define HASH_FILESYSTEM -#ifdef HASH_FILESYSTEM -//#include "hash.h" -#define Hash_BytesForBuckets(b) (sizeof(bucket_t)*b) - -#define STRCMP(s1,s2) (((*s1)!=(*s2)) || strcmp(s1+1,s2+1)) //saves about 2-6 out of 120 - expansion of idea from fastqcc -typedef struct bucket_s { - void *data; - char *keystring; - struct bucket_s *next; -} bucket_t; -typedef struct hashtable_s { - int numbuckets; - bucket_t **bucket; -} hashtable_t; - -void Hash_InitTable(hashtable_t *table, int numbucks, void *mem); //mem must be 0 filled. (memset(mem, 0, size)) -int Hash_Key(char *name, int modulus); -void *Hash_Get(hashtable_t *table, char *name); -void *Hash_GetKey(hashtable_t *table, int key); -void *Hash_GetNext(hashtable_t *table, char *name, void *old); -void *Hash_Add(hashtable_t *table, char *name, void *data); -void *Hash_Add2(hashtable_t *table, char *name, void *data, bucket_t *buck); -void *Hash_AddKey(hashtable_t *table, int key, void *data); -void Hash_Remove(hashtable_t *table, char *name); -#endif +#include "hash.h" @@ -247,7 +222,7 @@ static int SV_POP3_AddMessage(char *filename, int flags, void *incl) cl->totalsize+=msg->size; cl->nummessages++; - Hash_Add2(&cl->emails, va("%i", ++cl->nummessages), msg, &msg->bucket); + Hash_Add(&cl->emails, va("%i", ++cl->nummessages), msg, &msg->bucket); return true; } diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index 863712d3b..f92220194 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -669,7 +669,7 @@ static galiastexnum_t *GL_ChooseSkin(galiasinfo_t *inf, char *modelname, entity_ //colourmap isn't present yet. cm = BZ_Malloc(sizeof(*cm)); Q_strncpyz(cm->name, skinname, sizeof(cm->name)); - Hash_Add2(&skincolourmapped, cm->name, cm, &cm->bucket); + Hash_Add(&skincolourmapped, cm->name, cm, &cm->bucket); cm->colour = cc; cm->skinnum = e->skinnum; cm->texnum.fullbright = 0; @@ -945,7 +945,7 @@ static void R_DrawShadowVolume(mesh_t *mesh) qglEnd(); } -void GL_DrawAliasMesh_Sketch (mesh_t *mesh, int texnum) +void GL_DrawAliasMesh_Sketch (mesh_t *mesh) { int i; extern int gldepthfunc; @@ -1402,19 +1402,46 @@ void R_DrawGAliasModel (entity_t *e) qglEnable(GL_PN_TRIANGLES_ATI); memset(&mesh, 0, sizeof(mesh)); - while(inf) + for(; inf; ((inf->nextsurf)?(inf = (galiasinfo_t*)((char *)inf + inf->nextsurf)):(inf=NULL))) { if (R_GAliasBuildMesh(&mesh, inf, e->frame, e->oldframe, e->lerptime, e->alpha) && r_vertexdlights.value) R_GAliasAddDlights(&mesh, e->origin, e->angles); - skin = GL_ChooseSkin(inf, clmodel->name, e); + c_alias_polys += mesh.numindexes/3; if (r_drawflat.value == 2) - GL_DrawAliasMesh_Sketch(&mesh, skin->base); - else if (!skin) + { + GL_DrawAliasMesh_Sketch(&mesh); + continue; + } +#ifdef Q3SHADERS + else if (currententity->forcedshader) + { + meshbuffer_t mb; + + R_IBrokeTheArrays(); + + mb.entity = &r_worldentity; + mb.shader = currententity->forcedshader; + mb.fog = NULL; + mb.mesh = &mesh; + mb.infokey = currententity->keynum; + mb.dlightbits = 0; + + R_PushMesh(&mesh, mb.shader->features | MF_NONBATCHED | MF_COLORS); + + R_RenderMeshBuffer ( &mb, false ); + + continue; + } +#endif + + skin = GL_ChooseSkin(inf, clmodel->name, e); + + if (!skin) { qglEnable(GL_TEXTURE_2D); - GL_DrawAliasMesh_Sketch(&mesh, 1); + GL_DrawAliasMesh_Sketch(&mesh); } #ifdef Q3SHADERS else if (skin->shader) @@ -1452,10 +1479,6 @@ void R_DrawGAliasModel (entity_t *e) GL_DrawAliasMesh(&mesh, skin->fullbright); } } - if (inf->nextsurf) - inf = (galiasinfo_t*)((char *)inf + inf->nextsurf); - else - inf = NULL; } if (qglPNTrianglesfATI && gl_ati_truform.value) diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index f4db5799d..9cab31690 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -2593,15 +2593,11 @@ void R_RenderMeshBuffer ( meshbuffer_t *mb, qboolean shadowpass ) shader = mb->shader; r_lmtex = mb->infokey; -#ifdef FIZME if ( currententity && !gl_state.in2d ) { - r_localShaderTime = r_refdef.time * 0.001f - currententity->shaderTime; + r_localShaderTime = r_refdef.time - currententity->shaderTime; } else { - r_localShaderTime = Sys_Milliseconds() * 0.001f; + r_localShaderTime = realtime; } -#else - r_localShaderTime = realtime; -#endif R_SetShaderState ( shader ); diff --git a/engine/gl/gl_draw.c b/engine/gl/gl_draw.c index 4f5d13f32..409b2fed6 100644 --- a/engine/gl/gl_draw.c +++ b/engine/gl/gl_draw.c @@ -35,7 +35,7 @@ vec4_t draw_mesh_xyz[4]; vec3_t draw_mesh_normals[4]; vec2_t draw_mesh_st[4]; vec2_t draw_mesh_lmst[4]; -//byte_vec4_t draw_mesh_colors[4]; +byte_vec4_t draw_mesh_colors[4]; qbyte *uploadmemorybuffer; int sizeofuploadmemorybuffer; @@ -59,7 +59,7 @@ extern cvar_t gl_lerpimages; extern cvar_t gl_picmip2d; extern cvar_t r_drawdisk; extern cvar_t gl_compress; -extern cvar_t gl_font, gl_conback, gl_smoothfont; +extern cvar_t gl_font, gl_conback, gl_smoothfont, gl_fontedgeclamp; extern cvar_t gl_savecompressedtex; @@ -74,7 +74,8 @@ int char_texture, char_tex2, default_char_texture; int cs_texture; // crosshair texture extern int detailtexture; -float char_instep, default_char_instep; //to avoid blending issues +float custom_char_instep, default_char_instep; //to avoid blending issues +float char_instep; static unsigned cs_data[16*16]; @@ -827,9 +828,9 @@ TRACE(("dbg: GLDraw_ReInit: Allocating upload buffers\n")); default_char_texture=char_texture; //half a pixel if (image_width) - char_instep = default_char_instep = 0.5f/((image_width+image_height)/2); //you're an idiot if you use non-square conchars + custom_char_instep = default_char_instep = 0.5f/((image_width+image_height)/2); //you're an idiot if you use non-square conchars else - char_instep = default_char_instep = 0.5f/(128); + custom_char_instep = default_char_instep = 0.5f/(128); TRACE(("dbg: GLDraw_ReInit: loaded charset\n")); @@ -1912,12 +1913,13 @@ void GL_Set2D (void) if (!*gl_font.string || !(char_texture=Mod_LoadHiResTexture(va("fonts/%s", gl_font.string), false, true, true))) { char_texture = default_char_texture; - char_instep = default_char_instep; + custom_char_instep = default_char_instep; } else - char_instep = 0.5f/((image_width+image_height)/2); + custom_char_instep = 0.5f/((image_width+image_height)/2); - gl_smoothfont.modified = 1; + gl_smoothfont.modified = true; + gl_fontedgeclamp.modified = true; } if (gl_conback.modified) { @@ -1932,6 +1934,15 @@ void GL_Set2D (void) } } + if (gl_fontedgeclamp.modified) + { + if (gl_fontedgeclamp.value) + char_instep = custom_char_instep; + else + char_instep = 0; + gl_fontedgeclamp.modified = false; + } + if (gl_smoothfont.modified) { gl_smoothfont.modified = false; @@ -3308,7 +3319,7 @@ TRACE(("dbg: GL_LoadTexture: new %s\n", identifier)); glt->bpp = 8; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); GL_Bind(texture_extension_number ); @@ -3350,7 +3361,7 @@ int GL_LoadTextureFB (char *identifier, int width, int height, qbyte *data, qboo glt->bpp = 8; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); GL_Bind(texture_extension_number ); @@ -3385,7 +3396,7 @@ int GL_LoadTexture8Pal24 (char *identifier, int width, int height, qbyte *data, glt->bpp = 24; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); GL_Bind(texture_extension_number ); @@ -3421,7 +3432,7 @@ int GL_LoadTexture32 (char *identifier, int width, int height, unsigned *data, q glt->bpp = 32; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); // if (!isDedicated) { @@ -3470,7 +3481,7 @@ int GL_LoadCompressed(char *name) glt->texnum = texture_extension_number; glt->bpp = 32; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); GL_Bind(texture_extension_number ); @@ -3507,7 +3518,7 @@ int GL_LoadTexture8Grey (char *identifier, int width, int height, unsigned char glt->bpp = 8; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); // if (!isDedicated) { @@ -3551,7 +3562,7 @@ int GL_LoadTexture8Bump (char *identifier, int width, int height, unsigned char glt->bpp = 8; glt->mipmap = mipmap; - Hash_Add2(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); + Hash_Add(&gltexturetable, glt->identifier, glt, (bucket_t*)(glt+1)); // if (!isDedicated) {