]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
fix bugs with q1bsp/hlbsp rotating submodels, caused by CLIP brushes not
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 20 Jan 2009 18:47:41 +0000 (18:47 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 20 Jan 2009 18:47:41 +0000 (18:47 +0000)
creating surfaces (thus vertex-based calculation of modelradius failed),
and some really stupid bugs with using min where it should have been max

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@8659 d7cf8633-e32d-0410-b094-e92efae38249

model_brush.c

index cd22a2bb775720ee2cbc8d5d74e0859b5a04c2a4..ab2be21d29a3ed5c5638958637f19126df571eaa 100644 (file)
@@ -3383,7 +3383,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
        dheader_t *header;
        dmodel_t *bm;
        mempool_t *mainmempool;
        dheader_t *header;
        dmodel_t *bm;
        mempool_t *mainmempool;
-       float dist, modelyawradius, modelradius, *vec;
+       float dist, modelyawradius, modelradius;
        msurface_t *surface;
        int numshadowmeshtriangles;
        hullinfo_t hullinfo;
        msurface_t *surface;
        int numshadowmeshtriangles;
        hullinfo_t hullinfo;
@@ -3620,17 +3620,31 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                        mod->brush.LightPoint = NULL;
                        mod->brush.AmbientSoundLevelsForPoint = NULL;
                }
                        mod->brush.LightPoint = NULL;
                        mod->brush.AmbientSoundLevelsForPoint = NULL;
                }
+
                // copy the submodel bounds, then enlarge the yaw and rotated bounds according to radius
                // copy the submodel bounds, then enlarge the yaw and rotated bounds according to radius
+               // (previously this code measured the radius of the vertices of surfaces in the submodel, but that broke submodels that contain only CLIP brushes, which do not produce surfaces)
                VectorCopy(bm->mins, mod->normalmins);
                VectorCopy(bm->maxs, mod->normalmaxs);
                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);
+               dist = max(fabs(mod->normalmins[0]), fabs(mod->normalmaxs[0]));
+               modelyawradius = max(fabs(mod->normalmins[0]), fabs(mod->normalmaxs[0]));
+               modelyawradius = dist*dist+modelyawradius*modelyawradius;
+               modelradius = max(fabs(mod->normalmins[2]), fabs(mod->normalmaxs[2]));
+               modelradius = modelyawradius + modelradius * modelradius;
+               modelyawradius = sqrt(modelyawradius);
+               modelradius = sqrt(modelradius);
+               mod->yawmins[0] = mod->yawmins[1] = -modelyawradius;
+               mod->yawmins[2] = mod->normalmins[2];
+               mod->yawmaxs[0] = mod->yawmaxs[1] =  modelyawradius;
+               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->radius = modelradius;
+               mod->radius2 = modelradius * modelradius;
+
+               // scan surfaces for sky and water and flag the submodel as possessing these features or not
+               // build lightstyle lists for quick marking of dirty lightmaps when lightstyles flicker
                if (mod->nummodelsurfaces)
                {
                if (mod->nummodelsurfaces)
                {
-                       modelyawradius = 0;
-                       modelradius = 0;
                        for (j = 0, surface = &mod->data_surfaces[mod->firstmodelsurface];j < mod->nummodelsurfaces;j++, surface++)
                        {
                                // we only need to have a drawsky function if it is used(usually only on world model)
                        for (j = 0, surface = &mod->data_surfaces[mod->firstmodelsurface];j < mod->nummodelsurfaces;j++, surface++)
                        {
                                // we only need to have a drawsky function if it is used(usually only on world model)
@@ -3638,31 +3652,7 @@ void Mod_Q1BSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                                        mod->DrawSky = R_Q1BSP_DrawSky;
                                if (surface->texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION))
                                        mod->DrawAddWaterPlanes = R_Q1BSP_DrawAddWaterPlanes;
                                        mod->DrawSky = R_Q1BSP_DrawSky;
                                if (surface->texture->basematerialflags & (MATERIALFLAG_WATERSHADER | MATERIALFLAG_REFRACTION | MATERIALFLAG_REFLECTION))
                                        mod->DrawAddWaterPlanes = R_Q1BSP_DrawAddWaterPlanes;
-                               // calculate bounding shapes
-                               for (k = 0, vec = (loadmodel->surfmesh.data_vertex3f + 3 * surface->num_firstvertex);k < surface->num_vertices;k++, vec += 3)
-                               {
-                                       dist = vec[0]*vec[0]+vec[1]*vec[1];
-                                       if (modelyawradius < dist)
-                                               modelyawradius = dist;
-                                       dist += vec[2]*vec[2];
-                                       if (modelradius < dist)
-                                               modelradius = dist;
-                               }
                        }
                        }
-                       modelyawradius = sqrt(modelyawradius);
-                       modelradius = sqrt(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;
 
                        // build lightstyle update chains
                        // (used to rapidly mark lightmapupdateflags on many surfaces
 
                        // build lightstyle update chains
                        // (used to rapidly mark lightmapupdateflags on many surfaces