]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
collision brush generation in q3bsp is now *MUCH* faster and uses a lot less memory...
[xonotic/darkplaces.git] / model_brush.c
index 31ccdedff6b3893820949769df2f40afe35eea90..19aaf6aa9386f5023c861bebfee56baa4c9ea607 100644 (file)
@@ -1038,9 +1038,9 @@ static void Mod_Q1BSP_LoadLighting(lump_t *l)
        else // LordHavoc: bsp version 29 (normal white lighting)
        {
                // LordHavoc: hope is not lost yet, check for a .lit file to load
-               strcpy(litfilename, loadmodel->name);
-               FS_StripExtension(litfilename, litfilename);
-               strcat(litfilename, ".lit");
+               strlcpy (litfilename, loadmodel->name, sizeof (litfilename));
+               FS_StripExtension (litfilename, litfilename, sizeof (litfilename));
+               strlcat (litfilename, ".lit", sizeof (litfilename));
                data = (qbyte*) FS_LoadFile(litfilename, false);
                if (data)
                {
@@ -1093,9 +1093,9 @@ static void Mod_Q1BSP_LoadLightList(void)
        char lightsfilename[1024], *s, *t, *lightsstring;
        mlight_t *e;
 
-       strcpy(lightsfilename, loadmodel->name);
-       FS_StripExtension(lightsfilename, lightsfilename);
-       strcat(lightsfilename, ".lights");
+       strlcpy (lightsfilename, loadmodel->name, sizeof (lightsfilename));
+       FS_StripExtension (lightsfilename, lightsfilename, sizeof(lightsfilename));
+       strlcat (lightsfilename, ".lights", sizeof (lightsfilename));
        s = lightsstring = (char *) FS_LoadFile(lightsfilename, false);
        if (s)
        {
@@ -3315,7 +3315,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l)
 
        for (i = 0;i < count;i++, in++, out++)
        {
-               strncpy(out->name, in->name, sizeof(out->name) - 1);
+               strlcpy (out->name, in->name, sizeof (out->name));
                out->surfaceflags = LittleLong(in->surfaceflags);
                out->nativecontents = LittleLong(in->contents);
                out->supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(loadmodel, out->nativecontents);
@@ -3389,6 +3389,7 @@ static void Mod_Q3BSP_LoadBrushes(lump_t *l)
        q3mbrush_t *out;
        int i, j, n, c, count, maxplanes;
        mplane_t *planes;
+       winding_t *temp1, *temp2;
 
        in = (void *)(mod_base + l->fileofs);
        if (l->filelen % sizeof(*in))
@@ -3399,6 +3400,9 @@ static void Mod_Q3BSP_LoadBrushes(lump_t *l)
        loadmodel->brushq3.data_brushes = out;
        loadmodel->brushq3.num_brushes = count;
 
+       temp1 = Winding_New(64);
+       temp2 = Winding_New(64);
+
        maxplanes = 0;
        planes = NULL;
 
@@ -3429,10 +3433,12 @@ static void Mod_Q3BSP_LoadBrushes(lump_t *l)
                        planes[j].dist = out->firstbrushside[j].plane->dist;
                }
                // make the colbrush from the planes
-               out->colbrushf = Collision_NewBrushFromPlanes(loadmodel->mempool, out->numbrushsides, planes, out->texture->supercontents);
+               out->colbrushf = Collision_NewBrushFromPlanes(loadmodel->mempool, out->numbrushsides, planes, out->texture->supercontents, temp1, temp2);
        }
        if (planes)
                Mem_Free(planes);
+       Winding_Free(temp1);
+       Winding_Free(temp2);
 }
 
 static void Mod_Q3BSP_LoadEffects(lump_t *l)
@@ -3452,7 +3458,7 @@ static void Mod_Q3BSP_LoadEffects(lump_t *l)
 
        for (i = 0;i < count;i++, in++, out++)
        {
-               strncpy(out->shadername, in->shadername, sizeof(out->shadername) - 1);
+               strlcpy (out->shadername, in->shadername, sizeof (out->shadername));
                n = LittleLong(in->brushindex);
                if (n < 0 || n >= loadmodel->brushq3.num_brushes)
                        Host_Error("Mod_Q3BSP_LoadEffects: invalid brushindex %i (%i brushes)\n", n, loadmodel->brushq3.num_brushes);
@@ -3470,13 +3476,13 @@ static void Mod_Q3BSP_LoadVertices(lump_t *l)
        if (l->filelen % sizeof(*in))
                Host_Error("Mod_Q3BSP_LoadVertices: funny lump size in %s",loadmodel->name);
        loadmodel->brushq3.num_vertices = count = l->filelen / sizeof(*in);
-       loadmodel->brushq3.data_vertex3f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[3]));
-       loadmodel->brushq3.data_texcoordtexture2f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[2]));
-       loadmodel->brushq3.data_texcoordlightmap2f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[2]));
-       loadmodel->brushq3.data_svector3f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[3]));
-       loadmodel->brushq3.data_tvector3f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[3]));
-       loadmodel->brushq3.data_normal3f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[3]));
-       loadmodel->brushq3.data_color4f = Mem_Alloc(loadmodel->mempool, count * sizeof(float[4]));
+       loadmodel->brushq3.data_vertex3f = Mem_Alloc(loadmodel->mempool, count * (sizeof(float) * (3 + 2 + 2 + 3 + 3 + 3 + 4)));
+       loadmodel->brushq3.data_texcoordtexture2f = loadmodel->brushq3.data_vertex3f + count * 3;
+       loadmodel->brushq3.data_texcoordlightmap2f = loadmodel->brushq3.data_texcoordtexture2f + count * 2;
+       loadmodel->brushq3.data_svector3f = loadmodel->brushq3.data_texcoordlightmap2f + count * 2;
+       loadmodel->brushq3.data_tvector3f = loadmodel->brushq3.data_svector3f + count * 3;
+       loadmodel->brushq3.data_normal3f = loadmodel->brushq3.data_tvector3f + count * 3;
+       loadmodel->brushq3.data_color4f = loadmodel->brushq3.data_normal3f + count * 3;
 
        for (i = 0;i < count;i++, in++)
        {
@@ -3514,11 +3520,11 @@ static void Mod_Q3BSP_LoadTriangles(lump_t *l)
        if (l->filelen % sizeof(int[3]))
                Host_Error("Mod_Q3BSP_LoadTriangles: funny lump size in %s",loadmodel->name);
        count = l->filelen / sizeof(*in);
-       out = Mem_Alloc(loadmodel->mempool, count * sizeof(*out));
+       out = Mem_Alloc(loadmodel->mempool, count * sizeof(*out) * 2);
 
        loadmodel->brushq3.num_triangles = count / 3;
        loadmodel->brushq3.data_element3i = out;
-       loadmodel->brushq3.data_neighbor3i = Mem_Alloc(loadmodel->mempool, count * sizeof(*out));
+       loadmodel->brushq3.data_neighbor3i = out + count;
 
        for (i = 0;i < count;i++, in++, out++)
        {
@@ -3537,6 +3543,8 @@ static void Mod_Q3BSP_LoadLightmaps(lump_t *l)
        rtexture_t **out;
        int i, count;
 
+       if (!l->filelen)
+               return;
        in = (void *)(mod_base + l->fileofs);
        if (l->filelen % sizeof(*in))
                Host_Error("Mod_Q3BSP_LoadLightmaps: funny lump size in %s",loadmodel->name);
@@ -4058,9 +4066,9 @@ static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientc
        Matrix4x4_Transform(&model->brushq3.num_lightgrid_indexfromworld, p, transformed);
        //Matrix4x4_Print(&model->brushq3.num_lightgrid_indexfromworld);
        //Con_Printf("%f %f %f transformed %f %f %f clamped ", p[0], p[1], p[2], transformed[0], transformed[1], transformed[2]);
-       transformed[0] = bound(0, transformed[0], model->brushq3.num_lightgrid_isize[0]);
-       transformed[1] = bound(0, transformed[1], model->brushq3.num_lightgrid_isize[1]);
-       transformed[2] = bound(0, transformed[2], model->brushq3.num_lightgrid_isize[2]);
+       transformed[0] = bound(0, transformed[0], model->brushq3.num_lightgrid_isize[0] - 1);
+       transformed[1] = bound(0, transformed[1], model->brushq3.num_lightgrid_isize[1] - 1);
+       transformed[2] = bound(0, transformed[2], model->brushq3.num_lightgrid_isize[2] - 1);
        index[0] = (int)floor(transformed[0]);
        index[1] = (int)floor(transformed[1]);
        index[2] = (int)floor(transformed[2]);
@@ -4071,12 +4079,18 @@ static void Mod_Q3BSP_LightPoint(model_t *model, const vec3_t p, vec3_t ambientc
        for (k = 0;k < 2;k++)
        {
                blend1 = (k ? (transformed[2] - index[2]) : (1 - (transformed[2] - index[2])));
+               if (blend1 < 0.001f || index[2] + k >= model->brushq3.num_lightgrid_isize[2])
+                       continue;
                for (j = 0;j < 2;j++)
                {
                        blend2 = blend1 * (j ? (transformed[1] - index[1]) : (1 - (transformed[1] - index[1])));
+                       if (blend2 < 0.001f || index[1] + j >= model->brushq3.num_lightgrid_isize[1])
+                               continue;
                        for (i = 0;i < 2;i++)
                        {
                                blend = blend2 * (i ? (transformed[0] - index[0]) : (1 - (transformed[0] - index[0])));
+                               if (blend < 0.001f || index[0] + i >= model->brushq3.num_lightgrid_isize[0])
+                                       continue;
                                s = a + (k * model->brushq3.num_lightgrid_isize[1] + j) * model->brushq3.num_lightgrid_isize[0] + i;
                                VectorMA(ambientcolor, blend * (1.0f / 128.0f), s->ambientrgb, ambientcolor);
                                VectorMA(diffusecolor, blend * (1.0f / 128.0f), s->diffusergb, diffusecolor);