[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41988] trunk/blender/source/blender: Camera: some more refactoring, mostly in the function that computes the camera

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Nov 19 19:35:42 CET 2011


Revision: 41988
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41988
Author:   blendix
Date:     2011-11-19 18:35:42 +0000 (Sat, 19 Nov 2011)
Log Message:
-----------
Camera: some more refactoring, mostly in the function that computes the camera
border, now we just get the border coordinates from comparing the viewport and
camera viewplanes.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_camera.h
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/editors/gpencil/drawgpencil.c
    trunk/blender/source/blender/editors/gpencil/gpencil_edit.c
    trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_edit.c
    trunk/blender/source/blender/editors/space_view3d/view3d_intern.h
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/modifiers/intern/MOD_uvproject.c
    trunk/blender/source/blender/render/intern/source/initrender.c

Modified: trunk/blender/source/blender/blenkernel/BKE_camera.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_camera.h	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/blenkernel/BKE_camera.h	2011-11-19 18:35:42 UTC (rev 41988)
@@ -92,21 +92,23 @@
 	int field_second;
 	int field_odd;
 
-	/* compute result */
+	/* computed viewplane */
 	float ycor;
-
 	float viewdx;
 	float viewdy;
 	rctf viewplane;
 
+	/* computed matrix */
 	float winmat[4][4];
 } CameraParams;
 
 void camera_params_init(CameraParams *params);
 void camera_params_from_object(CameraParams *params, struct Object *camera);
 void camera_params_from_view3d(CameraParams *params, struct View3D *v3d, struct RegionView3D *rv3d);
-void camera_params_compute(CameraParams *params, int winx, int winy, float aspx, float aspy);
 
+void camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy);
+void camera_params_compute_matrix(CameraParams *params);
+
 /* Camera View Frame */
 
 void camera_view_frame_ex(struct Scene *scene, struct Camera *camera, float drawsize, const short do_clip, const float scale[3],

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -241,7 +241,7 @@
 
 void camera_params_from_view3d(CameraParams *params, View3D *v3d, RegionView3D *rv3d)
 {
-	/* perspective view */
+	/* common */
 	params->lens= v3d->lens;
 	params->clipsta= v3d->near;
 	params->clipend= v3d->far;
@@ -250,28 +250,32 @@
 		/* camera view */
 		camera_params_from_object(params, v3d->camera);
 
-		params->zoom= BKE_screen_view3d_zoom_to_fac((float)rv3d->camzoom) * 2.0f;
-		params->zoom= 1.0f/params->zoom;
+		params->zoom= BKE_screen_view3d_zoom_to_fac((float)rv3d->camzoom);
 
-		params->offsetx= rv3d->camdx;
-		params->offsety= rv3d->camdy;
+		params->offsetx= 2.0f*rv3d->camdx*params->zoom;
+		params->offsety= 2.0f*rv3d->camdy*params->zoom;
 
-		params->shiftx *= 0.5f;
-		params->shifty *= 0.5f;
+		params->shiftx *= params->zoom;
+		params->shifty *= params->zoom;
+
+		params->zoom= 1.0f/params->zoom;
 	}
 	else if(rv3d->persp==RV3D_ORTHO) {
 		/* orthographic view */
 		params->clipend *= 0.5f;	// otherwise too extreme low zbuffer quality
 		params->clipsta= - params->clipend;
 
-		params->is_ortho= 1;
+		params->is_ortho= TRUE;
 		params->ortho_scale = rv3d->dist;
+		params->zoom= 2.0f;
 	}
-
-	params->zoom *= 2.0f;
+	else {
+		/* perspective view */
+		params->zoom= 2.0f;
+	}
 }
 
-void camera_params_compute(CameraParams *params, int winx, int winy, float xasp, float yasp)
+void camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float xasp, float yasp)
 {
 	rctf viewplane;
 	float pixsize, viewfac, sensor_size, dx, dy;
@@ -344,7 +348,13 @@
 	params->viewdx= pixsize;
 	params->viewdy= params->ycor * pixsize;
 	params->viewplane= viewplane;
+}
 
+/* viewplane is assumed to be already computed */
+void camera_params_compute_matrix(CameraParams *params)
+{
+	rctf viewplane= params->viewplane;
+
 	/* compute projection matrix */
 	if(params->is_ortho)
 		orthographic_m4(params->winmat, viewplane.xmin, viewplane.xmax,

Modified: trunk/blender/source/blender/editors/gpencil/drawgpencil.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/drawgpencil.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/gpencil/drawgpencil.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -794,7 +794,7 @@
 	 * deal with the camera border, otherwise map the coords to the camera border. */
 	if ((rv3d->persp == RV3D_CAMOB) && !(G.f & G_RENDER_OGL)) {
 		rctf rectf;
-		ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &rectf, -1); /* negative shift */
+		ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, &rectf, TRUE); /* no shift */
 		BLI_copy_rcti_rctf(&rect, &rectf);
 	}
 	else {

Modified: trunk/blender/source/blender/editors/gpencil/gpencil_edit.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_edit.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_edit.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -468,7 +468,7 @@
 		/* for camera view set the subrect */
 		if (rv3d->persp == RV3D_CAMOB) {
 			Scene *scene= CTX_data_scene(C);
-			ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, subrect, -1); /* negative shift */
+			ED_view3d_calc_camera_border(scene, ar, v3d, rv3d, subrect, TRUE); /* no shift */
 			return 1;
 		}
 	}

Modified: trunk/blender/source/blender/editors/gpencil/gpencil_paint.c
===================================================================
--- trunk/blender/source/blender/editors/gpencil/gpencil_paint.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/gpencil/gpencil_paint.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -1258,7 +1258,7 @@
 
 			/* for camera view set the subrect */
 			if (rv3d->persp == RV3D_CAMOB) {
-				ED_view3d_calc_camera_border(p->scene, p->ar, v3d, rv3d, &p->subrect_data, -1); /* negative shift */
+				ED_view3d_calc_camera_border(p->scene, p->ar, v3d, rv3d, &p->subrect_data, TRUE); /* no shift */
 				p->subrect= &p->subrect_data;
 			}
 		}

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2011-11-19 18:35:42 UTC (rev 41988)
@@ -210,7 +210,8 @@
 int ED_view3d_viewplane_get(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct rctf *viewplane, float *clipsta, float *clipend);
 void ED_view3d_ob_project_mat_get(struct RegionView3D *v3d, struct Object *ob, float pmat[4][4]);
 void ED_view3d_project_float(struct ARegion *a, const float vec[3], float adr[2], float mat[4][4]);
-void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, struct rctf *viewborder_r, short do_shift);
+void ED_view3d_calc_camera_border(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, struct rctf *viewborder_r, short no_shift);
+void ED_view3d_calc_camera_border_size(struct Scene *scene, struct ARegion *ar, struct View3D *v3d, struct RegionView3D *rv3d, float size_r[2]);
 
 /* drawobject.c iterators */
 void mesh_foreachScreenVert(struct ViewContext *vc, void (*func)(void *userData, struct EditVert *eve, int x, int y, int index), void *userData, int clipVerts);

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -3068,7 +3068,8 @@
 				/* window matrix, clipping and ortho */
 				camera_params_init(&params);
 				camera_params_from_object(&params, cam_ob);
-				camera_params_compute(&params, ps->winx, ps->winy, 1.0f, 1.0f);
+				camera_params_compute_viewplane(&params, ps->winx, ps->winy, 1.0f, 1.0f);
+				camera_params_compute_matrix(&params);
 
 				copy_m4_m4(winmat, params.winmat);
 				ps->clipsta= params.clipsta;

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2011-11-19 16:17:35 UTC (rev 41987)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2011-11-19 18:35:42 UTC (rev 41988)
@@ -923,75 +923,48 @@
 	BLF_draw_default(offset,  10, 0.0f, info, sizeof(info)-1);
 }
 
-void view3d_viewborder_size_get(Scene *scene, Object *camob, ARegion *ar, float size_r[2])
+static void view3d_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, rctf *viewborder_r, short no_shift, short no_zoom)
 {
-	float aspect= (scene->r.xsch*scene->r.xasp) / (scene->r.ysch*scene->r.yasp);
-	short sensor_fit= CAMERA_SENSOR_FIT_AUTO;
+	CameraParams params;
+	rctf rect_view, rect_camera;
 
-	if(camob && camob->type==OB_CAMERA) {
-		Camera *cam= (Camera *)camob->data;
-		sensor_fit= cam->sensor_fit;
-	}
+	/* get viewport viewplane */
+	camera_params_init(&params);
+	camera_params_from_view3d(&params, v3d, rv3d);
+	if(no_zoom)
+		params.zoom= 1.0f;
+	camera_params_compute_viewplane(&params, ar->winx, ar->winy, 1.0f, 1.0f);
+	rect_view= params.viewplane;
 
-	if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
-		float winmax= MAX2(ar->winx, ar->winy);
-
-		if(aspect > 1.0f) {
-			size_r[0]= winmax;
-			size_r[1]= winmax/aspect;
-		} else {
-			size_r[0]= winmax*aspect;
-			size_r[1]= winmax;
-		}
+	/* get camera viewplane */
+	camera_params_init(&params);
+	camera_params_from_object(&params, v3d->camera);
+	if(no_shift) {
+		params.shiftx= 0.0f;
+		params.shifty= 0.0f;
 	}
-	else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
-		size_r[0]= ar->winx;
-		size_r[1]= ar->winx/aspect;
-	}
-	else {
-		size_r[0]= ar->winy*aspect;
-		size_r[1]= ar->winy;
-	}
+	camera_params_compute_viewplane(&params, scene->r.xsch, scene->r.ysch, scene->r.xasp, scene->r.yasp);
+	rect_camera= params.viewplane;
+
+	/* get camera border within viewport */
+	viewborder_r->xmin= ((rect_camera.xmin - rect_view.xmin)/(rect_view.xmax - rect_view.xmin))*ar->winx;
+	viewborder_r->xmax= ((rect_camera.xmax - rect_view.xmin)/(rect_view.xmax - rect_view.xmin))*ar->winx;
+	viewborder_r->ymin= ((rect_camera.ymin - rect_view.ymin)/(rect_view.ymax - rect_view.ymin))*ar->winy;
+	viewborder_r->ymax= ((rect_camera.ymax - rect_view.ymin)/(rect_view.ymax - rect_view.ymin))*ar->winy;
 }
 
-void ED_view3d_calc_camera_border(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, rctf *viewborder_r, short do_shift)
+void ED_view3d_calc_camera_border_size(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, float size_r[2])
 {
-	const float zoomfac= BKE_screen_view3d_zoom_to_fac((float)rv3d->camzoom);
-	float size[2];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list