From 7b8db3fab7bc6c7f2d5c53796f7311b6df216406 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 27 Oct 2010 10:36:22 +0000 Subject: [PATCH] [#24414] Render hanging on small render border. large render sizes could cause an the threaded tile processor to hang because winx * winy wrapped into a negative value. also convert winx/winy to floats before multiplying for vector passs. --- source/blender/render/intern/include/render_types.h | 3 ++- .../blender/render/intern/source/convertblender.c | 6 +++--- source/blender/render/intern/source/pipeline.c | 13 +++++++------ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index b124102f50b..d3f52a5a911 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -131,7 +131,8 @@ struct Render ThreadRWMutex resultmutex; /* window size, display rect, viewplane */ - int winx, winy; + int winx, winy; /* buffer width and height with percentage applied + * without border & crop. convert to long before multiplying together to avoid overflow. */ rcti disprect; /* part within winx winy */ rctf viewplane; /* mapped on winx winy */ float viewdx, viewdy; /* size of 1 pixel */ diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index e70287e522e..50e52bfe2f7 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -5186,7 +5186,7 @@ static void calculate_speedvector(float *vectors, int step, float winsq, float w static float *calculate_strandsurface_speedvectors(Render *re, ObjectInstanceRen *obi, StrandSurface *mesh) { - float winsq= re->winx*re->winy, winroot= sqrt(winsq), (*winspeed)[4]; + float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq), (*winspeed)[4]; /* int's can wrap on large images */ float ho[4], prevho[4], nextho[4], winmat[4][4], vec[2]; int a; @@ -5225,7 +5225,7 @@ static void calculate_speedvectors(Render *re, ObjectInstanceRen *obi, float *ve StrandSurface *mesh= NULL; float *speed, (*winspeed)[4]=NULL, ho[4], winmat[4][4]; float *co1, *co2, *co3, *co4, w[4]; - float winsq= re->winx*re->winy, winroot= sqrt(winsq); + float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */ int a, *face, *index; if(obi->flag & R_TRANSFORMED) @@ -5292,7 +5292,7 @@ static int load_fluidsimspeedvectors(Render *re, ObjectInstanceRen *obi, float * VertRen *ver= NULL; float *speed, div, zco[2], avgvel[4] = {0.0, 0.0, 0.0, 0.0}; float zmulx= re->winx/2, zmuly= re->winy/2, len; - float winsq= re->winx*re->winy, winroot= sqrt(winsq); + float winsq= (float)re->winx*(float)re->winy, winroot= sqrt(winsq); /* int's can wrap on large images */ int a, j; float hoco[4], ho[4], fsvec[4], camco[4]; float mat[4][4], winmat[4][4]; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index ca9aef24803..68b6a04035e 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1537,8 +1537,10 @@ static RenderPart *find_next_pano_slice(Render *re, int *minx, rctf *viewplane) static RenderPart *find_next_part(Render *re, int minx) { RenderPart *pa, *best= NULL; - int centx=re->winx/2, centy=re->winy/2, tot=1; - int mindist, distx, disty; + + /* long long int's needed because of overflow [#24414] */ + long long int centx=re->winx/2, centy=re->winy/2, tot=1; + long long int mindist= (long long int)re->winx * (long long int)re->winy; /* find center of rendered parts, image center counts for 1 too */ for(pa= re->parts.first; pa; pa= pa->next) { @@ -1552,12 +1554,11 @@ static RenderPart *find_next_part(Render *re, int minx) centy/=tot; /* closest of the non-rendering parts */ - mindist= re->winx*re->winy; for(pa= re->parts.first; pa; pa= pa->next) { if(pa->ready==0 && pa->nr==0) { - distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2; - disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2; - distx= (int)sqrt(distx*distx + disty*disty); + long long int distx= centx - (pa->disprect.xmin+pa->disprect.xmax)/2; + long long int disty= centy - (pa->disprect.ymin+pa->disprect.ymax)/2; + distx= (long long int)sqrt(distx*distx + disty*disty); if(distxr.mode & R_PANORAMA) { if(pa->disprect.xmin==minx) {