Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-10-27 14:36:22 +0400
committerCampbell Barton <ideasman42@gmail.com>2010-10-27 14:36:22 +0400
commit7b8db3fab7bc6c7f2d5c53796f7311b6df216406 (patch)
treef5e33457379f93be4c0efb709506e4e9416ec9da /source
parentdefc47bcb923984f27f9e2b72db16ac1f8a7c46a (diff)
[#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.
Diffstat (limited to 'source')
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c6
-rw-r--r--source/blender/render/intern/source/pipeline.c13
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(distx<mindist) {
if(re->r.mode & R_PANORAMA) {
if(pa->disprect.xmin==minx) {