]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
fixed a crash with clusterindex -1 in GetPVS and FatPVS
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 27 Aug 2003 13:10:41 +0000 (13:10 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 27 Aug 2003 13:10:41 +0000 (13:10 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3418 d7cf8633-e32d-0410-b094-e92efae38249

gl_rsurf.c
model_brush.c

index 8f3af75aa4ea635aaceed80daa20ca3ec33e78d5..26380c6a1597c55a5e53854b3461880d58989604 100644 (file)
@@ -1991,12 +1991,9 @@ void R_Q3BSP_Draw(entity_render_t *ent)
        if (r_drawcollisionbrushes.integer < 2)
        {
                qglPolygonOffset(1.0f, 0);
-               if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer)
-               {
-                       Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
-                       pvs = model->brush.GetPVS(model, modelorg);
+               Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
+               if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer && (pvs = model->brush.GetPVS(model, modelorg)))
                        R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, ++markframe);
-               }
                else
                        for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
                                R_Q3BSP_DrawFace(ent, face);
@@ -2031,38 +2028,6 @@ void R_Q3BSP_DrawShadowVolume(entity_render_t *ent, vec3_t relativelightorigin,
 
 void R_Q3BSP_DrawLight(entity_render_t *ent, vec3_t relativelightorigin, vec3_t relativeeyeorigin, float lightradius, float *lightcolor, const matrix4x4_t *matrix_modeltofilter, const matrix4x4_t *matrix_modeltoattenuationxyz, const matrix4x4_t *matrix_modeltoattenuationz)
 {
-       int i;
-       q3mface_t *face;
-       vec3_t modelorg;
-       model_t *model;
-       qbyte *pvs;
-       static int markframe = 0;
-       R_Mesh_Matrix(&ent->matrix);
-       model = ent->model;
-       if (r_drawcollisionbrushes.integer < 2)
-       {
-               if (ent == &cl_entities[0].render && model->brushq3.num_pvsclusters && !r_novis.integer)
-               {
-                       Matrix4x4_Transform(&ent->inversematrix, r_origin, modelorg);
-                       pvs = model->brush.GetPVS(model, modelorg);
-                       R_Q3BSP_RecursiveWorldNode(ent, model->brushq3.data_nodes, modelorg, pvs, ++markframe);
-               }
-               else
-                       for (i = 0, face = model->brushq3.data_thismodel->firstface;i < model->brushq3.data_thismodel->numfaces;i++, face++)
-                               R_Q3BSP_DrawFace(ent, face);
-       }
-       if (r_drawcollisionbrushes.integer >= 1)
-       {
-               rmeshstate_t m;
-               memset(&m, 0, sizeof(m));
-               GL_BlendFunc(GL_SRC_ALPHA, GL_ONE);
-               GL_DepthMask(false);
-               GL_DepthTest(true);
-               R_Mesh_State_Texture(&m);
-               for (i = 0;i < model->brushq3.data_thismodel->numbrushes;i++)
-                       if (model->brushq3.data_thismodel->firstbrush[i].colbrushf && model->brushq3.data_thismodel->firstbrush[i].colbrushf->numtriangles)
-                               R_DrawCollisionBrush(model->brushq3.data_thismodel->firstbrush[i].colbrushf);
-       }
 }
 
 static void gl_surf_start(void)
index 4ead7ce64a4a9653bd4a7a015bacbcdcf24fc1f3..db38611a3f7500af7077857fa384873eebf62d2b 100644 (file)
@@ -4341,7 +4341,7 @@ static int Mod_Q3BSP_BoxTouchingPVS(model_t *model, const qbyte *pvs, const vec3
 }
 
 //Returns PVS data for a given point
-//(note: always returns valid data, never NULL)
+//(note: can return NULL)
 static qbyte *Mod_Q3BSP_GetPVS(model_t *model, const vec3_t p)
 {
        q3mnode_t *node;
@@ -4349,7 +4349,10 @@ static qbyte *Mod_Q3BSP_GetPVS(model_t *model, const vec3_t p)
        node = model->brushq3.data_nodes;
        while (node->isnode)
                node = node->children[(node->plane->type < 3 ? p[node->plane->type] : DotProduct(p,node->plane->normal)) < node->plane->dist];
-       return model->brushq3.data_pvschains + ((q3mleaf_t *)node)->clusterindex * model->brushq3.num_pvschainlength;
+       if (((q3mleaf_t *)node)->clusterindex >= 0)
+               return model->brushq3.data_pvschains + ((q3mleaf_t *)node)->clusterindex * model->brushq3.num_pvschainlength;
+       else
+               return NULL;
 }
 
 static void Mod_Q3BSP_FatPVS_RecursiveBSPNode(model_t *model, const vec3_t org, vec_t radius, qbyte *pvsbuffer, int pvsbytes, q3mnode_t *node)
@@ -4372,10 +4375,13 @@ static void Mod_Q3BSP_FatPVS_RecursiveBSPNode(model_t *model, const vec3_t org,
                        node = node->children[1];
                }
        }
-       // if this is a leaf, accumulate the pvs bits
-       pvs = model->brushq3.data_pvschains + ((q3mleaf_t *)node)->clusterindex * model->brushq3.num_pvschainlength;
-       for (i = 0;i < pvsbytes;i++)
-               pvsbuffer[i] |= pvs[i];
+       // if this is a leaf with a pvs, accumulate the pvs bits
+       if (((q3mleaf_t *)node)->clusterindex >= 0)
+       {
+               pvs = model->brushq3.data_pvschains + ((q3mleaf_t *)node)->clusterindex * model->brushq3.num_pvschainlength;
+               for (i = 0;i < pvsbytes;i++)
+                       pvsbuffer[i] |= pvs[i];
+       }
        return;
 }