]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
fix TH's status patch to again send the same data as before
[xonotic/darkplaces.git] / model_brush.c
index a5ed0fcc9f27a3ac5ebf6b41194d2f7a0a4fb8f0..667bc22a0809c6ab17a2ff637dd27562d461ad23 100644 (file)
@@ -39,8 +39,8 @@ cvar_t r_subdivisions_collision_mintess = {0, "r_subdivisions_collision_mintess"
 cvar_t r_subdivisions_collision_maxtess = {0, "r_subdivisions_collision_maxtess", "1024", "maximum number of subdivisions (prevents curves beyond a certain detail level, limits smoothing)"};
 cvar_t r_subdivisions_collision_maxvertices = {0, "r_subdivisions_collision_maxvertices", "4225", "maximum vertices allowed per subdivided curve"};
 cvar_t mod_q3bsp_curves_collisions = {0, "mod_q3bsp_curves_collisions", "1", "enables collisions with curves (SLOW)"};
-cvar_t mod_q3bsp_curves_collisions_stride = {0, "mod_q3bsp_curves_collisions_stride", "32", "collisions against curves: optimize performance by doing a combined collision check for this triangle amount first"};
-cvar_t mod_q3bsp_curves_stride = {0, "mod_q3bsp_curves_stride", "32", "particle effect collisions against curves: optimize performance by doing a combined collision check for this triangle amount first"};
+cvar_t mod_q3bsp_curves_collisions_stride = {0, "mod_q3bsp_curves_collisions_stride", "16", "collisions against curves: optimize performance by doing a combined collision check for this triangle amount first"};
+cvar_t mod_q3bsp_curves_stride = {0, "mod_q3bsp_curves_stride", "16", "particle effect collisions against curves: optimize performance by doing a combined collision check for this triangle amount first"};
 cvar_t mod_q3bsp_optimizedtraceline = {0, "mod_q3bsp_optimizedtraceline", "1", "whether to use optimized traceline code for line traces (as opposed to tracebox code)"};
 cvar_t mod_q3bsp_debugtracebrush = {0, "mod_q3bsp_debugtracebrush", "0", "selects different tracebrush bsp recursion algorithms (for debugging purposes only)"};
 cvar_t mod_q3bsp_lightmapmergepower = {CVAR_SAVE, "mod_q3bsp_lightmapmergepower", "4", "merges the quake3 128x128 lightmap textures into larger lightmap group textures to speed up rendering, 1 = 256x256, 2 = 512x512, 3 = 1024x1024, 4 = 2048x2048, 5 = 4096x4096, ..."};
@@ -415,6 +415,7 @@ static int Mod_Q1BSP_BoxTouchingVisibleLeafs(dp_model_t *model, const unsigned c
 typedef struct findnonsolidlocationinfo_s
 {
        vec3_t center;
+       vec3_t absmin, absmax;
        vec_t radius;
        vec3_t nudge;
        vec_t bestdist;
@@ -519,9 +520,30 @@ static void Mod_Q1BSP_FindNonSolidLocation_r_Leaf(findnonsolidlocationinfo_t *in
                surface = info->model->data_surfaces + *mark;
                if (surface->texture->supercontents & SUPERCONTENTS_SOLID)
                {
-                       for (k = 0;k < surface->num_triangles;k++)
+                       if(surface->num_bboxstride)
                        {
-                               Mod_Q1BSP_FindNonSolidLocation_r_Triangle(info, surface, k);
+                               int i, cnt, tri;
+                               cnt = (surface->num_triangles + surface->num_bboxstride - 1) / surface->num_bboxstride;
+                               for(i = 0; i < cnt; ++i)
+                               {
+                                       if(BoxesOverlap(surface->data_bbox6f + i * 6, surface->data_bbox6f + i * 6 + 3, info->absmin, info->absmax))
+                                       {
+                                               for(k = 0; k < surface->num_bboxstride; ++k)
+                                               {
+                                                       tri = i * surface->num_bboxstride + k;
+                                                       if(tri >= surface->num_triangles)
+                                                               break;
+                                                       Mod_Q1BSP_FindNonSolidLocation_r_Triangle(info, surface, tri);
+                                               }
+                                       }
+                               }
+                       }
+                       else
+                       {
+                               for (k = 0;k < surface->num_triangles;k++)
+                               {
+                                       Mod_Q1BSP_FindNonSolidLocation_r_Triangle(info, surface, k);
+                               }
                        }
                }
        }
@@ -561,6 +583,14 @@ static void Mod_Q1BSP_FindNonSolidLocation(dp_model_t *model, const vec3_t in, v
        {
                VectorClear(info.nudge);
                info.bestdist = radius;
+               VectorCopy(info.center, info.absmin);
+               VectorCopy(info.center, info.absmax);
+               info.absmin[0] -= info.radius + 1;
+               info.absmin[1] -= info.radius + 1;
+               info.absmin[2] -= info.radius + 1;
+               info.absmax[0] += info.radius + 1;
+               info.absmax[1] += info.radius + 1;
+               info.absmax[2] += info.radius + 1;
                Mod_Q1BSP_FindNonSolidLocation_r(&info, model->brush.data_nodes + model->brushq1.hulls[0].firstclipnode);
                VectorAdd(info.center, info.nudge, info.center);
        }
@@ -4584,20 +4614,19 @@ static void Mod_Q3BSP_LoadLightmaps(lump_t *l, lump_t *faceslump)
        Con_DPrintf("%s is %sdeluxemapped\n", loadmodel->name, loadmodel->brushq3.deluxemapping ? "" : "not ");
 
        // figure out what the most reasonable merge power is within limits
+
        loadmodel->brushq3.num_lightmapmergepower = 0;
-       for (power = 1;power <= mod_q3bsp_lightmapmergepower.integer && (128 << power) <= gl_max_texture_size && (1 << (power * 2)) < 4 * (count >> loadmodel->brushq3.deluxemapping);power++)
-               loadmodel->brushq3.num_lightmapmergepower = power;
 
-       // as the lightmap size may actually be another power of 2, adjust for this
-       // (and interpret it as the power for 128x128 lightmaps above)
        for(i = 0; (128 << i) < size; ++i)
-               loadmodel->brushq3.num_lightmapmergepower -= 1;
-       if(loadmodel->brushq3.num_lightmapmergepower < 0)
-               loadmodel->brushq3.num_lightmapmergepower = 0;
+               ;
+       // i is now 0 for 128, 1 for 256, etc
+
+       for (power = 1;power + i <= mod_q3bsp_lightmapmergepower.integer && (size << power) <= gl_max_texture_size && (1 << (power * 2)) < 4 * (count >> (loadmodel->brushq3.deluxemapping ? 1 : 0)); power++)
+               loadmodel->brushq3.num_lightmapmergepower = power;
 
        loadmodel->brushq3.num_lightmapmerge = 1 << loadmodel->brushq3.num_lightmapmergepower;
 
-       loadmodel->brushq3.num_mergedlightmaps = ((count >> loadmodel->brushq3.deluxemapping) + (1 << (loadmodel->brushq3.num_lightmapmergepower * 2)) - 1) >> (loadmodel->brushq3.num_lightmapmergepower * 2);
+       loadmodel->brushq3.num_mergedlightmaps = ((count >> (loadmodel->brushq3.deluxemapping ? 1 : 0)) + (1 << (loadmodel->brushq3.num_lightmapmergepower * 2)) - 1) >> (loadmodel->brushq3.num_lightmapmergepower * 2);
        loadmodel->brushq3.data_lightmaps = (rtexture_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brushq3.num_mergedlightmaps * sizeof(rtexture_t *));
        if (loadmodel->brushq3.deluxemapping)
                loadmodel->brushq3.data_deluxemaps = (rtexture_t **)Mem_Alloc(loadmodel->mempool, loadmodel->brushq3.num_mergedlightmaps * sizeof(rtexture_t *));
@@ -4631,7 +4660,7 @@ static void Mod_Q3BSP_LoadLightmaps(lump_t *l, lump_t *faceslump)
                                // all be full size except the last one which may be smaller
                                // because it only needs to the remaining blocks, and it will often
                                // be odd sizes like 2048x512 due to only being 25% full or so.
-                               j = (count >> loadmodel->brushq3.deluxemapping) - (lightmapindex << power2);
+                               j = (count >> (loadmodel->brushq3.deluxemapping ? 1 : 0)) - (lightmapindex << power2);
                                for (mergewidth = 1;mergewidth < j && mergewidth < (1 << power);mergewidth *= 2)
                                        ;
                                for (mergeheight = 1;mergewidth*mergeheight < j && mergeheight < (1 << power);mergeheight *= 2)
@@ -4644,7 +4673,7 @@ static void Mod_Q3BSP_LoadLightmaps(lump_t *l, lump_t *faceslump)
                        }
                        mergewidth = R_TextureWidth(loadmodel->brushq3.data_lightmaps[lightmapindex]) / size;
                        mergeheight = R_TextureHeight(loadmodel->brushq3.data_lightmaps[lightmapindex]) / size;
-                       j = (i >> loadmodel->brushq3.deluxemapping) & ((1 << power2) - 1);
+                       j = (i >> (loadmodel->brushq3.deluxemapping ? 1 : 0)) & ((1 << power2) - 1);
                        if (loadmodel->brushq3.deluxemapping && (i & 1))
                                R_UpdateTexture(loadmodel->brushq3.data_deluxemaps[lightmapindex], convertedpixels, (j % mergewidth) * size, (j / mergewidth) * size, size, size);
                        else
@@ -4684,7 +4713,7 @@ static void Mod_Q3BSP_BuildBBoxes(const int *element3i, int num_triangles, const
                        maxs = &((*collisionbbox6f)[6 * j + 3]);
                        for(k = 0; k < stride; ++k)
                        {
-                               tri = j * stride;
+                               tri = j * stride + k;
                                if(tri >= num_triangles)
                                        break;
                                vert = &(vertex3f[element3i[3 * tri + 0] * 3]);
@@ -5027,7 +5056,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
                        Q3PatchTesselateFloat(4, sizeof(float[4]), (loadmodel->surfmesh.data_lightmapcolor4f + 4 * out->num_firstvertex), patchsize[0], patchsize[1], sizeof(float[4]), originalcolor4f, xtess, ytess);
                        Q3PatchTriangleElements((loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle), finalwidth, finalheight, out->num_firstvertex);
 
-                       out->num_triangles = Mod_RemoveDegenerateTriangles(out->num_triangles, (loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle), (loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle), loadmodel->surfmesh.data_vertex3f + 3 * out->num_firstvertex);
+                       out->num_triangles = Mod_RemoveDegenerateTriangles(out->num_triangles, (loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle), (loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle), loadmodel->surfmesh.data_vertex3f);
 
                        if (developer.integer >= 100)
                        {
@@ -5059,7 +5088,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
 
                        // now optimize the collision mesh by finding triangle bboxes...
                        Mod_Q3BSP_BuildBBoxes(out->data_collisionelement3i, out->num_collisiontriangles, out->data_collisionvertex3f, &out->data_collisionbbox6f, &out->num_collisionbboxstride, mod_q3bsp_curves_collisions_stride.integer);
-                       Mod_Q3BSP_BuildBBoxes(loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle, out->num_triangles, loadmodel->surfmesh.data_vertex3f + 3 * out->num_firstvertex, &out->data_bbox6f, &out->num_bboxstride, mod_q3bsp_curves_stride.integer);
+                       Mod_Q3BSP_BuildBBoxes(loadmodel->surfmesh.data_element3i + 3 * out->num_firsttriangle, out->num_triangles, loadmodel->surfmesh.data_vertex3f, &out->data_bbox6f, &out->num_bboxstride, mod_q3bsp_curves_stride.integer);
 
                        if (developer.integer >= 100)
                                Con_Printf("Mod_Q3BSP_LoadFaces: %ix%i curve became %i:%i vertices / %i:%i triangles (%i:%i degenerate)\n", patchsize[0], patchsize[1], out->num_vertices, out->num_collisionvertices, oldnumtriangles, oldnumtriangles2, oldnumtriangles - out->num_triangles, oldnumtriangles2 - out->num_collisiontriangles);
@@ -5091,7 +5120,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
                        if (cls.state != ca_dedicated && out->lightmaptexture)
                        {
                                // figure out which part of the merged lightmap this fits into
-                               int lightmapindex = LittleLong(in->lightmapindex) >> loadmodel->brushq3.deluxemapping;
+                               int lightmapindex = LittleLong(in->lightmapindex) >> (loadmodel->brushq3.deluxemapping ? 1 : 0);
                                int mergewidth = R_TextureWidth(out->lightmaptexture) / loadmodel->brushq3.lightmapsize;
                                int mergeheight = R_TextureHeight(out->lightmaptexture) / loadmodel->brushq3.lightmapsize;
                                lightmapindex &= mergewidth * mergeheight - 1;