Patch #4940, by Wybren van Keulen

The 2-point perspecitve Architecture Camera!
http://www.funnyfarm.tv/patch_lens_shift/patch_lens_shift.mov

Full log:
https://projects.blender.org/tracker/index.php?func=detail&aid=4940&group_id=9&atid=127
This commit is contained in:
Ton Roosendaal 2006-11-06 15:42:38 +00:00
parent 232bfbbf8d
commit 71d7409fda
5 changed files with 48 additions and 21 deletions

@ -50,6 +50,7 @@ typedef struct Camera {
float passepartalpha, pad1;
float clipsta, clipend;
float lens, ortho_scale, drawsize;
float shiftx, shifty;
/* yafray: dof params */
float YF_dofdist, YF_aperture;

@ -455,7 +455,7 @@ void RE_SetCamera(Render *re, Object *camera)
Camera *cam=NULL;
rctf viewplane;
float pixsize, clipsta, clipend;
float lens;
float lens, shiftx=0.0, shifty=0.0, winside;
/* question mark */
re->ycor= ( (float)re->r.yasp)/( (float)re->r.xasp);
@ -473,6 +473,8 @@ void RE_SetCamera(Render *re, Object *camera)
execute_ipo(&cam->id, cam->ipo);
}
lens= cam->lens;
shiftx=cam->shiftx;
shifty=cam->shifty;
clipsta= cam->clipsta;
clipend= cam->clipend;
@ -524,10 +526,11 @@ void RE_SetCamera(Render *re, Object *camera)
}
/* viewplane fully centered, zbuffer fills in jittered between -.5 and +.5 */
viewplane.xmin= -0.5f*(float)re->winx;
viewplane.ymin= -0.5f*re->ycor*(float)re->winy;
viewplane.xmax= 0.5f*(float)re->winx;
viewplane.ymax= 0.5f*re->ycor*(float)re->winy;
winside= MAX2(re->winx, re->winy);
viewplane.xmin= -0.5f*(float)re->winx + shiftx*winside;
viewplane.ymin= -0.5f*re->ycor*(float)re->winy + shifty*winside;
viewplane.xmax= 0.5f*(float)re->winx + shiftx*winside;
viewplane.ymax= 0.5f*re->ycor*(float)re->winy + shifty*winside;
if(re->flag & R_SEC_FIELD) {
if(re->r.mode & R_ODDFIELD) {

@ -821,11 +821,11 @@ static float Blinn_Spec(float *n, float *l, float *v, float refrac, float spec_p
nv= n[0]*v[0]+n[1]*v[1]+n[2]*v[2]; /* Dot product between surface normal and view vector */
if(tangent) nv= sasqrt(1.0f - nv*nv);
if(nv<=0.0) nv= 0.01; /* hrms... */
if(nv<=0.01) nv= 0.01; /* hrms... */
nl= n[0]*l[0]+n[1]*l[1]+n[2]*l[2]; /* Dot product between surface normal and light vector */
if(tangent) nl= sasqrt(1.0f - nl*nl);
if(nl<=0.0) {
if(nl<=0.01) {
return 0.0;
}

@ -2673,50 +2673,61 @@ static void editing_panel_camera_type(Object *ob, Camera *cam)
block= uiNewBlock(&curarea->uiblocks, "editing_panel_camera_type", UI_EMBOSS, UI_HELV, curarea->win);
if(uiNewPanel(curarea, block, "Camera", "Editing", 320, 0, 318, 204)==0) return;
uiDefBut(block, LABEL, 10, "Lens:", 10, 180, 150, 20, 0, 0.0, 0.0, 0, 0, "");
if(cam->type==CAM_ORTHO) {
uiDefButF(block, NUM,REDRAWVIEW3D, "Scale:",
0, 145, 150, 20, &cam->ortho_scale, 0.01, 1000.0, 50, 0, "Specify the ortho scaling of the used camera");
10, 160, 150, 20, &cam->ortho_scale, 0.01, 1000.0, 50, 0, "Specify the ortho scaling of the used camera");
} else {
uiDefButF(block, NUM,REDRAWVIEW3D, "Lens:",
0, 145, 150, 20, &cam->lens, 1.0, 250.0, 100, 0, "Specify the lens of the camera");
10, 160, 150, 20, &cam->lens, 1.0, 250.0, 100, 0, "Specify the lens of the camera");
}
uiDefButS(block, TOG, REDRAWVIEW3D, "Orthographic",
0, 120, 150, 20, &cam->type, 0, 0, 0, 0, "Render orthogonally");
10, 135, 150, 20, &cam->type, 0, 0, 0, 0, "Render orthogonally");
uiDefBut(block, LABEL, 0, "Clipping:", 0, 90, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiDefBut(block, LABEL, 0, "Clipping:", 10, 110, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM,REDRAWVIEW3D, "Start:",
0, 70, 150, 20, &cam->clipsta, 0.001*grid, 100.0*grid, 10, 0, "Specify the startvalue of the the field of view");
10, 90, 150, 20, &cam->clipsta, 0.001*grid, 100.0*grid, 10, 0, "Specify the startvalue of the the field of view");
uiDefButF(block, NUM,REDRAWVIEW3D, "End:",
0, 50, 150, 20, &cam->clipend, 1.0, 5000.0*grid, 100, 0, "Specify the endvalue of the the field of view");
10, 70, 150, 20, &cam->clipend, 1.0, 5000.0*grid, 100, 0, "Specify the endvalue of the the field of view");
uiBlockEndAlign(block);
uiDefButF(block, NUM,REDRAWVIEW3D, "Size:",
0, 25, 150, 20, &cam->drawsize, 0.1*grid, 10.0, 10, 0, "The size that the camera is displayed in the 3D View (different to the object's scale)");
170, 25, 150, 20, &cam->drawsize, 0.1*grid, 10.0, 10, 0, "The size that the camera is displayed in the 3D View (different to the object's scale)");
uiDefBut(block, LABEL, 0, "Show:", 160, 155, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiDefBut(block, LABEL, 0, "Shift:", 10, 45, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButF(block, NUM,REDRAWVIEW3D, "X:",
10, 25, 75, 20, &cam->shiftx, -2.0, 2.0, 1, 2, "Horizontally shifts the camera view, without changing the perspective");
uiDefButF(block, NUM,REDRAWVIEW3D, "Y:",
85, 25, 75, 20, &cam->shifty, -2.0, 2.0, 1, 2, "Vertically shifts the camera view, without changing the perspective");
uiBlockEndAlign(block);
uiDefBut(block, LABEL, 0, "Show:", 170, 180, 150, 20, 0, 0.0, 0.0, 0, 0, "");
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|0, REDRAWVIEW3D, "Limits",
160, 135, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the field of view");
170, 160, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the field of view");
uiDefButS(block, TOG|BIT|1, REDRAWVIEW3D, "Mist",
160, 115, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a line that indicates the mist area");
170, 140, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a line that indicates the mist area");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|4, REDRAWVIEW3D, "Name",
160, 90, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the active camera's name in camera view");
170, 115, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw the active camera's name in camera view");
uiDefButS(block, TOG|BIT|3, REDRAWVIEW3D, "Title Safe",
160, 70, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a the title safe zone in camera view");
170, 95, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a the title safe zone in camera view");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
uiDefButS(block, TOG|BIT|2, REDRAWVIEW3D, "Passepartout",
160, 45, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a darkened passepartout over the off-screen area in camera view");
170, 70, 150, 20, &cam->flag, 0, 0, 0, 0, "Draw a darkened passepartout over the off-screen area in camera view");
uiDefButF(block, NUMSLI, REDRAWVIEW3D, "Alpha: ",
160, 25, 150, 20, &cam->passepartalpha, 0.0, 1.0, 0, 0, "The opacity (darkness) of the passepartout");
170, 50, 150, 20, &cam->passepartalpha, 0.0, 1.0, 0, 0, "The opacity (darkness) of the passepartout");
uiBlockEndAlign(block);

@ -910,6 +910,18 @@ void calc_viewborder(struct View3D *v3d, rctf *viewborder_r)
viewborder_r->ymin-= dy;
viewborder_r->xmax-= dx;
viewborder_r->ymax-= dy;
if(v3d->camera && v3d->camera->type==OB_CAMERA) {
Camera *cam= v3d->camera->data;
float w = viewborder_r->xmax - viewborder_r->xmin;
float h = viewborder_r->ymax - viewborder_r->ymin;
float side = MAX2(w, h);
viewborder_r->xmin+= cam->shiftx*side;
viewborder_r->xmax+= cam->shiftx*side;
viewborder_r->ymin+= cam->shifty*side;
viewborder_r->ymax+= cam->shifty*side;
}
}
void view3d_set_1_to_1_viewborder(View3D *v3d)