]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
host: Move server/client-specific frametime limiting code outside of common code
[xonotic/darkplaces.git] / model_brush.c
index b56321f51ad3da6d57cb59f8386550b958c36187..d24c6878587d90aa89322e183d21979ba4744c60 100644 (file)
@@ -1183,7 +1183,7 @@ static qboolean Mod_Q1BSP_TraceLineOfSight(struct model_s *model, const vec3_t s
        return trace.fraction == 1 || BoxesOverlap(trace.endpos, trace.endpos, acceptmins, acceptmaxs);
 }
 
-static int Mod_Q1BSP_LightPoint_RecursiveBSPNode(dp_model_t *model, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const mnode_t *node, float x, float y, float startz, float endz)
+static int Mod_BSP_LightPoint_RecursiveBSPNode(dp_model_t *model, vec3_t ambientcolor, vec3_t diffusecolor, vec3_t diffusenormal, const mnode_t *node, float x, float y, float startz, float endz)
 {
        int side;
        float front, back;
@@ -1225,7 +1225,7 @@ static int Mod_Q1BSP_LightPoint_RecursiveBSPNode(dp_model_t *model, vec3_t ambie
                }
 
                // go down front side
-               if (node->children[side]->plane && Mod_Q1BSP_LightPoint_RecursiveBSPNode(model, ambientcolor, diffusecolor, diffusenormal, node->children[side], x, y, startz, mid))
+               if (node->children[side]->plane && Mod_BSP_LightPoint_RecursiveBSPNode(model, ambientcolor, diffusecolor, diffusenormal, node->children[side], x, y, startz, mid))
                        return true;    // hit something
 
                // check for impact on this node
@@ -1339,7 +1339,7 @@ static void Mod_BSP_LightPoint(dp_model_t *model, const vec3_t p, vec3_t ambient
                return;
        }
 
-       Mod_Q1BSP_LightPoint_RecursiveBSPNode(model, ambientcolor, diffusecolor, diffusenormal, model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode, p[0], p[1], p[2] + 0.125, p[2] - 65536);
+       Mod_BSP_LightPoint_RecursiveBSPNode(model, ambientcolor, diffusecolor, diffusenormal, model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode, p[0], p[1], p[2] + 0.125, p[2] - 65536);
 }
 
 static const texture_t *Mod_Q1BSP_TraceLineAgainstSurfacesFindTextureOnNode(RecursiveHullCheckTraceInfo_t *t, const dp_model_t *model, const mnode_t *node, double mid[3])
@@ -1526,7 +1526,7 @@ static void Mod_Q1BSP_TraceLineAgainstSurfaces(struct model_s *model, const fram
        VectorMA(rhc.start, rhc.trace->fraction, rhc.dist, rhc.trace->endpos);
 }
 
-static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char *inend, unsigned char *out, unsigned char *outend)
+static void Mod_BSP_DecompressVis(const unsigned char *in, const unsigned char *inend, unsigned char *out, unsigned char *outend)
 {
        int c;
        unsigned char *outstart = out;
@@ -1534,7 +1534,7 @@ static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char
        {
                if (in == inend)
                {
-                       Con_Printf("Mod_Q1BSP_DecompressVis: input underrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
+                       Con_Printf("Mod_BSP_DecompressVis: input underrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
                        return;
                }
                c = *in++;
@@ -1544,14 +1544,14 @@ static void Mod_Q1BSP_DecompressVis(const unsigned char *in, const unsigned char
                {
                        if (in == inend)
                        {
-                               Con_Printf("Mod_Q1BSP_DecompressVis: input underrun (during zero-run) on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
+                               Con_Printf("Mod_BSP_DecompressVis: input underrun (during zero-run) on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
                                return;
                        }
                        for (c = *in++;c > 0;c--)
                        {
                                if (out == outend)
                                {
-                                       Con_Printf("Mod_Q1BSP_DecompressVis: output overrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
+                                       Con_Printf("Mod_BSP_DecompressVis: output overrun on model \"%s\" (decompressed %i of %i output bytes)\n", loadmodel->name, (int)(out - outstart), (int)(outend - outstart));
                                        return;
                                }
                                *out++ = 0;
@@ -2278,14 +2278,14 @@ static void Mod_Q1BSP_LoadVertexes(sizebuf_t *sb)
        }
 }
 
-static void Mod_Q1BSP_LoadSubmodels(sizebuf_t *sb, hullinfo_t *hullinfo)
+static void Mod_BSP_LoadSubmodels(sizebuf_t *sb, hullinfo_t *hullinfo)
 {
        mmodel_t        *out;
        int                     i, j, count;
-       int                     structsize = (48+4*hullinfo->filehulls);
+       int                     structsize = hullinfo ? (48+4*hullinfo->filehulls) : 48;
 
        if (sb->cursize % structsize)
-               Host_Error ("Mod_Q1BSP_LoadSubmodels: funny lump size in %s", loadmodel->name);
+               Host_Error ("Mod_BSP_LoadSubmodels: funny lump size in %s", loadmodel->name);
 
        count = sb->cursize / structsize;
        out = (mmodel_t *)Mem_Alloc (loadmodel->mempool, count*sizeof(*out));
@@ -2305,9 +2305,15 @@ static void Mod_Q1BSP_LoadSubmodels(sizebuf_t *sb, hullinfo_t *hullinfo)
                out->origin[0] = MSG_ReadLittleFloat(sb);
                out->origin[1] = MSG_ReadLittleFloat(sb);
                out->origin[2] = MSG_ReadLittleFloat(sb);
-               for (j = 0; j < hullinfo->filehulls; j++)
-                       out->headnode[j] = MSG_ReadLittleLong(sb);
-               out->visleafs  = MSG_ReadLittleLong(sb);
+               if(hullinfo)
+               {
+                       for (j = 0; j < hullinfo->filehulls; j++)
+                               out->headnode[j] = MSG_ReadLittleLong(sb);
+                       out->visleafs  = MSG_ReadLittleLong(sb);
+               }
+               else // Quake 2 has only one hull
+                       out->headnode[0] = MSG_ReadLittleLong(sb);
+
                out->firstface = MSG_ReadLittleLong(sb);
                out->numfaces  = MSG_ReadLittleLong(sb);
        }
@@ -2828,16 +2834,16 @@ static void Mod_Q1BSP_LoadFaces(sizebuf_t *sb)
                        loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
 }
 
-static void Mod_Q1BSP_LoadNodes_RecursiveSetParent(mnode_t *node, mnode_t *parent)
+static void Mod_BSP_LoadNodes_RecursiveSetParent(mnode_t *node, mnode_t *parent)
 {
        //if (node->parent)
-       //      Host_Error("Mod_Q1BSP_LoadNodes_RecursiveSetParent: runaway recursion");
+       //      Host_Error("Mod_BSP_LoadNodes_RecursiveSetParent: runaway recursion");
        node->parent = parent;
        if (node->plane)
        {
                // this is a node, recurse to children
-               Mod_Q1BSP_LoadNodes_RecursiveSetParent(node->children[0], node);
-               Mod_Q1BSP_LoadNodes_RecursiveSetParent(node->children[1], node);
+               Mod_BSP_LoadNodes_RecursiveSetParent(node->children[0], node);
+               Mod_BSP_LoadNodes_RecursiveSetParent(node->children[1], node);
                // combine supercontents of children
                node->combinedsupercontents = node->children[0]->combinedsupercontents | node->children[1]->combinedsupercontents;
        }
@@ -2966,7 +2972,7 @@ static void Mod_Q1BSP_LoadNodes(sizebuf_t *sb)
                }
        }
 
-       Mod_Q1BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);      // sets nodes and leafs
+       Mod_BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);        // sets nodes and leafs
 }
 
 static void Mod_Q1BSP_LoadLeafs(sizebuf_t *sb)
@@ -3004,7 +3010,7 @@ static void Mod_Q1BSP_LoadLeafs(sizebuf_t *sb)
                        if (p >= loadmodel->brushq1.num_compressedpvs)
                                Con_Print("Mod_Q1BSP_LoadLeafs: invalid visofs\n");
                        else
-                               Mod_Q1BSP_DecompressVis(loadmodel->brushq1.data_compressedpvs + p, loadmodel->brushq1.data_compressedpvs + loadmodel->brushq1.num_compressedpvs, loadmodel->brush.data_pvsclusters + out->clusterindex * loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.data_pvsclusters + (out->clusterindex + 1) * loadmodel->brush.num_pvsclusterbytes);
+                               Mod_BSP_DecompressVis(loadmodel->brushq1.data_compressedpvs + p, loadmodel->brushq1.data_compressedpvs + loadmodel->brushq1.num_compressedpvs, loadmodel->brush.data_pvsclusters + out->clusterindex * loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.data_pvsclusters + (out->clusterindex + 1) * loadmodel->brush.num_pvsclusterbytes);
                }
 
                if (loadmodel->brush.isbsp2rmqe)
@@ -3848,6 +3854,28 @@ static void Mod_Q1BSP_RoundUpToHullSize(dp_model_t *cmodel, const vec3_t inmins,
 
 void Mod_CollisionBIH_TraceLineAgainstSurfaces(dp_model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, trace_t *trace, const vec3_t start, const vec3_t end, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask);
 
+void Mod_2PSB_Load(dp_model_t *mod, void *buffer, void *bufferend)
+{
+       mod->brush.isbsp2 = true;
+       mod->brush.isbsp2rmqe = true; // like bsp2 except leaf/node bounds are 16bit (unexpanded)
+       mod->modeldatatypestring = "Q1BSP2rmqe";
+       Mod_Q1BSP_Load(mod, buffer, bufferend);
+}
+
+void Mod_BSP2_Load(dp_model_t *mod, void *buffer, void *bufferend)
+{
+       mod->brush.isbsp2 = true;
+       mod->modeldatatypestring = "Q1BSP2";
+       Mod_Q1BSP_Load(mod, buffer, bufferend);
+}
+
+void Mod_HLBSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
+{
+       mod->brush.ishlbsp = true;
+       mod->modeldatatypestring = "HLBSP";
+       Mod_Q1BSP_Load(mod, buffer, bufferend);
+}
+
 void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
 {
        int i, j, k;
@@ -3872,29 +3900,9 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->brush.isq3bsp = false;
        mod->brush.skymasking = true;
        i = MSG_ReadLittleLong(&sb);
-       switch(i)
-       {
-       case BSPVERSION:
+
+       if(!mod->modeldatatypestring)
                mod->modeldatatypestring = "Q1BSP";
-               break;
-       case 30:
-               mod->brush.ishlbsp = true;
-               mod->modeldatatypestring = "HLBSP";
-               break;
-       case ('2' + 'P' * 256 + 'S' * 65536 + 'B' * 16777216):
-               mod->brush.isbsp2 = true;
-               mod->brush.isbsp2rmqe = true; // like bsp2 except leaf/node bounds are 16bit (unexpanded)
-               mod->modeldatatypestring = "Q1BSP2rmqe";
-               break;
-       case ('B' + 'S' * 256 + 'P' * 65536 + '2' * 16777216):
-               mod->brush.isbsp2 = true;
-               mod->modeldatatypestring = "Q1BSP2";
-               break;
-       default:
-               mod->modeldatatypestring = "Unknown BSP";
-               Host_Error("Mod_Q1BSP_Load: %s has wrong version number %i: supported versions are 29 (Quake), 30 (Half-Life), \"BSP2\" or \"2PSB\" (rmqe)", mod->name, i);
-               return;
-       }
 
 // fill in hull info
        VectorClear (hullinfo.hullsizes[0][0]);
@@ -3985,7 +3993,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        Mod_Q1BSP_LoadLeaffaces(&lumpsb[LUMP_MARKSURFACES]);
        Mod_Q1BSP_LoadVisibility(&lumpsb[LUMP_VISIBILITY]);
        // load submodels before leafs because they contain the number of vis leafs
-       Mod_Q1BSP_LoadSubmodels(&lumpsb[LUMP_MODELS], &hullinfo);
+       Mod_BSP_LoadSubmodels(&lumpsb[LUMP_MODELS], &hullinfo);
        Mod_Q1BSP_LoadLeafs(&lumpsb[LUMP_LEAFS]);
        Mod_Q1BSP_LoadNodes(&lumpsb[LUMP_NODES]);
        Mod_Q1BSP_LoadClipnodes(&lumpsb[LUMP_CLIPNODES], &hullinfo);
@@ -4093,7 +4101,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                mod->nummodelsurfaces = bm->numfaces;
 
                // set node/leaf parents for this submodel
-               Mod_Q1BSP_LoadNodes_RecursiveSetParent(mod->brush.data_nodes + mod->brushq1.hulls[0].firstclipnode, NULL);
+               Mod_BSP_LoadNodes_RecursiveSetParent(mod->brush.data_nodes + mod->brushq1.hulls[0].firstclipnode, NULL);
 
                // this has to occur after hull info has been set, as it uses Mod_Q1BSP_PointSuperContents
                Mod_Q1BSP_AssignNoShadowSkySurfaces(mod);
@@ -4282,7 +4290,7 @@ static void Mod_Q2BSP_LoadVisibility(sizebuf_t *sb)
                /*int phsofs = */MSG_ReadLittleLong(sb);
                // decompress the vis data for this cluster
                // (note this accesses the underlying data store of sb, which is kind of evil)
-               Mod_Q1BSP_DecompressVis(sb->data + pvsofs, sb->data + sb->cursize, loadmodel->brush.data_pvsclusters + i * loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.data_pvsclusters + (i+1) * loadmodel->brush.num_pvsclusterbytes);
+               Mod_BSP_DecompressVis(sb->data + pvsofs, sb->data + sb->cursize, loadmodel->brush.data_pvsclusters + i * loadmodel->brush.num_pvsclusterbytes, loadmodel->brush.data_pvsclusters + (i+1) * loadmodel->brush.num_pvsclusterbytes);
        }
        // hush the loading error check later - we had to do random access on this lump, so we didn't read to the end
        sb->readcount = sb->cursize;
@@ -4354,7 +4362,7 @@ static void Mod_Q2BSP_LoadNodes(sizebuf_t *sb)
                }
        }
 
-       Mod_Q1BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);      // sets nodes and leafs
+       Mod_BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);        // sets nodes and leafs
 }
 
 static void Mod_Q2BSP_LoadTexinfo(sizebuf_t *sb)
@@ -4809,40 +4817,6 @@ static void Mod_Q2BSP_LoadAreaPortals(sizebuf_t *sb)
        sb->readcount = sb->cursize;
 }
 
-static void Mod_Q2BSP_LoadSubmodels(sizebuf_t *sb)
-{
-       mmodel_t        *out;
-       int                     i, count;
-       int                     structsize = 48;
-
-       if (sb->cursize % structsize)
-               Host_Error ("Mod_Q2BSP_LoadSubmodels: funny lump size in %s", loadmodel->name);
-
-       count = sb->cursize / structsize;
-       out = (mmodel_t *)Mem_Alloc (loadmodel->mempool, count*sizeof(*out));
-
-       loadmodel->brushq1.submodels = out;
-       loadmodel->brush.numsubmodels = count;
-
-       // this is identical to the q1 submodel structure except for having 1 hull
-       for (i = 0; i < count; i++, out++)
-       {
-               // spread out the mins / maxs by a pixel
-               out->mins[0] = MSG_ReadLittleFloat(sb) - 1;
-               out->mins[1] = MSG_ReadLittleFloat(sb) - 1;
-               out->mins[2] = MSG_ReadLittleFloat(sb) - 1;
-               out->maxs[0] = MSG_ReadLittleFloat(sb) + 1;
-               out->maxs[1] = MSG_ReadLittleFloat(sb) + 1;
-               out->maxs[2] = MSG_ReadLittleFloat(sb) + 1;
-               out->origin[0] = MSG_ReadLittleFloat(sb);
-               out->origin[1] = MSG_ReadLittleFloat(sb);
-               out->origin[2] = MSG_ReadLittleFloat(sb);
-               out->headnode[0] = MSG_ReadLittleLong(sb);
-               out->firstface = MSG_ReadLittleLong(sb);
-               out->numfaces  = MSG_ReadLittleLong(sb);
-       }
-}
-
 static void Mod_Q2BSP_FindSubmodelBrushRange_r(dp_model_t *mod, mnode_t *node, int *first, int *last)
 {
        int i;
@@ -4970,7 +4944,7 @@ static void Mod_Q2BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        Mod_Q2BSP_LoadAreaPortals(&lumpsb[Q2LUMP_AREAPORTALS]);
        Mod_Q2BSP_LoadLeafs(&lumpsb[Q2LUMP_LEAFS]);
        Mod_Q2BSP_LoadNodes(&lumpsb[Q2LUMP_NODES]);
-       Mod_Q2BSP_LoadSubmodels(&lumpsb[Q2LUMP_MODELS]);
+       Mod_BSP_LoadSubmodels(&lumpsb[Q2LUMP_MODELS], NULL);
 
        for (i = 0; i < Q2HEADER_LUMPS; i++)
                if (lumpsb[i].readcount != lumpsb[i].cursize)
@@ -5064,7 +5038,7 @@ static void Mod_Q2BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                        rootnode = mod->brush.data_nodes + bm->headnode[0];
                else
                        rootnode = (mnode_t*)(mod->brush.data_leafs + -1 - bm->headnode[0]);
-               Mod_Q1BSP_LoadNodes_RecursiveSetParent(rootnode, NULL);
+               Mod_BSP_LoadNodes_RecursiveSetParent(rootnode, NULL);
 
                // make the model surface list (used by shadowing/lighting)
                mod->sortedmodelsurfaces = (int *)datapointer;datapointer += mod->nummodelsurfaces * sizeof(int);
@@ -6472,7 +6446,7 @@ static void Mod_Q3BSP_LoadNodes(lump_t *l)
        }
 
        // set the parent pointers
-       Mod_Q1BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);
+       Mod_BSP_LoadNodes_RecursiveSetParent(loadmodel->brush.data_nodes, NULL);
 }
 
 static void Mod_Q3BSP_LoadLightGrid(lump_t *l)