forked from bartvdbraak/blender
[#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:
parent
defc47bcb9
commit
7b8db3fab7
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user