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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to