Camera: some code refactoring, use an intermediate CameraParams struct instead

of long list of variables everywhere. Intention is to also let 3d view use this
eventually, instead of duplicating code.
This commit is contained in:
2011-11-18 15:52:00 +00:00
parent 02ce6fd59c
commit 539c94a051
11 changed files with 272 additions and 194 deletions

View File

@@ -152,10 +152,7 @@ struct Render
int partx, party;
/* values for viewing */
float lens;
float sensor_x, sensor_y; /* image sensor size, same variable in camera */
float ycor; /* (scene->xasp / scene->yasp), multiplied with 'winy' */
short sensor_fit;
float panophi, panosi, panoco, panodxp, panodxv;

View File

@@ -131,6 +131,7 @@ static void envmap_split_ima(EnvMap *env, ImBuf *ibuf)
static Render *envmap_render_copy(Render *re, EnvMap *env)
{
Render *envre;
float viewscale;
int cuberes;
envre= RE_NewRender("Envmap");
@@ -156,15 +157,8 @@ static Render *envmap_render_copy(Render *re, EnvMap *env)
envre->lay= re->lay;
/* view stuff in env render */
envre->lens= 16.0f;
envre->sensor_x= 32.0f;
if(env->type==ENV_PLANE)
envre->lens*= env->viewscale;
envre->ycor= 1.0f;
envre->clipsta= env->clipsta; /* render_scene_set_window() respects this for now */
envre->clipend= env->clipend;
RE_SetCamera(envre, env->object);
viewscale= (env->type == ENV_PLANE)? env->viewscale: 1.0f;
RE_SetEnvmapCamera(envre, env->object, viewscale, env->clipsta, env->clipend);
/* callbacks */
envre->display_draw= re->display_draw;

View File

@@ -451,15 +451,62 @@ struct Object *RE_GetCamera(Render *re)
return re->camera_override ? re->camera_override : re->scene->camera;
}
static void re_camera_params_get(Render *re, CameraParams *params, Object *cam_ob)
{
copy_m4_m4(re->winmat, params->winmat);
re->clipsta= params->clipsta;
re->clipend= params->clipend;
re->ycor= params->ycor;
re->viewdx= params->viewdx;
re->viewdy= params->viewdy;
re->viewplane= params->viewplane;
object_camera_mode(&re->r, cam_ob);
}
void RE_SetEnvmapCamera(Render *re, Object *cam_ob, float viewscale, float clipsta, float clipend)
{
CameraParams params;
/* setup parameters */
camera_params_init(&params);
camera_params_from_object(&params, cam_ob);
params.lens= 16.0f*viewscale;
params.sensor_x= 32.0f;
params.sensor_y= 32.0f;
params.sensor_fit = CAMERA_SENSOR_FIT_AUTO;
params.clipsta= clipsta;
params.clipend= clipend;
/* compute matrix, viewplane, .. */
camera_params_compute(&params, re->winx, re->winy, 1.0f, 1.0f);
/* extract results */
re_camera_params_get(re, &params, cam_ob);
}
/* call this after InitState() */
/* per render, there's one persistent viewplane. Parts will set their own viewplanes */
void RE_SetCamera(Render *re, Object *camera)
void RE_SetCamera(Render *re, Object *cam_ob)
{
object_camera_mode(&re->r, camera);
CameraParams params;
object_camera_matrix(&re->r, camera, re->winx, re->winy, re->flag & R_SEC_FIELD,
re->winmat, &re->viewplane, &re->clipsta, &re->clipend,
&re->lens, &re->sensor_x, &re->sensor_y, &re->sensor_fit, &re->ycor, &re->viewdx, &re->viewdy);
/* setup parameters */
camera_params_init(&params);
camera_params_from_object(&params, cam_ob);
params.use_fields= (re->r.mode & R_FIELDS);
params.field_second= (re->flag & R_SEC_FIELD);
params.field_odd= (re->r.mode & R_ODDFIELD);
/* compute matrix, viewplane, .. */
camera_params_compute(&params, re->winx, re->winy, re->r.xasp, re->r.yasp);
/* extract results */
re_camera_params_get(re, &params, cam_ob);
}
void RE_SetPixelSize(Render *re, float pixsize)