//=========================================================================== // // Parameter: - // Returns: - // Changes Globals: - //=========================================================================== void Tree_FreePortals_r( node_t *node ) { portal_t *p, *nextp; int s; // free children if ( node->planenum != PLANENUM_LEAF ) { Tree_FreePortals_r( node->children[0] ); Tree_FreePortals_r( node->children[1] ); } // free portals for ( p = node->portals; p; p = nextp ) { s = ( p->nodes[1] == node ); nextp = p->next[s]; RemovePortalFromNode( p, p->nodes[!s] ); #ifdef ME if ( p->winding ) { freedtreemem += MemorySize( p->winding ); } freedtreemem += MemorySize( p ); #endif //ME FreePortal( p ); } node->portals = NULL; } //end of the function Tree_FreePortals_r
void FreePortals(node_t* node) { portal_t* p; portal_t* nextp; if (node->planenum != -1) { FreePortals(node->children[0]); FreePortals(node->children[1]); return; } for (p = node->portals; p; p = nextp) { if (p->nodes[0] == node) { nextp = p->next[0]; } else { nextp = p->next[1]; } RemovePortalFromNode(p, p->nodes[0]); RemovePortalFromNode(p, p->nodes[1]); delete p->winding; FreePortal(p); } }
//===================================================================================== // FreePOrtals_r //===================================================================================== geBoolean FreePortals_r(GBSP_Node *Node) { GBSP_Portal *Portal, *Next; int32 Side; if (!Node) return GE_TRUE; for (Portal = Node->Portals; Portal; Portal = Next) { if (Portal->Nodes[0] == Node) Side = 0; else if (Portal->Nodes[1] == Node) Side = 1; else { GHook.Error("FreePortals_r: Portal does not look at either node.\n"); return GE_FALSE; } Next = Portal->Next[Side]; if (!RemovePortalFromNode(Portal, Portal->Nodes[0])) return GE_FALSE; if (!RemovePortalFromNode(Portal, Portal->Nodes[1])) return GE_FALSE; if (!FreePortal(Portal)) return GE_FALSE; } Node->Portals = NULL; if (Node->PlaneNum == PLANENUM_LEAF) return GE_TRUE; if (!FreePortals_r(Node->Children[0])) return GE_FALSE; if (!FreePortals_r(Node->Children[1])) return GE_FALSE; return GE_TRUE; }
/* ================== MakeNodePortal create the new portal by taking the full plane winding for the cutting plane and clipping it by all of the planes from the other portals. Each portal tracks the node that created it, so unused nodes can be removed later. ================== */ void MakeNodePortal (node_t *node) { portal_t *new_portal, *p; dplane_t *plane; dplane_t clipplane; winding_t *w; int side; plane = &dplanes[node->planenum]; w = BaseWindingForPlane (plane); new_portal = AllocPortal (); new_portal->plane = *plane; new_portal->onnode = node; side = 0; // shut up compiler warning for (p = node->portals ; p ; p = p->next[side]) { clipplane = p->plane; if (p->nodes[0] == node) side = 0; else if (p->nodes[1] == node) { clipplane.dist = -clipplane.dist; VectorSubtract (vec3_origin, clipplane.normal, clipplane.normal); side = 1; } else Error ("MakeNodePortal: mislinked portal"); w = ClipWinding (w, &clipplane, true); if (!w) { printf ("WARNING: MakeNodePortal:new portal was clipped away from node@(%.0f,%.0f,%.0f)-(%.0f,%.0f,%.0f)\n", node->mins[0], node->mins[1], node->mins[2], node->maxs[0], node->maxs[1], node->maxs[2]); FreePortal (new_portal); return; } } new_portal->winding = w; AddPortalToNodes (new_portal, node->children[0], node->children[1]); }
static void FreeTreePortals_r (node_t *node) { portal_t *p, *nextp; /* free children */ if (node->planenum != PLANENUM_LEAF) { FreeTreePortals_r(node->children[0]); FreeTreePortals_r(node->children[1]); } /* free portals */ for (p = node->portals; p; p = nextp) { const int s = (p->nodes[1] == node); nextp = p->next[s]; RemovePortalFromNode(p, p->nodes[!s]); FreePortal(p); } node->portals = nullptr; }
/* ============= FreeTreePortals_r ============= */ void FreeTreePortals_r( node_t *node ){ portal_t *p, *nextp; int s; // free children if ( node->planenum != PLANENUM_LEAF ) { FreeTreePortals_r( node->children[0] ); FreeTreePortals_r( node->children[1] ); } // free portals for ( p = node->portals ; p ; p = nextp ) { s = ( p->nodes[1] == node ); nextp = p->next[s]; RemovePortalFromNode( p, p->nodes[!s] ); FreePortal( p ); } node->portals = NULL; }
/* ================== FreeNodePortals_r ================== */ static void FreeNodePortals_r (node_t *node) { portal_t *p, *nextp; if (!node->contents) { FreeNodePortals_r (node->children[0]); FreeNodePortals_r (node->children[1]); } for (p=node->portals ; p ; p=nextp) { if (p->nodes[0] == node) nextp = p->next[0]; else nextp = p->next[1]; RemovePortalFromNode (p, p->nodes[0]); RemovePortalFromNode (p, p->nodes[1]); FreeWinding (p->winding); FreePortal (p); } }