void V_RenderView (void) { int i; translation_info_t translations[MAX_CLIENTS]; // if (cl.simangles[ROLL]) // Sys_Error ("cl.simangles[ROLL]"); // DEBUG cl.simangles[ROLL] = 0; // FIXME @@@ if (cls.state != ca_active) return; if (cl.validsequence) view_message = cl.frames[cl.validsequence & UPDATE_MASK].playerstate[Cam_PlayerNum()]; DropPunchAngle (); if (cl.intermission) { // intermission / finale rendering V_CalcIntermissionRefdef (); } else { V_CalcRefdef (); } r_refdef2.time = cl.time; // r_refdef2.allowCheats = false; r_refdef2.viewplayernum = Cam_PlayerNum(); r_refdef2.watervis = (atoi(Info_ValueForKey(cl.serverinfo, "watervis")) != 0); r_refdef2.lightstyles = cl_lightstyle; r_refdef2.numDlights = cl_numvisdlights; r_refdef2.dlights = cl_visdlights; r_refdef2.numParticles = 0; //cl_numvisparticles; r_refdef2.particles = NULL;//cl_visparticles; for (i = 0; i < MAX_CLIENTS; i++) { translations[i].topcolor = cl.players[i].topcolor; translations[i].bottomcolor = cl.players[i].bottomcolor; strlcpy (translations[i].skinname, cl.players[i].skin, sizeof(translations[0].skinname)); } r_refdef2.translations = translations; strlcpy (r_refdef2.baseskin, baseskin.string, sizeof(r_refdef2.baseskin)); R_RenderView (); }
/* ================= CL_UpdateBeams ================= */ void CL_UpdateBeams (void) { int i; beam_t *b; vec3_t dist, org; float d, dec; entity_t ent; vec3_t angles; dec = 30; memset (&ent, 0, sizeof(entity_t)); ent.colormap = 0; // update lightning for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) { if (!b->model || b->endtime < cl.time) continue; // if coming from the player, update the start position if (b->entity == Cam_PlayerNum() + 1 && !cl.intermission) { VectorCopy (cl.simorg, b->start); b->start[2] += cl.crouch; if (cl_fakeshaft.value && cl.allow_fakeshaft) { vec3_t forward; vec3_t v, org; vec3_t ang; float f, delta; trace_t trace; f = max(0, min(1, cl_fakeshaft.value)); VectorSubtract (playerbeam_end, cl.simorg, v); v[2] -= 22; // adjust for view height vectoangles (v, ang); // lerp pitch ang[0] = -ang[0]; if (ang[0] < -180) ang[0] += 360; ang[0] += (cl.simangles[0] - ang[0]) * f; // lerp yaw delta = cl.simangles[1] - ang[1]; if (delta > 180) delta -= 360; if (delta < -180) delta += 360; ang[1] += delta*f; ang[2] = 0; AngleVectors (ang, forward, NULL, NULL); VectorScale (forward, 600, forward); VectorCopy (cl.simorg, org); org[2] += 16; VectorAdd (org, forward, b->end); trace = PM_TraceLine (&cl.pmove, org, b->end); if (trace.fraction < 1) VectorCopy (trace.endpos, b->end); } } // calculate pitch and yaw VectorSubtract (b->end, b->start, dist); vectoangles (dist, angles); // add new entities for the lightning VectorCopy (b->start, org); d = VectorNormalize (dist); VectorScale (dist, dec, dist); while (d > 0) { VectorCopy (org, ent.origin); ent.model = b->model; ent.angles[PITCH] = angles[PITCH]; ent.angles[YAW] = angles[YAW]; ent.angles[ROLL] = rand() % 360; if (b->model == cl_bolt2_mod) ent.alpha = r_shaftalpha.value; V_AddEntity (&ent); d -= dec; VectorAdd (org, dist, org); } } }
/* ================= CL_ParseBeam ================= */ void CL_ParseBeam (int type) { int ent; vec3_t start, end; beam_t *b; struct model_s *m; int i; ent = MSG_ReadShort (); start[0] = MSG_ReadCoord (); start[1] = MSG_ReadCoord (); start[2] = MSG_ReadCoord (); end[0] = MSG_ReadCoord (); end[1] = MSG_ReadCoord (); end[2] = MSG_ReadCoord (); // ZQuake protocol extension: // TE_LIGHTNING1 with entity num in -1288..-265 range is TE_BEAM if (type == 1 && (ent >= -1288 && ent <= -265) /* 1024 slots */) { if (!cl_beam_mod) cl_beam_mod = Mod_ForName ("progs/beam.mdl", true); m = cl_beam_mod; ent -= -1288; goto do_beam; } switch (type) { case 1: if (!cl_bolt1_mod) cl_bolt1_mod = Mod_ForName ("progs/bolt.mdl", true); m = cl_bolt1_mod; break; case 2: if (!cl_bolt2_mod) cl_bolt2_mod = Mod_ForName ("progs/bolt2.mdl", true); m = cl_bolt2_mod; break; case 3: if (!cl_bolt3_mod) cl_bolt3_mod = Mod_ForName ("progs/bolt3.mdl", true); m = cl_bolt3_mod; break; case 4: default: if (!cl_beam_mod) cl_beam_mod = Mod_ForName ("progs/beam.mdl", true); m = cl_beam_mod; break; } do_beam: if (ent == Cam_PlayerNum() + 1) VectorCopy (end, playerbeam_end); // for cl_fakeshaft // override any beam with the same entity for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) { if (b->entity == ent) { b->model = m; b->endtime = cl.time + 0.2; VectorCopy (start, b->start); VectorCopy (end, b->end); return; } } // find a free beam for (i = 0, b = cl_beams; i < MAX_BEAMS; i++, b++) { if (!b->model || b->endtime < cl.time) { b->entity = ent; b->model = m; b->endtime = cl.time + 0.2; VectorCopy (start, b->start); VectorCopy (end, b->end); return; } } Com_DPrintf ("beam list overflow!\n"); }