Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/space_view3d/view3d_view.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_view.c65
1 files changed, 52 insertions, 13 deletions
diff --git a/source/blender/editors/space_view3d/view3d_view.c b/source/blender/editors/space_view3d/view3d_view.c
index 93c577619de..7de1f2a85bb 100644
--- a/source/blender/editors/space_view3d/view3d_view.c
+++ b/source/blender/editors/space_view3d/view3d_view.c
@@ -966,10 +966,14 @@ int ED_view3d_clip_range_get(View3D *v3d, RegionView3D *rv3d, float *clipsta, fl
int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
{
Camera *cam=NULL;
- float lens, fac, x1, y1, x2, y2;
+ float lens, sensor_x =DEFAULT_SENSOR_WIDTH, sensor_y= DEFAULT_SENSOR_HEIGHT, fac, x1, y1, x2, y2;
float winx= (float)winxi, winy= (float)winyi;
int orth= 0;
-
+ short sensor_fit= CAMERA_SENSOR_FIT_AUTO;
+
+ /* currnetly using sensor size (depends on fov calculating method) */
+ float sensor= DEFAULT_SENSOR_WIDTH;
+
lens= v3d->lens;
*clipsta= v3d->near;
@@ -992,8 +996,13 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
else if(v3d->camera->type==OB_CAMERA) {
cam= v3d->camera->data;
lens= cam->lens;
+ sensor_x= cam->sensor_x;
+ sensor_y= cam->sensor_y;
*clipsta= cam->clipsta;
*clipend= cam->clipend;
+ sensor_fit= cam->sensor_fit;
+
+ sensor= (cam->sensor_fit==CAMERA_SENSOR_FIT_VERT) ? (cam->sensor_y) : (cam->sensor_x);
}
}
}
@@ -1024,21 +1033,44 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
if(cam && cam->type==CAM_ORTHO) {
/* ortho_scale == 1 means exact 1 to 1 mapping */
float dfac= 2.0f*cam->ortho_scale/fac;
-
- if(winx>winy) x1= -dfac;
- else x1= -winx*dfac/winy;
+
+ if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(winx>winy) {
+ x1= -dfac;
+ y1= -winy*dfac/winx;
+ }
+ else {
+ x1= -winx*dfac/winy;
+ y1= -dfac;
+ }
+ }
+ else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ x1= -dfac;
+ y1= -winy*dfac/winx;
+ }
+ else {
+ x1= -winx*dfac/winy;
+ y1= -dfac;
+ }
+
x2= -x1;
-
- if(winx>winy) y1= -winy*dfac/winx;
- else y1= -dfac;
y2= -y1;
+
orth= 1;
}
else {
float dfac;
- if(winx>winy) dfac= 64.0f/(fac*winx*lens);
- else dfac= 64.0f/(fac*winy*lens);
+ if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
+ if(winx>winy) dfac= (sensor_x * 2.0) / (fac*winx*lens);
+ else dfac= (sensor_x * 2.0) / (fac*winy*lens);
+ }
+ else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
+ dfac= (sensor_x * 2.0) / (fac*winx*lens);
+ }
+ else {
+ dfac= (sensor_y * 2.0) / (fac*winy*lens);
+ }
x1= - *clipsta * winx*dfac;
x2= -x1;
@@ -1057,8 +1089,8 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
dy += cam->shifty * cam->ortho_scale;
}
else {
- dx += cam->shiftx * (cam->clipsta / cam->lens) * 32.0f;
- dy += cam->shifty * (cam->clipsta / cam->lens) * 32.0f;
+ dx += cam->shiftx * (cam->clipsta / cam->lens) * sensor;
+ dy += cam->shifty * (cam->clipsta / cam->lens) * sensor;
}
x1+= dx;
@@ -1076,7 +1108,14 @@ int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winy
*pixsize= 1.0f/viewfac;
}
else {
- viewfac= (((winx >= winy)? winx: winy)*lens)/32.0f;
+ float size= ((winx >= winy)? winx: winy);
+
+ if(sensor_fit==CAMERA_SENSOR_FIT_HOR)
+ size= winx;
+ else if(sensor_fit==CAMERA_SENSOR_FIT_VERT)
+ size= winy;
+
+ viewfac= (size*lens)/sensor;
*pixsize= *clipsta/viewfac;
}
}