[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(¶ms);
camera_params_from_object(¶ms, cam_ob);
- camera_params_compute(¶ms, ps->winx, ps->winy, 1.0f, 1.0f); /* XXX aspect? */
+ camera_params_compute(¶ms, 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