]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
- fix specular stuff on Q1BSP
[xonotic/darkplaces.git] / model_brush.c
index 8ec59177e9091bb129ff65ace5bae4fdf7f0c8d8..7af9d0e7b4a225a7fc75eb93601d21ff65122082 100644 (file)
@@ -1459,6 +1459,8 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                tx->reflectfactor = 1;
                Vector4Set(tx->reflectcolor4f, 1, 1, 1, 1);
                tx->r_water_wateralpha = 1;
+               tx->specularscalemod = 1;
+               tx->specularpowermod = 1;
        }
 
        if (!m)
@@ -1644,6 +1646,8 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l)
                        // start out with no animation
                        tx->currentframe = tx;
                        tx->currentskinframe = tx->skinframes[0];
+                       tx->specularscalemod = 1; // not supported here
+                       tx->specularpowermod = 1; // not supported here
                }
        }
 
@@ -2924,26 +2928,7 @@ typedef struct portal_s
 }
 portal_t;
 
-static portal_t *portalchain;
-
-/*
-===========
-AllocPortal
-===========
-*/
-static portal_t *AllocPortal(void)
-{
-       portal_t *p;
-       p = (portal_t *)Mem_Alloc(loadmodel->mempool, sizeof(portal_t));
-       p->chain = portalchain;
-       portalchain = p;
-       return p;
-}
-
-static void FreePortal(portal_t *p)
-{
-       Mem_Free(p);
-}
+static memexpandablearray_t portalarray;
 
 static void Mod_Q1BSP_RecursiveRecalcNodeBBox(mnode_t *node)
 {
@@ -2966,8 +2951,8 @@ static void Mod_Q1BSP_RecursiveRecalcNodeBBox(mnode_t *node)
 
 static void Mod_Q1BSP_FinalizePortals(void)
 {
-       int i, j, numportals, numpoints;
-       portal_t *p, *pnext;
+       int i, j, numportals, numpoints, portalindex, portalrange = Mem_ExpandableArray_IndexRange(&portalarray);
+       portal_t *p;
        mportal_t *portal;
        mvertex_t *point;
        mleaf_t *leaf, *endleaf;
@@ -2981,11 +2966,13 @@ static void Mod_Q1BSP_FinalizePortals(void)
                VectorSet(leaf->mins,  2000000000,  2000000000,  2000000000);
                VectorSet(leaf->maxs, -2000000000, -2000000000, -2000000000);
        }
-       p = portalchain;
        numportals = 0;
        numpoints = 0;
-       while (p)
+       for (portalindex = 0;portalindex < portalrange;portalindex++)
        {
+               p = (portal_t*)Mem_ExpandableArray_RecordAtIndex(&portalarray, portalindex);
+               if (!p)
+                       continue;
                // note: this check must match the one below or it will usually corrupt memory
                // 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->numpoints >= 3 && p->nodes[0] != p->nodes[1] && ((mleaf_t *)p->nodes[0])->clusterindex >= 0 && ((mleaf_t *)p->nodes[1])->clusterindex >= 0)
@@ -2993,7 +2980,6 @@ static void Mod_Q1BSP_FinalizePortals(void)
                        numportals += 2;
                        numpoints += p->numpoints * 2;
                }
-               p = p->chain;
        }
        loadmodel->brush.data_portals = (mportal_t *)Mem_Alloc(loadmodel->mempool, numportals * sizeof(mportal_t) + numpoints * sizeof(mvertex_t));
        loadmodel->brush.num_portals = numportals;
@@ -3005,12 +2991,11 @@ static void Mod_Q1BSP_FinalizePortals(void)
        // process all portals in the global portal chain, while freeing them
        portal = loadmodel->brush.data_portals;
        point = loadmodel->brush.data_portalpoints;
-       p = portalchain;
-       portalchain = NULL;
-       while (p)
+       for (portalindex = 0;portalindex < portalrange;portalindex++)
        {
-               pnext = p->chain;
-
+               p = (portal_t*)Mem_ExpandableArray_RecordAtIndex(&portalarray, portalindex);
+               if (!p)
+                       continue;
                if (p->numpoints >= 3 && p->nodes[0] != p->nodes[1])
                {
                        // note: this check must match the one above or it will usually corrupt memory
@@ -3078,8 +3063,6 @@ static void Mod_Q1BSP_FinalizePortals(void)
                                }
                        }
                }
-               FreePortal(p);
-               p = pnext;
        }
        // now recalculate the node bounding boxes from the leafs
        Mod_Q1BSP_RecursiveRecalcNodeBBox(loadmodel->brush.data_nodes + loadmodel->brushq1.hulls[0].firstclipnode);
@@ -3181,7 +3164,7 @@ static void Mod_Q1BSP_RecursiveNodePortals(mnode_t *node)
 
        // create the new portal by generating a polygon for the node plane,
        // and clipping it by all of the other portals(which came from nodes above this one)
-       nodeportal = AllocPortal();
+       nodeportal = (portal_t *)Mem_ExpandableArray_AllocRecord(&portalarray);
        nodeportal->plane = *plane;
 
        // TODO: calculate node bounding boxes during recursion and calculate a maximum plane size accordingly to improve precision (as most maps do not need 1 billion unit plane polygons)
@@ -3264,7 +3247,7 @@ static void Mod_Q1BSP_RecursiveNodePortals(mnode_t *node)
                }
 
                // the portal is split
-               splitportal = AllocPortal();
+               splitportal = (portal_t *)Mem_ExpandableArray_AllocRecord(&portalarray);
                temp = splitportal->chain;
                *splitportal = *portal;
                splitportal->chain = temp;
@@ -3293,9 +3276,10 @@ static void Mod_Q1BSP_RecursiveNodePortals(mnode_t *node)
 
 static void Mod_Q1BSP_MakePortals(void)
 {
-       portalchain = NULL;
+       Mem_ExpandableArray_NewArray(&portalarray, loadmodel->mempool, sizeof(portal_t), 1020*1024/sizeof(portal_t));
        Mod_Q1BSP_RecursiveNodePortals(loadmodel->brush.data_nodes + loadmodel->brushq1.hulls[0].firstclipnode);
        Mod_Q1BSP_FinalizePortals();
+       Mem_ExpandableArray_FreeArray(&portalarray);
 }
 
 //Returns PVS data for a given point
@@ -3467,6 +3451,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->Draw = R_Q1BSP_Draw;
        mod->DrawDepth = R_Q1BSP_DrawDepth;
        mod->DrawDebug = R_Q1BSP_DrawDebug;
+       mod->DrawPrepass = R_Q1BSP_DrawPrepass;
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
@@ -6065,6 +6050,7 @@ void Mod_Q3BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->Draw = R_Q1BSP_Draw;
        mod->DrawDepth = R_Q1BSP_DrawDepth;
        mod->DrawDebug = R_Q1BSP_DrawDebug;
+       mod->DrawPrepass = R_Q1BSP_DrawPrepass;
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
@@ -6755,6 +6741,7 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
        loadmodel->Draw = R_Q1BSP_Draw;
        loadmodel->DrawDepth = R_Q1BSP_DrawDepth;
        loadmodel->DrawDebug = R_Q1BSP_DrawDebug;
+       loadmodel->DrawPrepass = R_Q1BSP_DrawPrepass;
        loadmodel->GetLightInfo = R_Q1BSP_GetLightInfo;
        loadmodel->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        loadmodel->DrawShadowMap = R_Q1BSP_DrawShadowMap;