mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-29 15:41:59 +00:00
Add a function to free a hull's portal information.
This commit is contained in:
parent
d3cf5c4b75
commit
f9877ce0e0
2 changed files with 47 additions and 6 deletions
|
@ -140,5 +140,6 @@ typedef struct nodeleaf_s {
|
||||||
} nodeleaf_t;
|
} nodeleaf_t;
|
||||||
|
|
||||||
nodeleaf_t *MOD_BuildBrushes (hull_t *hull);
|
nodeleaf_t *MOD_BuildBrushes (hull_t *hull);
|
||||||
|
void MOD_FreeBrushes (hull_t *hull);
|
||||||
|
|
||||||
#endif // __world_h
|
#endif // __world_h
|
||||||
|
|
|
@ -47,18 +47,20 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$";
|
||||||
|
|
||||||
#include "world.h"
|
#include "world.h"
|
||||||
|
|
||||||
static clipleaf_t *
|
|
||||||
alloc_leaf (void)
|
|
||||||
{
|
|
||||||
return calloc (1, sizeof (clipleaf_t));
|
|
||||||
}
|
|
||||||
|
|
||||||
static clipport_t *
|
static clipport_t *
|
||||||
alloc_portal (void)
|
alloc_portal (void)
|
||||||
{
|
{
|
||||||
return calloc (1, sizeof (clipport_t));
|
return calloc (1, sizeof (clipport_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_portal (clipport_t *portal)
|
||||||
|
{
|
||||||
|
FreeWinding (portal->winding);
|
||||||
|
FreeWinding (portal->edges);
|
||||||
|
free (portal);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
remove_portal (clipport_t *portal, clipleaf_t *leaf)
|
remove_portal (clipport_t *portal, clipleaf_t *leaf)
|
||||||
{
|
{
|
||||||
|
@ -75,6 +77,27 @@ remove_portal (clipport_t *portal, clipleaf_t *leaf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static clipleaf_t *
|
||||||
|
alloc_leaf (void)
|
||||||
|
{
|
||||||
|
return calloc (1, sizeof (clipleaf_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
free_leaf (clipleaf_t *leaf)
|
||||||
|
{
|
||||||
|
if (!leaf)
|
||||||
|
return;
|
||||||
|
while (leaf->portals) {
|
||||||
|
clipport_t *portal = leaf->portals;
|
||||||
|
int side = portal->leafs[1] == leaf;
|
||||||
|
leaf->portals = portal->next[side];
|
||||||
|
remove_portal (portal, portal->leafs[side ^ 1]);
|
||||||
|
free_portal (portal);
|
||||||
|
}
|
||||||
|
free (leaf);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
add_portal (clipport_t *portal, clipleaf_t *front, clipleaf_t *back)
|
add_portal (clipport_t *portal, clipleaf_t *front, clipleaf_t *back)
|
||||||
{
|
{
|
||||||
|
@ -195,3 +218,20 @@ MOD_BuildBrushes (hull_t *hull)
|
||||||
}
|
}
|
||||||
return nodeleafs;
|
return nodeleafs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MOD_FreeBrushes (hull_t *hull)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int numnodes;
|
||||||
|
|
||||||
|
if (!hull || !hull->nodeleafs)
|
||||||
|
return;
|
||||||
|
numnodes = hull->lastclipnode + 1;
|
||||||
|
for (i = 0; i < numnodes; i++) {
|
||||||
|
for (j = 0; j < 2; j++)
|
||||||
|
free_leaf (hull->nodeleafs[i].leafs[j]);
|
||||||
|
}
|
||||||
|
free (hull->nodeleafs);
|
||||||
|
hull->nodeleafs = 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue