From 89a584e066a0519620e07bc4399fa137ce7fd206 Mon Sep 17 00:00:00 2001 From: havoc Date: Wed, 27 Aug 2003 13:10:41 +0000 Subject: [PATCH] fixed a crash with clusterindex -1 in GetPVS and FatPVS git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3418 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_rsurf.c | 39 ++------------------------------------- model_brush.c | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 43 deletions(-) diff --git a/gl_rsurf.c b/gl_rsurf.c index 8f3af75a..26380c6a 100644 --- a/gl_rsurf.c +++ b/gl_rsurf.c @@ -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) diff --git a/model_brush.c b/model_brush.c index 4ead7ce6..db38611a 100644 --- a/model_brush.c +++ b/model_brush.c @@ -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; } -- 2.39.2