This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
qboolean hlbsp; // LordHavoc: true if it is a HalfLife BSP file (version 30)
-cvar_t gl_subdivide_size = {"gl_subdivide_size", "128", true};
-cvar_t halflifebsp = {"halflifebsp", "0"};
-cvar_t r_novis = {"r_novis", "0"};
+cvar_t gl_subdivide_size = {CVAR_SAVE, "gl_subdivide_size", "128"};
+cvar_t halflifebsp = {0, "halflifebsp", "0"};
+cvar_t r_novis = {0, "r_novis", "0"};
/*
===============
else
node = node->children[1];
}
-
+
return NULL; // never reached
}
*/
for ( i=0 ; i<count ; i++, in++, out++)
{
for (j=0 ; j<3 ; j++)
- { // spread the mins / maxs by a pixel
+ {
+ // spread the mins / maxs by a pixel
out->mins[j] = LittleFloat (in->mins[j]) - 1;
out->maxs[j] = LittleFloat (in->maxs[j]) + 1;
out->origin[j] = LittleFloat (in->origin[j]);
out->texinfo = loadmodel->texinfo + LittleShort (in->texinfo);
CalcSurfaceExtents (out);
-
+
// lighting info
for (i=0 ; i<MAXLIGHTMAPS ; i++)
for ( i=0 ; i<count ; i++, in++, out++)
{
-// for (j=0 ; j<3 ; j++)
-// {
-// out->mins[j] = LittleShort (in->mins[j]);
-// out->maxs[j] = LittleShort (in->maxs[j]);
-// }
+ for (j=0 ; j<3 ; j++)
+ {
+ out->mins[j] = LittleShort (in->mins[j]);
+ out->maxs[j] = LittleShort (in->maxs[j]);
+ }
p = LittleLong(in->planenum);
out->plane = loadmodel->planes + p;
return p;
}
+void Mod_RecursiveRecalcNodeBBox(mnode_t *node)
+{
+ // calculate children first
+ if (node->children[0]->contents >= 0)
+ Mod_RecursiveRecalcNodeBBox(node->children[0]);
+ if (node->children[1]->contents >= 0)
+ Mod_RecursiveRecalcNodeBBox(node->children[1]);
+
+ // make combined bounding box from children
+ node->mins[0] = min(node->children[0]->mins[0], node->children[1]->mins[0]);
+ node->mins[1] = min(node->children[0]->mins[1], node->children[1]->mins[1]);
+ node->mins[2] = min(node->children[0]->mins[2], node->children[1]->mins[2]);
+ node->maxs[0] = max(node->children[0]->maxs[0], node->children[1]->maxs[0]);
+ node->maxs[1] = max(node->children[0]->maxs[1], node->children[1]->maxs[1]);
+ node->maxs[2] = max(node->children[0]->maxs[2], node->children[1]->maxs[2]);
+}
+
void Mod_FinalizePortals(void)
{
int i, j, numportals, numpoints;
p = p->chain;
}
+// Hunk_Check();
+
+ Mod_RecursiveRecalcNodeBBox(loadmodel->nodes);
+
+// Hunk_Check();
+
// tally up portal and point counts
p = portalchain;
numportals = 0;
numpoints = 0;
while(p)
{
- if (p->winding && p->nodes[0] != p->nodes[1] && p->nodes[0]->contents != CONTENTS_SOLID && p->nodes[1]->contents != CONTENTS_SOLID)
+ // note: this check must match the one below or it will usually corrupt the hunk
+ // the nodes[0] != nodes[1] check is because leaf 0 is the shared solid leaf, it can have many portals inside with leaf 0 on both sides
+ if (p->winding && p->nodes[0] != p->nodes[1]
+ && p->nodes[0]->contents != CONTENTS_SOLID && p->nodes[1]->contents != CONTENTS_SOLID
+ && p->nodes[0]->contents != CONTENTS_SKY && p->nodes[1]->contents != CONTENTS_SKY)
{
numportals += 2;
numpoints += p->winding->numpoints * 2;
if (p->winding)
{
+ // note: this check must match the one below or it will usually corrupt the hunk
// the nodes[0] != nodes[1] check is because leaf 0 is the shared solid leaf, it can have many portals inside with leaf 0 on both sides
- if (p->nodes[0] != p->nodes[1] && p->nodes[0]->contents != CONTENTS_SOLID && p->nodes[1]->contents != CONTENTS_SOLID)
+ if (p->nodes[0] != p->nodes[1]
+ && p->nodes[0]->contents != CONTENTS_SOLID && p->nodes[1]->contents != CONTENTS_SOLID
+ && p->nodes[0]->contents != CONTENTS_SKY && p->nodes[1]->contents != CONTENTS_SKY)
{
// first make the back to front portal (forward portal)
portal->points = point;
}
else if (portal->nodes[1] == node)
{
- *portalpointer = portal->next[1];
+ *portalpointer = portal->next[1];
portal->nodes[1] = NULL;
}
else
int i, j;
dheader_t *header;
dmodel_t *bm;
-
+
loadmodel->type = mod_brush;
-
+
header = (dheader_t *)buffer;
i = LittleLong (header->version);
((int *)header)[i] = LittleLong ( ((int *)header)[i]);
// load into heap
-
+
// LordHavoc: had to move entity loading above everything to allow parsing various settings from worldspawn
Mod_LoadEntities (&header->lumps[LUMP_ENTITIES]);
Mod_MakeHull0 ();
Mod_MakePortals();
-
+
mod->numframes = 2; // regular and alternate animation
-
+
//
// set up the submodels (FIXME: this is confusing)
//
mod->hulls[j].firstclipnode = bm->headnode[j];
mod->hulls[j].lastclipnode = mod->numclipnodes - 1;
}
-
+
mod->firstmodelsurface = bm->firstface;
mod->nummodelsurfaces = bm->numfaces;
-
+
VectorCopy (bm->maxs, mod->maxs);
VectorCopy (bm->mins, mod->mins);