[#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.
This commit is contained in:
Campbell Barton 2010-10-27 10:36:22 +00:00
parent defc47bcb9
commit 7b8db3fab7
3 changed files with 12 additions and 10 deletions

@ -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 */

@ -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];

@ -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(distx<mindist) {
if(re->r.mode & R_PANORAMA) {
if(pa->disprect.xmin==minx) {