// // 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(); }
// // 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(); } }
// // 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; }
// // 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(); }