]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_brush.c
changed cl_stainmaps to be a loadtime cvar which decides whether to
[xonotic/darkplaces.git] / model_brush.c
index 303516604b9fc1b94a5aca134405bb846e7da9b6..dbf98b029a3e69ac1d86f05b9333176a4f62708d 100644 (file)
@@ -2410,11 +2410,6 @@ static void Mod_Q1BSP_LoadFaces(lump_t *l)
                        ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
                        tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
 
-                       // stainmap for permanent marks on walls
-                       surface->lightmapinfo->stainsamples = (unsigned char *)Mem_Alloc(loadmodel->mempool, ssize * tsize * 3);
-                       // clear to white
-                       memset(surface->lightmapinfo->stainsamples, 255, ssize * tsize * 3);
-
                        if (!lightmaptexture || !Mod_Q1BSP_AllocLightmapBlock(&allocState, lightmapsize, lightmapsize, ssize, tsize, &lightmapx, &lightmapy))
                        {
                                // allocate a texture pool if we need it
@@ -2451,7 +2446,36 @@ static void Mod_Q1BSP_LoadFaces(lump_t *l)
                        }
 
                }
+
+               if (cl_stainmaps.integer)
+               {
+                       // allocate stainmaps for permanent marks on walls
+                       int stainmapsize = 0;
+                       unsigned char *stainsamples = NULL;
+                       for (surfacenum = 0, surface = loadmodel->data_surfaces;surfacenum < count;surfacenum++, surface++)
+                       {
+                               ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
+                               tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
+                               stainmapsize += ssize * tsize * 3;
+                       }
+                       // allocate and clear to white
+                       stainsamples = (unsigned char *)Mem_Alloc(loadmodel->mempool, stainmapsize);
+                       memset(stainsamples, 255, stainmapsize);
+                       // assign pointers
+                       for (surfacenum = 0, surface = loadmodel->data_surfaces;surfacenum < count;surfacenum++, surface++)
+                       {
+                               ssize = (surface->lightmapinfo->extents[0] >> 4) + 1;
+                               tsize = (surface->lightmapinfo->extents[1] >> 4) + 1;
+                               surface->lightmapinfo->stainsamples = stainsamples;
+                               stainsamples += ssize * tsize * 3;
+                       }
+               }
        }
+
+       // generate ushort elements array if possible
+       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];
 }
 
 static void Mod_Q1BSP_LoadNodes_RecursiveSetParent(mnode_t *node, mnode_t *parent)
@@ -3591,11 +3615,15 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                        mod->brush.LightPoint = NULL;
                        mod->brush.AmbientSoundLevelsForPoint = NULL;
                }
+               // copy the submodel bounds, then enlarge the yaw and rotated bounds according to radius
+               VectorCopy(bm->mins, mod->normalmins);
+               VectorCopy(bm->maxs, mod->normalmaxs);
+               VectorCopy(bm->mins, mod->yawmins);
+               VectorCopy(bm->maxs, mod->yawmaxs);
+               VectorCopy(bm->mins, mod->rotatedmins);
+               VectorCopy(bm->maxs, mod->rotatedmaxs);
                if (mod->nummodelsurfaces)
                {
-                       // LordHavoc: calculate bmodel bounding box rather than trusting what it says
-                       mod->normalmins[0] = mod->normalmins[1] = mod->normalmins[2] = 1000000000.0f;
-                       mod->normalmaxs[0] = mod->normalmaxs[1] = mod->normalmaxs[2] = -1000000000.0f;
                        modelyawradius = 0;
                        modelradius = 0;
                        for (j = 0, surface = &mod->data_surfaces[mod->firstmodelsurface];j < mod->nummodelsurfaces;j++, surface++)
@@ -3608,12 +3636,6 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                                // calculate bounding shapes
                                for (k = 0, vec = (loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex);k < surface->num_vertices;k++, vec += 3)
                                {
-                                       if (mod->normalmins[0] > vec[0]) mod->normalmins[0] = vec[0];
-                                       if (mod->normalmins[1] > vec[1]) mod->normalmins[1] = vec[1];
-                                       if (mod->normalmins[2] > vec[2]) mod->normalmins[2] = vec[2];
-                                       if (mod->normalmaxs[0] < vec[0]) mod->normalmaxs[0] = vec[0];
-                                       if (mod->normalmaxs[1] < vec[1]) mod->normalmaxs[1] = vec[1];
-                                       if (mod->normalmaxs[2] < vec[2]) mod->normalmaxs[2] = vec[2];
                                        dist = vec[0]*vec[0]+vec[1]*vec[1];
                                        if (modelyawradius < dist)
                                                modelyawradius = dist;
@@ -3624,11 +3646,16 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer, void *bufferend)
                        }
                        modelyawradius = sqrt(modelyawradius);
                        modelradius = sqrt(modelradius);
-                       mod->yawmins[0] = mod->yawmins[1] = - (mod->yawmaxs[0] = mod->yawmaxs[1] = modelyawradius);
-                       mod->yawmins[2] = mod->normalmins[2];
-                       mod->yawmaxs[2] = mod->normalmaxs[2];
-                       mod->rotatedmins[0] = mod->rotatedmins[1] = mod->rotatedmins[2] = -modelradius;
-                       mod->rotatedmaxs[0] = mod->rotatedmaxs[1] = mod->rotatedmaxs[2] = modelradius;
+                       mod->yawmins[0] = min(mod->yawmins[0], -modelyawradius);
+                       mod->yawmaxs[0] = min(mod->yawmaxs[0], -modelyawradius);
+                       mod->yawmins[1] = min(mod->yawmins[1],  modelyawradius);
+                       mod->yawmaxs[1] = min(mod->yawmaxs[1],  modelyawradius);
+                       mod->rotatedmins[0] = min(mod->rotatedmins[0], -modelradius);
+                       mod->rotatedmaxs[0] = min(mod->rotatedmaxs[0],  modelradius);
+                       mod->rotatedmins[1] = min(mod->rotatedmins[1], -modelradius);
+                       mod->rotatedmaxs[1] = min(mod->rotatedmaxs[1],  modelradius);
+                       mod->rotatedmins[2] = min(mod->rotatedmins[2], -modelradius);
+                       mod->rotatedmaxs[2] = min(mod->rotatedmaxs[2],  modelradius);
                        mod->radius = modelradius;
                        mod->radius2 = modelradius * modelradius;
 
@@ -4569,7 +4596,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
        {
                // check face type first
                type = LittleLong(in->type);
-               if (type != Q3FACETYPE_POLYGON
+               if (type != Q3FACETYPE_FLAT
                 && type != Q3FACETYPE_PATCH
                 && type != Q3FACETYPE_MESH
                 && type != Q3FACETYPE_FLARE)
@@ -4638,7 +4665,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
                }
                switch(type)
                {
-               case Q3FACETYPE_POLYGON:
+               case Q3FACETYPE_FLAT:
                case Q3FACETYPE_MESH:
                        // no processing necessary
                        break;
@@ -4703,7 +4730,7 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
                out->num_firsttriangle = meshtriangles;
                switch(type)
                {
-               case Q3FACETYPE_POLYGON:
+               case Q3FACETYPE_FLAT:
                case Q3FACETYPE_MESH:
                        // no processing necessary, except for lightmap merging
                        for (j = 0;j < out->num_vertices;j++)
@@ -4881,6 +4908,11 @@ static void Mod_Q3BSP_LoadFaces(lump_t *l)
        // for per pixel lighting
        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, true);
 
+       // generate ushort elements array if possible
+       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];
+
        // free the no longer needed vertex data
        loadmodel->brushq3.num_vertices = 0;
        if (loadmodel->brushq3.data_vertex3f)
@@ -5699,7 +5731,6 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend)
        mod = loadmodel;
        for (i = 0;i < loadmodel->brush.numsubmodels;i++)
        {
-               qboolean boxready;
                if (i > 0)
                {
                        char name[10];
@@ -5743,7 +5774,6 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend)
                // because q3map2 sometimes lies (mostly to affect the lightgrid),
                // which can in turn mess up the farclip (as well as culling when
                // outside the level - an unimportant concern)
-               boxready = false;
 
                //printf("Editing model %d... BEFORE re-bounding: %f %f %f - %f %f %f\n", i, mod->normalmins[0], mod->normalmins[1], mod->normalmins[2], mod->normalmaxs[0], mod->normalmaxs[1], mod->normalmaxs[2]);
                for (j = 0;j < mod->nummodelsurfaces;j++)
@@ -5753,16 +5783,6 @@ void Mod_Q3BSP_Load(model_t *mod, void *buffer, void *bufferend)
                        int k;
                        if (!surface->num_vertices)
                                continue;
-                       if (!boxready)
-                       // (div0) do we REALLY want this? Above it says "enlarge the
-                       //        bounding box", but this completely regenerates this.
-                       //        Remove this part and the variable  to make it ACTUALLY
-                       //        enlarge the bbox.
-                       {
-                               VectorCopy(v, mod->normalmins);
-                               VectorCopy(v, mod->normalmaxs);
-                               boxready = true;
-                       }
                        for (k = 0;k < surface->num_vertices;k++, v += 3)
                        {
                                mod->normalmins[0] = min(mod->normalmins[0], v[0]);