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