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

Reply via email to