qbsp: Enable loading brushes from one entity into another

Make Brush_LoadEntity() take a source and destination entity arguments. In
order for this to work, intialisation is done before calling and then the
BSP brushes generated from the source entity's map brushes are added to
whatever is already in the destination entity.

Reasons for doing this will become obvious with the following patch! :)

Signed-off-by: Kevin Shanahan <kmshanah@disenchant.net>
This commit is contained in:
Kevin Shanahan 2013-02-20 16:38:43 +10:30
parent a5ac09fbd1
commit 918333cfe9
3 changed files with 42 additions and 26 deletions

View File

@ -834,7 +834,7 @@ Brush_LoadEntity
============
*/
void
Brush_LoadEntity(mapentity_t *ent, const int hullnum)
Brush_LoadEntity(mapentity_t *dst, const mapentity_t *src, const int hullnum)
{
const char *classname;
brush_t *brush, *next, *water, *other;
@ -842,25 +842,21 @@ Brush_LoadEntity(mapentity_t *ent, const int hullnum)
vec3_t rotate_offset;
int i, contents;
for (i = 0; i < 3; i++) {
ent->mins[i] = VECT_MAX;
ent->maxs[i] = -VECT_MAX;
}
other = water = NULL;
classname = ValueForKey(src, "classname");
other = dst->brushes;
water = NULL;
// Hipnotic rotation
/* Hipnotic rotation */
VectorCopy(vec3_origin, rotate_offset);
classname = ValueForKey(ent, "classname");
if (!strncmp(classname, "rotate_", 7)) {
FixRotateOrigin(ent);
GetVectorForKey(ent, "origin", rotate_offset);
FixRotateOrigin(dst);
GetVectorForKey(dst, "origin", rotate_offset);
}
Message(msgProgress, "Brush_LoadEntity");
mapbrush = ent->mapbrushes;
ent->numbrushes = 0;
for (i = 0; i < ent->nummapbrushes; i++, mapbrush++) {
mapbrush = src->mapbrushes;
for (i = 0; i < src->nummapbrushes; i++, mapbrush++) {
contents = Brush_GetContents(mapbrush);
/* "clip" brushes don't show up in the draw hull */
@ -871,7 +867,7 @@ Brush_LoadEntity(mapentity_t *ent, const int hullnum)
}
/* entities never use water merging */
if (ent != pWorldEnt)
if (dst != pWorldEnt)
contents = CONTENTS_SOLID;
/* water brushes don't show up in clipping hulls */
@ -882,7 +878,7 @@ Brush_LoadEntity(mapentity_t *ent, const int hullnum)
if (!brush)
continue;
ent->numbrushes++;
dst->numbrushes++;
brush->contents = contents;
if (brush->contents != CONTENTS_SOLID) {
brush->next = water;
@ -892,12 +888,12 @@ Brush_LoadEntity(mapentity_t *ent, const int hullnum)
other = brush;
}
AddToBounds(ent, brush->mins);
AddToBounds(ent, brush->maxs);
AddToBounds(dst, brush->mins);
AddToBounds(dst, brush->maxs);
Message(msgPercent, i + 1, ent->nummapbrushes);
Message(msgPercent, i + 1, src->nummapbrushes);
}
Message(msgStat, "%5i brushes", ent->numbrushes);
Message(msgStat, "%5i brushes", src->numbrushes);
// add all of the water textures at the start
for (brush = water; brush; brush = next) {
@ -907,5 +903,5 @@ Brush_LoadEntity(mapentity_t *ent, const int hullnum)
}
// Store the brushes away
ent->brushes = other;
dst->brushes = other;
}

View File

@ -37,10 +37,11 @@ ProcessEntity
static void
ProcessEntity(mapentity_t *ent, const int hullnum)
{
int i;
surface_t *surfs;
node_t *nodes;
// No map brushes means non-bmodel entity
/* No map brushes means non-bmodel entity */
if (!ent->nummapbrushes)
return;
@ -57,17 +58,32 @@ ProcessEntity(mapentity_t *ent, const int hullnum)
Message(msgStat, "MODEL: %s", mod);
SetKeyValue(ent, "model", mod);
}
// take the brush_ts and clip off all overlapping and contained faces,
// leaving a perfect skin of the model with no hidden faces
Brush_LoadEntity(ent, hullnum);
/*
* Init the entity
*/
ent->brushes = NULL;
ent->numbrushes = 0;
for (i = 0; i < 3; i++) {
ent->mins[i] = VECT_MAX;
ent->maxs[i] = -VECT_MAX;
}
/*
* Convert the map brushes (planes) into BSP brushes (polygons)
*/
Brush_LoadEntity(ent, ent, hullnum);
if (!ent->brushes) {
PrintEntity(ent);
Error(errNoValidBrushes);
}
surfs = CSGFaces(ent);
/*
* Take the brush_t's and clip off all overlapping and contained faces,
* leaving a perfect skin of the model with no hidden faces
*/
surfs = CSGFaces(ent);
FreeBrushsetBrushes(ent->brushes);
if (hullnum != 0) {

View File

@ -636,7 +636,11 @@ void GetVectorForKey(const mapentity_t *ent, const char *szKey, vec3_t vec);
void WriteEntitiesToString(void);
void FixRotateOrigin(mapentity_t *ent);
void Brush_LoadEntity(mapentity_t *ent, const int hullnum);
/* Create BSP brushes from map brushes in src and save into dst */
void Brush_LoadEntity(mapentity_t *dst, const mapentity_t *src,
const int hullnum);
surface_t *CSGFaces(const mapentity_t *ent);
void PortalizeWorld(const mapentity_t *ent, node_t *headnode, const int hullnum);
void TJunc(const mapentity_t *ent, node_t *headnode);