[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47550] trunk/blender: Cycles: border render now works in the viewport, when looking through the

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Jun 7 01:27:44 CEST 2012


Revision: 47550
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47550
Author:   blendix
Date:     2012-06-06 23:27:43 +0000 (Wed, 06 Jun 2012)
Log Message:
-----------
Cycles: border render now works in the viewport, when looking through the
camera, same as in render. It draws objects in solid draw mode outside of
the border.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_camera.cpp
    trunk/blender/intern/cycles/blender/blender_session.cpp
    trunk/blender/intern/cycles/blender/blender_sync.h
    trunk/blender/intern/cycles/render/buffers.cpp
    trunk/blender/intern/cycles/render/camera.cpp
    trunk/blender/intern/cycles/render/camera.h
    trunk/blender/intern/cycles/render/session.cpp
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/intern/cycles/blender/blender_camera.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-06-06 23:27:38 UTC (rev 47549)
+++ trunk/blender/intern/cycles/blender/blender_camera.cpp	2012-06-06 23:27:43 UTC (rev 47550)
@@ -56,6 +56,11 @@
 	float sensor_width;
 	float sensor_height;
 
+	float border_left;
+	float border_right;
+	float border_bottom;
+	float border_top;
+
 	Transform matrix;
 };
 
@@ -70,6 +75,8 @@
 	bcam->sensor_height = 18.0f;
 	bcam->sensor_fit = BlenderCamera::AUTO;
 	bcam->shuttertime = 1.0f;
+	bcam->border_right = 1.0f;
+	bcam->border_top = 1.0f;
 }
 
 static float blender_camera_focal_distance(BL::Object b_ob, BL::Camera b_camera)
@@ -188,86 +195,95 @@
 	return transform_clear_scale(result);
 }
 
-static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
+static void blender_camera_viewplane(BlenderCamera *bcam, int width, int height,
+	float *left, float *right, float *bottom, float *top, float *aspectratio, float *sensor_size)
 {
-	/* copy camera to compare later */
-	Camera prevcam = *cam;
-
 	/* dimensions */
 	float xratio = width*bcam->pixelaspect.x;
 	float yratio = height*bcam->pixelaspect.y;
 
 	/* compute x/y aspect and ratio */
-	float aspectratio, xaspect, yaspect;
+	float xaspect, yaspect;
 
 	/* sensor fitting */
 	bool horizontal_fit;
-	float sensor_size;
 
-	cam->sensorwidth = bcam->sensor_width;
-	cam->sensorheight = bcam->sensor_height;
-
 	if(bcam->sensor_fit == BlenderCamera::AUTO) {
 		horizontal_fit = (xratio > yratio);
-		sensor_size = bcam->sensor_width;
+		*sensor_size = bcam->sensor_width;
 	}
 	else if(bcam->sensor_fit == BlenderCamera::HORIZONTAL) {
 		horizontal_fit = true;
-		sensor_size = bcam->sensor_width;
+		*sensor_size = bcam->sensor_width;
 	}
 	else {
 		horizontal_fit = false;
-		sensor_size = bcam->sensor_height;
+		*sensor_size = bcam->sensor_height;
 	}
 
 	if(horizontal_fit) {
-		aspectratio= xratio/yratio;
-		xaspect= aspectratio;
+		*aspectratio= xratio/yratio;
+		xaspect= *aspectratio;
 		yaspect= 1.0f;
 	}
 	else {
-		aspectratio= yratio/xratio;
+		*aspectratio= yratio/xratio;
 		xaspect= 1.0f;
-		yaspect= aspectratio;
+		yaspect= *aspectratio;
 	}
 
 	/* modify aspect for orthographic scale */
 	if(bcam->type == CAMERA_ORTHOGRAPHIC) {
-		xaspect = xaspect*bcam->ortho_scale/(aspectratio*2.0f);
-		yaspect = yaspect*bcam->ortho_scale/(aspectratio*2.0f);
-		aspectratio = bcam->ortho_scale/2.0f;
+		xaspect = xaspect*bcam->ortho_scale/(*aspectratio*2.0f);
+		yaspect = yaspect*bcam->ortho_scale/(*aspectratio*2.0f);
+		*aspectratio = bcam->ortho_scale/2.0f;
 	}
 
 	if(bcam->type == CAMERA_PANORAMA) {
 		/* set viewplane */
-		cam->left = 0.0f;
-		cam->right = 1.0f;
-		cam->bottom = 0.0f;
-		cam->top = 1.0f;
+		*left = 0.0f;
+		*right = 1.0f;
+		*bottom = 0.0f;
+		*top = 1.0f;
 	}
 	else {
 		/* set viewplane */
-		cam->left = -xaspect;
-		cam->right = xaspect;
-		cam->bottom = -yaspect;
-		cam->top = yaspect;
+		*left = -xaspect;
+		*right = xaspect;
+		*bottom = -yaspect;
+		*top = yaspect;
 
 		/* zoom for 3d camera view */
-		cam->left *= bcam->zoom;
-		cam->right *= bcam->zoom;
-		cam->bottom *= bcam->zoom;
-		cam->top *= bcam->zoom;
+		*left *= bcam->zoom;
+		*right *= bcam->zoom;
+		*bottom *= bcam->zoom;
+		*top *= bcam->zoom;
 
 		/* modify viewplane with camera shift and 3d camera view offset */
-		float dx = 2.0f*(aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
-		float dy = 2.0f*(aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
+		float dx = 2.0f*(*aspectratio*bcam->shift.x + bcam->offset.x*xaspect*2.0f);
+		float dy = 2.0f*(*aspectratio*bcam->shift.y + bcam->offset.y*yaspect*2.0f);
 
-		cam->left += dx;
-		cam->right += dx;
-		cam->bottom += dy;
-		cam->top += dy;
+		*left += dx;
+		*right += dx;
+		*bottom += dy;
+		*top += dy;
 	}
+}
 
+static void blender_camera_sync(Camera *cam, BlenderCamera *bcam, int width, int height)
+{
+	/* copy camera to compare later */
+	Camera prevcam = *cam;
+	float aspectratio, sensor_size;
+
+	/* viewplane */
+	blender_camera_viewplane(bcam, width, height,
+		&cam->left, &cam->right, &cam->bottom, &cam->top, &aspectratio, &sensor_size);
+
+	/* sensor */
+	cam->sensorwidth = bcam->sensor_width;
+	cam->sensorheight = bcam->sensor_height;
+
 	/* clipping distances */
 	cam->nearclip = bcam->nearclip;
 	cam->farclip = bcam->farclip;
@@ -294,6 +310,12 @@
 	cam->use_motion = false;
 	cam->shuttertime = bcam->shuttertime;
 
+	/* border */
+	cam->border_left = bcam->border_left;
+	cam->border_right = bcam->border_right;
+	cam->border_bottom = bcam->border_bottom;
+	cam->border_top = bcam->border_top;
+
 	/* set update flag */
 	if(cam->modified(prevcam))
 		cam->tag_update();
@@ -313,6 +335,14 @@
 	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();
+	}
+
 	/* camera object */
 	BL::Object b_ob = b_scene.camera();
 
@@ -348,67 +378,142 @@
 
 /* Sync 3D View Camera */
 
-void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
+static void blender_camera_from_view(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
 {
-	BlenderCamera bcam;
-	blender_camera_init(&bcam);
-
 	/* 3d view parameters */
-	bcam.nearclip = b_v3d.clip_start();
-	bcam.farclip = b_v3d.clip_end();
-	bcam.lens = b_v3d.lens();
-	bcam.shuttertime = b_scene.render().motion_blur_shutter();
+	bcam->nearclip = b_v3d.clip_start();
+	bcam->farclip = b_v3d.clip_end();
+	bcam->lens = b_v3d.lens();
+	bcam->shuttertime = b_scene.render().motion_blur_shutter();
 
 	if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA) {
 		/* camera view */
 		BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
 
 		if(b_ob) {
-			blender_camera_from_object(&bcam, b_ob);
+			blender_camera_from_object(bcam, b_ob);
 
 			/* magic zoom formula */
-			bcam.zoom = (float)b_rv3d.view_camera_zoom();
-			bcam.zoom = (1.41421f + bcam.zoom/50.0f);
-			bcam.zoom *= bcam.zoom;
-			bcam.zoom = 2.0f/bcam.zoom;
+			bcam->zoom = (float)b_rv3d.view_camera_zoom();
+			bcam->zoom = (1.41421f + bcam->zoom/50.0f);
+			bcam->zoom *= bcam->zoom;
+			bcam->zoom = 2.0f/bcam->zoom;
 
 			/* offset */
-			bcam.offset = get_float2(b_rv3d.view_camera_offset());
+			bcam->offset = get_float2(b_rv3d.view_camera_offset());
 		}
 	}
 	else if(b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_ORTHO) {
 		/* orthographic view */
-		bcam.farclip *= 0.5;
-		bcam.nearclip = -bcam.farclip;
+		bcam->farclip *= 0.5;
+		bcam->nearclip = -bcam->farclip;
 
-		bcam.type = CAMERA_ORTHOGRAPHIC;
-		bcam.ortho_scale = b_rv3d.view_distance();
+		bcam->type = CAMERA_ORTHOGRAPHIC;
+		bcam->ortho_scale = b_rv3d.view_distance();
 	}
 
-	bcam.zoom *= 2.0f;
+	bcam->zoom *= 2.0f;
 
 	/* 3d view transform */
-	bcam.matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
+	bcam->matrix = transform_inverse(get_transform(b_rv3d.view_matrix()));
+}
 
-	/* sync */
+static void blender_camera_border(BlenderCamera *bcam, BL::Scene b_scene, BL::SpaceView3D b_v3d,
+	BL::RegionView3D b_rv3d, int width, int height)
+{
+	BL::RenderSettings r = b_scene.render();
+
+	if(!r.use_border())
+		return;
+
+	/* camera view? */
+	if(!(b_rv3d && b_rv3d.view_perspective() == BL::RegionView3D::view_perspective_CAMERA))
+		return;
+
+	BL::Object b_ob = (b_v3d.lock_camera_and_layers())? b_scene.camera(): b_v3d.camera();
+
+	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();
+
+	float cam_left, cam_right, cam_bottom, cam_top;
+	float view_left, view_right, view_bottom, view_top;
+	float view_aspect, cam_aspect, sensor_size;
+
+	/* get viewport viewplane */
+	BlenderCamera view_bcam;
+	blender_camera_init(&view_bcam);
+	blender_camera_from_view(&view_bcam, b_scene, b_v3d, b_rv3d, width, height);
+
+	blender_camera_viewplane(&view_bcam, width, height,
+		&view_left, &view_right, &view_bottom, &view_top, &view_aspect, &sensor_size);
+
+	view_left /= view_aspect;
+	view_right /= view_aspect;
+	view_bottom /= view_aspect;
+	view_top /= view_aspect;
+
+	/* get camera viewplane */
+	BlenderCamera cam_bcam;
+	blender_camera_init(&cam_bcam);
+	blender_camera_from_object(&cam_bcam, b_ob);
+
+	width = (int)(r.resolution_x()*r.resolution_percentage()/100);
+	height = (int)(r.resolution_y()*r.resolution_percentage()/100);
+
+	blender_camera_viewplane(&cam_bcam, width, height,
+		&cam_left, &cam_right, &cam_bottom, &cam_top, &cam_aspect, &sensor_size);
+
+	cam_left /= cam_aspect;
+	cam_right /= cam_aspect;
+	cam_bottom /= cam_aspect;
+	cam_top /= cam_aspect;
+
+	/* determine viewport subset matching camera border */
+	float tmp_left = ((cam_left - view_left) / (view_right - view_left));
+	float tmp_right = ((cam_right - view_left) / (view_right - view_left));
+	float tmp_bottom = ((cam_bottom - view_bottom) / (view_top - view_bottom));
+	float tmp_top = ((cam_top - view_bottom) / (view_top - view_bottom));
+
+	bcam->border_left = tmp_left + bcam->border_left*(tmp_right - tmp_left);
+	bcam->border_right = tmp_left + bcam->border_right*(tmp_right - tmp_left);
+	bcam->border_bottom = tmp_bottom + bcam->border_bottom*(tmp_top - tmp_bottom);
+	bcam->border_top = tmp_bottom + bcam->border_top*(tmp_top - tmp_bottom);
+
+	/* clamp */
+	bcam->border_left = max(bcam->border_left, 0.0f);
+	bcam->border_right = min(bcam->border_right, 1.0f);
+	bcam->border_bottom = max(bcam->border_bottom, 0.0f);
+	bcam->border_top = min(bcam->border_top, 1.0f);
+}
+
+void BlenderSync::sync_view(BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, int width, int height)
+{
+	BlenderCamera bcam;
+	blender_camera_init(&bcam);
+	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_sync(scene->camera, &bcam, width, height);
 }
 
-BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, BL::RegionView3D b_rv3d, int width, int height)
+BufferParams BlenderSync::get_buffer_params(BL::Scene b_scene, Camera *cam, int width, int height)
 {
 	BufferParams params;
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list