diff --git a/engine/client/cl_ents.c b/engine/client/cl_ents.c index 42621dbcd..0113aaf5f 100644 --- a/engine/client/cl_ents.c +++ b/engine/client/cl_ents.c @@ -667,7 +667,7 @@ entity_state_t *CL_FindOldPacketEntity(int num) packet_entities_t *pack; if (!cl.validsequence) return NULL; - pack = &cl.frames[(cl.validsequence)&UPDATE_MASK].packet_entities; + pack = &cl.frames[(cls.netchan.incoming_sequence-1)&UPDATE_MASK].packet_entities; for (pnum=0 ; pnumnum_entities ; pnum++) { @@ -962,9 +962,9 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o( //1: stepping monsters. These have frames and tick at 10fps. //2: physics. Objects moving acording to gravity. //3: both. This is really awkward. And I'm really lazy. - cl.lerpents[to->number].lerprate = cl.time-cl.lerpents[to->number].lerptime; //time per update + cl.lerpents[to->number].lerprate = cl.oldgametime-cl.lerpents[to->number].lerptime; //time per update cl.lerpents[to->number].frame = from->frame; - cl.lerpents[to->number].lerptime = cl.time; + cl.lerpents[to->number].lerptime = cl.oldgametime; if (cl.lerpents[to->number].lerprate>0.2) cl.lerpents[to->number].lerprate=0.2; @@ -974,7 +974,7 @@ void CLNQ_ParseDarkPlaces5Entities(void) //the things I do.. :o( // cl.lerpents[state->number].lerptime = newlerprate; // else if (to->frame == from->frame) - newlerprate = cl.time-cl.lerpents[to->number].lerptime; + newlerprate = cl.lerpents[to->number].lerprate; } } @@ -1319,8 +1319,12 @@ void CL_RotateAroundTag(entity_t *ent, int num, int tagent, int tagnum) void V_AddEntity(entity_t *in) { entity_t *ent; + if (cl_numvisedicts == MAX_VISEDICTS) + { + Con_Printf("Visedict list is full!\n"); return; // object list is full + } ent = &cl_visedicts[cl_numvisedicts]; cl_numvisedicts++; @@ -1391,6 +1395,11 @@ void CL_LinkPacketEntities (void) { s1 = &pack->entities[pnum]; + if (cl_numvisedicts == MAX_VISEDICTS) + { + Con_Printf("Too many visible entities\n"); + break; + } ent = &cl_visedicts[cl_numvisedicts]; #ifdef Q3SHADERS ent->forcedshader = NULL; @@ -1398,7 +1407,7 @@ void CL_LinkPacketEntities (void) //figure out the lerp factor if (cl.lerpents[s1->number].lerprate<=0) - ent->lerpfrac = 1; + ent->lerpfrac = 0; else ent->lerpfrac = 1-(cl.time-cl.lerpents[s1->number].lerptime)/cl.lerpents[s1->number].lerprate; if (ent->lerpfrac<0) diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index 3088bfb29..0f8367120 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -834,7 +834,7 @@ void VARGS CL_SendClientCommand(qboolean reliable, char *format, ...) // Con_Printf("Queing stringcmd %s\n", string); #ifdef Q3CLIENT - if (cls.q2server==2) + if (cls.protocol == CP_QUAKE3) { CLQ3_SendClientCommand("%s", string); return; @@ -891,6 +891,8 @@ int CL_RemoveClientCommands(char *command) first->next = next; removed++; } + else + first = first->next; } return removed; @@ -952,7 +954,8 @@ unsigned long _stdcall CL_IndepPhysicsThread(void *param) sleeptime = 1000/fps; - Sleep(sleeptime); + if (sleeptime) + Sleep(sleeptime); } } @@ -1024,32 +1027,6 @@ void CL_SendCmd (float frametime) extern cvar_t cl_maxfps; -#ifdef Q3CLIENT - if (cls.q2server==2) - { //guess what? q3 rules don't require network packet limiting! - usercmd_t ncmd; - - memset(&ncmd, 0, sizeof(ncmd)); - ncmd.msec = frametime*1000; - - CL_BaseMove (&ncmd, 0); - - // allow mice or other external controllers to add to the move - IN_Move (&ncmd, 0); - - // if we are spectator, try autocam - if (cl.spectator) - Cam_Track(0, &ncmd); - - CL_FinishMove(&ncmd, (int)(frametime*1000), 0); - - Cam_FinishMove(0, &ncmd); - - CLQ3_SendCmd(&ncmd); - return; - } -#endif - if (cls.demoplayback != DPB_NONE) { if (cls.demoplayback == DPB_MVD) @@ -1152,10 +1129,10 @@ void CL_SendCmd (float frametime) independantphysics[plnum].msec = msecstouse; } - if (!CL_FilterTime(msecstouse, cl_netfps.value<=0?cl_maxfps.value:cl_netfps.value) && msecstouse<255 && cls.state == ca_active) - { - return; - } +// if (!CL_FilterTime(msecstouse, cl_netfps.value<=0?cl_maxfps.value:cl_netfps.value) && msecstouse<255 && cls.state == ca_active) +// { +// return; +// } #ifdef NQPROT if (cls.protocol == CP_NETQUAKE) @@ -1168,6 +1145,15 @@ void CL_SendCmd (float frametime) } #endif +#ifdef Q3CLIENT + if (cls.protocol == CP_QUAKE3) + { + CLQ3_SendCmd(&independantphysics[0]); + memset(&independantphysics[0], 0, sizeof(independantphysics[0])); + return; + } +#endif + // Con_Printf("sending %i msecs\n", msecstouse); seq_hash = cls.netchan.outgoing_sequence; @@ -1233,6 +1219,7 @@ void CL_SendCmd (float frametime) i = cls.netchan.outgoing_sequence & UPDATE_MASK; cmd = &cl.frames[i].cmd[plnum]; *cmd = independantphysics[plnum]; + cl.frames[i].senttime = realtime; memset(&independantphysics[plnum], 0, sizeof(independantphysics[plnum])); #ifdef Q2CLIENT diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 28407543b..3f8c2b4fc 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -418,7 +418,7 @@ void CL_SendConnectPacket ( #endif #ifdef Q3CLIENT - if (cls.q2server==2) + if (cls.protocol == CP_QUAKE3) { //q3 requires some very strange things. CLQ3_SendConnectPacket(adr); return; @@ -494,7 +494,7 @@ void CL_CheckForResend (void) { #ifdef Q3CLIENT case GT_QUAKE3: - cls.q2server = 2; + cls.protocol = CP_QUAKE3; break; #endif #ifdef Q2CLIENT @@ -602,11 +602,11 @@ void CL_BeginServerReconnect(void) { #ifndef CLIENTONLY if (isDedicated) -#endif { Con_TPrintf (TLC_DEDICATEDCANNOTCONNECT); return; } +#endif connect_time = 0; CL_CheckForResend(); } @@ -972,6 +972,7 @@ void CL_Disconnect (void) SCR_EndLoadingPlaque(); cls.protocol = CP_UNKNOWN; + cl.servercount = 0; } #undef serverrunning @@ -1663,7 +1664,7 @@ void CL_ConnectionlessPacket (void) if (!strcmp(com_token, "hallengeResponse")) { #ifdef Q3CLIENT - cls.q2server = 2; + cls.protocol = CP_QUAKE3; cls.challenge = atoi(s+17); CL_SendConnectPacket (0, 0/*, ...*/); return; @@ -1709,9 +1710,9 @@ void CL_ConnectionlessPacket (void) { goto client_connect; } +#endif else cls.protocol = CP_QUAKEWORLD; -#endif cls.challenge = atoi(s); for(;;) @@ -1807,8 +1808,11 @@ void CL_ConnectionlessPacket (void) if (c == 'd') //note - this conflicts with qw masters, our browser uses a different socket. { - Con_Printf("Disconnect\n"); - CL_Disconnect_f(); + if (cls.demoplayback != DPB_NONE) + { + Con_Printf("Disconnect\n"); + CL_Disconnect_f(); + } return; } @@ -1829,7 +1833,7 @@ client_connect: //fixme: make function Netchan_Setup (NS_CLIENT, &cls.netchan, net_from, cls.qport); cls.netchan.compress = compress; #ifdef Q3CLIENT - if (cls.q2server < 2) + if (cls.protocol != CP_QUAKE3) #endif CL_SendClientCommand(true, "new"); cls.state = ca_connected; @@ -1901,6 +1905,13 @@ client_connect: //fixme: make function Con_Print (s); return; } + if (c == 'r')//dp's reject + { + s = MSG_ReadString (); + Con_Printf("r%s\n", s); + return; + } + // ping from somewhere if (c == A2A_PING) @@ -1965,7 +1976,7 @@ void CLNQ_ConnectionlessPacket(void) case CCREP_REJECT: s = MSG_ReadString(); - Con_Printf("Connect failed\n%s\n"); + Con_Printf("Connect failed\n%s\n", s); return; } } @@ -2357,6 +2368,8 @@ void CL_Init (void) Cvar_Register (&host_mapname, "Scripting"); + Cvar_Register (&cl_indepphysics, cl_controlgroup); + #ifdef IRCCLIENT Cmd_AddCommand ("irc", CL_IRC_f); #endif diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index f418c7644..9505351d3 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -373,7 +373,16 @@ void CL_FinishDownload(char *filename, char *tempname) Skin_FlushSkin(filename); } } +/* +void MapDownload(char *name, qboolean gotornot) +{ + if (gotornot) //yay + return; + + CL_EnqueDownload(filename, false, false); +} +*/ /* =============== CL_CheckOrDownloadFile @@ -407,6 +416,15 @@ qboolean CL_CheckOrDownloadFile (char *filename, int nodelay) SCR_EndLoadingPlaque(); //release console. +/* if (1) + if (strncmp(filename, "maps/", 5)) + if (strcmp(filename + strlen(filename)-4, ".bsp")) + { + char base[MAX_QPATH]; + COM_FileBase(filename, base); + HTTP_CL_Get(va("http://maps.quakeworld.nu/%s/download/", base), filename, MapDownload); + } +*/ if (CL_EnqueDownload(filename, false, false)) return !nodelay; else @@ -1314,6 +1332,9 @@ void CL_ParseServerData (void) Con_TPrintf (TLC_LINEBREAK_NEWLEVEL); Con_TPrintf (TLC_PC_PS_NL, 2, str); + if (CL_RemoveClientCommands("new")) //mvdsv is really appaling some times. + Con_Printf("Multiple 'new' commands?!?!? This server needs reinstalling!\n"); + memset(cl.sound_name, 0, sizeof(cl.sound_name)); #ifdef PEXT_PK3DOWNLOADS if (cls.fteprotocolextensions & PEXT_PK3DOWNLOADS) //instead of going for a soundlist, go for the pk3 list instead. The server will make us go for the soundlist after. @@ -2190,7 +2211,8 @@ void CL_ParseStartSoundPacket(void) S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation); - TP_CheckPickupSound(cl.sound_name[sound_num], pos); + if (ent == cl.playernum[0]+1) + TP_CheckPickupSound(cl.sound_name[sound_num], pos); } #ifdef Q2CLIENT @@ -2296,6 +2318,9 @@ void CLNQ_ParseStartSoundPacket(void) pos[i] = MSG_ReadCoord (); S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation); + + if (ent == cl.playernum[0]+1) + TP_CheckPickupSound(cl.sound_name[sound_num], pos); } #endif @@ -2632,7 +2657,7 @@ void CL_MuzzleFlash (void) if ((unsigned)(i) <= MAX_CLIENTS && i > 0) { // don't draw our own muzzle flash in gl if flashblending - if (i-1 == cl.playernum[0] && r_flashblend.value) + if (i-1 == cl.playernum[0] && r_flashblend.value && qrenderer == QR_OPENGL) return; pl = &cl.frames[parsecountmod].playerstate[i-1]; @@ -2654,8 +2679,8 @@ void CL_MuzzleFlash (void) dl->color[1] = 0.1; dl->color[2] = 0.05; - dl->channelfade[0] = 1.5; - dl->channelfade[1] = 0.75; + dl->channelfade[0] = 1.5; + dl->channelfade[1] = 0.75; dl->channelfade[2] = 0.375; } @@ -3878,6 +3903,7 @@ void CLNQ_ParseServerMessage (void) received_framecount = host_framecount; cl.last_servermessage = realtime; cl.oldgametime = cl.gametime; + cl.oldgametimemark = cl.gametimemark; cl.gametime = MSG_ReadFloat(); cl.gametimemark = realtime; if (nq_dp_protocol<5) diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index a11012d74..0bca632c3 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -555,9 +555,20 @@ void CL_PredictMovePNum (int pnum) if (cl.oldgametime) { - cl.time = cl.gametime; - if (cl.time > realtime) - cl.time = realtime; + float want; + float off; + + want = cl.oldgametime + realtime - cl.gametimemark; + off = (want - cl.time); + if (want>cl.time) + cl.time = want; + +// Con_Printf("Drifted to %f off by %f\n", cl.time, off); + + if (cl.time > cl.gametime) + cl.time = cl.gametime; + if (cl.time < cl.oldgametime) + cl.time = cl.oldgametime; } else { @@ -612,6 +623,31 @@ void CL_PredictMovePNum (int pnum) old = CL_FindOldPacketEntity (cl.viewentity[pnum]); if (state) { + float f; + extern cvar_t cl_nolerp; + + //figure out the lerp factor + if (cl.lerpents[state->number].lerprate<=0) + f = 1; + else + f = (cl.time-cl.lerpents[state->number].lerptime)/cl.lerpents[state->number].lerprate; + if (f<0) + f=0; + if (f>1) + f=1; + +// if (cl_nolerp.value) +// f = 1; + + + // calculate origin + for (i=0 ; i<3 ; i++) + lrp[i] = cl.lerpents[state->number].origin[i] + + f * (state->origin[i] - cl.lerpents[state->number].origin[i]); + + org = lrp; + +/* if (old) { float f = (cl.time-cl.lerpents[cl.viewentity[pnum]].lerptime)/cl.lerpents[cl.viewentity[pnum]].lerprate; @@ -632,6 +668,7 @@ void CL_PredictMovePNum (int pnum) org = state->origin; Con_Printf("No old\n"); } +*/ goto fixedorg; } diff --git a/engine/client/cl_screen.c b/engine/client/cl_screen.c index fe5238987..0c73d7281 100644 --- a/engine/client/cl_screen.c +++ b/engine/client/cl_screen.c @@ -760,6 +760,10 @@ void SCR_CalcRefdef (void) } r_refdef.fov_x = scr_fov.value; + if (r_refdef.fov_x < 10) + r_refdef.fov_x = 10; + else if (r_refdef.fov_x > 170) + r_refdef.fov_x = 170; r_refdef.fov_y = CalcFov (r_refdef.fov_x, r_refdef.vrect.width, r_refdef.vrect.height); diff --git a/engine/client/client.h b/engine/client/client.h index de525eb87..841ff3361 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -289,7 +289,8 @@ typedef struct CP_UNKNOWN, CP_QUAKEWORLD, CP_NETQUAKE, - CP_QUAKE2 + CP_QUAKE2, + CP_QUAKE3 } protocol; qboolean resendinfo; @@ -452,8 +453,8 @@ typedef struct // is rendering at. allways <= realtime float gametime; float gametimemark; - float oldgametime; //used as the old time to lerp cl.time from. - //if it's 0, cl.time will casually increase. + float oldgametime; //used as the old time to lerp cl.time from. + float oldgametimemark; //if it's 0, cl.time will casually increase. vec3_t simorg[MAX_SPLITS]; vec3_t simvel[MAX_SPLITS]; diff --git a/engine/client/console.c b/engine/client/console.c index b4d50ed49..d1c298957 100644 --- a/engine/client/console.c +++ b/engine/client/console.c @@ -911,7 +911,7 @@ void Con_DrawInput (void) if (key_linepos == i) //cursor is at end { x = text[1] == '/'?2:1; - fname = Cmd_CompleteCommand(text+x, true, con_commandmatch); + fname = Cmd_CompleteCommand(text+x, true, true, con_commandmatch); if (fname) //we can compleate it to: { for (p = i-x; fname[p]>' '; p++) diff --git a/engine/client/in_win.c b/engine/client/in_win.c index c7eaaf3ec..8fcf854c7 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -1027,7 +1027,11 @@ static void ProcessMouse(mouse_t *mouse, usercmd_t *cmd, int pnum) if ( (in_strafe.state[pnum] & 1) || (lookstrafe.value && (in_mlook.state[pnum] & 1) )) cmd->sidemove += m_side.value * mouse_x; else + { + if ((int)((cl.viewangles[pnum][PITCH]+89.99)/180) & 1) + mouse_x *= -1; cl.viewangles[pnum][YAW] -= m_yaw.value * mouse_x; + } if (in_mlook.state[pnum] & 1) V_StopPitchDrift (pnum); diff --git a/engine/client/keys.c b/engine/client/keys.c index 3c457133b..de7adc8b9 100644 --- a/engine/client/keys.c +++ b/engine/client/keys.c @@ -227,7 +227,7 @@ qboolean Cmd_IsCommand (char *line) command[i] = s[i]; command[i] = 0; - cmd = Cmd_CompleteCommand (command, true, -1); + cmd = Cmd_CompleteCommand (command, true, false, -1); if (!cmd || strcmp (cmd, command) ) return false; // just a chat message return true; @@ -282,7 +282,7 @@ void CompleteCommand (qboolean force) int x=0; for (i = 1; ; i++) { - cmd = Cmd_CompleteCommand (s, true, i); + cmd = Cmd_CompleteCommand (s, true, true, i); if (!cmd) break; if (i == 1) @@ -293,13 +293,13 @@ void CompleteCommand (qboolean force) Con_Printf("\n"); } - cmd = Cmd_CompleteCommand (s, true, 2); + cmd = Cmd_CompleteCommand (s, true, true, 2); if (!cmd || force) { if (!force) - cmd = Cmd_CompleteCommand (s, false, 1); + cmd = Cmd_CompleteCommand (s, false, true, 1); else - cmd = Cmd_CompleteCommand (s, true, con_commandmatch); + cmd = Cmd_CompleteCommand (s, true, true, con_commandmatch); if (cmd) { key_lines[edit_line][1] = '/'; @@ -312,7 +312,7 @@ void CompleteCommand (qboolean force) // if (strlen(cmd)>strlen(s)) { - cmd = Cmd_CompleteCommand (s, true, 0); + cmd = Cmd_CompleteCommand (s, true, true, 0); if (cmd && !strcmp(s, cmd)) //also a compleate var { key_lines[edit_line][key_linepos] = ' '; @@ -323,7 +323,7 @@ void CompleteCommand (qboolean force) return; } } - cmd = Cmd_CompleteCommand (s, false, 0); + cmd = Cmd_CompleteCommand (s, false, true, 0); if (cmd) { i = key_lines[edit_line][1] == '/'?2:1; @@ -344,7 +344,7 @@ void CompleteCommand (qboolean force) } con_commandmatch++; - if (!Cmd_CompleteCommand(s, true, con_commandmatch)) + if (!Cmd_CompleteCommand(s, true, true, con_commandmatch)) con_commandmatch = 1; } @@ -424,7 +424,7 @@ void Key_Console (int key) if (key == K_SPACE && con_current->commandcompletion) { - if (keydown[K_SHIFT] && Cmd_CompleteCommand(key_lines[edit_line]+1, true, con_current->commandcompletion)) + if (keydown[K_SHIFT] && Cmd_CompleteCommand(key_lines[edit_line]+1, true, true, con_current->commandcompletion)) { CompleteCommand (true); return; diff --git a/engine/client/net_master.c b/engine/client/net_master.c index bcdf7d4b2..9e8a34c12 100644 --- a/engine/client/net_master.c +++ b/engine/client/net_master.c @@ -918,6 +918,8 @@ void MasterInfo_ProcessHTTP(char *name, qboolean success) return; el = COM_LoadTempFile(name); + if (!el) + return; while(*el) { s = el; @@ -1362,12 +1364,16 @@ int CL_ReadServerInfo(char *msg, int servertype, qboolean favorite) Q_strncpyz(info->map, Info_ValueForKey(msg, "map"), sizeof(info->map)); } + strcpy(details.info, msg); + msg = msg+strlen(msg)+1; + + info->players=details.numplayers = 0; + if (!strchr(msg, '\n')) + info->players = atoi(Info_ValueForKey(details.info, "clients")); + else { int clnum; - strcpy(details.info, msg); - msg = msg+strlen(msg)+1; - info->players=details.numplayers = 0; for (clnum=0; clnum < MAX_CLIENTS; clnum++) { nl = strchr(msg, '\n'); diff --git a/engine/client/pr_csqc.c b/engine/client/pr_csqc.c index af7d51020..2eca7811f 100644 --- a/engine/client/pr_csqc.c +++ b/engine/client/pr_csqc.c @@ -333,7 +333,67 @@ static void PF_makevectors (progfuncs_t *prinst, struct globalvars_s *pr_globals AngleVectors (G_VECTOR(OFS_PARM0), csqcg.forward, csqcg.right, csqcg.up); } -static void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) +void QuaternainToAngleMatrix(float *quat, vec3_t *mat) +{ + float xx = quat[0] * quat[0]; + float xy = quat[0] * quat[1]; + float xz = quat[0] * quat[2]; + float xw = quat[0] * quat[3]; + float yy = quat[1] * quat[1]; + float yz = quat[1] * quat[2]; + float yw = quat[1] * quat[3]; + float zz = quat[2] * quat[2]; + float zw = quat[2] * quat[3]; + mat[0][0] = 1 - 2 * ( yy + zz ); + mat[0][1] = 2 * ( xy - zw ); + mat[0][2] = 2 * ( xz + yw ); + mat[1][0] = 2 * ( xy + zw ); + mat[1][1] = 1 - 2 * ( xx + zz ); + mat[1][2] = 2 * ( yz - xw ); + mat[2][0] = 2 * ( xz - yw ); + mat[2][1] = 2 * ( yz + xw ); + mat[2][2] = 1 - 2 * ( xx + yy ); +} + +void quaternion_multiply(float *a, float *b, float *c) +{ +#define x1 a[0] +#define y1 a[1] +#define z1 a[2] +#define w1 a[3] +#define x2 b[0] +#define y2 b[1] +#define z2 b[2] +#define w2 b[3] + c[0] = w1*x2 + x1*w2 + y1*z2 - z1*y2; + c[1] = w1*y2 + y1*w2 + z1*x2 - x1*z2; + c[2] = w1*z2 + z1*w2 + x1*y2 - y1*x2; + c[3] = w1*w2 - x1*x2 - y1*y2 - z1*z2; +} + +void quaternion_rotation(float pitch, float roll, float yaw, float angle, float *quat) +{ + float sin_a, cos_a; + + sin_a = sin( angle / 360 ); + cos_a = cos( angle / 360 ); + quat[0] = pitch * sin_a; + quat[1] = yaw * sin_a; + quat[2] = roll * sin_a; + quat[3] = cos_a; +} + +void EularToQuaternian(vec3_t angles, float *quat) +{ + float x[4] = {sin(angles[2]/360), 0, 0, cos(angles[2]/360)}; + float y[4] = {0, sin(angles[1]/360), 0, cos(angles[1]/360)}; + float z[4] = {0, 0, sin(angles[0]/360), cos(angles[0]/360)}; + float t[4]; + quaternion_multiply(x, y, t); + quaternion_multiply(t, z, quat); +} + +void _PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) { csqcedict_t *in = (void*)G_EDICT(prinst, OFS_PARM0); entity_t ent; @@ -375,6 +435,7 @@ static void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) ent.angles[0] = in->v->angles[0]; ent.angles[1] = in->v->angles[1]; ent.angles[2] = in->v->angles[2]; + memcpy(ent.origin, in->v->origin, sizeof(vec3_t)); AngleVectors(ent.angles, ent.axis[0], ent.axis[1], ent.axis[2]); VectorInverse(ent.axis[1]); @@ -384,6 +445,30 @@ static void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) ent.skinnum = in->v->skin; V_AddEntity(&ent); + +/* + { + float a[4]; + float q[4]; + float r[4]; + EularToQuaternian(ent.angles, a); + + QuaternainToAngleMatrix(a, ent.axis); + ent.origin[0] += 16; + V_AddEntity(&ent); + + quaternion_rotation(0, 0, 1, cl.time*360, r); + quaternion_multiply(a, r, q); + QuaternainToAngleMatrix(q, ent.axis); + ent.origin[0] -= 32; + ent.angles[1] = cl.time; + V_AddEntity(&ent); + } +*/ +} +void PF_R_AddEntity(progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + _PF_R_AddEntity(prinst, pr_globals); } static void PF_R_AddDynamicLight(progfuncs_t *prinst, struct globalvars_s *pr_globals) @@ -937,11 +1022,10 @@ static void PF_cs_setsensativityscaler (progfuncs_t *prinst, struct globalvars_s static void PF_cs_pointparticles (progfuncs_t *prinst, struct globalvars_s *pr_globals) { - char *effectname = PR_GetStringOfs(prinst, OFS_PARM0); + int effectnum = G_FLOAT(OFS_PARM0); float *org = G_VECTOR(OFS_PARM1); float *vel = G_VECTOR(OFS_PARM2); float count = G_FLOAT(OFS_PARM3); - int effectnum = P_AllocateParticleType(effectname); if (*prinst->callargc < 3) vel = vec3_origin; @@ -954,7 +1038,7 @@ static void PF_cs_pointparticles (progfuncs_t *prinst, struct globalvars_s *pr_g static void PF_cs_particlesloaded (progfuncs_t *prinst, struct globalvars_s *pr_globals) { char *effectname = PR_GetStringOfs(prinst, OFS_PARM0); - G_FLOAT(OFS_RETURN) = P_DescriptionIsLoaded(effectname); + G_FLOAT(OFS_RETURN) = P_ParticleTypeForName(effectname); } //get the input commands, and stuff them into some globals. @@ -1172,6 +1256,26 @@ static void PF_checkextension (progfuncs_t *prinst, struct globalvars_s *pr_glob G_FLOAT(OFS_RETURN) = 0; } +void PF_cs_sound(progfuncs_t *prinst, struct globalvars_s *pr_globals) +{ + char *sample; + int channel; + csqcedict_t *entity; + int volume; + float attenuation; + + sfx_t *sfx; + + entity = G_EDICT(prinst, OFS_PARM0); + channel = G_FLOAT(OFS_PARM1); + sample = PR_GetStringOfs(prinst, OFS_PARM2); + volume = G_FLOAT(OFS_PARM3) * 255; + attenuation = G_FLOAT(OFS_PARM4); + + sfx = S_PrecacheSound(sample); + if (sfx) + S_StartSound(-entity->entnum, channel, sfx, entity->v->origin, volume, attenuation); +}; #define PF_FixTen PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme,PF_Fixme @@ -1186,7 +1290,7 @@ static builtin_t csqc_builtins[] = { PF_Fixme, PF_Fixme, //PF_break, PF_random, - PF_Fixme, //PF_sound, + PF_cs_sound, //PF_sound, PF_normalize, //10 PF_error, diff --git a/engine/client/r_part.c b/engine/client/r_part.c index 022e05140..209dd7ce5 100644 --- a/engine/client/r_part.c +++ b/engine/client/r_part.c @@ -1287,7 +1287,7 @@ void P_NewServer(void) Con_Printf("Couldn't find particle description, using spikeset\n"); Cbuf_AddText(particle_set_spikeset, RESTRICT_SERVER); } -/*#if defined(_DEBUG) && defined(WIN32) //expand the particles cfg into a C style quoted string, and copy to clipboard so I can paste it in. +#if defined(_DEBUG) && defined(WIN32) //expand the particles cfg into a C style quoted string, and copy to clipboard so I can paste it in. { char *TL_ExpandToCString(char *in); extern HWND mainwindow; @@ -1324,7 +1324,7 @@ void P_NewServer(void) SetClipboardData(CF_TEXT, hglbCopy); CloseClipboard(); } -#endif*/ +#endif } } @@ -1471,7 +1471,11 @@ glEnable(GL_DEPTH_TEST); if (Length(vdist) > (1024+512)*frandom()) continue; - VectorMA(org, 0.5, st->face->normal, org); + if (st->face->flags & SURF_PLANEBACK) + VectorMA(org, -0.5, st->face->plane->normal, org); + else + VectorMA(org, 0.5, st->face->plane->normal, org); + if (!(cl.worldmodel->hulls->funcs.HullPointContents(cl.worldmodel->hulls, org) & FTECONTENTS_SOLID)) { if (st->face->flags & SURF_PLANEBACK) @@ -1726,7 +1730,7 @@ int P_RunParticleEffectTypeString (vec3_t org, vec3_t dir, float count, char *na return P_RunParticleEffectType(org, dir, count, type); } -int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, float size, float **out); +int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out); int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum) { part_type_t *ptype = &part_type[typenum]; @@ -1763,7 +1767,7 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum) CrossProduct(dir, vec, tangent); CrossProduct(dir, tangent, t2); - decalcount = Q1BSP_ClipDecal(org, dir, tangent, ptype->scale, &decverts); + decalcount = Q1BSP_ClipDecal(org, dir, tangent, t2, ptype->scale, &decverts); while(decalcount) { if (!free_decals) @@ -1781,9 +1785,8 @@ int P_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum) for (i = 0; i < 3; i++) { VectorSubtract(d->vertex[i], org, vec); - dist = DotProduct(vec, dir)/ptype->scale; - d->texcoords[i][0] = ((DotProduct(vec, t2)*(1-dist))/ptype->scale)+0.5; - d->texcoords[i][1] = ((DotProduct(vec, tangent)*(1-dist))/ptype->scale)+0.5; + d->texcoords[i][0] = (DotProduct(vec, t2)/ptype->scale)+0.5; + d->texcoords[i][1] = (DotProduct(vec, tangent)/ptype->scale)+0.5; } d->die = ptype->randdie*frandom(); @@ -3414,7 +3417,7 @@ void DrawParticleTypes (void texturedparticles(particle_t *,part_type_t*), void { if (type->clippeddecals) { - for ( ;; ) +/* for ( ;; ) { dkill = type->clippeddecals; if (dkill && dkill->die < particletime) @@ -3431,9 +3434,9 @@ void DrawParticleTypes (void texturedparticles(particle_t *,part_type_t*), void } break; } - for (d=type->clippeddecals ; d ; d=d->next) +*/ for (d=type->clippeddecals ; d ; d=d->next) { - for ( ;; ) + /* for ( ;; ) { dkill = d->next; if (dkill && dkill->die < particletime) @@ -3446,7 +3449,7 @@ void DrawParticleTypes (void texturedparticles(particle_t *,part_type_t*), void continue; } break; - } + }*/ diff --git a/engine/client/render.h b/engine/client/render.h index fd0435541..d55fda617 100644 --- a/engine/client/render.h +++ b/engine/client/render.h @@ -40,7 +40,7 @@ typedef struct entity_s { int keynum; // for matching entities in different frames vec3_t origin; - vec3_t angles; + vec3_t angles; vec3_t axis[3]; byte_vec4_t shaderRGBA; diff --git a/engine/client/renderer.c b/engine/client/renderer.c index b6ca5e99e..756895886 100644 --- a/engine/client/renderer.c +++ b/engine/client/renderer.c @@ -111,6 +111,7 @@ static cvar_t vid_height = {"vid_height", "480", NULL, CVAR_ARCHIVE|CVAR_RENDERE static cvar_t vid_refreshrate = {"vid_displayfrequency", "0", NULL, CVAR_ARCHIVE|CVAR_RENDERERLATCH}; cvar_t gl_motionblur = {"gl_motionblur", "0"}; +cvar_t gl_motionblurscale = {"gl_motionblurscale", "1"}; 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", ""}; @@ -287,6 +288,7 @@ void GLRenderer_Init(void) Cvar_Register (&gl_ztrick, GLRENDEREROPTIONS); Cvar_Register (&gl_motionblur, GLRENDEREROPTIONS); + Cvar_Register (&gl_motionblurscale, GLRENDEREROPTIONS); Cvar_Register (&gl_max_size, GLRENDEREROPTIONS); Cvar_Register (&gl_maxdist, GLRENDEREROPTIONS); Cvar_Register (&vid_conwidth, GLRENDEREROPTIONS); @@ -1647,8 +1649,6 @@ TRACE(("dbg: R_ApplyRenderer: reloading ALL models\n")); UI_Reset(); return false; } - - S_ExtraUpdate(); } loadmodel = cl.worldmodel = cl.model_precache[1]; @@ -1700,9 +1700,12 @@ TRACE(("dbg: R_ApplyRenderer: efrags\n")); break; } + TRACE(("dbg: R_ApplyRenderer: S_Restart_f\n")); if (!isDedicated) S_Restart_f(); + TRACE(("dbg: R_ApplyRenderer: done\n")); + memcpy(¤trendererstate, newr, sizeof(currentrendererstate)); return true; } diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c index 6c4493a18..ccd92e40a 100644 --- a/engine/client/snd_dma.c +++ b/engine/client/snd_dma.c @@ -554,6 +554,10 @@ void S_Init (void) void S_ShutdownCard(soundcardinfo_t *sc) { +#ifndef NODIRECTX + extern int aimedforguid; + aimedforguid = 0; +#endif if (!fakedma) { SNDDMA_Shutdown(sc); diff --git a/engine/client/zqtp.c b/engine/client/zqtp.c index 14e3c5332..ec2022961 100644 --- a/engine/client/zqtp.c +++ b/engine/client/zqtp.c @@ -3248,7 +3248,7 @@ static void CL_Say (qboolean team, char *extra) } #ifdef Q3CLIENT - if (cls.q2server==2) + if (cls.protocol == CP_QUAKE3) CLQ3_SendClientCommand("%s %s%s", team ? "say_team " : "say ", extra?extra:"", sendtext); else #endif diff --git a/engine/common/cmd.c b/engine/common/cmd.c index 0d0241fde..1fcb74b08 100644 --- a/engine/common/cmd.c +++ b/engine/common/cmd.c @@ -490,8 +490,11 @@ void Cmd_Exec_f (void) else Q_strncpyz(name, Cmd_Argv(1), sizeof(name)); - f = (char *)COM_LoadMallocFile(name); - if (!f) + if ((f = (char *)COM_LoadMallocFile(name))) + ; + else if ((f = (char *)COM_LoadMallocFile(va("%s.cfg", name)))) + ; + else { Con_TPrintf (TL_EXECFAILED,name); return; @@ -1461,7 +1464,7 @@ void Cmd_CompleteCheck(char *check, match_t *match) //compare cumulative strings strcpy(match->result, check); } } -char *Cmd_CompleteCommand (char *partial, qboolean fullonly, int matchnum) +char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens, int matchnum) { extern cvar_group_t *cvar_groups; cmd_function_t *cmd; @@ -1490,18 +1493,34 @@ char *Cmd_CompleteCommand (char *partial, qboolean fullonly, int matchnum) strcpy(match.result, ""); -// check for partial match - for (cmd=cmd_functions ; cmd ; cmd=cmd->next) - if (!Q_strncmp (partial,cmd->name, len)) - Cmd_CompleteCheck(cmd->name, &match); - for (a=cmd_alias ; a ; a=a->next) - if (!Q_strncmp (partial, a->name, len)) - Cmd_CompleteCheck(a->name, &match); - for (grp=cvar_groups ; grp ; grp=grp->next) - for (cvar=grp->cvars ; cvar ; cvar=cvar->next) - if (!Q_strncmp (partial,cvar->name, len)) - Cmd_CompleteCheck(cvar->name, &match); + // check for partial match + if (caseinsens) + { + for (cmd=cmd_functions ; cmd ; cmd=cmd->next) + if (!Q_strncasecmp (partial,cmd->name, len)) + Cmd_CompleteCheck(cmd->name, &match); + for (a=cmd_alias ; a ; a=a->next) + if (!Q_strncasecmp (partial, a->name, len)) + Cmd_CompleteCheck(a->name, &match); + for (grp=cvar_groups ; grp ; grp=grp->next) + for (cvar=grp->cvars ; cvar ; cvar=cvar->next) + if (!Q_strncasecmp (partial,cvar->name, len)) + Cmd_CompleteCheck(cvar->name, &match); + } + else + { + for (cmd=cmd_functions ; cmd ; cmd=cmd->next) + if (!Q_strncmp (partial,cmd->name, len)) + Cmd_CompleteCheck(cmd->name, &match); + for (a=cmd_alias ; a ; a=a->next) + if (!Q_strncmp (partial, a->name, len)) + Cmd_CompleteCheck(a->name, &match); + for (grp=cvar_groups ; grp ; grp=grp->next) + for (cvar=grp->cvars ; cvar ; cvar=cvar->next) + if (!Q_strncmp (partial,cvar->name, len)) + Cmd_CompleteCheck(cvar->name, &match); + } if (match.matchnum>0) return NULL; if (!*match.result) @@ -1550,7 +1569,7 @@ void Cmd_ForwardToServer (void) return; // not really connected #ifdef Q3CLIENT - if (cls.q2server == 2) + if (cls.protocol == CP_QUAKE3) { CLQ3_SendClientCommand("%s %s", Cmd_Argv(0), Cmd_Args()); return; diff --git a/engine/common/cmd.h b/engine/common/cmd.h index 996b63bca..1fc1d0d1e 100644 --- a/engine/common/cmd.h +++ b/engine/common/cmd.h @@ -83,7 +83,7 @@ qboolean Cmd_AddCommand (char *cmd_name, xcommand_t function); qboolean Cmd_Exists (char *cmd_name); // used by the cvar code to check for cvar / command name overlap -char *Cmd_CompleteCommand (char *partial, qboolean fullonly, int matchnum); +char *Cmd_CompleteCommand (char *partial, qboolean fullonly, qboolean caseinsens, int matchnum); qboolean Cmd_IsCommand (char *line); // attempts to match a partial command for automatic command line completion // returns NULL if nothing fits diff --git a/engine/common/cvar.c b/engine/common/cvar.c index 351d8200c..2fef60bf2 100644 --- a/engine/common/cvar.c +++ b/engine/common/cvar.c @@ -491,7 +491,7 @@ cvar_t *Cvar_Get(const char *name, const char *defaultvalue, int flags, const ch { //allow this to change all < cvar_latch values. //this allows q2 dlls to apply different flags to a cvar without destroying our important ones (like cheat). - var->flags = (flags & (CVAR_LATCH-1)) | (var->flags & ~(CVAR_LATCH-1)); + var->flags = (var->flags & ~(CVAR_NOSET)) | (flags & (CVAR_NOSET|CVAR_SERVERINFO|CVAR_USERINFO|CVAR_ARCHIVE)); return var; } diff --git a/engine/common/gl_q2bsp.c b/engine/common/gl_q2bsp.c index 0d792f68d..77ebba1ca 100644 --- a/engine/common/gl_q2bsp.c +++ b/engine/common/gl_q2bsp.c @@ -617,6 +617,8 @@ void CM_CreateBrush ( q2cbrush_t *brush, vec3_t *verts, q2mapsurface_t *surface qboolean skip[20]; int numpatchplanes = 0; + int matchplane; + // calc absmins & absmaxs ClearBounds ( absmins, absmaxs ); for (i = 0; i < 3; i++) @@ -703,11 +705,22 @@ void CM_CreateBrush ( q2cbrush_t *brush, vec3_t *verts, q2mapsurface_t *surface skip[i] = true; - if (numplanes == MAX_Q2MAP_PLANES) - Host_Error ("CM_CreateBrush: numplanes == MAX_CM_PLANES"); + for (matchplane = 0; matchplane < numplanes; matchplane++) + { + if (!memcmp(&map_planes[matchplane], &patchplanes[i], sizeof(patchplanes[i]))) + { + plane = &map_planes[matchplane]; + break; + } + } + if (matchplane == numplanes) + { + if (numplanes == MAX_Q2MAP_PLANES) + Host_Error ("CM_CreateBrush: numplanes == MAX_CM_PLANES"); - plane = &map_planes[numplanes++]; - *plane = patchplanes[i]; + plane = &map_planes[numplanes++]; + *plane = patchplanes[i]; + } if (numbrushsides == MAX_CM_BRUSHSIDES) Host_Error ("CM_CreateBrush: numbrushsides == MAX_CM_BRUSHSIDES"); @@ -715,10 +728,10 @@ void CM_CreateBrush ( q2cbrush_t *brush, vec3_t *verts, q2mapsurface_t *surface side = &map_brushsides[numbrushsides++]; side->plane = plane; -// if (DotProduct(plane->normal, mainplane.normal) >= 0) + if (DotProduct(plane->normal, mainplane.normal) >= 0) side->surface = surface; -// else -// side->surface = NULL; // don't clip against this side + else + side->surface = NULL; // don't clip against this side brush->numsides++; } diff --git a/engine/common/net.h b/engine/common/net.h index aa9711c51..64c66ee24 100644 --- a/engine/common/net.h +++ b/engine/common/net.h @@ -91,7 +91,6 @@ typedef struct #ifdef NQPROT qboolean isnqprotocol; - struct qsocket_s *qsocket; #endif float last_received; // for timeouts @@ -140,9 +139,9 @@ typedef struct qboolean compress; //nq servers must recieve truncated packets. - int in_reliable_length; - char in_reliable_buf[MAX_OVERALLMSGLEN]; - int in_reliable_start; + int in_fragment_length; + char in_fragment_buf[MAX_OVERALLMSGLEN]; + int in_fragment_start; } netchan_t; extern int net_drop; // packets dropped before this one diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c index c84cb589d..4e7b881f0 100644 --- a/engine/common/net_chan.c +++ b/engine/common/net_chan.c @@ -180,9 +180,7 @@ called to open a channel to a remote system void Netchan_Setup (netsrc_t sock, netchan_t *chan, netadr_t adr, int qport) { memset (chan, 0, sizeof(*chan)); -#ifdef NQPROT - chan->qsocket = NULL; -#endif + chan->sock = sock; chan->remote_address = adr; chan->last_received = realtime; @@ -302,20 +300,20 @@ qboolean NQNetChan_Process(netchan_t *chan) { chan->incoming_reliable_sequence++; - if (chan->in_reliable_length + net_message.cursize-8 >= sizeof(chan->in_reliable_buf)) + if (chan->in_fragment_length + net_message.cursize-8 >= sizeof(chan->in_fragment_buf)) { chan->fatal_error = true; return false; } - memcpy(chan->in_reliable_buf + chan->in_reliable_length, net_message.data+8, net_message.cursize-8); - chan->in_reliable_length += net_message.cursize-8; + memcpy(chan->in_fragment_buf + chan->in_fragment_length, net_message.data+8, net_message.cursize-8); + chan->in_fragment_length += net_message.cursize-8; if (header & NETFLAG_EOM) { SZ_Clear(&net_message); - SZ_Write(&net_message, chan->in_reliable_buf, chan->in_reliable_length); - chan->in_reliable_length = 0; + SZ_Write(&net_message, chan->in_fragment_buf, chan->in_fragment_length); + chan->in_fragment_length = 0; MSG_BeginReading(); return 2; //we can read it now } diff --git a/engine/common/net_wins.c b/engine/common/net_wins.c index 9178f4008..2d6afa60f 100644 --- a/engine/common/net_wins.c +++ b/engine/common/net_wins.c @@ -119,7 +119,7 @@ void (*pfreeaddrinfo) (struct addrinfo*); #endif -extern cvar_t sv_public; +extern cvar_t sv_public, sv_listen; @@ -1196,7 +1196,7 @@ void NET_InitServer(void) int p; port = PORT_SERVER; - if (sv_public.value) + if (sv_listen.value) { p = COM_CheckParm ("-svport"); if (p && p < com_argc) diff --git a/engine/common/protocol.h b/engine/common/protocol.h index 6a8f2c37f..90b4c1d57 100644 --- a/engine/common/protocol.h +++ b/engine/common/protocol.h @@ -606,6 +606,7 @@ enum { #define DPTE_BLOOD 50 #define DPTE_SPARK 51 #define DPTE_BLOODSHOWER 52 +#define DPTE_EXPLOSIONRGB 53 #define DPTE_PARTICLECUBE 54 #define DPTE_SMALLFLASH 72 #define DPTE_CUSTOMFLASH 73 diff --git a/engine/common/q1bsp.c b/engine/common/q1bsp.c index 10f0c6aab..6062f18d8 100644 --- a/engine/common/q1bsp.c +++ b/engine/common/q1bsp.c @@ -631,6 +631,17 @@ void Q1BSP_ClipDecalToNodes (fragmentdecal_t *dec, mnode_t *node) surf = cl.worldmodel->surfaces + node->firstsurface; for (i=0 ; inumsurfaces ; i++, surf++) { + + if (surf->flags & SURF_PLANEBACK) + { + if (DotProduct(surf->plane->normal, dec->normal) < -0.1) + continue; + } + else + { + if (-DotProduct(surf->plane->normal, dec->normal) < -0.1) + continue; + } Q1BSP_FragmentToMesh(dec, surf->mesh); } @@ -638,7 +649,7 @@ void Q1BSP_ClipDecalToNodes (fragmentdecal_t *dec, mnode_t *node) Q1BSP_ClipDecalToNodes (dec, node->children[1]); } -int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, float size, float **out) +int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, vec3_t tangent2, float size, float **out) { //quad marks a full, independant quad int p; fragmentdecal_t dec; @@ -646,7 +657,7 @@ int Q1BSP_ClipDecal(vec3_t center, vec3_t normal, vec3_t tangent, float size, fl VectorCopy(center, dec.center); VectorCopy(normal, dec.normal); VectorCopy(tangent, dec.tangent1); - CrossProduct(tangent, normal, dec.tangent2); + VectorCopy(tangent2, dec.tangent2); dec.radius = size/2; dec.numtris = 0; diff --git a/engine/ftequake/ftequake.dsp b/engine/ftequake/ftequake.dsp index 988fb16b6..5e35a41f7 100644 --- a/engine/ftequake/ftequake.dsp +++ b/engine/ftequake/ftequake.dsp @@ -360,7 +360,7 @@ LINK32=link.exe # PROP Target_Dir "" # ADD BASE CPP /nologo /G5 /ML /W3 /GX /ZI /Od /I "..\client" /I "../common" /I "../server" /I "../gl" /I "../sw" /I "../qclib" /I "../libs" /I "../libs/dxsdk7/include" /D "_DEBUG" /D "GLQUAKE" /D "WIN32" /D "_WINDOWS" /D "AVAIL_OGGVORBIS" /D "Q3CLIENT" /FR".\GLDebug/" /Fp".\GLDebug/qwcl.pch" /YX /Fo".\GLDebug/" /Fd".\GLDebug/" /FD /c # SUBTRACT BASE CPP /X -# ADD CPP /nologo /G5 /W3 /GX /ZI /Od /I "..\client" /I "../common" /I "../server" /I "../gl" /I "../sw" /I "../qclib" /I "../libs" /I "../libs/dxsdk7/include" /D "_DEBUG" /D "GLQUAKE" /D "WIN32" /D "_WINDOWS" /D "AVAIL_OGGVORBIS" /D "Q3CLIENT" /D "Q3SERVER" /FR /Fp".\GLDebugQ3/qwcl.pch" /Yu"quakedef.h" /Fo".\GLDebugQ3/" /Fd".\GLDebugQ3/" /FD /c +# ADD CPP /nologo /G5 /W3 /GX /ZI /Od /I "..\client" /I "../common" /I "../server" /I "../gl" /I "../sw" /I "../qclib" /I "../libs" /I "../libs/dxsdk7/include" /D "_DEBUG" /D "GLQUAKE" /D "WIN32" /D "_WINDOWS" /D "Q3CLIENT" /D "Q3SERVER" /FR /Fp".\GLDebugQ3/qwcl.pch" /Yu"quakedef.h" /Fo".\GLDebugQ3/" /Fd".\GLDebugQ3/" /FD /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x809 /d "_DEBUG" @@ -4920,230 +4920,6 @@ SOURCE=..\sw\vid_win2.c !ENDIF -# End Source File -# End Group -# Begin Group "nq" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\nqnet\net_dgrm.c - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -# SUBTRACT CPP /YX /Yc /Yu - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\nqnet\net_loop.c - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -# SUBTRACT CPP /YX /Yc /Yu - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\nqnet\net_main.c - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -# SUBTRACT CPP /YX /Yc /Yu - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\nqnet\net_win.c - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -# SUBTRACT CPP /YX /Yc /Yu - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\nqnet\net_wipx.c - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -# SUBTRACT CPP /YX /Yc /Yu - -!ENDIF - -# End Source File -# Begin Source File - -SOURCE=..\nqnet\nqnet.h - -!IF "$(CFG)" == "ftequake - Win32 Release" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebug" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLDebug" - -# PROP Exclude_From_Build 1 - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinGLRelease" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Debug Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 Release Dedicated Server" - -!ELSEIF "$(CFG)" == "ftequake - Win32 MinSW" - -!ELSEIF "$(CFG)" == "ftequake - Win32 GLDebugQ3" - -!ENDIF - # End Source File # End Group # Begin Group "common" diff --git a/engine/gl/gl_alias.c b/engine/gl/gl_alias.c index dea6af56e..abe1f828b 100644 --- a/engine/gl/gl_alias.c +++ b/engine/gl/gl_alias.c @@ -182,13 +182,7 @@ static void R_LerpFrames(mesh_t *mesh, galiaspose_t *p1, galiaspose_t *p2, float mesh->xyz_array = p1v; if (r_nolightdir.value) { - for (i = 0; i < mesh->numvertexes; i++) - { - mesh->colors_array[i][0] = /*ambientlight[0]/2*/+shadelight[0]; - mesh->colors_array[i][1] = /*ambientlight[1]/2*/+shadelight[1]; - mesh->colors_array[i][2] = /*ambientlight[2]/2*/+shadelight[2]; - mesh->colors_array[i][3] = alpha; - } + mesh->colors_array = NULL; } else { @@ -1469,11 +1463,14 @@ void R_DrawGAliasModel (entity_t *e) fog = CM_FogForOrigin(currententity->origin); #endif + qglColor4f(shadelight[0], shadelight[1], shadelight[2], e->alpha); + memset(&mesh, 0, sizeof(mesh)); for(; inf; ((inf->nextsurf)?(inf = (galiasinfo_t*)((char *)inf + inf->nextsurf)):(inf=NULL))) { if (R_GAliasBuildMesh(&mesh, inf, e->frame, e->oldframe, e->lerpfrac, e->alpha) && r_vertexdlights.value) - R_GAliasAddDlights(&mesh, e->origin, e->angles); + if (mesh.colors_array) + R_GAliasAddDlights(&mesh, e->origin, e->angles); c_alias_polys += mesh.numindexes/3; @@ -2238,12 +2235,12 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha) outskin->texnums=1; outskin->ofstexnums = (char *)texnums - (char *)outskin; - +/* #ifdef Q3SHADERS sprintf(skinname, "%s_%i", loadname, i); texnums->shader = R_RegisterSkin(skinname); #endif - +*/ texnums->base = texture; texnums->fullbright = fbtexture; @@ -2317,11 +2314,12 @@ static void *Q1_LoadSkins (daliasskintype_t *pskintype, qboolean alpha) if (t != 0) //only keep the first. BZ_Free(saved); } - - sprintf(skinname, "%s_%i_%i", loadname, i, t); +/* #ifdef Q3SHADERS + sprintf(skinname, "%s_%i_%i", loadname, i, t); texnums->shader = R_RegisterSkin(skinname); #endif +*/ texnums->base = texture; texnums->fullbright = fbtexture; } diff --git a/engine/gl/gl_backend.c b/engine/gl/gl_backend.c index fc37e46da..2a485017e 100644 --- a/engine/gl/gl_backend.c +++ b/engine/gl/gl_backend.c @@ -736,15 +736,14 @@ void R_FlushArraysMtex (void) return; } - GL_MBind( mtexid0, r_texNums[0] ); - qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); - if ( numColors > 1 ) { qglEnableClientState( GL_COLOR_ARRAY ); } else if ( numColors == 1 ) { qglColor4ubv ( colorArray[0] ); } + GL_MBind( mtexid0, r_texNums[0] ); + qglEnableClientState( GL_TEXTURE_COORD_ARRAY ); for ( i = 1; i < r_numUnits; i++ ) { GL_MBind( mtexid0 + i, r_texNums[i] ); @@ -1764,15 +1763,15 @@ void R_RenderMeshCombined ( meshbuffer_t *mb, shaderpass_t *pass ) R_ModifyColor ( mb, pass ); GL_SelectTexture( mtexid0 ); - R_ModifyTextureCoords ( pass, 0 ); if ( pass->blendmode == GL_REPLACE ) GL_TexEnv( GL_REPLACE ); else GL_TexEnv( GL_MODULATE ); + R_ModifyTextureCoords ( pass, 0 ); for ( i = 1, pass++; i < r_numUnits; i++, pass++ ) { - GL_SelectTexture( mtexid1 + i ); + GL_SelectTexture( mtexid0 + i ); if ( pass->blendmode ) { diff --git a/engine/gl/gl_model.h b/engine/gl/gl_model.h index c59409bc5..7c24ee4b0 100644 --- a/engine/gl/gl_model.h +++ b/engine/gl/gl_model.h @@ -203,9 +203,6 @@ typedef struct glpoly_s { struct glpoly_s *next; int numverts; -#ifdef SHADERS - float texcenter[2]; //center of texture made by adveraging the tex coords -#endif float verts[4][VERTEXSIZE]; // variable sized (xyz s1t1 s2t2 (ldir_xyz) } glpoly_t; @@ -221,12 +218,14 @@ typedef struct mfog_s } mfog_t; #endif +#if MAX_SWDECALS typedef struct decal_s { int xpos, ypos; struct msurface_s *owner; struct decal_s *next; struct decal_s *prev; } decal_t; +#endif typedef struct msurface_s @@ -256,9 +255,9 @@ typedef struct msurface_s mesh_t *mesh; entity_t *ownerent; struct msurface_s *texturechain; - +#if 0 vec3_t normal; - +#endif mtexinfo_t *texinfo; // lighting info @@ -276,8 +275,9 @@ typedef struct msurface_s qboolean stained; #endif qbyte *samples; // [numstyles*surfsize] - +#ifdef MAX_SWDECALS decal_t *decal; +#endif } msurface_t; typedef struct mnode_s diff --git a/engine/gl/gl_rlight.c b/engine/gl/gl_rlight.c index 1bd80f9fc..4054d8f5c 100644 --- a/engine/gl/gl_rlight.c +++ b/engine/gl/gl_rlight.c @@ -355,34 +355,6 @@ void GLR_PushDlights (void) continue; cl.worldmodel->funcs.MarkLights( l, 1<nodes ); } - -/* - if (cl.worldmodel->fromgame == fg_quake3) - { - for (i=0 ; idie < cl.time || !l->radius) - continue; - GLR_MarkQ3Lights ( l, 1<nodes ); - } - return; - } - if (cl.worldmodel->fromgame == fg_quake2) - { - for (i=0 ; idie < cl.time || !l->radius) - continue; - GLR_MarkQ2Lights ( l, 1<nodes ); - } - return; - } - for (i=0 ; idie < cl.time || !l->radius) - continue; - GLR_MarkLights ( l, 1<nodes ); - }*/ } diff --git a/engine/gl/gl_rmain.c b/engine/gl/gl_rmain.c index 09f619fc0..c73197fa0 100644 --- a/engine/gl/gl_rmain.c +++ b/engine/gl/gl_rmain.c @@ -125,6 +125,7 @@ cvar_t gl_contrast = {"gl_contrast", "1"}; cvar_t gl_dither = {"gl_dither", "1"}; cvar_t gl_maxdist = {"gl_maxdist", "8192"}; extern cvar_t gl_motionblur; +extern cvar_t gl_motionblurscale; extern cvar_t gl_ati_truform; extern cvar_t gl_ati_truform_type; @@ -1776,14 +1777,20 @@ void R_Mirror (void) //enable stencil writing qglClearStencil(0); + qglClear(GL_STENCIL_BUFFER_BIT); + qglDisable(GL_ALPHA_TEST); qglEnable(GL_STENCIL_TEST); qglStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); //replace where it passes qglStencilFunc( GL_ALWAYS, 1, ~0 ); //always pass (where z passes set to 1) - qglColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE ); + qglColorMask( GL_FALSE, GL_TRUE, GL_FALSE, GL_FALSE ); qglDepthMask( GL_FALSE ); + qglEnableClientState( GL_VERTEX_ARRAY ); for (prevs = s; s; s=s->texturechain) //write the polys to the stencil buffer. - R_RenderBrushPoly (s); + { + qglVertexPointer(3, GL_FLOAT, 0, s->mesh->xyz_array); + qglDrawElements(GL_TRIANGLES, s->mesh->numindexes, GL_UNSIGNED_INT, s->mesh->indexes); + } qglColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); qglDepthMask( GL_TRUE ); @@ -1820,7 +1827,7 @@ void R_Mirror (void) r_refdef.vieworg[1] = 575; r_refdef.vieworg[2] = 64; */ -// AngleVectors (r_refdef.viewangles, vpn, vright, vup); + AngleVectors (r_refdef.viewangles, vpn, vright, vup); gldepthmin = 0.5; @@ -1873,6 +1880,7 @@ void R_Mirror (void) qglCullFace(GL_BACK); // cl_numvisedicts = oldvisents; } + qglDisable(GL_STENCIL_TEST); memcpy(r_refdef.viewangles, oldangles, sizeof(vec3_t)); memcpy(r_refdef.vieworg, oldorg, sizeof(vec3_t)); @@ -2154,14 +2162,19 @@ void GLR_RenderView (void) if (gl_motionblur.value>=0 && gl_motionblur.value < 1) { int vwidth = 1, vheight = 1; - float vs, vt; - while (vwidth < glwidth) - { - vwidth *= 2; + float vs, vt, cs, ct; + + if (gl_config.arb_texture_non_power_of_two) + { //we can use any size, supposedly + vwidth = glwidth; + vheight = glheight; } - while (vheight < glheight) - { - vheight *= 2; + else + { //limit the texture size to square and use padding. + while (vwidth < glwidth) + vwidth *= 2; + while (vheight < glheight) + vheight *= 2; } qglViewport (glx, gly, glwidth, glheight); @@ -2179,22 +2192,24 @@ void GLR_RenderView (void) //blend the last frame onto the scene //the maths is because our texture is over-sized (must be power of two) - vs = (float)glwidth / vwidth; - vt = (float)glheight / vheight; + cs = vs = (float)glwidth / vwidth * 0.5; + ct = vt = (float)glheight / vheight * 0.5; + vs *= gl_motionblurscale.value; + vt *= gl_motionblurscale.value; + qglDisable (GL_DEPTH_TEST); qglDisable (GL_CULL_FACE); - qglDisable (GL_BLEND); qglDisable (GL_ALPHA_TEST); qglEnable(GL_BLEND); qglColor4f(1, 1, 1, gl_motionblur.value); qglBegin(GL_QUADS); - qglTexCoord2f(0, 0); + qglTexCoord2f(cs-vs, ct-vt); qglVertex2f(0, 0); - qglTexCoord2f(vs, 0); + qglTexCoord2f(cs+vs, ct-vt); qglVertex2f(glwidth, 0); - qglTexCoord2f(vs, vt); + qglTexCoord2f(cs+vs, ct+vt); qglVertex2f(glwidth, glheight); - qglTexCoord2f(0, vt); + qglTexCoord2f(cs-vs, ct+vt); qglVertex2f(0, glheight); qglEnd(); diff --git a/engine/gl/gl_rsurf.c b/engine/gl/gl_rsurf.c index d599e8a3c..1a781328c 100644 --- a/engine/gl/gl_rsurf.c +++ b/engine/gl/gl_rsurf.c @@ -2878,7 +2878,6 @@ start: // deal with model fragments in this leaf if (pleaf->efrags) R_StoreEfrags (&pleaf->efrags); - return; } @@ -2918,10 +2917,10 @@ start: { surf = cl.worldmodel->surfaces + node->firstsurface; - if (dot < 0 -BACKFACE_EPSILON) - side = SURF_PLANEBACK; - else if (dot > BACKFACE_EPSILON) - side = 0; +// if (dot < 0 -BACKFACE_EPSILON) +// side = SURF_PLANEBACK; +// else if (dot > BACKFACE_EPSILON) +// side = 0; { for ( ; c ; c--, surf++) { @@ -3855,15 +3854,6 @@ void GL_BuildLightmaps (void) currentmodel = m; for (i=0 ; inumsurfaces ; i++) { - fa = &m->surfaces[i]; - VectorCopy(fa->plane->normal, fa->normal); - if (fa->flags & SURF_PLANEBACK) - { - fa->normal[0]*=-1; - fa->normal[1]*=-1; - fa->normal[2]*=-1; - } - GL_CreateSurfaceLightmap (m->surfaces + i); P_EmitSkyEffectTris(m, &m->surfaces[i]); if (m->surfaces[i].mesh) //there are some surfaces that have a display list already (the subdivided ones) diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index b10bcde68..08cea0e33 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -742,12 +742,15 @@ qboolean VID_AttachGL (rendererstate_t *info) break; } - if (!stricmp(info->glrenderer, "opengl32.dll") || !stricmp(info->glrenderer, "opengl32")) //go for windows system dir if we failed with the default. Should help to avoid the 3dfx problem. + if (!*info->glrenderer || !stricmp(info->glrenderer, "opengl32.dll") || !stricmp(info->glrenderer, "opengl32")) //go for windows system dir if we failed with the default. Should help to avoid the 3dfx problem. { char systemgl[MAX_OSPATH+1]; GetSystemDirectory(systemgl, sizeof(systemgl)-1); strncat(systemgl, "\\", sizeof(systemgl)-1); - strncat(systemgl, info->glrenderer, sizeof(systemgl)-1); + if (*info->glrenderer) + strncat(systemgl, info->glrenderer, sizeof(systemgl)-1); + else + strncat(systemgl, "opengl32.dll", sizeof(systemgl)-1); TRACE(("dbg: VID_AttachGL: GLInitialise (system dir specific)\n")); if (GLInitialise(systemgl)) { diff --git a/engine/gl/gl_warp.c b/engine/gl/gl_warp.c index 749ccc941..da26b9e30 100644 --- a/engine/gl/gl_warp.c +++ b/engine/gl/gl_warp.c @@ -279,7 +279,10 @@ R_LoadSkys static char *skyname_suffix[][6] = { {"px", "py", "nx", "ny", "pz", "nz"}, {"posx", "posy", "negx", "negy", "posz", "negz"}, - {"rt", "bk", "lf", "ft", "up", "dn"} + {"rt", "bk", "lf", "ft", "up", "dn"}, + {"_px", "_py", "_nx", "_ny", "_pz", "_nz"}, + {"_posx", "_posy", "_negx", "_negy", "_posz", "_negz"}, + {"_rt", "_bk", "_lf", "_ft", "_up", "_dn"} }; static char *skyname_pattern[] = { @@ -318,7 +321,11 @@ void R_LoadSkys (void) { _snprintf (name, sizeof(name), skyname_pattern[p], boxname, skyname_suffix[s][i]); skyboxtex[i] = Mod_LoadHiResTexture(name, NULL, false, false, true); + if (skyboxtex[i]) + break; } + if (skyboxtex[i]) + break; } if (!skyboxtex[i]) break; @@ -326,7 +333,7 @@ void R_LoadSkys (void) qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } - if (boxname != defaultskybox && i < 6) + if (boxname != defaultskybox && i < 6 && *defaultskybox) { boxname = defaultskybox; continue; @@ -593,10 +600,10 @@ void R_DrawSkyBoxChain (msurface_t *s) R_DrawSkyBox (s); } -#define skygridx 32 +#define skygridx 16 #define skygridx1 (skygridx + 1) #define skygridxrecip (1.0f / (skygridx)) -#define skygridy 32 +#define skygridy 16 #define skygridy1 (skygridy + 1) #define skygridyrecip (1.0f / (skygridy)) #define skysphere_numverts (skygridx1 * skygridy1) diff --git a/engine/gl/glmod_doom.c b/engine/gl/glmod_doom.c index 1881161de..a15a7d4a6 100644 --- a/engine/gl/glmod_doom.c +++ b/engine/gl/glmod_doom.c @@ -1,9 +1,7 @@ -#ifdef RGLQUAKE - #include "quakedef.h" -#include "glquake.h" - #ifdef DOOMWADS +#ifdef RGLQUAKE +#include "glquake.h" #include "doommap.h" diff --git a/engine/gl/glsupp.h b/engine/gl/glsupp.h index 1ee0db052..fb57b2c3d 100644 --- a/engine/gl/glsupp.h +++ b/engine/gl/glsupp.h @@ -551,4 +551,13 @@ typedef void (APIENTRY * PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); typedef void (APIENTRY * PFNGLUNLOCKARRAYSEXTPROC) (void); #endif + + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 + +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif + #endif diff --git a/engine/http/httpclient.c b/engine/http/httpclient.c index 11129a384..3bfa0fad5 100644 --- a/engine/http/httpclient.c +++ b/engine/http/httpclient.c @@ -331,7 +331,7 @@ static qboolean HTTP_CL_Run(http_con_t *con) { //server closed off the connection. if (con->chunksize) Con_Printf("Download was part way through chunking - must be corrupt - %s\n", con->filename); - else if (con->bufferused != con->contentlength) + else if (con->bufferused != con->contentlength && !con->file) Con_Printf("Recieved file isn't the correct length - must be corrupt - %s\n", con->filename); Con_Printf("Retrieved %s\n", con->filename); if (con->file) diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index 2a799d5d0..54c550007 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -92,6 +92,7 @@ pbool opt_stripfunctions; //if a functions is only ever called directly or by e pbool opt_locals_marshalling; //make the local vars of all functions occupy the same globals. pbool opt_logicops; //don't make conditions enter functions if the return value will be discarded due to a previous value. (C style if statements) pbool opt_vectorcalls; //vectors can be packed into 3 floats, which can yield lower numpr_globals, but cost two more statements per call (only works for q1 calling conventions). +pbool opt_simplifiedifs; //if (f != 0) -> if (f). if (f == 0) -> ifnot (f) //bool opt_comexprremoval; //these are the results of the opt_. The values are printed out when compilation is compleate, showing effectivness. @@ -4860,13 +4861,17 @@ void QCC_PR_ParseStatement (void) if (QCC_PR_CheckKeyword(keyword_if, "if")) { - if (QCC_PR_CheckKeyword(keyword_not, "not")) - { - QCC_PR_Expect ("("); - conditional = 1; - e = QCC_PR_Expression (TOP_PRIORITY); - conditional = 0; + pbool negate = QCC_PR_CheckKeyword(keyword_not, "not"); + QCC_PR_Expect ("("); + conditional = 1; + e = QCC_PR_Expression (TOP_PRIORITY); + conditional = 0; + +// negate = negate != 0; + + if (negate) + { if (e->type == type_string && flag_ifstring) //special case, as strings are now pointers, not offsets from string table { QCC_PR_ParseWarning(WARN_IFSTRING_USED, "if not(string) can result in bizzare behaviour"); @@ -4877,11 +4882,6 @@ void QCC_PR_ParseStatement (void) } else { - QCC_PR_Expect ("("); - conditional = 1; - e = QCC_PR_Expression (TOP_PRIORITY); - conditional = 0; - if (e->type == type_string && flag_ifstring) //special case, as strings are now pointers, not offsets from string table { QCC_PR_ParseWarning(WARN_IFSTRING_USED, "if (string) can result in bizzare behaviour"); diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 15dff9c4e..370d6c9f3 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -2068,7 +2068,7 @@ int QCC_PR_CheakCompConst(void) time_t long_time; time( &long_time ); strftime( retbuf, sizeof(retbuf), - "\"%R\"", localtime( &long_time )); + "\"%H:%M\"", localtime( &long_time )); pr_file_p = retbuf; QCC_PR_Lex(); //translate the macro's value diff --git a/engine/server/sv_main.c b/engine/server/sv_main.c index d2b89d7b9..45ad31d7a 100644 --- a/engine/server/sv_main.c +++ b/engine/server/sv_main.c @@ -104,7 +104,8 @@ cvar_t allow_download_textures = {"allow_download_textures", "1"}; cvar_t allow_download_pk3s = {"allow_download_pk3s", "1"}; cvar_t allow_download_wads = {"allow_download_wads", "1"}; -cvar_t sv_public = {"sv_public", "1"}; +cvar_t sv_public = {"sv_public", "0"}; +cvar_t sv_listen = {"sv_listen", "1"}; cvar_t sv_highchars = {"sv_highchars", "1"}; cvar_t sv_loadentfiles = {"sv_loadentfiles", "1"}; cvar_t sv_maxrate = {"sv_maxrate", "10000"}; @@ -996,7 +997,7 @@ void SVC_GetChallenge (void) Netchan_OutOfBand(NS_SERVER, net_from, over-buf, buf); -// buf = va("challenge %i", svs.challenges[i].challenge); +// buf = va("challenge FTE%i", svs.challenges[i].challenge); // Netchan_OutOfBand(NS_SERVER, net_from, strlen(buf)+1, buf); } @@ -2028,7 +2029,10 @@ void SVNQ_ConnectionlessPacket(void) client_t *client; char *str; char buffer[256]; -// if (net_from.type == NA_LOOPBACK) + if (net_from.type == NA_LOOPBACK) + return; + + if (sv_listen.value < 2) return; MSG_BeginReading(); @@ -2068,33 +2072,7 @@ void SVNQ_ConnectionlessPacket(void) str = va("connect %i %i %i \"\\name\\unconnected\"", NET_PROTOCOL_VERSION, 0, SV_NewChallenge()); Cmd_TokenizeString (str, false, false); - client = SVC_DirectConnect(); - - if (client) - { - SZ_Clear(&sb); - MSG_WriteLong(&sb, 0); - MSG_WriteByte(&sb, CCREP_ACCEPT); - MSG_WriteLong(&sb, BigShort(net_local_sv_ipadr.port)); - *(int*)sb.data = BigLong(NETFLAG_CTL|sb.cursize); - NET_SendPacket(NS_SERVER, sb.cursize, sb.data, net_from); - - //nq supports packet truncation, so give them the full ammount - client->netchan.message.maxsize = sizeof(client->netchan.message_buf); - - host_client = client; - SVNQ_New_f(); - } - else - { - SZ_Clear(&sb); - MSG_WriteLong(&sb, 0); - MSG_WriteByte(&sb, CCREP_REJECT); - MSG_WriteString(&sb, "Bugger ye off"); - *(int*)sb.data = BigLong(NETFLAG_CTL|sb.cursize); - NET_SendPacket(NS_SERVER, sb.cursize, sb.data, net_from); - - } + SVC_DirectConnect(); break; } } @@ -2901,6 +2879,7 @@ void SV_InitLocal (void) Cvar_Register (&sv_resetparms, cvargroup_servercontrol); Cvar_Register (&sv_public, cvargroup_servercontrol); + Cvar_Register (&sv_listen, cvargroup_servercontrol); #ifndef SERVERONLY if (isDedicated) @@ -3145,10 +3124,13 @@ void Master_Heartbeat (void) NET_SendPacket (NS_SERVER, strlen(string), string, sv_masterlist[i].adr); break; case true: - Con_Printf ("Sending heartbeat to %s\n", NET_AdrToString (sv_masterlist[i].adr)); + if (sv_listen.value>=2) //set listen to 1 to allow qw connections, 2 to allow nq connections too. { - char *str = "\377\377\377\377heartbeat DarkPlaces\x0A"; - NET_SendPacket (NS_SERVER, strlen(str), str, sv_masterlist[i].adr); + Con_Printf ("Sending heartbeat to %s\n", NET_AdrToString (sv_masterlist[i].adr)); + { + char *str = "\377\377\377\377heartbeat DarkPlaces\x0A"; + NET_SendPacket (NS_SERVER, strlen(str), str, sv_masterlist[i].adr); + } } break; } diff --git a/engine/server/sv_phys.c b/engine/server/sv_phys.c index 79dfa9241..315f33529 100644 --- a/engine/server/sv_phys.c +++ b/engine/server/sv_phys.c @@ -411,6 +411,8 @@ SV_AddGravity */ void SV_AddGravity (edict_t *ent, float scale) { + if (!scale && progstype != PROG_QW) + scale = 1; ent->v->velocity[2] -= scale * sv_gravity.value/*movevars.gravity*/ * host_frametime; } diff --git a/engine/sw/d_scan.c b/engine/sw/d_scan.c index 4a21783ec..bef5ff268 100644 --- a/engine/sw/d_scan.c +++ b/engine/sw/d_scan.c @@ -53,8 +53,8 @@ void D_WarpScreen (void) int column[MAXWIDTH+AMP2*2]; float wratio, hratio; - w = r_refdef.vrect.width; - h = r_refdef.vrect.height; + w = WARP_WIDTH; + h = WARP_HEIGHT; wratio = w / (float)scr_vrect.width; hratio = h / (float)scr_vrect.height; diff --git a/engine/sw/r_surf.c b/engine/sw/r_surf.c index e44a01b2f..521455564 100644 --- a/engine/sw/r_surf.c +++ b/engine/sw/r_surf.c @@ -27,10 +27,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif -//#define MAX_DECALS (1<<8) +//#define MAX_SWDECALS (1<<8) -#if MAX_DECALS -decal_t decals[MAX_DECALS]; +#if MAX_SWDECALS +decal_t decals[MAX_SWDECALS]; int nextdecal; void SWR_AddDecal(vec3_t org); @@ -213,7 +213,7 @@ void SWR_AddStain(vec3_t org, float red, float green, float blue, float radius) int i; float parms[5]; -#if MAX_DECALS +#if MAX_SWDECALS SWR_AddDecal(org); #endif @@ -415,7 +415,7 @@ void SWR_BuildLightmaps(void) #endif //retrieves the next decal to be used, unlinking if needed. -#if MAX_DECALS +#if MAX_SWDECALS decal_t *R_GetFreeDecal(void) { decal_t *dec = &decals[nextdecal]; @@ -430,7 +430,7 @@ decal_t *R_GetFreeDecal(void) dec->owner->cached_dlight = -1; //get the surface to redraw. } - nextdecal = (nextdecal+1)&(MAX_DECALS-1); + nextdecal = (nextdecal+1)&(MAX_SWDECALS-1); memset(dec, 0, sizeof(decal_t)); @@ -440,7 +440,7 @@ decal_t *R_GetFreeDecal(void) void R_WipeDecals(void) { -#if MAX_DECALS +#if MAX_SWDECALS int i; memset(decals, 0, sizeof(decals)); @@ -449,7 +449,7 @@ void R_WipeDecals(void) #endif } -#if MAX_DECALS +#if MAX_SWDECALS static vec3_t decalorg; static float decalradius; @@ -1077,7 +1077,7 @@ void R_DrawSurface (void) unsigned char *pcolumndest; void (*pblockdrawer)(void); texture_t *mt; -#if MAX_DECALS +#if MAX_SWDECALS decal_t *dec; #endif @@ -1154,7 +1154,7 @@ void R_DrawSurface (void) pcolumndest += horzblockstep; } -#if MAX_DECALS +#if MAX_SWDECALS if (r_drawsurf.surf->decal && !r_drawsurf.surfmip) { if (r_pixbytes == 1 || r_pixbytes == 4)