forked from bartvdbraak/blender
Camera: more code refactoring, adding a function to create CameraParams from
3d view, deduplicating the complex code for setting up the viewplane.
This commit is contained in:
parent
c26c5f3852
commit
5429a701c4
@ -40,21 +40,27 @@ extern "C" {
|
|||||||
|
|
||||||
struct Camera;
|
struct Camera;
|
||||||
struct Object;
|
struct Object;
|
||||||
|
struct RegionView3D;
|
||||||
struct RenderData;
|
struct RenderData;
|
||||||
struct Scene;
|
struct Scene;
|
||||||
struct rctf;
|
struct rctf;
|
||||||
struct View3D;
|
struct View3D;
|
||||||
|
|
||||||
|
/* Camera Datablock */
|
||||||
|
|
||||||
void *add_camera(const char *name);
|
void *add_camera(const char *name);
|
||||||
struct Camera *copy_camera(struct Camera *cam);
|
struct Camera *copy_camera(struct Camera *cam);
|
||||||
void make_local_camera(struct Camera *cam);
|
void make_local_camera(struct Camera *cam);
|
||||||
void free_camera(struct Camera *ca);
|
void free_camera(struct Camera *ca);
|
||||||
|
|
||||||
/* Camera Object */
|
/* Camera Usage */
|
||||||
|
|
||||||
float object_camera_dof_distance(struct Object *ob);
|
float object_camera_dof_distance(struct Object *ob);
|
||||||
void object_camera_mode(struct RenderData *rd, 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:
|
/* Camera Parameters:
|
||||||
*
|
*
|
||||||
* Intermediate struct for storing camera parameters from various sources,
|
* Intermediate struct for storing camera parameters from various sources,
|
||||||
@ -65,9 +71,12 @@ typedef struct CameraParams {
|
|||||||
int is_ortho;
|
int is_ortho;
|
||||||
float lens;
|
float lens;
|
||||||
float ortho_scale;
|
float ortho_scale;
|
||||||
|
float zoom;
|
||||||
|
|
||||||
float shiftx;
|
float shiftx;
|
||||||
float shifty;
|
float shifty;
|
||||||
|
float offsetx;
|
||||||
|
float offsety;
|
||||||
|
|
||||||
/* sensor */
|
/* sensor */
|
||||||
float sensor_x;
|
float sensor_x;
|
||||||
@ -95,6 +104,7 @@ typedef struct CameraParams {
|
|||||||
|
|
||||||
void camera_params_init(CameraParams *params);
|
void camera_params_init(CameraParams *params);
|
||||||
void camera_params_from_object(CameraParams *params, struct Object *camera);
|
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(CameraParams *params, int winx, int winy, float aspx, float aspy);
|
||||||
|
|
||||||
/* Camera View Frame */
|
/* Camera View Frame */
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "DNA_lamp_types.h"
|
#include "DNA_lamp_types.h"
|
||||||
#include "DNA_object_types.h"
|
#include "DNA_object_types.h"
|
||||||
#include "DNA_scene_types.h"
|
#include "DNA_scene_types.h"
|
||||||
|
#include "DNA_view3d_types.h"
|
||||||
|
|
||||||
#include "BLI_math.h"
|
#include "BLI_math.h"
|
||||||
#include "BLI_utildefines.h"
|
#include "BLI_utildefines.h"
|
||||||
@ -45,6 +46,7 @@
|
|||||||
#include "BKE_global.h"
|
#include "BKE_global.h"
|
||||||
#include "BKE_library.h"
|
#include "BKE_library.h"
|
||||||
#include "BKE_main.h"
|
#include "BKE_main.h"
|
||||||
|
#include "BKE_screen.h"
|
||||||
|
|
||||||
/****************************** Camera Datablock *****************************/
|
/****************************** Camera Datablock *****************************/
|
||||||
|
|
||||||
@ -161,9 +163,16 @@ float object_camera_dof_distance(Object *ob)
|
|||||||
return cam->YF_dofdist;
|
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(sensor_fit == CAMERA_SENSOR_FIT_AUTO) {
|
||||||
if(sizex >= sizey)
|
if(sizex >= sizey)
|
||||||
@ -175,6 +184,8 @@ static int camera_sensor_fit(int sensor_fit, float sizex, float sizey)
|
|||||||
return sensor_fit;
|
return sensor_fit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************** Camera Params *******************************/
|
||||||
|
|
||||||
void camera_params_init(CameraParams *params)
|
void camera_params_init(CameraParams *params)
|
||||||
{
|
{
|
||||||
memset(params, 0, sizeof(CameraParams));
|
memset(params, 0, sizeof(CameraParams));
|
||||||
@ -183,6 +194,8 @@ void camera_params_init(CameraParams *params)
|
|||||||
params->sensor_x= DEFAULT_SENSOR_WIDTH;
|
params->sensor_x= DEFAULT_SENSOR_WIDTH;
|
||||||
params->sensor_y= DEFAULT_SENSOR_HEIGHT;
|
params->sensor_y= DEFAULT_SENSOR_HEIGHT;
|
||||||
params->sensor_fit= CAMERA_SENSOR_FIT_AUTO;
|
params->sensor_fit= CAMERA_SENSOR_FIT_AUTO;
|
||||||
|
|
||||||
|
params->zoom= 1.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void camera_params_from_object(CameraParams *params, Object *ob)
|
void camera_params_from_object(CameraParams *params, Object *ob)
|
||||||
@ -224,10 +237,42 @@ void camera_params_from_object(CameraParams *params, Object *ob)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
void camera_params_compute(CameraParams *params, int winx, int winy, float xasp, float yasp)
|
||||||
{
|
{
|
||||||
rctf viewplane;
|
rctf viewplane;
|
||||||
float pixsize, winside, viewfac;
|
float pixsize, viewfac, sensor_size, dx, dy;
|
||||||
int sensor_fit;
|
int sensor_fit;
|
||||||
|
|
||||||
/* fields rendering */
|
/* fields rendering */
|
||||||
@ -235,48 +280,47 @@ void camera_params_compute(CameraParams *params, int winx, int winy, float xasp,
|
|||||||
if(params->use_fields)
|
if(params->use_fields)
|
||||||
params->ycor *= 2.0f;
|
params->ycor *= 2.0f;
|
||||||
|
|
||||||
|
if(params->is_ortho) {
|
||||||
|
/* orthographic camera */
|
||||||
|
/* scale == 1.0 means exact 1 to 1 mapping */
|
||||||
|
pixsize= params->ortho_scale;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* perspective camera */
|
||||||
|
sensor_size= camera_sensor_size(params->sensor_fit, params->sensor_x, params->sensor_y);
|
||||||
|
pixsize= (sensor_size * params->clipsta)/params->lens;
|
||||||
|
}
|
||||||
|
|
||||||
/* determine sensor fit */
|
/* determine sensor fit */
|
||||||
sensor_fit = camera_sensor_fit(params->sensor_fit, xasp*winx, yasp*winy);
|
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)
|
if(sensor_fit==CAMERA_SENSOR_FIT_HOR)
|
||||||
viewfac= winx;
|
viewfac= winx;
|
||||||
else
|
else
|
||||||
viewfac= params->ycor * winy;
|
viewfac= params->ycor * winy;
|
||||||
|
|
||||||
pixsize= params->ortho_scale/viewfac;
|
pixsize /= viewfac;
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* perspective camera */
|
|
||||||
float sensor_size;
|
|
||||||
|
|
||||||
/* note for auto fit sensor_x is both width and height */
|
/* extra zoom factor */
|
||||||
if(params->sensor_fit == CAMERA_SENSOR_FIT_VERT)
|
pixsize *= params->zoom;
|
||||||
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;
|
|
||||||
|
|
||||||
pixsize= params->clipsta/viewfac;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* compute view plane:
|
/* compute view plane:
|
||||||
* fully centered, zbuffer fills in jittered between -.5 and +.5 */
|
* fully centered, zbuffer fills in jittered between -.5 and +.5 */
|
||||||
if(sensor_fit == CAMERA_SENSOR_FIT_HOR)
|
viewplane.xmin= -0.5f*(float)winx;
|
||||||
winside= winx;
|
viewplane.ymin= -0.5f*params->ycor*(float)winy;
|
||||||
else
|
viewplane.xmax= 0.5f*(float)winx;
|
||||||
winside= winy;
|
viewplane.ymax= 0.5f*params->ycor*(float)winy;
|
||||||
|
|
||||||
viewplane.xmin= -0.5f*(float)winx + params->shiftx*winside;
|
/* lens shift and offset */
|
||||||
viewplane.ymin= -0.5f*params->ycor*(float)winy + params->shifty*winside;
|
dx= params->shiftx*viewfac + winx*params->offsetx;
|
||||||
viewplane.xmax= 0.5f*(float)winx + params->shiftx*winside;
|
dy= params->shifty*viewfac + winy*params->offsety;
|
||||||
viewplane.ymax= 0.5f*params->ycor*(float)winy + params->shifty*winside;
|
|
||||||
|
|
||||||
|
viewplane.xmin += dx;
|
||||||
|
viewplane.ymin += dy;
|
||||||
|
viewplane.xmax += dx;
|
||||||
|
viewplane.ymax += dy;
|
||||||
|
|
||||||
|
/* fields offset */
|
||||||
if(params->field_second) {
|
if(params->field_second) {
|
||||||
if(params->field_odd) {
|
if(params->field_odd) {
|
||||||
viewplane.ymin-= 0.5f * params->ycor;
|
viewplane.ymin-= 0.5f * params->ycor;
|
||||||
@ -297,15 +341,15 @@ void camera_params_compute(CameraParams *params, int winx, int winy, float xasp,
|
|||||||
|
|
||||||
params->viewdx= pixsize;
|
params->viewdx= pixsize;
|
||||||
params->viewdy= params->ycor * pixsize;
|
params->viewdy= params->ycor * pixsize;
|
||||||
|
params->viewplane= viewplane;
|
||||||
|
|
||||||
|
/* compute projection matrix */
|
||||||
if(params->is_ortho)
|
if(params->is_ortho)
|
||||||
orthographic_m4(params->winmat, viewplane.xmin, viewplane.xmax,
|
orthographic_m4(params->winmat, viewplane.xmin, viewplane.xmax,
|
||||||
viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
|
viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
|
||||||
else
|
else
|
||||||
perspective_m4(params->winmat, viewplane.xmin, viewplane.xmax,
|
perspective_m4(params->winmat, viewplane.xmin, viewplane.xmax,
|
||||||
viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
|
viewplane.ymin, viewplane.ymax, params->clipsta, params->clipend);
|
||||||
|
|
||||||
params->viewplane= viewplane;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************** Camera View Frame *****************************/
|
/***************************** Camera View Frame *****************************/
|
||||||
|
@ -208,7 +208,7 @@ void project_float_noclip(struct ARegion *ar, const float vec[3], float adr[2]);
|
|||||||
|
|
||||||
void ED_view3d_ob_clip_range_get(struct Object *ob, float *lens, float *clipsta, float *clipend);
|
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_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_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_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 do_shift);
|
||||||
|
@ -147,7 +147,7 @@ static void screen_opengl_render_apply(OGLRender *oglrender)
|
|||||||
rctf viewplane;
|
rctf viewplane;
|
||||||
float clipsta, clipend;
|
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);
|
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);
|
else perspective_m4(winmat, viewplane.xmin, viewplane.xmax, viewplane.ymin, viewplane.ymax, clipsta, clipend);
|
||||||
}
|
}
|
||||||
|
@ -3068,7 +3068,7 @@ static void project_paint_begin(ProjPaintState *ps)
|
|||||||
/* window matrix, clipping and ortho */
|
/* window matrix, clipping and ortho */
|
||||||
camera_params_init(¶ms);
|
camera_params_init(¶ms);
|
||||||
camera_params_from_object(¶ms, cam_ob);
|
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);
|
copy_m4_m4(winmat, params.winmat);
|
||||||
ps->clipsta= params.clipsta;
|
ps->clipsta= params.clipsta;
|
||||||
|
@ -1018,169 +1018,19 @@ int ED_view3d_clip_range_get(View3D *v3d, RegionView3D *rv3d, float *clipsta, fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* also exposed in previewrender.c */
|
/* also exposed in previewrender.c */
|
||||||
int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winxi, int winyi, rctf *viewplane, float *clipsta, float *clipend, float *pixsize)
|
int ED_view3d_viewplane_get(View3D *v3d, RegionView3D *rv3d, int winx, int winy, rctf *viewplane, float *clipsta, float *clipend)
|
||||||
{
|
{
|
||||||
Camera *cam=NULL;
|
CameraParams params;
|
||||||
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) */
|
camera_params_init(¶ms);
|
||||||
float sensor= DEFAULT_SENSOR_WIDTH;
|
camera_params_from_view3d(¶ms, v3d, rv3d);
|
||||||
|
camera_params_compute(¶ms, winx, winy, 1.0f, 1.0f);
|
||||||
|
|
||||||
lens= v3d->lens;
|
*viewplane= params.viewplane;
|
||||||
|
*clipsta= params.clipsta;
|
||||||
|
*clipend= params.clipend;
|
||||||
|
|
||||||
*clipsta= v3d->near;
|
return params.is_ortho;
|
||||||
*clipend= v3d->far;
|
|
||||||
|
|
||||||
if(rv3d->persp==RV3D_CAMOB) {
|
|
||||||
if(v3d->camera) {
|
|
||||||
if(v3d->camera->type==OB_LAMP ) {
|
|
||||||
Lamp *la;
|
|
||||||
|
|
||||||
la= v3d->camera->data;
|
|
||||||
fac= cosf(((float)M_PI)*la->spotsize/360.0f);
|
|
||||||
|
|
||||||
x1= saacos(fac);
|
|
||||||
lens= 16.0f*fac/sinf(x1);
|
|
||||||
|
|
||||||
*clipsta= la->clipsta;
|
|
||||||
*clipend= la->clipend;
|
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(rv3d->persp==RV3D_ORTHO) {
|
|
||||||
if(winx>winy) x1= -rv3d->dist;
|
|
||||||
else x1= -winx*rv3d->dist/winy;
|
|
||||||
x2= -x1;
|
|
||||||
|
|
||||||
if(winx>winy) y1= -winy*rv3d->dist/winx;
|
|
||||||
else y1= -rv3d->dist;
|
|
||||||
y2= -y1;
|
|
||||||
|
|
||||||
*clipend *= 0.5f; // otherwise too extreme low zbuffer quality
|
|
||||||
*clipsta= - *clipend;
|
|
||||||
orth= 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* fac for zoom, also used for camdx */
|
|
||||||
if(rv3d->persp==RV3D_CAMOB) {
|
|
||||||
fac= BKE_screen_view3d_zoom_to_fac((float)rv3d->camzoom) * 4.0f;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fac= 2.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* viewplane size depends... */
|
|
||||||
if(cam && cam->type==CAM_ORTHO) {
|
|
||||||
/* ortho_scale == 1 means exact 1 to 1 mapping */
|
|
||||||
float dfac= 2.0f*cam->ortho_scale/fac;
|
|
||||||
|
|
||||||
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;
|
|
||||||
y2= -y1;
|
|
||||||
|
|
||||||
orth= 1;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
float dfac;
|
|
||||||
|
|
||||||
if(sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
|
|
||||||
if(winx>winy) dfac= (sensor_x * 2.0f) / (fac*winx*lens);
|
|
||||||
else dfac= (sensor_x * 2.0f) / (fac*winy*lens);
|
|
||||||
}
|
|
||||||
else if(sensor_fit==CAMERA_SENSOR_FIT_HOR) {
|
|
||||||
dfac= (sensor_x * 2.0f) / (fac*winx*lens);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dfac= (sensor_y * 2.0f) / (fac*winy*lens);
|
|
||||||
}
|
|
||||||
|
|
||||||
x1= - *clipsta * winx*dfac;
|
|
||||||
x2= -x1;
|
|
||||||
y1= - *clipsta * winy*dfac;
|
|
||||||
y2= -y1;
|
|
||||||
orth= 0;
|
|
||||||
}
|
|
||||||
/* cam view offset */
|
|
||||||
if(cam) {
|
|
||||||
float dx= 0.5f*fac*rv3d->camdx*(x2-x1);
|
|
||||||
float dy= 0.5f*fac*rv3d->camdy*(y2-y1);
|
|
||||||
|
|
||||||
/* shift offset */
|
|
||||||
if(cam->type==CAM_ORTHO) {
|
|
||||||
dx += cam->shiftx * cam->ortho_scale;
|
|
||||||
dy += cam->shifty * cam->ortho_scale;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
dx += cam->shiftx * (cam->clipsta / cam->lens) * sensor;
|
|
||||||
dy += cam->shifty * (cam->clipsta / cam->lens) * sensor;
|
|
||||||
}
|
|
||||||
|
|
||||||
x1+= dx;
|
|
||||||
x2+= dx;
|
|
||||||
y1+= dy;
|
|
||||||
y2+= dy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(pixsize) {
|
|
||||||
float viewfac;
|
|
||||||
|
|
||||||
if(orth) {
|
|
||||||
viewfac= (winx >= winy)? winx: winy;
|
|
||||||
*pixsize= 1.0f/viewfac;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
viewplane->xmin= x1;
|
|
||||||
viewplane->ymin= y1;
|
|
||||||
viewplane->xmax= x2;
|
|
||||||
viewplane->ymax= y2;
|
|
||||||
|
|
||||||
return orth;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) /* rect: for picking */
|
void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) /* rect: for picking */
|
||||||
@ -1190,7 +1040,7 @@ void setwinmatrixview3d(ARegion *ar, View3D *v3d, rctf *rect) /* rect: for pick
|
|||||||
float clipsta, clipend, x1, y1, x2, y2;
|
float clipsta, clipend, x1, y1, x2, y2;
|
||||||
int orth;
|
int orth;
|
||||||
|
|
||||||
orth= ED_view3d_viewplane_get(v3d, rv3d, ar->winx, ar->winy, &viewplane, &clipsta, &clipend, NULL);
|
orth= ED_view3d_viewplane_get(v3d, rv3d, ar->winx, ar->winy, &viewplane, &clipsta, &clipend);
|
||||||
rv3d->is_persp= !orth;
|
rv3d->is_persp= !orth;
|
||||||
|
|
||||||
// printf("%d %d %f %f %f %f %f %f\n", winx, winy, viewplane.xmin, viewplane.ymin, viewplane.xmax, viewplane.ymax, clipsta, clipend);
|
// printf("%d %d %f %f %f %f %f %f\n", winx, winy, viewplane.xmin, viewplane.ymin, viewplane.xmax, viewplane.ymax, clipsta, clipend);
|
||||||
|
@ -39,34 +39,21 @@
|
|||||||
|
|
||||||
#ifdef RNA_RUNTIME
|
#ifdef RNA_RUNTIME
|
||||||
|
|
||||||
|
#include "BKE_camera.h"
|
||||||
#include "BKE_object.h"
|
#include "BKE_object.h"
|
||||||
#include "BKE_depsgraph.h"
|
#include "BKE_depsgraph.h"
|
||||||
|
|
||||||
/* only for rad/deg conversion! can remove later */
|
|
||||||
static float get_camera_sensor(Camera *cam)
|
|
||||||
{
|
|
||||||
if(cam->sensor_fit==CAMERA_SENSOR_FIT_AUTO) {
|
|
||||||
return cam->sensor_x;
|
|
||||||
}
|
|
||||||
else if(cam->sensor_fit==CAMERA_SENSOR_FIT_HOR) {
|
|
||||||
return cam->sensor_x;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return cam->sensor_y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static float rna_Camera_angle_get(PointerRNA *ptr)
|
static float rna_Camera_angle_get(PointerRNA *ptr)
|
||||||
{
|
{
|
||||||
Camera *cam= ptr->id.data;
|
Camera *cam= ptr->id.data;
|
||||||
float sensor= get_camera_sensor(cam);
|
float sensor= camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
|
||||||
return focallength_to_fov(cam->lens, sensor);
|
return focallength_to_fov(cam->lens, sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rna_Camera_angle_set(PointerRNA *ptr, float value)
|
static void rna_Camera_angle_set(PointerRNA *ptr, float value)
|
||||||
{
|
{
|
||||||
Camera *cam= ptr->id.data;
|
Camera *cam= ptr->id.data;
|
||||||
float sensor= get_camera_sensor(cam);
|
float sensor= camera_sensor_size(cam->sensor_fit, cam->sensor_x, cam->sensor_y);
|
||||||
cam->lens= fov_to_focallength(value, sensor);
|
cam->lens= fov_to_focallength(value, sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user