[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41975] trunk/blender/source/blender: Camera: more code refactoring, adding a function to create CameraParams from

Brecht Van Lommel brechtvanlommel at pandora.be
Fri Nov 18 22:19:04 CET 2011


Revision: 41975
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41975
Author:   blendix
Date:     2011-11-18 21:19:03 +0000 (Fri, 18 Nov 2011)
Log Message:
-----------
Camera: more code refactoring, adding a function to create CameraParams from
3d view, deduplicating the complex code for setting up the viewplane.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_camera.h
    trunk/blender/source/blender/blenkernel/intern/camera.c
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/render/render_opengl.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/makesrna/intern/rna_camera.c

Modified: trunk/blender/source/blender/blenkernel/BKE_camera.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_camera.h	2011-11-18 21:06:36 UTC (rev 41974)
+++ trunk/blender/source/blender/blenkernel/BKE_camera.h	2011-11-18 21:19:03 UTC (rev 41975)
@@ -40,21 +40,27 @@
 
 struct Camera;
 struct Object;
+struct RegionView3D;
 struct RenderData;
 struct Scene;
 struct rctf;
 struct View3D;
 
+/* Camera Datablock */
+
 void *add_camera(const char *name);
 struct Camera *copy_camera(struct Camera *cam);
 void make_local_camera(struct Camera *cam);
 void free_camera(struct Camera *ca);
 
-/* Camera Object */
+/* Camera Usage */
 
 float object_camera_dof_distance(struct Object *ob);
 void object_camera_mode(struct RenderData *rd, struct Object *ob);
 
+int camera_sensor_fit(int sensor_fit, float sizex, float sizey);
+float camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y);
+
 /* Camera Parameters:
  *
  * Intermediate struct for storing camera parameters from various sources,
@@ -65,9 +71,12 @@
 	int is_ortho;
 	float lens;
 	float ortho_scale;
+	float zoom;
 
 	float shiftx;
 	float shifty;
+	float offsetx;
+	float offsety;
 
 	/* sensor */
 	float sensor_x;
@@ -95,6 +104,7 @@
 
 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);
 
 /* Camera View Frame */

Modified: trunk/blender/source/blender/blenkernel/intern/camera.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-18 21:06:36 UTC (rev 41974)
+++ trunk/blender/source/blender/blenkernel/intern/camera.c	2011-11-18 21:19:03 UTC (rev 41975)
@@ -35,6 +35,7 @@
 #include "DNA_lamp_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_view3d_types.h"
 
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
@@ -45,6 +46,7 @@
 #include "BKE_global.h"
 #include "BKE_library.h"
 #include "BKE_main.h"
+#include "BKE_screen.h"
 
 /****************************** Camera Datablock *****************************/
 
@@ -161,9 +163,16 @@
 	return cam->YF_dofdist;
 }
 
-/******************************** Camera Params *******************************/
+float camera_sensor_size(int sensor_fit, float sensor_x, float sensor_y)
+{
+	/* sensor size used to fit to. for auto, sensor_x is both x and y. */
+	if(sensor_fit == CAMERA_SENSOR_FIT_VERT)
+		return sensor_y;
 
-static int camera_sensor_fit(int sensor_fit, float sizex, float sizey)
+	return sensor_x;
+}
+
+int camera_sensor_fit(int sensor_fit, float sizex, float sizey)
 {
 	if(sensor_fit == CAMERA_SENSOR_FIT_AUTO) {
 		if(sizex >= sizey)
@@ -175,6 +184,8 @@
 	return sensor_fit;
 }
 
+/******************************** Camera Params *******************************/
+
 void camera_params_init(CameraParams *params)
 {
 	memset(params, 0, sizeof(CameraParams));
@@ -183,6 +194,8 @@
 	params->sensor_x= DEFAULT_SENSOR_WIDTH;
 	params->sensor_y= DEFAULT_SENSOR_HEIGHT;
 	params->sensor_fit= CAMERA_SENSOR_FIT_AUTO;
+
+	params->zoom= 1.0f;
 }
 
 void camera_params_from_object(CameraParams *params, Object *ob)
@@ -224,10 +237,42 @@
 	}
 }
 
+void camera_params_from_view3d(CameraParams *params, View3D *v3d, RegionView3D *rv3d)
+{
+	/* perspective view */
+	params->lens= v3d->lens;
+	params->clipsta= v3d->near;
+	params->clipend= v3d->far;
+
+	if(rv3d->persp==RV3D_CAMOB) {
+		/* 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->offsetx= rv3d->camdx;
+		params->offsety= rv3d->camdy;
+
+		params->shiftx *= 0.5f;
+		params->shifty *= 0.5f;
+	}
+	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->ortho_scale = rv3d->dist;
+	}
+
+	params->zoom *= 2.0f;
+}
+
 void camera_params_compute(CameraParams *params, int winx, int winy, float xasp, float yasp)
 {
 	rctf viewplane;
-	float pixsize, winside, viewfac;
+	float pixsize, viewfac, sensor_size, dx, dy;
 	int sensor_fit;
 
 	/* fields rendering */
@@ -235,48 +280,47 @@
 	if(params->use_fields)
 		params->ycor *= 2.0f;
 
-	/* determine sensor fit */
-	sensor_fit = camera_sensor_fit(params->sensor_fit, xasp*winx, yasp*winy);
-
 	if(params->is_ortho) {
-		/* orthographic camera, scale == 1.0 means exact 1 to 1 mapping */
-		if(sensor_fit==CAMERA_SENSOR_FIT_HOR)
-			viewfac= winx;
-		else
-			viewfac= params->ycor * winy;
-
-		pixsize= params->ortho_scale/viewfac;
+		/* orthographic camera */
+		/* scale == 1.0 means exact 1 to 1 mapping */
+		pixsize= params->ortho_scale;
 	}
 	else {
 		/* perspective camera */
-		float sensor_size;
+		sensor_size= camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y);
+		pixsize= (sensor_size * params->clipsta)/params->lens;
+	}
 
-		/* note for auto fit sensor_x is both width and height */
-		if(params->sensor_fit == CAMERA_SENSOR_FIT_VERT)
-			sensor_size= params->sensor_y;
-		else
-			sensor_size= params->sensor_x;
-		
-		if(sensor_fit == CAMERA_SENSOR_FIT_HOR)
-			viewfac= (params->lens * winx) / sensor_size;
-		else
-			viewfac= params->ycor * (params->lens * winy) / sensor_size;
+	/* determine sensor fit */
+	sensor_fit = camera_sensor_fit(params->sensor_fit, xasp*winx, yasp*winy);
 
-		pixsize= params->clipsta/viewfac;
-	}
+	if(sensor_fit==CAMERA_SENSOR_FIT_HOR)
+		viewfac= winx;
+	else
+		viewfac= params->ycor * winy;
 
+	pixsize /= viewfac;
+
+	/* extra zoom factor */
+	pixsize *= params->zoom;
+
 	/* compute view plane:
 	 * fully centered, zbuffer fills in jittered between -.5 and +.5 */
-	if(sensor_fit == CAMERA_SENSOR_FIT_HOR)
-		winside= winx;
-	else
-		winside= winy;
+	viewplane.xmin= -0.5f*(float)winx;
+	viewplane.ymin= -0.5f*params->ycor*(float)winy;
+	viewplane.xmax=  0.5f*(float)winx;
+	viewplane.ymax=  0.5f*params->ycor*(float)winy;
 
-	viewplane.xmin= -0.5f*(float)winx + params->shiftx*winside;
-	viewplane.ymin= -0.5f*params->ycor*(float)winy + params->shifty*winside;
-	viewplane.xmax=  0.5f*(float)winx + params->shiftx*winside;
-	viewplane.ymax=  0.5f*params->ycor*(float)winy + params->shifty*winside;
+	/* lens shift and offset */
+	dx= params->shiftx*viewfac + winx*params->offsetx;
+	dy= params->shifty*viewfac + winy*params->offsety;
 
+	viewplane.xmin += dx;
+	viewplane.ymin += dy;
+	viewplane.xmax += dx;
+	viewplane.ymax += dy;
+
+	/* fields offset */
 	if(params->field_second) {
 		if(params->field_odd) {
 			viewplane.ymin-= 0.5f * params->ycor;
@@ -297,15 +341,15 @@
 
 	params->viewdx= pixsize;
 	params->viewdy= params->ycor * pixsize;
+	params->viewplane= viewplane;
 
+	/* compute projection matrix */
 	if(params->is_ortho)
 		orthographic_m4(params->winmat, viewplane.xmin, viewplane.xmax,
 			viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
 	else
 		perspective_m4(params->winmat, viewplane.xmin, viewplane.xmax,
 			viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
-	
-	params->viewplane= viewplane;
 }
 
 /***************************** Camera View Frame *****************************/

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2011-11-18 21:06:36 UTC (rev 41974)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2011-11-18 21:19:03 UTC (rev 41975)
@@ -208,7 +208,7 @@
 
 void ED_view3d_ob_clip_range_get(struct Object *ob, float *lens, float *clipsta, float *clipend);
 int ED_view3d_clip_range_get(struct View3D *v3d, struct RegionView3D *rv3d, float *clipsta, float *clipend);
-int ED_view3d_viewplane_get(struct View3D *v3d, struct RegionView3D *rv3d, int winxi, int winyi, struct rctf *viewplane, float *clipsta, float *clipend, float *pixsize);
+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);

Modified: trunk/blender/source/blender/editors/render/render_opengl.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_opengl.c	2011-11-18 21:06:36 UTC (rev 41974)
+++ trunk/blender/source/blender/editors/render/render_opengl.c	2011-11-18 21:19:03 UTC (rev 41975)
@@ -147,7 +147,7 @@
 			rctf viewplane;
 			float clipsta, clipend;
 
-			int is_ortho= ED_view3d_viewplane_get(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend, NULL);
+			int is_ortho= ED_view3d_viewplane_get(v3d, rv3d, sizex, sizey, &viewplane, &clipsta, &clipend);
 			if(is_ortho) orthographic_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, -clipend, clipend);
 			else  perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
 		}

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-11-18 21:06:36 UTC (rev 41974)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c	2011-11-18 21:19:03 UTC (rev 41975)
@@ -3068,7 +3068,7 @@
 				/* 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); /* XXX aspect? */
+				camera_params_compute(&params, ps->winx, ps->winy, 1.0f, 1.0f);
 
 				copy_m4_m4(winmat, params.winmat);
 				ps->clipsta= params.clipsta;

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_view.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list