[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(¶ms);
camera_params_from_object(¶ms, cam_ob);
- camera_params_compute(¶ms, ps->winx, ps->winy, 1.0f, 1.0f);
+ camera_params_compute_viewplane(¶ms, ps->winx, ps->winy, 1.0f, 1.0f);
+ camera_params_compute_matrix(¶ms);
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(¶ms);
+ camera_params_from_view3d(¶ms, v3d, rv3d);
+ if(no_zoom)
+ params.zoom= 1.0f;
+ camera_params_compute_viewplane(¶ms, 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(¶ms);
+ camera_params_from_object(¶ms, 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(¶ms, 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