[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [55270] trunk/blender: Border rendering now works for all scenes used in compositor,

Sergey Sharybin sergey.vfx at gmail.com
Thu Mar 14 08:38:38 CET 2013


Revision: 55270
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=55270
Author:   nazgul
Date:     2013-03-14 07:38:37 +0000 (Thu, 14 Mar 2013)
Log Message:
-----------
Border rendering now works for all scenes used in compositor,
before this only active scene would be rendered with border.

When do_render_fields_blur_3d() is finished, it'll modify
render's display rect so it'll correspond bordered render
result placed on black backgrund. Actual border is stored
nowhere, which makes it only way to re-calculate disprect
for all other renders used in compo based on source. Not
so big deal actually.

Also needed to modify Cycles a bit, because before this
patch it used border settings from scene being rendered.
Now made it so render data is passing to external engines.

Using a property inside RenderEngine structure for this.
Not best ever design for passing render data, but this
would prevent API breakage. So now external engines could
access engine.render to access active rendering settings.

Reviewed by Brecht, thanks!

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_camera.cpp
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_session.h
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/render/extern/include/RE_engine.h
    trunk/blender/source/blender/render/intern/source/external_engine.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/intern/cycles/blender/blender_camera.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_camera.cpp	2013-03-14 07:25:54 UTC (rev 55269)
+++ trunk/blender/intern/cycles/blender/blender_camera.cpp	2013-03-14 07:38:37 UTC (rev 55270)
@@ -65,7 +65,7 @@
 	Transform matrix;
 };
 
-static void blender_camera_init(BlenderCamera *bcam, BL::Scene b_scene)
+static void blender_camera_init(BlenderCamera *bcam, BL::RenderSettings b_render, BL::Scene b_scene)
 {
 	memset(bcam, 0, sizeof(BlenderCamera));
 
@@ -82,10 +82,8 @@
 	bcam->pano_viewplane.top = 1.0f;
 
 	/* render resolution */
-	BL::RenderSettings r = b_scene.render();
-
-	bcam->full_width = (int)(r.resolution_x()*r.resolution_percentage()/100);
-	bcam->full_height = (int)(r.resolution_y()*r.resolution_percentage()/100);
+	bcam->full_width = (int)(b_render.resolution_x()*b_render.resolution_percentage()/100);
+	bcam->full_height = (int)(b_render.resolution_y()*b_render.resolution_percentage()/100);
 }
 
 static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
@@ -351,24 +349,22 @@
 
 /* Sync Render Camera */
 
-void BlenderSync::sync_camera(BL::Object b_override, int width, int height)
+void BlenderSync::sync_camera(BL::RenderSettings b_render, BL::Object b_override, int width, int height)
 {
 	BlenderCamera bcam;
-	blender_camera_init(&bcam, b_scene);
+	blender_camera_init(&bcam, b_render, b_scene);
 
 	/* pixel aspect */
-	BL::RenderSettings r = b_scene.render();
+	bcam.pixelaspect.x = b_render.pixel_aspect_x();
+	bcam.pixelaspect.y = b_render.pixel_aspect_y();
+	bcam.shuttertime = b_render.motion_blur_shutter();
 
-	bcam.pixelaspect.x = r.pixel_aspect_x();
-	bcam.pixelaspect.y = r.pixel_aspect_y();
-	bcam.shuttertime = r.motion_blur_shutter();
-
 	/* border */
-	if(r.use_border()) {
-		bcam.border.left = r.border_min_x();
-		bcam.border.right = r.border_max_x();
-		bcam.border.bottom = r.border_min_y();
-		bcam.border.top = r.border_max_y();
+	if(b_render.use_border()) {
+		bcam.border.left = b_render.border_min_x();
+		bcam.border.right = b_render.border_max_x();
+		bcam.border.bottom = b_render.border_min_y();
+		bcam.border.top = b_render.border_max_y();
 	}
 
 	/* camera object */
@@ -406,7 +402,7 @@
 
 /* Sync 3D View Camera */
 
-static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
+static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
 	BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box);
 
 static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height, bool skip_panorama = false)
@@ -428,7 +424,7 @@
 				/* in panorama camera view, we map viewplane to camera border */
 				BoundBox2D view_box, cam_box;
 
-				blender_camera_view_subset(b_scene, b_ob, b_v3d, b_rv3d, width, height,
+				blender_camera_view_subset(b_scene.render(), b_scene, b_ob, b_v3d, b_rv3d, width, height,
 					&view_box, &cam_box);
 
 				bcam->pano_viewplane = view_box.make_relative_to(cam_box);
@@ -466,16 +462,15 @@
 	bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
 }
 
-static void blender_camera_view_subset(BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
+static void blender_camera_view_subset(BL::RenderSettings b_render, BL::Scene b_scene, BL::Object b_ob, BL::SpaceView3D b_v3d,
 	BL::RegionView3D b_rv3d, int width, int height, BoundBox2D *view_box, BoundBox2D *cam_box)
 {
-//	BL::RenderSettings r = b_scene.render();  /* UNUSED */
 	BoundBox2D cam, view;
 	float view_aspect, cam_aspect, sensor_size;
 
 	/* get viewport viewplane */
 	BlenderCamera view_bcam;
-	blender_camera_init(&view_bcam, b_scene);
+	blender_camera_init(&view_bcam, b_render, b_scene);
 	blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height, true);
 
 	blender_camera_viewplane(&view_bcam, width, height,
@@ -483,7 +478,7 @@
 
 	/* get camera viewplane */
 	BlenderCamera cam_bcam;
-	blender_camera_init(&cam_bcam, b_scene);
+	blender_camera_init(&cam_bcam, b_render, b_scene);
 	blender_camera_from_object(&cam_bcam, b_ob, true);
 
 	blender_camera_viewplane(&cam_bcam, cam_bcam.full_width, cam_bcam.full_height,
@@ -494,10 +489,9 @@
 	*cam_box = cam * (1.0f/cam_aspect);
 }
 
-static void blender_camera_border(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d,
+static void blender_camera_border(BlenderCamera *bcam, BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d,
 	BL::RegionView3D b_rv3d, int width, int height)
 {
-	BL::RenderSettings r = b_scene.render();
 	bool is_camera_view;
 
 	/* camera view? */
@@ -517,7 +511,7 @@
 			return;
 		}
 	}
-	else if(!r.use_border())
+	else if(!b_render.use_border())
 		return;
 
 	BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
@@ -525,15 +519,15 @@
 	if(!b_ob)
 		return;
 
-	bcam->border.left = r.border_min_x();
-	bcam->border.right = r.border_max_x();
-	bcam->border.bottom = r.border_min_y();
-	bcam->border.top = r.border_max_y();
+	bcam->border.left = b_render.border_min_x();
+	bcam->border.right = b_render.border_max_x();
+	bcam->border.bottom = b_render.border_min_y();
+	bcam->border.top = b_render.border_max_y();
 
 	/* determine camera viewport subset */
 	BoundBox2D view_box, cam_box;
 
-	blender_camera_view_subset(b_scene, b_ob, b_v3d, b_rv3d, width, height,
+	blender_camera_view_subset(b_render, b_scene, b_ob, b_v3d, b_rv3d, width, height,
 		&view_box, &cam_box);
 
 	/* determine viewport subset matching camera border */
@@ -544,14 +538,14 @@
 void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
 {
 	BlenderCamera bcam;
-	blender_camera_init(&bcam, b_scene);
+	blender_camera_init(&bcam, b_scene.render(), b_scene);
 	blender_camera_from_view(&bcam, b_scene, b_v3d, b_rv3d, width, height);
-	blender_camera_border(&bcam, b_scene, b_v3d, b_rv3d, width, height);
+	blender_camera_border(&bcam, b_scene.render(), b_scene, b_v3d, b_rv3d, width, height);
 
 	blender_camera_sync(scene->camera, &bcam, width, height);
 }
 
-BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height)
+BufferParams BlenderSync::get_buffer_params(BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height)
 {
 	BufferParams params;
 	bool use_border = false;
@@ -562,7 +556,7 @@
 	if(b_v3d && b_rv3d && b_rv3d.view_perspective() != BL::RegionView3D::view_perspective_CAMERA)
 		use_border = b_v3d.use_render_border();
 	else
-		use_border = b_scene.render().use_border();
+		use_border = b_render.use_border();
 
 	if(use_border) {
 		/* border render */

Modified: trunk/blender/intern/cycles/blender/blender_session.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_session.cpp	2013-03-14 07:25:54 UTC (rev 55269)
+++ trunk/blender/intern/cycles/blender/blender_session.cpp	2013-03-14 07:38:37 UTC (rev 55270)
@@ -41,13 +41,13 @@
 
 BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
 	BL::BlendData b_data_, BL::Scene b_scene_)
-: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_scene(b_scene_),
+: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_engine_.render()), b_scene(b_scene_),
   b_v3d(PointerRNA_NULL), b_rv3d(PointerRNA_NULL)
 {
 	/* offline render */
 
-	width = b_engine.resolution_x();
-	height = b_engine.resolution_y();
+	width = (int)(b_render.resolution_x()*b_render.resolution_percentage()/100);
+	height = (int)(b_render.resolution_y()*b_render.resolution_percentage()/100);
 
 	background = true;
 	last_redraw_time = 0.0f;
@@ -58,10 +58,11 @@
 BlenderSession::BlenderSession(BL::RenderEngine b_engine_, BL::UserPreferences b_userpref_,
 	BL::BlendData b_data_, BL::Scene b_scene_,
 	BL::SpaceView3D b_v3d_, BL::RegionView3D b_rv3d_, int width_, int height_)
-: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_scene(b_scene_),
+: b_engine(b_engine_), b_userpref(b_userpref_), b_data(b_data_), b_render(b_scene_.render()), b_scene(b_scene_),
   b_v3d(b_v3d_), b_rv3d(b_rv3d_)
 {
 	/* 3d view render */
+
 	width = width_;
 	height = height_;
 	background = false;
@@ -102,10 +103,10 @@
 	if(b_rv3d)
 		sync->sync_view(b_v3d, b_rv3d, width, height);
 	else
-		sync->sync_camera(b_engine.camera_override(), width, height);
+		sync->sync_camera(b_render, b_engine.camera_override(), width, height);
 
 	/* set buffer parameters */
-	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, b_v3d, b_rv3d, scene->camera, width, height);
+	BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, b_v3d, b_rv3d, scene->camera, width, height);
 	session->reset(buffer_params, session_params.samples);
 
 	b_engine.use_highlight_tiles(session_params.progressive_refine == false);
@@ -119,13 +120,14 @@
 void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_)
 {
 	b_data = b_data_;
+	b_render = b_engine.render();
 	b_scene = b_scene_;
 
 	SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background);
 	SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
 
-	width = b_engine.resolution_x();
-	height = b_engine.resolution_y();
+	width = b_render.resolution_x();
+	height = b_render.resolution_y();
 
 	if(scene->params.modified(scene_params) ||
 	   session->params.modified(session_params) ||
@@ -155,9 +157,9 @@
 	/* sync object should be re-created */
 	sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, session_params.device.type == DEVICE_CPU);
 	sync->sync_data(b_v3d, b_engine.camera_override());
-	sync->sync_camera(b_engine.camera_override(), width, height);
+	sync->sync_camera(b_render, b_engine.camera_override(), width, height);
 
-	BufferParams buffer_params = BlenderSync::get_buffer_params(b_scene, PointerRNA_NULL, PointerRNA_NULL, scene->camera, width, height);
+	BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_scene, PointerRNA_NULL, PointerRNA_NULL, scene->camera, width, height);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list