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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(¶ms);
|
||||
camera_params_from_object(¶ms, 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(¶ms, re->winx, re->winy, 1.0f, 1.0f);
|
||||
|
||||
/* extract results */
|
||||
re_camera_params_get(re, ¶ms, 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(¶ms);
|
||||
camera_params_from_object(¶ms, 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(¶ms, re->winx, re->winy, re->r.xasp, re->r.yasp);
|
||||
|
||||
/* extract results */
|
||||
re_camera_params_get(re, ¶ms, cam_ob);
|
||||
}
|
||||
|
||||
void RE_SetPixelSize(Render *re, float pixsize)
|
||||
|
||||
Reference in New Issue
Block a user