From 001d104997b586527d7292c6bc436c1da2ae28a4 Mon Sep 17 00:00:00 2001 From: havoc Date: Mon, 22 Sep 2003 20:05:40 +0000 Subject: [PATCH] fixed lightgrid out-of-bounds crash (for example when one hits the very top of a q3bsp) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@3504 d7cf8633-e32d-0410-b094-e92efae38249 --- model_brush.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/model_brush.c b/model_brush.c index 31ccdedf..5c77a5cc 100644 --- a/model_brush.c +++ b/model_brush.c @@ -4058,9 +4058,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 +4071,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); -- 2.39.2