]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
Split the global cmd interpreter into 4 separate ones for specific uses (client conso...
[xonotic/darkplaces.git] / model_brush.c
index e6451a0555cba0dfdbedad30916e01c508e11f2d..79609fb13d2cc1c2667f969d63ad5459828c4dc2 100644 (file)
@@ -57,6 +57,7 @@ cvar_t mod_q3shader_default_offsetmapping_scale = {CVAR_SAVE, "mod_q3shader_defa
 cvar_t mod_q3shader_default_offsetmapping_bias = {CVAR_SAVE, "mod_q3shader_default_offsetmapping_bias", "0", "default bias used for offsetmapping"};
 cvar_t mod_q3shader_default_polygonfactor = {0, "mod_q3shader_default_polygonfactor", "0", "biases depth values of 'polygonoffset' shaders to prevent z-fighting artifacts"};
 cvar_t mod_q3shader_default_polygonoffset = {0, "mod_q3shader_default_polygonoffset", "-2", "biases depth values of 'polygonoffset' shaders to prevent z-fighting artifacts"};
+cvar_t mod_q3shader_default_refractive_index = { 0, "mod_q3shader_default_refractive_index", "1.33", "angle of refraction specified as n to apply when a photon is refracted, example values are: 1.0003 = air, water = 1.333, crown glass = 1.517, flint glass = 1.655, diamond = 2.417" };
 cvar_t mod_q3shader_force_addalpha = {0, "mod_q3shader_force_addalpha", "0", "treat GL_ONE GL_ONE (or add) blendfunc as GL_SRC_ALPHA GL_ONE for compatibility with older DarkPlaces releases"};
 cvar_t mod_q3shader_force_terrain_alphaflag = {0, "mod_q3shader_force_terrain_alphaflag", "0", "for multilayered terrain shaders force TEXF_ALPHA flag on both layers"};
 
@@ -105,6 +106,7 @@ void Mod_BrushInit(void)
        Cvar_RegisterVariable(&mod_q3shader_default_offsetmapping_bias);
        Cvar_RegisterVariable(&mod_q3shader_default_polygonfactor);
        Cvar_RegisterVariable(&mod_q3shader_default_polygonoffset);
+       Cvar_RegisterVariable(&mod_q3shader_default_refractive_index);
        Cvar_RegisterVariable(&mod_q3shader_force_addalpha);
        Cvar_RegisterVariable(&mod_q3shader_force_terrain_alphaflag);
        Cvar_RegisterVariable(&mod_q1bsp_polygoncollisions);
@@ -149,7 +151,7 @@ static mleaf_t *Mod_Q1BSP_PointInLeaf(dp_model_t *model, const vec3_t p)
        if (model == NULL)
                return NULL;
 
-       // LordHavoc: modified to start at first clip node,
+       // LadyHavoc: modified to start at first clip node,
        // in other words: first node of the (sub)model
        node = model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode;
        while (node->plane)
@@ -993,7 +995,7 @@ static void Mod_Q1BSP_TraceBox(struct model_s *model, const frameblend_t *frameb
                rhc.hull = &model->brushq1.hulls[0]; // 0x0x0
        else if (model->brush.ishlbsp)
        {
-               // LordHavoc: this has to have a minor tolerance (the .1) because of
+               // LadyHavoc: this has to have a minor tolerance (the .1) because of
                // minor float precision errors from the box being transformed around
                if (boxsize[0] < 32.1)
                {
@@ -1007,7 +1009,7 @@ static void Mod_Q1BSP_TraceBox(struct model_s *model, const frameblend_t *frameb
        }
        else
        {
-               // LordHavoc: this has to have a minor tolerance (the .1) because of
+               // LadyHavoc: this has to have a minor tolerance (the .1) because of
                // minor float precision errors from the box being transformed around
                if (boxsize[0] < 32.1)
                        rhc.hull = &model->brushq1.hulls[1]; // 32x32x56
@@ -1305,11 +1307,11 @@ static int Mod_Q1BSP_LightPoint_RecursiveBSPNode(dp_model_t *model, vec3_t ambie
                                        w11 = (    dsfrac) * (    dtfrac) * (1.0f / 128.0f);
 
                                        // values for pointer math
-                                       line3 = lmwidth * 3; // LordHavoc: *3 for colored lighting
-                                       size3 = lmwidth * lmheight * 3; // LordHavoc: *3 for colored lighting
+                                       line3 = lmwidth * 3; // LadyHavoc: *3 for colored lighting
+                                       size3 = lmwidth * lmheight * 3; // LadyHavoc: *3 for colored lighting
 
                                        // look up the pixel
-                                       lightmap = surface->lightmapinfo->samples + dti * line3 + dsi*3; // LordHavoc: *3 for colored lighting
+                                       lightmap = surface->lightmapinfo->samples + dti * line3 + dsi*3; // LadyHavoc: *3 for colored lighting
 
                                        // bilinear filter each lightmap style, and sum them
                                        for (maps = 0;maps < MAXLIGHTMAPS && surface->lightmapinfo->styles[maps] != 255;maps++)
@@ -1463,7 +1465,7 @@ static int Mod_Q1BSP_TraceLineAgainstSurfacesRecursiveBSPNode(RecursiveHullCheck
                }
 
                // the line intersects, find intersection point
-               // LordHavoc: this uses the original trace for maximum accuracy
+               // LadyHavoc: this uses the original trace for maximum accuracy
                if (plane->type < 3)
                {
                        t1 = t->start[plane->type] - plane->dist;
@@ -1636,8 +1638,8 @@ static void R_Q1BSP_LoadSplitSky (unsigned char *src, int width, int height, int
                }
        }
 
-       loadmodel->brush.solidskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_solidtexture", 0         , (unsigned char *) solidpixels, w, h, vid.sRGB3D);
-       loadmodel->brush.alphaskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_alphatexture", TEXF_ALPHA, (unsigned char *) alphapixels, w, h, vid.sRGB3D);
+       loadmodel->brush.solidskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_solidtexture", 0         , (unsigned char *) solidpixels, w, h, 0, 0, 0, vid.sRGB3D);
+       loadmodel->brush.alphaskyskinframe = R_SkinFrame_LoadInternalBGRA("sky_alphatexture", TEXF_ALPHA, (unsigned char *) alphapixels, w, h, 0, 0, 0, vid.sRGB3D);
        Mem_Free(solidpixels);
        Mem_Free(alphapixels);
 }
@@ -1700,7 +1702,7 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                }
 
                // bump it back to where we started parsing
-               sb->readcount = watermark;
+               sb->readcount = (int)watermark;
 
                firstskynoshadowtexture = loadmodel->num_textures;
                loadmodel->num_textures += numsky;
@@ -1745,6 +1747,7 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                // clear water settings
                tx->reflectmin = 0;
                tx->reflectmax = 1;
+               tx->refractive_index = mod_q3shader_default_refractive_index.value;
                tx->refractfactor = 1;
                Vector4Set(tx->refractcolor4f, 1, 1, 1, 1);
                tx->reflectfactor = 1;
@@ -1771,7 +1774,7 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                s += 5;
        FS_StripExtension(s, mapname, sizeof(mapname));
 
-       // LordHavoc: mostly rewritten map texture loader
+       // LadyHavoc: mostly rewritten map texture loader
        for (i = 0;i < nummiptex;i++)
        {
                doffset = MSG_ReadLittleLong(sb);
@@ -1819,14 +1822,14 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                if ((mtwidth & 15) || (mtheight & 15))
                        Con_DPrintf("%s: warning: texture \"%s\" is not 16 aligned\n", loadmodel->name, name);
 
-               // LordHavoc: force all names to lowercase
+               // LadyHavoc: force all names to lowercase
                for (j = 0;name[j];j++)
                        if (name[j] >= 'A' && name[j] <= 'Z')
                                name[j] += 'a' - 'A';
 
-               // LordHavoc: backup the texture_t because q3 shader loading overwrites it
+               // LadyHavoc: backup the texture_t because q3 shader loading overwrites it
                backuptex = loadmodel->data_textures[i];
-               if (name[0] && Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, loadmodel->data_textures + i, name, false, false, 0))
+               if (name[0] && Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, loadmodel->data_textures + i, name, false, false, 0, MATERIALFLAG_WALL))
                        continue;
                loadmodel->data_textures[i] = backuptex;
 
@@ -1873,7 +1876,7 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
 
                if (cls.state != ca_dedicated)
                {
-                       // LordHavoc: HL sky textures are entirely different than quake
+                       // LadyHavoc: HL sky textures are entirely different than quake
                        if (!loadmodel->brush.ishlbsp && !strncmp(tx->name, "sky", 3) && mtwidth == mtheight * 2)
                        {
                                data = loadimagepixelsbgra(gamemode == GAME_TENEBRAE ? tx->name : va(vabuf, sizeof(vabuf), "textures/%s/%s", mapname, tx->name), false, false, false, NULL);
@@ -1910,7 +1913,7 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                                                {
                                                        tx->width = image_width;
                                                        tx->height = image_height;
-                                                       skinframe = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP, pixels, image_width, image_height, true);
+                                                       skinframe = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP, pixels, image_width, image_height, image_width, image_height, CRC_Block(pixels, image_width * image_height * 4), true);
                                                }
                                                if (freepixels)
                                                        Mem_Free(freepixels);
@@ -1922,18 +1925,18 @@ static void Mod_Q1BSP_LoadTextures(sizebuf_t *sb)
                                if (skinframe)
                                        tx->materialshaderpass->skinframes[0] = skinframe;
                        }
-                       // LordHavoc: some Tenebrae textures get replaced by black
+                       // LadyHavoc: some Tenebrae textures get replaced by black
                        if (!strncmp(tx->name, "*glassmirror", 12)) // Tenebrae
-                               tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_MIPMAP | TEXF_ALPHA, zerotrans, 1, 1, false);
+                               tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, TEXF_MIPMAP | TEXF_ALPHA, zerotrans, 1, 1, 0, 0, 0, false);
                        else if (!strncmp(tx->name, "mirror", 6)) // Tenebrae
-                               tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, 0, zeroopaque, 1, 1, false);
+                               tx->materialshaderpass->skinframes[0] = R_SkinFrame_LoadInternalBGRA(tx->name, 0, zeroopaque, 1, 1, 0, 0, 0, false);
                        tx->currentskinframe = tx->materialshaderpass->skinframes[0];
                }
 
                tx->basematerialflags = MATERIALFLAG_WALL;
                if (tx->name[0] == '*')
                {
-                       // LordHavoc: some turbulent textures should not be affected by wateralpha
+                       // LadyHavoc: some turbulent textures should not be affected by wateralpha
                        if (!strncmp(tx->name, "*glassmirror", 12)) // Tenebrae
                                tx->basematerialflags |= MATERIALFLAG_NOSHADOW | MATERIALFLAG_ADD | MATERIALFLAG_BLENDED | MATERIALFLAG_REFLECTION;
                        else if (!strncmp(tx->name,"*lava",5)
@@ -2104,15 +2107,15 @@ static void Mod_Q1BSP_LoadLighting(sizebuf_t *sb)
        char litfilename[MAX_QPATH];
        char dlitfilename[MAX_QPATH];
        fs_offset_t filesize;
-       if (loadmodel->brush.ishlbsp) // LordHavoc: load the colored lighting data straight
+       if (loadmodel->brush.ishlbsp) // LadyHavoc: load the colored lighting data straight
        {
                loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize);
                for (i = 0;i < sb->cursize;i++)
                        loadmodel->brushq1.lightdata[i] = sb->data[i] >>= 1;
        }
-       else // LordHavoc: bsp version 29 (normal white lighting)
+       else // LadyHavoc: bsp version 29 (normal white lighting)
        {
-               // LordHavoc: hope is not lost yet, check for a .lit file to load
+               // LadyHavoc: hope is not lost yet, check for a .lit file to load
                strlcpy (litfilename, loadmodel->name, sizeof (litfilename));
                FS_StripExtension (litfilename, litfilename, sizeof (litfilename));
                strlcpy (dlitfilename, litfilename, sizeof (dlitfilename));
@@ -2165,7 +2168,7 @@ static void Mod_Q1BSP_LoadLighting(sizebuf_t *sb)
                                data = NULL;
                        }
                }
-               // LordHavoc: oh well, expand the white lighting data
+               // LadyHavoc: oh well, expand the white lighting data
                if (!sb->cursize)
                        return;
                loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize*3);
@@ -2587,7 +2590,7 @@ static void Mod_Q1BSP_LoadFaces(sizebuf_t *sb)
                totaltris += numedges - 2;
        }
 
-       Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, false, false);
+       Mod_AllocSurfMesh(loadmodel->mempool, totalverts, totaltris, true, false);
 
        lightmaptexture = NULL;
        deluxemaptexture = r_texture_blanknormalmap;
@@ -2707,9 +2710,9 @@ static void Mod_Q1BSP_LoadFaces(sizebuf_t *sb)
                        }
 #endif
                }
-               else if (loadmodel->brush.ishlbsp || loadmodel->brush.isq2bsp) // LordHavoc: HalfLife map (bsp version 30)
+               else if (loadmodel->brush.ishlbsp || loadmodel->brush.isq2bsp) // LadyHavoc: HalfLife map (bsp version 30)
                        surface->lightmapinfo->samples = loadmodel->brushq1.lightdata + lightmapoffset;
-               else // LordHavoc: white lighting (bsp version 29)
+               else // LadyHavoc: white lighting (bsp version 29)
                {
                        surface->lightmapinfo->samples = loadmodel->brushq1.lightdata + (lightmapoffset * 3);
                        if (loadmodel->brushq1.nmaplightdata)
@@ -2802,7 +2805,7 @@ static void Mod_Q1BSP_LoadFaces(sizebuf_t *sb)
                                v = ((DotProduct(((loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex) + i * 3), surface->lightmapinfo->texinfo->vecs[1]) + surface->lightmapinfo->texinfo->vecs[1][3]) + 8 - surface->lightmapinfo->texturemins[1]) * (1.0 / 16.0);
                                (loadmodel->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 0] = u * uscale + ubase;
                                (loadmodel->surfmesh.data_texcoordlightmap2f + 2 * surface->num_firstvertex)[i * 2 + 1] = v * vscale + vbase;
-                               // LordHavoc: calc lightmap data offset for vertex lighting to use
+                               // LadyHavoc: calc lightmap data offset for vertex lighting to use
                                iu = (int) u;
                                iv = (int) v;
                                (loadmodel->surfmesh.data_lightmapoffsets + surface->num_firstvertex)[i] = (bound(0, iv, tmax) * ssize + bound(0, iu, smax)) * 3;
@@ -2940,7 +2943,7 @@ static void Mod_Q1BSP_LoadNodes(sizebuf_t *sb)
 
                for (j=0 ; j<2 ; j++)
                {
-                       // LordHavoc: this code supports broken bsp files produced by
+                       // LadyHavoc: this code supports broken bsp files produced by
                        // arguire qbsp which can produce more than 32768 nodes, any value
                        // below count is assumed to be a node number, any other value is
                        // assumed to be a leaf number
@@ -3137,7 +3140,7 @@ static void Mod_Q1BSP_LoadClipnodes(sizebuf_t *sb, hullinfo_t *hullinfo)
                }
                else
                {
-                       // LordHavoc: this code supports arguire qbsp's broken clipnodes indices (more than 32768 clipnodes), values above count are assumed to be contents values
+                       // LadyHavoc: this code supports arguire qbsp's broken clipnodes indices (more than 32768 clipnodes), values above count are assumed to be contents values
                        out->children[0] = (unsigned short)MSG_ReadLittleShort(sb);
                        out->children[1] = (unsigned short)MSG_ReadLittleShort(sb);
                        if (out->children[0] >= count)
@@ -3852,31 +3855,6 @@ static void Mod_Q1BSP_RoundUpToHullSize(dp_model_t *cmodel, const vec3_t inmins,
        VectorAdd(inmins, hull->clip_size, outmaxs);
 }
 
-static int Mod_Q1BSP_CreateShadowMesh(dp_model_t *mod)
-{
-       int j;
-       int numshadowmeshtriangles = 0;
-       msurface_t *surface;
-       if (cls.state == ca_dedicated)
-               return 0;
-       // make a single combined shadow mesh to allow optimized shadow volume creation
-
-       for (j = 0, surface = mod->data_surfaces;j < mod->num_surfaces;j++, surface++)
-       {
-               surface->num_firstshadowmeshtriangle = numshadowmeshtriangles;
-               numshadowmeshtriangles += surface->num_triangles;
-       }
-       mod->brush.shadowmesh = Mod_ShadowMesh_Begin(mod->mempool, numshadowmeshtriangles * 3, numshadowmeshtriangles, NULL, NULL, NULL, false, false, true);
-       for (j = 0, surface = mod->data_surfaces;j < mod->num_surfaces;j++, surface++)
-               if (surface->num_triangles > 0)
-                       Mod_ShadowMesh_AddMesh(mod->mempool, mod->brush.shadowmesh, NULL, NULL, NULL, mod->surfmesh.data_vertex3f, NULL, NULL, NULL, NULL, surface->num_triangles, (mod->surfmesh.data_element3i + 3 * surface->num_firsttriangle));
-       mod->brush.shadowmesh = Mod_ShadowMesh_Finish(mod->mempool, mod->brush.shadowmesh, false, r_enableshadowvolumes.integer != 0, false);
-       if (mod->brush.shadowmesh && mod->brush.shadowmesh->neighbor3i)
-               Mod_BuildTriangleNeighbors(mod->brush.shadowmesh->neighbor3i, mod->brush.shadowmesh->element3i, mod->brush.shadowmesh->numtriangles);
-
-       return numshadowmeshtriangles;
-}
-
 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_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
@@ -3986,8 +3964,6 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
-       mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
-       mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
        mod->DrawLight = R_Q1BSP_DrawLight;
 
 // load into heap
@@ -4043,13 +4019,10 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->numframes = 2;             // regular and alternate animation
        mod->numskins = 1;
 
-       // make a single combined shadow mesh to allow optimized shadow volume creation
-       Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
        if (loadmodel->brush.numsubmodels)
                loadmodel->brush.submodels = (dp_model_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
 
-       // LordHavoc: to clear the fog around the original quake submodel code, I
+       // LadyHavoc: to clear the fog around the original quake submodel code, I
        // will explain:
        // first of all, some background info on the submodels:
        // model 0 is the map model (the world, named maps/e1m1.bsp for example)
@@ -4060,7 +4033,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        // the number i), at the end of the loop it duplicates the model to become
        // the next submodel, and loops back to set up the new submodel.
 
-       // LordHavoc: now the explanation of my sane way (which works identically):
+       // LadyHavoc: now the explanation of my sane way (which works identically):
        // set up the world model, then on each submodel copy from the world model
        // and set up the submodel with the respective model info.
        totalstylesurfaces = 0;
@@ -4084,7 +4057,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        datapointer = (unsigned char *)Mem_Alloc(mod->mempool, mod->num_surfaces * sizeof(int) + totalstyles * sizeof(model_brush_lightstyleinfo_t) + totalstylesurfaces * sizeof(int *));
        for (i = 0;i < mod->brush.numsubmodels;i++)
        {
-               // LordHavoc: this code was originally at the end of this loop, but
+               // LadyHavoc: this code was originally at the end of this loop, but
                // has been transformed to something more readable at the start here.
 
                if (i > 0)
@@ -4218,7 +4191,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                }
                else
                {
-                       // LordHavoc: empty submodel(lacrima.bsp has such a glitch)
+                       // LadyHavoc: empty submodel(lacrima.bsp has such a glitch)
                        Con_Printf("warning: empty submodel *%i in %s\n", i+1, loadmodel->name);
                }
                //mod->brushq1.num_visleafs = bm->visleafs;
@@ -4439,7 +4412,7 @@ static void Mod_Q2BSP_LoadTexinfo(sizebuf_t *sb)
                                int q2flags = out->q2flags;
                                unsigned char *walfile = NULL;
                                fs_offset_t walfilesize = 0;
-                               Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, tx, filename, true, true, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS);
+                               Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, tx, filename, true, true, TEXF_ALPHA | TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, MATERIALFLAG_WALL);
                                // now read the .wal file to get metadata (even if a .tga was overriding it, we still need the wal data)
                                walfile = FS_LoadFile(filename, tempmempool, true, &walfilesize);
                                if (walfile)
@@ -4600,7 +4573,7 @@ static void Mod_Q2BSP_LoadTexinfo(sizebuf_t *sb)
 
 static void Mod_Q2BSP_LoadLighting(sizebuf_t *sb)
 {
-       // LordHavoc: this fits exactly the same format that we use in .lit files
+       // LadyHavoc: this fits exactly the same format that we use in .lit files
        loadmodel->brushq1.lightdata = (unsigned char *)Mem_Alloc(loadmodel->mempool, sb->cursize);
        MSG_ReadBytes(sb, sb->cursize, loadmodel->brushq1.lightdata);
 }
@@ -4969,8 +4942,6 @@ static void Mod_Q2BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
-       mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
-       mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
        mod->DrawLight = R_Q1BSP_DrawLight;
 
 // load into heap
@@ -5031,9 +5002,6 @@ static void Mod_Q2BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->numframes = 0;             // q2bsp animations are kind of special, frame is unbounded...
        mod->numskins = 1;
 
-       // make a single combined shadow mesh to allow optimized shadow volume creation
-       Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
        if (loadmodel->brush.numsubmodels)
                loadmodel->brush.submodels = (dp_model_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
 
@@ -5309,7 +5277,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l)
        {
                out[i].surfaceflags = LittleLong(in[i].surfaceflags);
                out[i].supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(LittleLong(in[i].contents));
-               Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, out + i, in[i].name, true, true, TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS);
+               Mod_LoadTextureFromQ3Shader(loadmodel->mempool, loadmodel->name, out + i, in[i].name, true, true, TEXF_MIPMAP | TEXF_ISWORLD | TEXF_PICMIP | TEXF_COMPRESS, MATERIALFLAG_WALL);
                // restore the surfaceflags and supercontents
                out[i].surfaceflags = LittleLong(in[i].surfaceflags);
                out[i].supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(LittleLong(in[i].contents));
@@ -5938,7 +5906,6 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
        int i, oldi, j, n, count, invalidelements, patchsize[2], finalwidth, finalheight, xtess, ytess, finalvertices, finaltriangles, firstvertex, firstelement, type, oldnumtriangles, oldnumtriangles2, meshvertices, meshtriangles, collisionvertices, collisiontriangles, numvertices, numtriangles, cxtess, cytess;
        float lightmaptcbase[2], lightmaptcscale[2];
        //int *originalelement3i;
-       //int *originalneighbor3i;
        float *originalvertex3f;
        //float *originalsvector3f;
        //float *originaltvector3f;
@@ -6158,7 +6125,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
        i = oldi;
        in = oldin;
        out = oldout;
-       Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, true, false);
+       Mod_AllocSurfMesh(loadmodel->mempool, meshvertices, meshtriangles, false, true);
        if (collisiontriangles)
        {
                loadmodel->brush.data_collisionvertex3f = (float *)Mem_Alloc(loadmodel->mempool, collisionvertices * sizeof(float[3]));
@@ -6723,23 +6690,9 @@ static void Mod_Q3BSP_LightPoint(dp_model_t *model, const vec3_t p, vec3_t ambie
        q3dlightgrid_t *a, *s;
 
        // scale lighting by lightstyle[0] so that darkmode in dpmod works properly
-       switch(vid.renderpath)
-       {
-       case RENDERPATH_GL20:
-       case RENDERPATH_D3D9:
-       case RENDERPATH_D3D10:
-       case RENDERPATH_D3D11:
-       case RENDERPATH_SOFT:
-       case RENDERPATH_GLES2:
-               // LordHavoc: FIXME: is this true?
-               stylescale = 1; // added while render
-               break;
-       case RENDERPATH_GL11:
-       case RENDERPATH_GL13:
-       case RENDERPATH_GLES1:
-               stylescale = r_refdef.scene.rtlightstylevalue[0];
-               break;
-       }
+       // LadyHavoc: FIXME: is this true?
+       stylescale = 1; // added while render
+       //stylescale = r_refdef.scene.rtlightstylevalue[0];
 
        if (!model->brushq3.num_lightgrid)
        {
@@ -7939,8 +7892,6 @@ static void Mod_Q3BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        mod->GetLightInfo = R_Q1BSP_GetLightInfo;
        mod->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        mod->DrawShadowMap = R_Q1BSP_DrawShadowMap;
-       mod->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
-       mod->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
        mod->DrawLight = R_Q1BSP_DrawLight;
 
        mod_base = (unsigned char *)header;
@@ -8015,9 +7966,6 @@ static void Mod_Q3BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        // FIXME: shader alpha should replace r_wateralpha support in q3bsp
        loadmodel->brush.supportwateralpha = true;
 
-       // make a single combined shadow mesh to allow optimized shadow volume creation
-       Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
        loadmodel->brush.num_leafs = 0;
        Mod_Q3BSP_RecursiveFindNumLeafs(loadmodel->brush.data_nodes);
 
@@ -8260,8 +8208,6 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
        loadmodel->GetLightInfo = R_Q1BSP_GetLightInfo;
        loadmodel->CompileShadowMap = R_Q1BSP_CompileShadowMap;
        loadmodel->DrawShadowMap = R_Q1BSP_DrawShadowMap;
-       loadmodel->CompileShadowVolume = R_Q1BSP_CompileShadowVolume;
-       loadmodel->DrawShadowVolume = R_Q1BSP_DrawShadowVolume;
        loadmodel->DrawLight = R_Q1BSP_DrawLight;
 
        skinfiles = Mod_LoadSkinFiles();
@@ -8597,21 +8543,21 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
        // allocate storage for final mesh data
        loadmodel->num_textures = numtextures * loadmodel->numskins;
        loadmodel->num_texturesperskin = numtextures;
-       data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + numtriangles * sizeof(int[3]) + (numvertices <= 65536 ? numtriangles * sizeof(unsigned short[3]) : 0) + (r_enableshadowvolumes.integer ? numtriangles * sizeof(int[3]) : 0) + numvertices * sizeof(float[14]) + loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
+       data = (unsigned char *)Mem_Alloc(loadmodel->mempool, loadmodel->num_surfaces * sizeof(int) + loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t) + numtriangles * sizeof(int[3]) + (numvertices <= 65536 ? numtriangles * sizeof(unsigned short[3]) : 0) + numvertices * sizeof(float[14]) + loadmodel->brush.numsubmodels * sizeof(dp_model_t *));
        loadmodel->brush.submodels = (dp_model_t **)data;data += loadmodel->brush.numsubmodels * sizeof(dp_model_t *);
        loadmodel->sortedmodelsurfaces = (int *)data;data += loadmodel->num_surfaces * sizeof(int);
        loadmodel->data_textures = (texture_t *)data;data += loadmodel->num_surfaces * loadmodel->numskins * sizeof(texture_t);
        loadmodel->surfmesh.num_vertices = numvertices;
        loadmodel->surfmesh.num_triangles = numtriangles;
-       if (r_enableshadowvolumes.integer)
-               loadmodel->surfmesh.data_neighbor3i = (int *)data;data += numtriangles * sizeof(int[3]);
        loadmodel->surfmesh.data_vertex3f = (float *)data;data += numvertices * sizeof(float[3]);
        loadmodel->surfmesh.data_svector3f = (float *)data;data += numvertices * sizeof(float[3]);
        loadmodel->surfmesh.data_tvector3f = (float *)data;data += numvertices * sizeof(float[3]);
        loadmodel->surfmesh.data_normal3f = (float *)data;data += numvertices * sizeof(float[3]);
        loadmodel->surfmesh.data_texcoordtexture2f = (float *)data;data += numvertices * sizeof(float[2]);
-       if (loadmodel->surfmesh.num_vertices <= 65536)
+
+       if (loadmodel->surfmesh.num_vertices <= 65536) {
                loadmodel->surfmesh.data_element3s = (unsigned short *)data;data += loadmodel->surfmesh.num_triangles * sizeof(unsigned short[3]);
+       }
 
        for (j = 0;j < loadmodel->surfmesh.num_vertices;j++)
        {
@@ -8638,20 +8584,15 @@ void Mod_OBJ_Load(dp_model_t *mod, void *buffer, void *bufferend)
        Mem_Free(vertexhashtable);
        Mem_Free(vertexhashdata);
 
-       // make a single combined shadow mesh to allow optimized shadow volume creation
-       Mod_Q1BSP_CreateShadowMesh(loadmodel);
-
        // compute all the mesh information that was not loaded from the file
        if (loadmodel->surfmesh.data_element3s)
                for (i = 0;i < loadmodel->surfmesh.num_triangles*3;i++)
                        loadmodel->surfmesh.data_element3s[i] = loadmodel->surfmesh.data_element3i[i];
-       Mod_ValidateElements(loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles, 0, loadmodel->surfmesh.num_vertices, __FILE__, __LINE__);
+       Mod_ValidateElements(loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_element3s, loadmodel->surfmesh.num_triangles, 0, loadmodel->surfmesh.num_vertices, __FILE__, __LINE__);
        // generate normals if the file did not have them
        if (!VectorLength2(loadmodel->surfmesh.data_normal3f))
                Mod_BuildNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_normal3f, r_smoothnormals_areaweighting.integer != 0);
        Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, r_smoothnormals_areaweighting.integer != 0);
-       if (loadmodel->surfmesh.data_neighbor3i)
-               Mod_BuildTriangleNeighbors(loadmodel->surfmesh.data_neighbor3i, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.num_triangles);
 
        // if this is a worldmodel and has no BSP tree, create a fake one for the purpose
        loadmodel->brush.num_visleafs = 1;