[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32733] trunk/blender/source/blender/ render/intern: [#24414] Render hanging on small render border.

Campbell Barton ideasman42 at gmail.com
Wed Oct 27 12:36:22 CEST 2010


Revision: 32733
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32733
Author:   campbellbarton
Date:     2010-10-27 12:36:22 +0200 (Wed, 27 Oct 2010)

Log Message:
-----------
[#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.

Modified Paths:
--------------
    trunk/blender/source/blender/render/intern/include/render_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/render/intern/include/render_types.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/render_types.h	2010-10-27 08:55:13 UTC (rev 32732)
+++ trunk/blender/source/blender/render/intern/include/render_types.h	2010-10-27 10:36:22 UTC (rev 32733)
@@ -131,7 +131,8 @@
 	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 */

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2010-10-27 08:55:13 UTC (rev 32732)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2010-10-27 10:36:22 UTC (rev 32733)
@@ -5186,7 +5186,7 @@
 
 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 @@
 	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 @@
 	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];

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2010-10-27 08:55:13 UTC (rev 32732)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2010-10-27 10:36:22 UTC (rev 32733)
@@ -1537,8 +1537,10 @@
 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 @@
 	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) {





More information about the Bf-blender-cvs mailing list