void gl_RenderBSPNode (void *node) { if (numnodes == 0) { DoSubsector (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(viewx, viewy, bsp); // Recursively divide front space (toward the viewer). gl_RenderBSPNode (bsp->children[side]); // Possibly divide back space (away from the viewer). side ^= 1; if (!clipper.CheckBox(bsp->bbox[side])) { return; } node = bsp->children[side]; } DoSubsector ((subsector_t *)((BYTE *)node - 1)); }
void FGLRenderer::CreateScene() { // reset the portal manager GLPortal::StartFrame(); PO_LinkToSubsectors(); ProcessAll.Clock(); // clip the scene and fill the drawlists for(unsigned i=0;i<portals.Size(); i++) portals[i]->glportal = NULL; gl_spriteindex=0; Bsp.Clock(); GLRenderer->mVBO->Map(); R_SetView(); validcount++; // used for processing sidedefs only once by the renderer. gl_RenderBSPNode (nodes + numnodes - 1); if (GLRenderer->mCurrentPortal != NULL) GLRenderer->mCurrentPortal->RenderAttached(); Bsp.Unclock(); // And now the crappy hacks that have to be done to avoid rendering anomalies: gl_drawinfo->HandleMissingTextures(); // Missing upper/lower textures gl_drawinfo->HandleHackedSubsectors(); // open sector hacks for deep water gl_drawinfo->ProcessSectorStacks(); // merge visplanes of sector stacks GLRenderer->mVBO->Unmap(); ProcessAll.Unclock(); }