[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41582] branches/soc-2008-mxcurioni/source /blender/freestyle/intern/blender_interface: Fix for a crash when two scenes in the compositor have different render

Tamito Kajiyama rd6t-kjym at asahi-net.or.jp
Sun Nov 6 13:23:48 CET 2011


Revision: 41582
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41582
Author:   kjym3
Date:     2011-11-06 12:23:44 +0000 (Sun, 06 Nov 2011)
Log Message:
-----------
Fix for a crash when two scenes in the compositor have different render
resolution (i.e., image width and height, scaled by the size factor).
Problem report by flokkievids together with a .blend file for reproducing
the bug, thanks!

Modified Paths:
--------------
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
    branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2011-11-06 12:12:14 UTC (rev 41581)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp	2011-11-06 12:23:44 UTC (rev 41582)
@@ -40,6 +40,8 @@
 	_textureManager = new BlenderTextureManager;
 	_textureManager->load();
 
+	_width = re->winx; _height = re->winy; // for stroke mesh generation
+
 	// Scene.New("FreestyleStrokes")
 	old_scene = re->scene;
 
@@ -47,18 +49,19 @@
 	snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name+2);
 	freestyle_scene = add_scene(name);
 	freestyle_scene->r.cfra = old_scene->r.cfra;
-	freestyle_scene->r.mode= old_scene->r.mode;
-	freestyle_scene->r.xsch= old_scene->r.xsch;
-	freestyle_scene->r.ysch= old_scene->r.ysch;
+	freestyle_scene->r.mode= old_scene->r.mode &
+		~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR | R_BORDER );
+	freestyle_scene->r.xsch= re->rectx; // old_scene->r.xsch
+	freestyle_scene->r.ysch= re->recty; // old_scene->r.ysch
 	freestyle_scene->r.xasp= old_scene->r.xasp;
 	freestyle_scene->r.yasp= old_scene->r.yasp;
 	freestyle_scene->r.xparts= old_scene->r.xparts;
 	freestyle_scene->r.yparts= old_scene->r.yparts;
-	freestyle_scene->r.size= old_scene->r.size;
+	freestyle_scene->r.size= 100; // old_scene->r.size
 	freestyle_scene->r.maximsize= old_scene->r.maximsize;
 	freestyle_scene->r.ocres = old_scene->r.ocres;
 	freestyle_scene->r.color_mgt_flag = old_scene->r.color_mgt_flag;
-	freestyle_scene->r.scemode= old_scene->r.scemode;
+	freestyle_scene->r.scemode= old_scene->r.scemode & ~( R_SINGLE_LAYER );
 	freestyle_scene->r.flag= old_scene->r.flag;
 	freestyle_scene->r.threads= old_scene->r.threads;
 	freestyle_scene->r.border.xmin= old_scene->r.border.xmin;
@@ -75,19 +78,16 @@
 	freestyle_scene->r.gauss= old_scene->r.gauss;
 	freestyle_scene->r.dither_intensity= old_scene->r.dither_intensity;
 	BLI_strncpy(freestyle_scene->r.engine, old_scene->r.engine, sizeof(freestyle_scene->r.engine));
+	freestyle_scene->r.planes = R_PLANES32;
+	freestyle_scene->r.imtype = R_PNG;
 	set_scene_bg( G.main, freestyle_scene );
 
-	// image dimensions
-	float ycor = ((float)re->r.yasp) / ((float)re->r.xasp);
-	float width = freestyle_scene->r.xsch;
-	float height = freestyle_scene->r.ysch * ycor;
-
 	// Camera
 	Object* object_camera = add_object(freestyle_scene, OB_CAMERA);
 	
 	Camera* camera = (Camera *) object_camera->data;
 	camera->type = CAM_ORTHO;
-	camera->ortho_scale = max(width,height);
+	camera->ortho_scale = max(re->rectx, re->recty);
     camera->clipsta = 0.1f;
     camera->clipend = 100.0f;
 
@@ -96,11 +96,11 @@
 
     // test
     //_z = 999.90f; _z_delta = 0.01f;
+
+	object_camera->loc[0] = re->disprect.xmin + 0.5f * re->rectx;
+	object_camera->loc[1] = re->disprect.ymin + 0.5f * re->recty;
+	object_camera->loc[2] = 1.f;
 	
-	object_camera->loc[0] = 0.5 * width;
-	object_camera->loc[1] = 0.5 * height;
-	object_camera->loc[2] = 1.0;
-	
 	freestyle_scene->camera = object_camera;
 	
 	// Material
@@ -179,9 +179,6 @@
 	  StrokeVertexRep *svRep[3];
 	  Vec3r color[3];
 	  unsigned int vertex_index;
-	  float ycor = ((float)freestyle_scene->r.yasp) / ((float)freestyle_scene->r.xasp);
-	  float width = freestyle_scene->r.xsch;
-	  float height = freestyle_scene->r.ysch * ycor;
 	  Vec2r p;
 	
 	  for(vector<Strip*>::iterator s=strips.begin(), send=strips.end();
@@ -209,7 +206,7 @@
 			m = 0;
 			for (int j = 0; j < 3; j++) {
 				p = svRep[j]->point2d();
-				if (p[0] < 0.0 || p[0] > width || p[1] < 0.0 || p[1] > height)
+				if (p[0] < 0.0 || p[0] > _width || p[1] < 0.0 || p[1] > _height)
 					m++;
 			}
 			if (m == 3) {
@@ -277,7 +274,7 @@
 			m = 0;
 			for (int j = 0; j < 3; j++) {
 				p = svRep[j]->point2d();
-				if (p[0] < 0.0 || p[0] > width || p[1] < 0.0 || p[1] > height)
+				if (p[0] < 0.0 || p[0] > _width || p[1] < 0.0 || p[1] > _height)
 					m++;
 			}
 			if (m == 3) {
@@ -352,13 +349,6 @@
         camera->clipend = _z + _z_delta * 100.0f;
     //cout << "clipsta " << camera->clipsta << ", clipend " << camera->clipend << endl;
 
-	freestyle_scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR );
-	freestyle_scene->r.scemode &= ~( R_SINGLE_LAYER );
-	freestyle_scene->r.planes = R_PLANES32;
-	freestyle_scene->r.imtype = R_PNG;
-	if (freestyle_scene->r.mode & R_BORDER)
-		freestyle_scene->r.mode |= R_CROP;
-	
 	Render *freestyle_render = RE_NewRender(freestyle_scene->id.name);
 
 	RE_RenderFreestyleStrokes(freestyle_render, G.main, freestyle_scene);

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2011-11-06 12:12:14 UTC (rev 41581)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h	2011-11-06 12:23:44 UTC (rev 41582)
@@ -35,6 +35,7 @@
 	Scene* old_scene;
 	Scene* freestyle_scene;
 	Material* material;
+	float _width, _height;
 	float _z, _z_delta;
 
 	float get_stroke_vertex_z(void) const;

Modified: branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
===================================================================
--- branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2011-11-06 12:12:14 UTC (rev 41581)
+++ branches/soc-2008-mxcurioni/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp	2011-11-06 12:23:44 UTC (rev 41582)
@@ -88,13 +88,12 @@
 	//=======================================================
 
 	static void init_view(Render* re){
-		float ycor = ((float)re->r.yasp) / ((float)re->r.xasp);
-		int width = re->r.xsch;
-		int height = (int)(((float)re->r.ysch) * ycor);
-		int xmin = re->r.border.xmin * width;
-		int xmax = re->r.border.xmax * width;
-		int ymin = re->r.border.ymin * height;
-		int ymax = re->r.border.ymax * height;
+		int width = re->winx;
+		int height = re->winy;
+		int xmin = re->disprect.xmin;
+		int ymin = re->disprect.ymin;
+		int xmax = re->disprect.xmax;
+		int ymax = re->disprect.ymax;
 		
 		freestyle_viewport[0] = freestyle_viewport[1] = 0;
 		freestyle_viewport[2] = width;
@@ -384,7 +383,7 @@
 
 		rectx = re->rectx;
 		recty = re->recty;
-	    for( y = 0; y < recty; y++) {
+		for( y = 0; y < recty; y++) {
 	        for( x = 0; x < rectx; x++) {
 	            pixSrc = src + 4 * (rectx * y + x);
 	            if( pixSrc[3] > 0.0) {




More information about the Bf-blender-cvs mailing list