// // RenderBSPNode // Renders all subsectors below a given node, // traversing subtree recursively. // Just call with BSP root. void R_RenderBSPNode (int bspnum) { node_t* bsp; int side; // Found a subsector? if (bspnum & NF_SUBSECTOR) { if (bspnum == -1) R_Subsector (0); else R_Subsector (bspnum&(~NF_SUBSECTOR)); return; } bsp = &nodes[bspnum]; // Decide which side the view point is on. side = R_PointOnSide (viewx, viewy, bsp); // Recursively divide front space. R_RenderBSPNode (bsp->children[side]); // Possibly divide back space. if (R_CheckBBox (bsp->bbox[side^1])) R_RenderBSPNode (bsp->children[side^1]); }
void R_RenderBSPNode (int bspnum) { node_t *bsp; int side; if (bspnum & NF_SUBSECTOR) { if (bspnum == -1) R_Subsector (0); else R_Subsector (bspnum&(~NF_SUBSECTOR)); return; } bsp = &nodes[bspnum]; #ifdef __NeXT__ RD_DrawNodeLine (bsp); #endif // // decide which side the view point is on // side = R_PointOnSide (viewx, viewy, bsp); R_RenderBSPNode (bsp->children[side]); // recursively divide front space if (R_CheckBBox (bsp->bbox[side^1])) // possibly divide back space R_RenderBSPNode (bsp->children[side^1]); }
// // R_RenderView // void R_RenderPlayerView(player_t *player) { R_SetupFrame(player); // Clear buffers. R_ClearClipSegs(); R_ClearDrawSegs(); if (automapactive) { // The head node is the last node output. R_RenderBSPNode(numnodes - 1); } else { // Clear buffers. R_ClearPlanes(); R_ClearSprites(); if (player->cheats & CF_NOCLIP) V_FillRect(0, viewwindowx, viewwindowy, viewwidth, viewheight, 0); // The head node is the last node output. R_RenderBSPNode(numnodes - 1); R_DrawPlanes(); R_DrawMasked(); } }
// // RenderBSPNode // Renders all subsectors below a given node, // traversing subtree recursively. // Just call with BSP root. void R_RenderBSPNode(int bspnum, vector<BspNodeInfo>& nodeInfo, vector<SegInfo>& segInfo, int parentIdx, bool nodeFront) { node_t* bsp; int side; // Found a subsector? if (bspnum & NF_SUBSECTOR) { int subsectorNum = (bspnum == -1) ? 0 : bspnum&(~NF_SUBSECTOR); R_Subsector(subsectorNum, segInfo, parentIdx); return; } bsp = &nodes[bspnum]; int curIdx = nodeInfo.size(); nodeInfo.emplace_back(); { BspNodeInfo& curNodeInfo = nodeInfo.back(); //Ref could be invalid after recursion below. curNodeInfo.node = *bsp; curNodeInfo.parent = parentIdx; curNodeInfo.frontChild = curNodeInfo.backChild = -1; curNodeInfo.twoSide = false; } if (parentIdx != -1) { BspNodeInfo& parent = nodeInfo[parentIdx]; if (nodeFront) { parent.frontChild = curIdx; } else { parent.backChild = curIdx; } } // Decide which side the view point is on. side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space. R_RenderBSPNode(bsp->children[side], nodeInfo, segInfo, curIdx, true); // Possibly divide back space. if (R_CheckBBox(bsp->bbox[side ^ 1])) { R_RenderBSPNode(bsp->children[side ^ 1], nodeInfo, segInfo, curIdx, false); nodeInfo[curIdx].twoSide = true; } }
// // R_RenderView // void R_RenderPlayerView (player_t* player) { R_SetupFrame (player); // Clear buffers. R_ClearClipSegs (); R_ClearDrawSegs (); R_ClearPlanes (); R_ClearSprites (); rendered_segs = rendered_visplanes = 0; // proff 11/99: clear buffers gld_InitDrawScene(); // proff 11/99: switch to perspective mode gld_StartDrawScene(); // The head node is the last node output. R_RenderBSPNode (numnodes-1); R_ResetColumnBuffer(); // proff 11/99: draw the scene gld_DrawScene(player); // proff 11/99: finishing off gld_EndDrawScene(); if (rendering_stats) R_ShowStats(); R_RestoreInterpolations(); }
void R_RenderBSPNode (void *node) { if (numnodes == 0) { R_Subsector (subsectors); return; } while (!((size_t)node & 1)) // Keep going until found a subsector { node_t *bsp = (node_t *)node; // Decide which side the view point is on. int side = R_PointOnSide (ViewPos, bsp); // Recursively divide front space (toward the viewer). R_RenderBSPNode (bsp->children[side]); // Possibly divide back space (away from the viewer). side ^= 1; if (!R_CheckBBox (bsp->bbox[side])) return; node = bsp->children[side]; } R_Subsector ((subsector_t *)((BYTE *)node - 1)); }
static void R_AddPolyobjs(subsector_t *sub) { if (sub->BSP == NULL || sub->BSP->bDirty) { sub->BuildPolyBSP(); } if (sub->BSP->Nodes.Size() == 0) { R_Subsector(&sub->BSP->Subsectors[0]); } else { R_RenderBSPNode(&sub->BSP->Nodes.Last()); } }
void R_RenderBSPNode(int bspnum) { while (!(bspnum & NF_SUBSECTOR)) // Found a subsector? { const node_t *bsp = &nodes[bspnum]; // Decide which side the view point is on. int side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space. R_RenderBSPNode(bsp->children[side]); // Possibly divide back space. if (!R_CheckBBox(bsp->bbox[side^1])) return; bspnum = bsp->children[side^1]; } R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); }
void R_RenderBSPNode(int bspnum) { while (!(bspnum & NF_SUBSECTOR)) { const node_t *bsp = &nodes[bspnum]; int side = R_PointOnSide(viewx, viewy, bsp); R_RenderBSPNode(bsp->children[side]); if (!R_CheckBBox(bsp->bbox[side ^ 1])) return; bspnum = bsp->children[side ^ 1]; } R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); }
static void R_RenderLinkedPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz; float lastxf, lastyf, lastzf; portal_t *portal = window->portal; // ioanch 20160123: keep track of window portalrender.curwindow = window; if(portal->type != R_LINKED || window->maxx < window->minx) return; // haleyjd: temporary debug if(portal->tainted > 6) { if(showtainted) R_ShowTainted(window); portal->tainted++; C_Printf(FC_ERROR "Refused to draw portal (line=%i) (t=%d)", portal->data.link.maker, portal->tainted); return; } #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderAnchoredPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); // haleyjd: temporary debug portal->tainted++; floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastxf = view.x; lastyf = view.y; lastzf = view.z; // SoM 3/10/2005: Use the coordinates stored in the portal struct viewx = window->vx + portal->data.link.deltax; viewy = window->vy + portal->data.link.deltay; viewz = window->vz + portal->data.link.deltaz; view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; viewx = lastx; viewy = lasty; viewz = lastz; view.x = lastxf; view.y = lastyf; view.z = lastzf; if(window->child) R_RenderLinkedPortal(window->child); }
// // R_RenderSkyboxPortal // static void R_RenderSkyboxPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz, lastangle; float lastxf, lastyf, lastzf, lastanglef; portal_t *portal = window->portal; portalrender.curwindow = window; if(portal->type != R_SKYBOX) return; if(window->maxx < window->minx) return; #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderSkyboxPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastangle = viewangle; lastxf = view.x; lastyf = view.y; lastzf = view.z; lastanglef = view.angle; viewx = portal->data.camera->x; viewy = portal->data.camera->y; viewz = portal->data.camera->z; view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); // SoM: The viewangle should also be offset by the skybox camera angle. viewangle += portal->data.camera->angle; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; view.angle = (ANG90 - viewangle) * PI / ANG180; view.sin = (float)sin(view.angle); view.cos = (float)cos(view.angle); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; // SoM: "pop" the view state. viewx = lastx; viewy = lasty; viewz = lastz; viewangle = lastangle; view.x = lastxf; view.y = lastyf; view.z = lastzf; view.angle = lastanglef; viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; view.sin = (float)sin(view.angle); view.cos = (float)cos(view.angle); if(window->child) R_RenderSkyboxPortal(window->child); }
// // R_RenderView // void R_RenderPlayerView (player_t* player) { R_SetupFrame (player); // Clear buffers. R_ClearClipSegs (); R_ClearDrawSegs (); R_ClearPlanes (); R_ClearSprites (); rendered_segs = rendered_visplanes = 0; if (V_GetMode() == VID_MODEGL) { #ifdef GL_DOOM // proff 11/99: clear buffers gld_InitDrawScene(); // proff 11/99: switch to perspective mode gld_StartDrawScene(); #endif } else { if (autodetect_hom) { // killough 2/10/98: add flashing red HOM indicators int color=(gametic % 20) < 9 ? 0xb0 : 0; int h=viewheight; for (; h>0; h--) memset(screens[0].data+(viewwindowy+h)*screens[0].pitch,color,SCREENWIDTH); R_DrawViewBorder(); } } // check for new console commands. #ifdef HAVE_NET NetUpdate (); #endif // The head node is the last node output. R_RenderBSPNode (numnodes-1); // Check for new console commands. #ifdef HAVE_NET NetUpdate (); #endif if (V_GetMode() != VID_MODEGL) R_DrawPlanes (); // Check for new console commands. #ifdef HAVE_NET NetUpdate (); #endif if (V_GetMode() != VID_MODEGL) { R_DrawMasked (); R_ResetColumnBuffer(); } // Check for new console commands. #ifdef HAVE_NET NetUpdate (); #endif if (V_GetMode() == VID_MODEGL) { #ifdef GL_DOOM // proff 11/99: draw the scene gld_DrawScene(player); // proff 11/99: finishing off gld_EndDrawScene(); #endif } if (rendering_stats) R_ShowStats(); R_RestoreInterpolations(); }
void R_DrawPortals () { static TArray<size_t> interestingStack; static TArray<ptrdiff_t> drawsegStack; static TArray<ptrdiff_t> visspriteStack; static TArray<DVector3> viewposStack; static TArray<visplane_t *> visplaneStack; numskyboxes = 0; if (visplanes[MAXVISPLANES] == NULL) return; R_3D_EnterSkybox(); CurrentPortalInSkybox = true; int savedextralight = extralight; DVector3 savedpos = ViewPos; DAngle savedangle = ViewAngle; ptrdiff_t savedvissprite_p = vissprite_p - vissprites; ptrdiff_t savedds_p = ds_p - drawsegs; ptrdiff_t savedlastopening = lastopening; size_t savedinteresting = FirstInterestingDrawseg; double savedvisibility = R_GetVisibility(); AActor *savedcamera = camera; sector_t *savedsector = viewsector; int i; visplane_t *pl; for (pl = visplanes[MAXVISPLANES]; pl != NULL; pl = visplanes[MAXVISPLANES]) { // Pop the visplane off the list now so that if this skybox adds more // skyboxes to the list, they will be drawn instead of skipped (because // new skyboxes go to the beginning of the list instead of the end). visplanes[MAXVISPLANES] = pl->next; pl->next = NULL; if (pl->right < pl->left || !r_skyboxes || numskyboxes == MAX_SKYBOX_PLANES || pl->portal == NULL) { R_DrawSinglePlane (pl, OPAQUE, false, false); *freehead = pl; freehead = &pl->next; continue; } numskyboxes++; FSectorPortal *port = pl->portal; switch (port->mType) { case PORTS_SKYVIEWPOINT: { // Don't let gun flashes brighten the sky box ASkyViewpoint *sky = barrier_cast<ASkyViewpoint*>(port->mSkybox); extralight = 0; R_SetVisibility(sky->args[0] * 0.25f); ViewPos = sky->InterpolatedPosition(r_TicFracF); ViewAngle = savedangle + (sky->PrevAngles.Yaw + deltaangle(sky->PrevAngles.Yaw, sky->Angles.Yaw) * r_TicFracF); R_CopyStackedViewParameters(); break; } case PORTS_STACKEDSECTORTHING: case PORTS_PORTAL: case PORTS_LINKEDPORTAL: extralight = pl->extralight; R_SetVisibility (pl->visibility); ViewPos.X = pl->viewpos.X + port->mDisplacement.X; ViewPos.Y = pl->viewpos.Y + port->mDisplacement.Y; ViewPos.Z = pl->viewpos.Z; ViewAngle = pl->viewangle; break; case PORTS_HORIZON: case PORTS_PLANE: // not implemented yet default: R_DrawSinglePlane(pl, OPAQUE, false, false); *freehead = pl; freehead = &pl->next; numskyboxes--; continue; } port->mFlags |= PORTSF_INSKYBOX; if (port->mPartner > 0) sectorPortals[port->mPartner].mFlags |= PORTSF_INSKYBOX; camera = NULL; viewsector = port->mDestination; assert(viewsector != NULL); R_SetViewAngle (); validcount++; // Make sure we see all sprites R_ClearPlanes (false); R_ClearClipSegs (pl->left, pl->right); WindowLeft = pl->left; WindowRight = pl->right; for (i = pl->left; i < pl->right; i++) { if (pl->top[i] == 0x7fff) { ceilingclip[i] = viewheight; floorclip[i] = -1; } else { ceilingclip[i] = pl->top[i]; floorclip[i] = pl->bottom[i]; } } // Create a drawseg to clip sprites to the sky plane R_CheckDrawSegs (); ds_p->CurrentPortalUniq = CurrentPortalUniq; ds_p->siz1 = INT_MAX; ds_p->siz2 = INT_MAX; ds_p->sz1 = 0; ds_p->sz2 = 0; ds_p->x1 = pl->left; ds_p->x2 = pl->right; ds_p->silhouette = SIL_BOTH; ds_p->sprbottomclip = R_NewOpening (pl->right - pl->left); ds_p->sprtopclip = R_NewOpening (pl->right - pl->left); ds_p->maskedtexturecol = ds_p->swall = -1; ds_p->bFogBoundary = false; ds_p->curline = NULL; ds_p->fake = 0; memcpy (openings + ds_p->sprbottomclip, floorclip + pl->left, (pl->right - pl->left)*sizeof(short)); memcpy (openings + ds_p->sprtopclip, ceilingclip + pl->left, (pl->right - pl->left)*sizeof(short)); firstvissprite = vissprite_p; firstdrawseg = ds_p++; FirstInterestingDrawseg = InterestingDrawsegs.Size(); interestingStack.Push (FirstInterestingDrawseg); ptrdiff_t diffnum = firstdrawseg - drawsegs; drawsegStack.Push (diffnum); diffnum = firstvissprite - vissprites; visspriteStack.Push (diffnum); viewposStack.Push(ViewPos); visplaneStack.Push (pl); InSubsector = NULL; R_RenderBSPNode (nodes + numnodes - 1); R_3D_ResetClip(); // reset clips (floor/ceiling) R_DrawPlanes (); port->mFlags &= ~PORTSF_INSKYBOX; if (port->mPartner > 0) sectorPortals[port->mPartner].mFlags &= ~PORTSF_INSKYBOX; } // Draw all the masked textures in a second pass, in the reverse order they // were added. This must be done separately from the previous step for the // sake of nested skyboxes. while (interestingStack.Pop (FirstInterestingDrawseg)) { ptrdiff_t pd = 0; drawsegStack.Pop (pd); firstdrawseg = drawsegs + pd; visspriteStack.Pop (pd); firstvissprite = vissprites + pd; // Masked textures and planes need the view coordinates restored for proper positioning. viewposStack.Pop(ViewPos); R_DrawMasked (); ds_p = firstdrawseg; vissprite_p = firstvissprite; visplaneStack.Pop (pl); if (pl->Alpha > 0 && pl->picnum != skyflatnum) { R_DrawSinglePlane (pl, pl->Alpha, pl->Additive, true); } *freehead = pl; freehead = &pl->next; } firstvissprite = vissprites; vissprite_p = vissprites + savedvissprite_p; firstdrawseg = drawsegs; ds_p = drawsegs + savedds_p; InterestingDrawsegs.Resize ((unsigned int)FirstInterestingDrawseg); FirstInterestingDrawseg = savedinteresting; lastopening = savedlastopening; camera = savedcamera; viewsector = savedsector; ViewPos = savedpos; R_SetVisibility(savedvisibility); extralight = savedextralight; ViewAngle = savedangle; R_SetViewAngle (); CurrentPortalInSkybox = false; R_3D_LeaveSkybox(); if(fakeActive) return; for (*freehead = visplanes[MAXVISPLANES], visplanes[MAXVISPLANES] = NULL; *freehead; ) freehead = &(*freehead)->next; }
static void R_RenderLinkedPortal(pwindow_t *window) { fixed_t lastx, lasty, lastz; float lastxf, lastyf, lastzf; portal_t *portal = window->portal; // ioanch 20160123: keep track of window portalrender.curwindow = window; if(portal->type != R_LINKED || window->maxx < window->minx) return; // haleyjd: temporary debug if(portal->tainted > PORTAL_RECURSION_LIMIT) { R_ShowTainted(window); portal->tainted++; return; } #ifdef RANGECHECK for(int i = 0; i < video.width; i++) { if(window->bottom[i] > window->top[i] && (window->bottom[i] < -1 || window->bottom[i] > viewwindow.height || window->top[i] < -1 || window->top[i] > viewwindow.height)) { I_Error("R_RenderAnchoredPortal: clipping array contained invalid " "information:\n" " x:%i, ytop:%f, ybottom:%f\n", i, window->top[i], window->bottom[i]); } } #endif if(!R_SetupPortalClipsegs(window->minx, window->maxx, window->top, window->bottom)) return; R_ClearSlopeMark(window->minx, window->maxx, window->type); // haleyjd: temporary debug portal->tainted++; floorclip = window->bottom; ceilingclip = window->top; R_ClearOverlayClips(); portalrender.minx = window->minx; portalrender.maxx = window->maxx; ++validcount; R_SetMaskedSilhouette(ceilingclip, floorclip); lastx = viewx; lasty = viewy; lastz = viewz; lastxf = view.x; lastyf = view.y; lastzf = view.z; // SoM 3/10/2005: Use the coordinates stored in the portal struct viewx = window->vx + portal->data.link.deltax; viewy = window->vy + portal->data.link.deltay; viewz = window->vz + portal->data.link.deltaz; // ioanch 20160227: microscopic adjustment for line portals to make sure // the edge textures in the buffer sectors are seen in case of polyobject // portals //if(window->line && window->line->portal->data.link.polyportalpartner) //{ // if(window->line->dx > 0) // --viewy; // else if(window->line->dx < 0) // ++viewy; // if(window->line->dy > 0) // ++viewx; // else if(window->line->dy < 0) // --viewx; //} view.x = M_FixedToFloat(viewx); view.y = M_FixedToFloat(viewy); view.z = M_FixedToFloat(viewz); R_IncrementFrameid(); R_RenderBSPNode(numnodes - 1); // Only push the overlay if this is the head window R_PushPost(true, window->head == window ? window->portal->poverlay : NULL); floorclip = floorcliparray; ceilingclip = ceilingcliparray; viewx = lastx; viewy = lasty; viewz = lastz; view.x = lastxf; view.y = lastyf; view.z = lastzf; if(window->child) R_RenderLinkedPortal(window->child); }
// // R_RenderView // void R_RenderPlayerView (player_t* player) { R_SetupFrame (player); // Clear buffers. R_ClearClipSegs (); R_ClearDrawSegs (); R_ClearPlanes (); R_ClearSprites (); rendered_segs = rendered_visplanes = 0; if (autodetect_hom) { // killough 2/10/98: add flashing red HOM indicators char c[47*47]; extern int lastshottic; int i,color=(gametic % 20) < 9 ? 0xb0 : 0; memset(*screens+viewwindowy*SCREENWIDTH,color,viewheight*SCREENWIDTH); for (i=0;i<47*47;i++) { char t = "/////////////////////////////////////////////////////////////////////////////" "/////////////////////////////////////////////////////////////////////////////" "///////jkkkkklk////////////////////////////////////hkllklklkklkj/////////////" "///////////////////jkkkkklklklkkkll//////////////////////////////kkkkkklklklk" "lkkkklk//////////////////////////jllkkkkklklklklklkkklk//////////////////////" "//klkkllklklklkllklklkkklh//////////////////////kkkkkjkjjkkj\3\205\214\3lllkk" "lkllh////////////////////kllkige\211\210\207\206\205\204\203\203\203\205`\206" "\234\234\234\234kkllg//////////////////klkkjhfe\210\206\203\203\203\202\202" "\202\202\202\202\203\205`\207\211eikkk//////////////////kkkk\3g\211\207\206" "\204\203\202\201\201\200\200\200\200\200\201\201\202\204b\210\211\3lkh///////" "//////////lklki\213\210b\206\203\201\201\200\200\200\200\200Z\200\200\200\202" "\203\204\205\210\211jll/////////////////lkkk\3\212\210b\205\202\201\200\200" "\200XW\200\200\200\200\200\200\202\203\204\206\207eklj////////////////lkkjg" "\211b\206\204\202\200\200\200YWWX\200Z\200\200\200\202\203\203\205bdjkk//////" "//////////llkig\211a\205\203\202\200\200\200YXWX\200\200\200\200\200\201\202" "\203\203\206\207ekk////////////////lkki\3\211\206\204\202\201\200\200XXWWWXX" "\200\200\200\200\202\202\204\206\207ekk////////////////lkkj\3e\206\206\204\\" "\200\200XWVVWWWXX\200\200\200\\\203\205\207\231kk////////////////lkkjjgcccfd" "\207\203WVUVW\200\200\202\202\204\204\205\204\206\210gkk////////////////kkkkj" "e``\210hjjgb\200W\200\205\206fhghcbdcdfkk////////////////jkkj\3\207ab\211e" "\213j\3g\204XX\207\213jii\212\207\203\204\210gfkj///////////////j\211lkjf\210" "\214\3\3kj\213\213\211\205X\200\205\212\210\213\213\213\211\210\203\205gelj//" "////////////hf\211\213kh\212\212i\212gkh\202\203\210\210\202\201\206\207\206" "\\kkhf\210aabkk//////////////je\210\210\3g\210\207\210e\210c\205\204\202\210" "\207\203\202\210\205\203\203fjbe\213\210bbieW/////////////ke\207\206ie\206" "\203\203\203\205\205\204\203\210\211\207\202\202\206\210\203\204\206\207\210" "\211\231\206\206`\206\206]/////////////kf\\\202ig\204\203\202\201\\\202\202" "\205\207\210\207\203\202\206\206\206\205\203\203\203\202\202\203\204b\206\204" "Z/////////////i\3\\\204j\212\204\202\201\200\202\202\202\203\206\211\210\203" "\203c\205\202\201\201\201\200\200\201\202\204a\204\201W/////////////j\3\207" "\210jh\206\202\200\200\200\200\200\202\206\211\205\202\202bb\201\200\200\200" "\200\200\200\202\203b\\WW/////////////jke\206jic\203\201\200\200\200\200\202" "\211\211\201\200\200\204\210\201\200\200W\200\200\200\201\204c\\\200]////////" "//////kd\210\3\3e\205\202\200\200W\200\202\211\210\210\201\202\207\210\203" "\200WWW\200\200\202\205d\\\202///////////////kkdhigb\203\201\200\200\200\202" "\206\210\210\205\210\211\206\203\200WWW\200\201\203ce\203\205////////////////" "ijkig\211\203\201\200\200\202\206\207\207\205\206\207\210\206\203\200\200WW" "\200\203\206ce\202_//////////////////jig\210\203\202\200\201\206\210\210\205" "\204\204\205\206\206\204\202\200\200\200\200\203bcd////////////////////hjgc" "\205\202\201\203\206\210\206\204\204\202\202\204\205\206\204\200\200\200\201" "\206\207c//////////////////////j\3\207\204\203\202\202\211c\204\201W\200\200" "\203\205\206\203\200\200\200\203\206b///////////////////////ihd\204\203\202" "\201\207f\205VTVTW\202\210\206Z\200\200\203aa////////////////////////jg\204" "\204\203\201\202\210\211\211c\206\205\210d\210\200\200\200\202\204ac/////////" "///////////////j\3b\203\203\202\202\205\207\206\205\207\207\206\206\202\200" "\201\202\203ac/////////////////////////iid\206\204\203\202\204\205\377\205" "\204\205\204\203\201\200\202\203\203bc//////////////////////////ej\207\205" "\203\201\202\202\203\207\204\203\202\202\201\201\203\203bd///////////////////" "////////ee\3a\204\201\200\201\202\205\203\201\200\200\201\202\204\205cc//////" "//////////////////////c\3ec\203\201\200\200\201\202\201\200\200\202\203\206cc" "//////////////////////////////c\3f\206\203\201\200\200\200\200\200\201\203bdc" "////////////////////////////////g\3\211\206\202\\\201\200\201\202\203dde/////" "/////////////////////////////\234\3db\203\203\203\203adec////////////////////" "/////////////////hffed\211de////////////////////"[i]; c[i] = t=='/' ? color : t; } if (gametic-lastshottic < TICRATE*2 && gametic-lastshottic > TICRATE/8) V_DrawBlock(viewwindowx + viewwidth/2 - 24, viewwindowy + viewheight/2 - 24, 0, 47, 47, c, VPT_NONE); R_DrawViewBorder(); } // check for new console commands. NetUpdate (); // The head node is the last node output. R_RenderBSPNode (numnodes-1); // Check for new console commands. NetUpdate (); R_DrawPlanes (); // Check for new console commands. NetUpdate (); R_DrawMasked (); // Check for new console commands. NetUpdate (); if (rendering_stats) R_ShowStats(); }