]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
don't change gamma ramps when running dedicated
[xonotic/darkplaces.git] / model_brush.c
index b01c1c37cd1c9335fd1d870f7a580bd3d719965d..d2cee3f5fcdd1d92de8dc4161ff52656e9b51d4d 100644 (file)
@@ -8,7 +8,7 @@ of the License, or (at your option) any later version.
 
 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.
 
@@ -24,9 +24,9 @@ byte  mod_novis[MAX_MAP_LEAFS/8];
 
 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"};
 
 /*
 ===============
@@ -82,7 +82,7 @@ mleaf_t *Mod_PointInLeaf (vec3_t p, model_t *model)
                else
                        node = node->children[1];
        }
-       
+
        return NULL;    // never reached
 }
 */
@@ -613,7 +613,8 @@ void Mod_LoadSubmodels (lump_t *l)
        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]);
@@ -795,7 +796,7 @@ void Mod_LoadFaces (lump_t *l)
                out->texinfo = loadmodel->texinfo + LittleShort (in->texinfo);
 
                CalcSurfaceExtents (out);
-                               
+
        // lighting info
 
                for (i=0 ; i<MAXLIGHTMAPS ; i++)
@@ -817,7 +818,7 @@ void Mod_LoadFaces (lump_t *l)
                 && (out->texinfo->texture->name[2] == 'y' || out->texinfo->texture->name[2] == 'Y'))
                {
                        // LordHavoc: for consistency reasons, mark sky as fullbright and solid as well
-                       out->flags |= (SURF_DRAWSKY | SURF_DRAWTILED | SURF_DRAWFULLBRIGHT | SURF_DRAWNOALPHA);
+                       out->flags |= (SURF_DRAWSKY | SURF_DRAWTILED | SURF_DRAWFULLBRIGHT | SURF_DRAWNOALPHA | SURF_CLIPSOLID);
                        GL_SubdivideSurface (out);      // cut up polygon for warps
                        continue;
                }
@@ -839,7 +840,8 @@ void Mod_LoadFaces (lump_t *l)
                        GL_SubdivideSurface (out);      // cut up polygon for warps
                        continue;
                }
-
+               
+               out->flags |= SURF_CLIPSOLID;
        }
 }
 
@@ -880,11 +882,11 @@ void Mod_LoadNodes (lump_t *l)
 
        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;
@@ -1153,7 +1155,6 @@ void Mod_LoadPlanes (lump_t *l)
        mplane_t        *out;
        dplane_t        *in;
        int                     count;
-       int                     bits;
        
        in = (void *)(mod_base + l->fileofs);
        if (l->filelen % sizeof(*in))
@@ -1166,18 +1167,13 @@ void Mod_LoadPlanes (lump_t *l)
 
        for ( i=0 ; i<count ; i++, in++, out++)
        {
-               bits = 0;
                for (j=0 ; j<3 ; j++)
-               {
                        out->normal[j] = LittleFloat (in->normal[j]);
-//                     if (out->normal[j] < 0)
-//                             bits |= 1<<j;
-               }
 
                out->dist = LittleFloat (in->dist);
-               out->type = LittleLong (in->type);
-//             out->signbits = bits;
-               BoxOnPlaneSideClassify(out);
+               // LordHavoc: recalculated by PlaneClassify, FIXME: validate type and report error if type does not match normal?
+//             out->type = LittleLong (in->type);
+               PlaneClassify(out);
        }
 }
 
@@ -1204,7 +1200,7 @@ winding_t *NewWinding (int points)
                Host_Error("NewWinding: too many points\n");
 
        size = (int)((winding_t *)0)->points[points];
-       w = malloc (size);
+       w = qmalloc (size);
        memset (w, 0, size);
 
        return w;
@@ -1212,7 +1208,7 @@ winding_t *NewWinding (int points)
 
 void FreeWinding (winding_t *w)
 {
-       free (w);
+       qfree (w);
 }
 
 /*
@@ -1480,13 +1476,30 @@ AllocPortal
 portal_t *AllocPortal (void)
 {
        portal_t *p;
-       p = malloc(sizeof(portal_t));
+       p = qmalloc(sizeof(portal_t));
        memset(p, 0, sizeof(portal_t));
        p->chain = portalchain;
        portalchain = 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;
@@ -1527,13 +1540,23 @@ void Mod_FinalizePortals(void)
                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;
@@ -1558,8 +1581,11 @@ void Mod_FinalizePortals(void)
 
                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;
@@ -1574,6 +1600,7 @@ void Mod_FinalizePortals(void)
                                        VectorCopy(p->winding->points[j], point->position);
                                        point++;
                                }
+                               PlaneClassify(&portal->plane);
 
                                // link into leaf's portal chain
                                portal->next = portal->here->portals;
@@ -1595,6 +1622,7 @@ void Mod_FinalizePortals(void)
                                        VectorCopy(p->winding->points[j], point->position);
                                        point++;
                                }
+                               PlaneClassify(&portal->plane);
 
                                // link into leaf's portal chain
                                portal->next = portal->here->portals;
@@ -1605,7 +1633,7 @@ void Mod_FinalizePortals(void)
                        }
                        FreeWinding(p->winding);
                }
-               free(p);
+               qfree(p);
                p = pnext;
        }
 }
@@ -1665,7 +1693,7 @@ void RemovePortalFromNodes(portal_t *portal)
                                }
                                else if (portal->nodes[1] == node)
                                {
-                                       *portalpointer = portal->next[1];       
+                                       *portalpointer = portal->next[1];
                                        portal->nodes[1] = NULL;
                                }
                                else
@@ -1864,9 +1892,9 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer)
        int                     i, j;
        dheader_t       *header;
        dmodel_t        *bm;
-       
+
        loadmodel->type = mod_brush;
-       
+
        header = (dheader_t *)buffer;
 
        i = LittleLong (header->version);
@@ -1882,7 +1910,7 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer)
                ((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]);
 
@@ -1905,9 +1933,9 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer)
        Mod_MakeHull0 ();
 
        Mod_MakePortals();
-       
+
        mod->numframes = 2;             // regular and alternate animation
-       
+
 //
 // set up the submodels (FIXME: this is confusing)
 //
@@ -1921,10 +1949,10 @@ void Mod_LoadBrushModel (model_t *mod, void *buffer)
                        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);