diff -Naur blender-2.44/config/linux2-config.py stereoblender/config/linux2-config.py --- blender-2.44/config/linux2-config.py 2007-04-13 08:24:29.000000000 -0700 +++ stereoblender/config/linux2-config.py 2007-06-28 22:11:46.000000000 -0700 @@ -11,7 +11,7 @@ BF_PYTHON_LIB = 'python${BF_PYTHON_VERSION}' #BF_PYTHON+'/lib/python'+BF_PYTHON_VERSION+'/config/libpython'+BF_PYTHON_VERSION+'.a' BF_PYTHON_LINKFLAGS = ['-Xlinker', '-export-dynamic'] -WITH_BF_OPENAL = 'true' +WITH_BF_OPENAL = 'false' BF_OPENAL = '/usr' BF_OPENAL_INC = '${BF_OPENAL}/include' BF_OPENAL_LIB = 'openal' @@ -27,7 +27,7 @@ WITH_BF_FMOD = 'false' BF_FMOD = LIBDIR + '/fmod' -WITH_BF_OPENEXR = 'true' +WITH_BF_OPENEXR = 'false' BF_OPENEXR = '/usr' BF_OPENEXR_INC = '${BF_OPENEXR}/include/OpenEXR' BF_OPENEXR_LIB = 'Half IlmImf Iex Imath ' diff -Naur blender-2.44/source/blender/blenkernel/BKE_global.h stereoblender/source/blender/blenkernel/BKE_global.h --- blender-2.44/source/blender/blenkernel/BKE_global.h 2007-01-30 08:59:55.000000000 -0800 +++ stereoblender/source/blender/blenkernel/BKE_global.h 2007-06-28 22:11:46.000000000 -0700 @@ -67,6 +67,13 @@ /* active pointers */ struct View3D *vd; + + /* for stereovision */ + struct View3D *lvd; + struct View3D *rvd; + struct View3D *avd; + float eyedist; + struct View2D *v2d; struct SpaceIpo *sipo; struct SpaceButs *buts; diff -Naur blender-2.44/source/blender/blenkernel/intern/blender.c stereoblender/source/blender/blenkernel/intern/blender.c --- blender-2.44/source/blender/blenkernel/intern/blender.c 2007-04-02 09:06:02.000000000 -0700 +++ stereoblender/source/blender/blenkernel/intern/blender.c 2007-06-28 22:11:46.000000000 -0700 @@ -212,6 +212,8 @@ G.version= BLENDER_VERSION; + G.eyedist = 1.0; + G.order= 1; G.order= (((char*)&G.order)[0])?L_ENDIAN:B_ENDIAN; @@ -260,6 +262,9 @@ G.buts= NULL; G.v2d= NULL; G.vd= NULL; + G.lvd = NULL; + G.rvd = NULL; + G.avd = NULL; G.soops= NULL; G.sima= NULL; G.sipo= NULL; diff -Naur blender-2.44/source/blender/include/blendef.h stereoblender/source/blender/include/blendef.h --- blender-2.44/source/blender/include/blendef.h 2007-04-25 08:04:41.000000000 -0700 +++ stereoblender/source/blender/include/blendef.h 2007-06-28 22:11:46.000000000 -0700 @@ -232,6 +232,8 @@ #define B_HEMESHBROWSE 164 #define B_HEMESHLOCAL 165 +#define N_EYEDIST 171 + /* IPO: 200 */ #define B_IPOHOME 201 #define B_IPOBORDER 202 diff -Naur blender-2.44/source/blender/src/drawview.c stereoblender/source/blender/src/drawview.c --- blender-2.44/source/blender/src/drawview.c 2007-04-30 07:51:20.000000000 -0700 +++ stereoblender/source/blender/src/drawview.c 2007-07-07 13:33:04.000000000 -0700 @@ -2707,7 +2707,7 @@ } } -void drawview3dspace(ScrArea *sa, void *spacedata) +void drawsingleview3dspace(ScrArea *sa, void *spacedata) { View3D *v3d= spacedata; Base *base; @@ -3006,6 +3006,20 @@ } +/* Test for stereo views */ +void drawview3dspace(ScrArea *sa, void *spacedata) { + if(G.avd != NULL && G.lvd != NULL && G.rvd != NULL) { + if(sa == G.lvd->area) { + areawinset(G.rvd->area->win); + drawsingleview3dspace(G.rvd->area, G.rvd->area->spacedata.first); + } else if(sa == G.rvd->area) { + areawinset(G.lvd->area->win); + drawsingleview3dspace(G.lvd->area, G.lvd->area->spacedata.first); + } + } + areawinset(sa->win); + drawsingleview3dspace(sa, spacedata); +} void drawview3d_render(struct View3D *v3d, int winx, int winy) { diff -Naur blender-2.44/source/blender/src/edit.c stereoblender/source/blender/src/edit.c --- blender-2.44/source/blender/src/edit.c 2007-04-16 11:32:46.000000000 -0700 +++ stereoblender/source/blender/src/edit.c 2007-07-07 17:00:49.000000000 -0700 @@ -1812,23 +1812,32 @@ void toggle_shading(void) { + View3D *mv3d = G.vd; + + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; + if(G.qual & LR_SHIFTKEY) { if(G.qual & LR_ALTKEY) { reshadeall_displist(); - G.vd->drawtype= OB_SHADED; + mv3d->drawtype= OB_SHADED; } else { - if(G.vd->drawtype== OB_SHADED) G.vd->drawtype= OB_WIRE; - else G.vd->drawtype= OB_SHADED; + if(mv3d->drawtype== OB_SHADED) mv3d->drawtype= OB_WIRE; + else mv3d->drawtype= OB_SHADED; } } else if(G.qual & LR_ALTKEY) { - if(G.vd->drawtype== OB_TEXTURE) G.vd->drawtype= OB_SOLID; - else G.vd->drawtype= OB_TEXTURE; + if(mv3d->drawtype== OB_TEXTURE) mv3d->drawtype= OB_SOLID; + else mv3d->drawtype= OB_TEXTURE; } else { - if(G.vd->drawtype==OB_SOLID || G.vd->drawtype==OB_SHADED) G.vd->drawtype= OB_WIRE; - else G.vd->drawtype= OB_SOLID; + if(mv3d->drawtype==OB_SOLID || mv3d->drawtype==OB_SHADED) mv3d->drawtype= OB_WIRE; + else mv3d->drawtype= OB_SOLID; + } + + if(G.lvd != NULL && G.rvd != NULL && mv3d == G.avd) { + G.lvd->drawtype = G.avd->drawtype; + G.rvd->drawtype = G.avd->drawtype; } if(G.vd->drawtype != OB_WIRE && G.vd->depths) { diff -Naur blender-2.44/source/blender/src/editscreen.c stereoblender/source/blender/src/editscreen.c --- blender-2.44/source/blender/src/editscreen.c 2007-04-22 12:48:21.000000000 -0700 +++ stereoblender/source/blender/src/editscreen.c 2007-07-08 17:23:19.000000000 -0700 @@ -2895,6 +2895,9 @@ sa1 = sa2; sa2 = scr; } + + if(G.lvd && sa2 == G.lvd->area) G.lvd = NULL; + else if(G.rvd && sa2 == G.rvd->area) G.rvd = NULL; if(sa2==left) { sa1->v1= sa2->v1; diff -Naur blender-2.44/source/blender/src/editview.c stereoblender/source/blender/src/editview.c --- blender-2.44/source/blender/src/editview.c 2007-05-01 08:06:21.000000000 -0700 +++ stereoblender/source/blender/src/editview.c 2007-07-09 09:38:38.000000000 -0700 @@ -2120,10 +2120,13 @@ void fly(void) { + View3D *mv3d = G.vd; /* fly mode - Shift+F a fly loop where the user can move move the view as if they are flying */ + + float speed=0.0, /* the speed the view is moving per redraw */ mat[3][3], /* 3x3 copy of the view matrix so we can move allong the view axis */ dvec[3]={0,0,0}, /* this is the direction thast added to the view offset per redraw */ @@ -2185,6 +2188,7 @@ return; } + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; /* detect weather to start with Z locking */ upvec[0]=1; upvec[1]=0; upvec[2]=0; @@ -2194,8 +2198,8 @@ zlock = 1; upvec[0]=0; upvec[1]=0; upvec[2]=0; - persp_backup= G.vd->persp; - dist_backup= G.vd->dist; + persp_backup= mv3d->persp; + dist_backup= mv3d->dist; if (G.vd->persp==2) { /* Camera */ if(G.vd->camera->constraints.first) { error("Cannot fly an object with constraints"); @@ -2219,15 +2223,15 @@ } else { /* perspective or ortho */ - if (G.vd->persp==0) - G.vd->persp= 1; /*if ortho projection, make perspective */ - QUATCOPY(rot_backup, G.vd->viewquat); - VECCOPY(ofs_backup, G.vd->ofs); - G.vd->dist= 0.0; + if (mv3d->persp==0) + mv3d->persp= 1; /*if ortho projection, make perspective */ + QUATCOPY(rot_backup, mv3d->viewquat); + VECCOPY(ofs_backup, mv3d->ofs); + mv3d->dist= 0.0; upvec[2]=dist_backup; /*x and y are 0*/ Mat3MulVecfl(mat, upvec); - VecSubf(G.vd->ofs, G.vd->ofs, upvec); + VecSubf(mv3d->ofs, mv3d->ofs, upvec); /*Done with correcting for the dist*/ } @@ -2256,7 +2260,14 @@ time_lastdraw= time_lastwheel= PIL_check_seconds_timer(); - G.vd->flag2 |= V3D_FLYMODE; /* so we draw the corner margins */ + mv3d->flag2 |= V3D_FLYMODE; /* so we draw the corner margins */ + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) { + G.avd->grid = G.vd->grid; + G.lvd->flag2 = G.avd->flag2; + G.rvd->flag2 = G.avd->flag2; + set_stereo_views(); + } + scrarea_do_windraw(curarea); screen_swapbuffers(); @@ -2283,9 +2294,9 @@ if (speed<0) speed=0; else { if (G.qual & LR_SHIFTKEY) - speed+= G.vd->grid*time_wheel*0.1; + speed+= mv3d->grid*time_wheel*0.1; else - speed+= G.vd->grid*time_wheel; + speed+= mv3d->grid*time_wheel; } } else if(toets==PADMINUS || toets==MINUSKEY || toets==WHEELDOWNMOUSE) { @@ -2297,9 +2308,9 @@ if (speed>0) speed=0; else { if (G.qual & LR_SHIFTKEY) - speed-= G.vd->grid*time_wheel*0.1; + speed-= mv3d->grid*time_wheel*0.1; else - speed-= G.vd->grid*time_wheel; + speed-= mv3d->grid*time_wheel; } } else if (toets==MIDDLEMOUSE) { @@ -2312,11 +2323,11 @@ /* impliment WASD keys */ } else if(toets==WKEY) { if (speed<0) speed=-speed; /* flip speed rather then stopping, game like motion */ - else speed+= G.vd->grid; /* increse like mousewheel if were alredy moving in that difection*/ + else speed+= mv3d->grid; /* increse like mousewheel if were alredy moving in that difection*/ axis= 2; } else if(toets==SKEY) { /*SAME as above but flipped */ if (speed>0) speed=-speed; - else speed-= G.vd->grid; + else speed-= mv3d->grid; axis= 2; } else if(toets==AKEY) { @@ -2419,7 +2430,7 @@ upvec[2]=0; Mat3MulVecfl(mat, upvec); VecRotToQuat( upvec, (float)moffset[1]*-time_redraw*20, tmp_quat); /* Rotate about the relative up vec */ - QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat); + QuatMul(mv3d->viewquat, mv3d->viewquat, tmp_quat); if (xlock) xlock = 2; /*check for rotation*/ if (zlock) zlock = 2; @@ -2441,7 +2452,7 @@ } VecRotToQuat( upvec, (float)moffset[0]*time_redraw*20, tmp_quat); /* Rotate about the relative up vec */ - QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat); + QuatMul(mv3d->viewquat, mv3d->viewquat, tmp_quat); if (xlock) xlock = 2;/*check for rotation*/ if (zlock) zlock = 2; @@ -2462,7 +2473,7 @@ Mat3MulVecfl(mat, upvec); VecRotToQuat( upvec, roll*time_redraw_clamped*zlock_momentum*0.1, tmp_quat); /* Rotate about the relative up vec */ - QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat); + QuatMul(mv3d->viewquat, mv3d->viewquat, tmp_quat); zlock_momentum += 0.05; } else { @@ -2487,7 +2498,7 @@ Mat3MulVecfl(mat, upvec); VecRotToQuat( upvec, roll*time_redraw_clamped*xlock_momentum*0.1, tmp_quat); /* Rotate about the relative up vec */ - QuatMul(G.vd->viewquat, G.vd->viewquat, tmp_quat); + QuatMul(mv3d->viewquat, mv3d->viewquat, tmp_quat); xlock_momentum += 0.05; } else { @@ -2526,7 +2537,10 @@ dvec[2] = 0.0; } - VecAddf(G.vd->ofs, G.vd->ofs, dvec); + VecAddf(mv3d->ofs, mv3d->ofs, dvec); + + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) set_stereo_views(); + if (zlock && xlock) headerprint("FlyKeys Speed:(+/- | Wheel), Upright Axis:X on/Z on, Slow:Shift, Direction:WASDRF, Ok:LMB, Pan:MMB, Cancel:RMB"); else if (zlock) @@ -2570,7 +2584,7 @@ VECCOPY(dvec_old, dvec); } - G.vd->dist= dist_backup; + mv3d->dist= dist_backup; /* Revert to original view? */ if (action == 2) { /* action == 2 means the user pressed Esc of RMB, and not to apply view to camera */ @@ -2581,9 +2595,9 @@ DAG_object_flush_update(G.scene, G.vd->camera, OB_RECALC_OB); } else { /* Non Camera we need to reset the view back to the original location bacause the user canceled*/ - QUATCOPY(G.vd->viewquat, rot_backup); - VECCOPY(G.vd->ofs, ofs_backup); - G.vd->persp= persp_backup; + QUATCOPY(mv3d->viewquat, rot_backup); + VECCOPY(mv3d->ofs, ofs_backup); + mv3d->persp= persp_backup; } } else if (persp_backup==2) { /* camera */ @@ -2607,17 +2621,26 @@ upvec[2]=dist_backup; /*x and y are 0*/ Mat3CpyMat4(mat, G.vd->viewinv); Mat3MulVecfl(mat, upvec); - VecAddf(G.vd->ofs, G.vd->ofs, upvec); + VecAddf(mv3d->ofs, mv3d->ofs, upvec); /*Done with correcting for the dist */ } - G.vd->flag2 &= ~V3D_FLYMODE; + mv3d->flag2 &= ~V3D_FLYMODE; + + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) { + G.lvd->flag2 = G.avd->flag2; + G.rvd->flag2 = G.avd->flag2; + set_stereo_views(); + } + allqueue(REDRAWVIEW3D, 0); BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); /* not working at the moment not sure why */ } void view3d_edit_clipping(View3D *v3d) { + short val; + short j; if(v3d->flag & V3D_CLIPPING) { v3d->flag &= ~V3D_CLIPPING; @@ -2631,7 +2654,6 @@ double projmatrix[16]; double xs, ys, p[3]; GLint viewport[4]; - short val; /* get border in window coords */ setlinestyle(2); @@ -2683,5 +2705,17 @@ - v3d->clip[val][2]*v3d->clipbb->vec[val][2]; } } + + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == v3d || G.rvd == v3d)) { + G.lvd->flag = v3d->flag; + G.lvd->clipbb = v3d->clipbb; + G.rvd->flag = v3d->flag; + G.rvd->clipbb = v3d->clipbb; + for(val=0; val<4; val++) { + for(j=0;j<4;j++) { + G.lvd->clip[val][j] = G.rvd->clip[val][j] = v3d->clip[val][j]; + } + } + } } diff -Naur blender-2.44/source/blender/src/header_view3d.c stereoblender/source/blender/src/header_view3d.c --- blender-2.44/source/blender/src/header_view3d.c 2007-05-04 04:57:22.000000000 -0700 +++ stereoblender/source/blender/src/header_view3d.c 2007-07-09 00:26:18.000000000 -0700 @@ -350,9 +350,11 @@ static void do_view3d_view_alignviewmenu(void *arg, int event) { - View3D *v3d= curarea->spacedata.first; + View3D *v3d= G.vd; float *curs; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) v3d = G.avd; + switch(event) { case 0: /* Align View to Selected (edit/faceselect mode) */ @@ -374,9 +376,9 @@ break; case 3: /* Center View to Cursor */ curs= give_cursor(); - G.vd->ofs[0]= -curs[0]; - G.vd->ofs[1]= -curs[1]; - G.vd->ofs[2]= -curs[2]; + v3d->ofs[0]= -curs[0]; + v3d->ofs[1]= -curs[1]; + v3d->ofs[2]= -curs[2]; scrarea_queue_winredraw(curarea); break; case 4: /* Align Active Camera to View */ @@ -396,6 +398,8 @@ curs[0]=curs[1]=curs[2]= 0.0; break; } + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) set_stereo_views(); + allqueue(REDRAWVIEW3D, 0); } @@ -569,6 +573,40 @@ case 18: /* render preview */ toggle_blockhandler(curarea, VIEW3D_HANDLER_PREVIEW, 0); break; + case 19: /* right eye */ + if(G.avd == NULL) { + G.avd= MEM_callocN(sizeof(View3D), "stereoview3d"); + (*G.avd) = (*G.vd); + } + if(G.vd == G.lvd) { + G.lvd = NULL; + } + G.rvd = G.vd; + G.rvd->area = curarea; + if(G.lvd != NULL) set_stereo_views(); + scrarea_queue_redraw(curarea); + break; + case 20: /* left eye */ + if(G.avd == NULL) { + G.avd= MEM_callocN(sizeof(View3D), "stereoview3d"); + (*G.avd) = (*G.vd); + } + if(G.vd == G.rvd) { + G.rvd = NULL; + } + G.lvd = G.vd; + G.lvd->area = curarea; + if(G.rvd != NULL) set_stereo_views(); + scrarea_queue_redraw(curarea); + break; + case 21: /* back to normal */ + if(G.vd == G.lvd) { + G.lvd = NULL; + } else if(G.vd == G.rvd) { + G.rvd = NULL; + } + scrarea_queue_redraw(curarea); + break; } allqueue(REDRAWVIEW3D, 1); } @@ -582,6 +620,12 @@ block= uiNewBlock(&curarea->uiblocks, "view3d_viewmenu", UI_EMBOSSP, UI_HELV, curarea->headwin); uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Standard 3D View", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Left Eye", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Right Eye", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, ""); + + uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, ""); + uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, ""); uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, ""); @@ -4614,7 +4658,13 @@ scrarea_queue_headredraw(curarea); } break; - + + case N_EYEDIST: + if(G.lvd != NULL && G.rvd != NULL) { + set_stereo_views(); + } + break; + case B_LOCALVIEW: if(G.vd->localview) initlocalview(); else { @@ -5025,6 +5075,14 @@ /* other buttons: */ uiBlockSetEmboss(block, UI_EMBOSS); + /* eye distance */ + uiDefButF(block, NUM, N_EYEDIST,"Eyes:", + xco,0, 4.5*XIC, YIC, + &G.eyedist,0.0f, 100.0f, 10, 0, + "The distance between virtual eyes."); + + xco += 4.5*XIC+4; + /* mode */ G.vd->modeselect = V3D_OBJECTMODE_SEL; diff -Naur blender-2.44/source/blender/src/space.c stereoblender/source/blender/src/space.c --- blender-2.44/source/blender/src/space.c 2007-05-09 07:41:37.000000000 -0700 +++ stereoblender/source/blender/src/space.c 2007-07-08 14:52:45.000000000 -0700 @@ -636,6 +636,8 @@ */ static void align_view_to_selected(View3D *v3d) { + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == v3d || G.rvd == v3d)) v3d = G.avd; + int nr= pupmenu("Align View (Ctrl flips)%t|To Selected (top)%x3|To Selected (front)%x2|To Selected (side)%x1"); if (nr!=-1) { int axis= nr; @@ -657,6 +659,8 @@ } } } + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) set_stereo_views(); + } } @@ -1743,7 +1747,10 @@ new_ofs[0]= -curs[0]; new_ofs[1]= -curs[1]; new_ofs[2]= -curs[2]; - smooth_view(G.vd, new_ofs, NULL, NULL, NULL); + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) { + smooth_view(G.avd, new_ofs, NULL, NULL, NULL); + set_stereo_views(); + } else smooth_view(G.vd, new_ofs, NULL, NULL, NULL); } scrarea_queue_winredraw(curarea); } @@ -2437,21 +2444,24 @@ } break; case PADASTERKEY: /* '*' */ + v3d = G.vd; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) v3d = G.avd; if(G.qual==0) { if(ob) { if ((G.obedit) && (G.obedit->type == OB_MESH)) { - editmesh_align_view_to_selected(G.vd, 3); + editmesh_align_view_to_selected(v3d, 3); } else if (G.f & G_FACESELECT) { if(ob->type==OB_MESH) { Mesh *me= ob->data; - faceselect_align_view_to_selected(G.vd, me, 3); + faceselect_align_view_to_selected(v3d, me, 3); } } else obmat_to_viewmat(ob, 1); - if(G.vd->persp==2) G.vd->persp= 1; + if(v3d->persp==2) v3d->persp= 1; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) set_stereo_views(); scrarea_queue_winredraw(curarea); } } @@ -5425,6 +5435,10 @@ type &= ~256; + /* unset if stereo view */ + if(G.lvd && sa == G.lvd->area) G.lvd = NULL; + else if(G.rvd && sa == G.rvd->area) G.rvd = NULL; + if(type>=0) { if(sa->spacetype != type) { SpaceLink *sl; diff -Naur blender-2.44/source/blender/src/spacetypes.c stereoblender/source/blender/src/spacetypes.c --- blender-2.44/source/blender/src/spacetypes.c 2006-11-07 09:11:13.000000000 -0800 +++ stereoblender/source/blender/src/spacetypes.c 2007-07-07 14:07:49.000000000 -0700 @@ -108,8 +108,9 @@ void scrarea_do_windraw(ScrArea *area) { SpaceType *st= spacetype_from_area(area); - - areawinset(area->win); + if(area->spacetype != SPACE_VIEW3D) { + areawinset(area->win); + } if(area->win && st->windraw) { st->windraw(area, area->spacedata.first); diff -Naur blender-2.44/source/blender/src/toets.c stereoblender/source/blender/src/toets.c --- blender-2.44/source/blender/src/toets.c 2007-04-20 04:58:57.000000000 -0700 +++ stereoblender/source/blender/src/toets.c 2007-07-07 17:03:43.000000000 -0700 @@ -123,10 +123,14 @@ /* run when pressing 1,3 or 7 */ static void axis_set_view(float q1, float q2, float q3, float q4, short view, int perspo) { + View3D *mv3d = G.vd; float new_quat[4]; new_quat[0]= q1; new_quat[1]= q2; new_quat[2]= q3; new_quat[3]= q4; - G.vd->view=0; + + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; + + mv3d->view=0; if (G.vd->persp==2 && G.vd->camera) { /* Is this switching from a camera view ? */ @@ -141,16 +145,17 @@ smooth_view(G.vd, orig_ofs, new_quat, NULL, &orig_lens); } else { - if (U.uiflag & USER_AUTOPERSP) G.vd->persp= 0; - else if(G.vd->persp>=2) G.vd->persp= perspo; + if (U.uiflag & USER_AUTOPERSP) mv3d->persp= 0; + else if(G.vd->persp>=2) mv3d->persp= perspo; - smooth_view(G.vd, NULL, new_quat, NULL, NULL); + smooth_view(mv3d, NULL, new_quat, NULL, NULL); } - G.vd->view= view; + mv3d->view= view; } void persptoetsen(unsigned short event) { + View3D *mv3d = G.vd; static Object *oldcamera=0; float phi, si, q1[4], vec[3]; static int perspo=1; @@ -163,6 +168,8 @@ if (G.vd->persp == 2) act_cam_orig = G.vd->camera; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; + if(event==PADENTER) { if (G.qual == LR_SHIFTKEY) { view3d_set_1_to_1_viewborder(G.vd); @@ -180,7 +187,7 @@ /* Indicate that this view is inverted, * but only if it actually _was_ inverted (jobbe) */ if (event==PAD7 || event == PAD1 || event == PAD3) - G.vd->flag2 |= V3D_OPP_DIRECTION_NAME; + mv3d->flag2 |= V3D_OPP_DIRECTION_NAME; if(event==PAD0) { /* G.vd->persp= 3; */ @@ -200,14 +207,14 @@ G.vd->camzoom-= 10; if(G.vd->camzoom<-30) G.vd->camzoom= -30; } - else if(G.vd->dist<10.0*G.vd->far) G.vd->dist*=1.2f; + else if(G.vd->dist<10.0*G.vd->far) mv3d->dist*=1.2f; } else if(event==PADPLUSKEY) { if(G.vd->persp==2) { G.vd->camzoom+= 10; if(G.vd->camzoom>300) G.vd->camzoom= 300; } - else if(G.vd->dist> 0.001*G.vd->grid) G.vd->dist*=.83333f; + else if(G.vd->dist> 0.001*G.vd->grid) mv3d->dist*=.83333f; } else { @@ -217,16 +224,16 @@ else if(event==PAD4) window_to_3d(vec, 32, 0); else if(event==PAD8) window_to_3d(vec, 0, -25); else if(event==PAD2) window_to_3d(vec, 0, 25); - G.vd->ofs[0]+= vec[0]; - G.vd->ofs[1]+= vec[1]; - G.vd->ofs[2]+= vec[2]; + mv3d->ofs[0]+= vec[0]; + mv3d->ofs[1]+= vec[1]; + mv3d->ofs[2]+= vec[2]; } } else { /* Indicate that this view is not inverted. * Don't do this for PADMINUS/PADPLUSKEY, though. (jobbe)*/ if (event != PADMINUS && event != PADPLUSKEY) - G.vd->flag2 &= ~V3D_OPP_DIRECTION_NAME; + mv3d->flag2 &= ~V3D_OPP_DIRECTION_NAME; if(event==PAD7) { @@ -243,19 +250,19 @@ if(G.vd->persp==2) { G.vd->camzoom= MAX2(-30, G.vd->camzoom-5); } - else if(G.vd->dist<10.0*G.vd->far) G.vd->dist*=1.2f; + else if(G.vd->dist<10.0*G.vd->far) mv3d->dist*=1.2f; if(G.vd->persp!=1) preview3d_event= 0; } else if(event==PADPLUSKEY) { if(G.vd->persp==2) { G.vd->camzoom= MIN2(300, G.vd->camzoom+5); } - else if(G.vd->dist> 0.001*G.vd->grid) G.vd->dist*=.83333f; + else if(G.vd->dist> 0.001*G.vd->grid) mv3d->dist*=.83333f; if(G.vd->persp!=1) preview3d_event= 0; } else if(event==PAD5) { if (U.smooth_viewtx) { - if(G.vd->persp==1) { G.vd->persp=0; + if(G.vd->persp==1) { mv3d->persp=0; } else if (act_cam_orig) { /* were from a camera view */ float orig_dist= G.vd->dist; @@ -270,11 +277,11 @@ smooth_view(G.vd, orig_ofs, NULL, &orig_dist, &orig_lens); } else { - G.vd->persp=1; + mv3d->persp=1; } } else { - if(G.vd->persp==1) G.vd->persp=0; - else G.vd->persp=1; + if(G.vd->persp==1) mv3d->persp=0; + else mv3d->persp=1; } } else if(event==PAD0) { @@ -347,8 +354,8 @@ q1[0]= (float)cos(phi); q1[1]= q1[2]= 0.0; q1[3]= si; - QuatMul(G.vd->viewquat, G.vd->viewquat, q1); - G.vd->view= 0; + QuatMul(mv3d->viewquat, mv3d->viewquat, q1); + mv3d->view= 0; } if(event==PAD2 || event==PAD8) { /* horizontal axis */ @@ -362,8 +369,8 @@ q1[1]*= si; q1[2]*= si; q1[3]*= si; - QuatMul(G.vd->viewquat, G.vd->viewquat, q1); - G.vd->view= 0; + QuatMul(mv3d->viewquat, mv3d->viewquat, q1); + mv3d->view= 0; } } @@ -379,6 +386,8 @@ else BIF_view3d_previewrender_signal(curarea, PR_PROJECTED); + /* fix stereo views */ + if(G.lvd != NULL && G.rvd != NULL && mv3d == G.avd) set_stereo_views(); scrarea_queue_redraw(curarea); } diff -Naur blender-2.44/source/blender/src/usiblender.c stereoblender/source/blender/src/usiblender.c --- blender-2.44/source/blender/src/usiblender.c 2007-04-16 11:32:47.000000000 -0700 +++ stereoblender/source/blender/src/usiblender.c 2007-07-07 17:04:34.000000000 -0700 @@ -427,6 +427,9 @@ } #endif + if(G.avd != NULL) { + MEM_freeN(G.avd); } /* clears the effective stereo view */ + /* first try to read exotic file formats... */ /* it throws error box when file doesnt exist and returns -1 */ retval= BKE_read_exotic(name); @@ -526,26 +529,26 @@ static void get_autosave_location(char buf[FILE_MAXDIR+FILE_MAXFILE]) { - char pidstr[32]; - char subdir[9]; + char pidstr[32]; + char subdir[9]; char savedir[FILE_MAXDIR]; - sprintf(pidstr, "%d.blend", abs(getpid())); - -#ifdef WIN32 - if (!BLI_exists(U.tempdir)) { - BLI_strncpy(subdir, "autosave", sizeof(subdir)); - BLI_make_file_string("/", savedir, BLI_gethome(), subdir); - - /* create a new autosave dir - * function already checks for existence or not */ - BLI_recurdir_fileops(savedir); - - BLI_make_file_string("/", buf, savedir, pidstr); - return; - } -#endif - + sprintf(pidstr, "%d.blend", abs(getpid())); + +#ifdef WIN32 + if (!BLI_exists(U.tempdir)) { + BLI_strncpy(subdir, "autosave", sizeof(subdir)); + BLI_make_file_string("/", savedir, BLI_gethome(), subdir); + + /* create a new autosave dir + * function already checks for existence or not */ + BLI_recurdir_fileops(savedir); + + BLI_make_file_string("/", buf, savedir, pidstr); + return; + } +#endif + BLI_make_file_string("/", buf, U.tempdir, pidstr); } @@ -986,6 +989,9 @@ BLI_freelistN(&U.themes); BIF_preview_free_dbase(); + if(G.avd != NULL) { + MEM_freeN(G.avd); } /* clears the effective stereo view */ + if(totblock!=0) { printf("Error Totblock: %d\n",totblock); MEM_printmemlist(); diff -Naur blender-2.44/source/blender/src/view.c stereoblender/source/blender/src/view.c --- blender-2.44/source/blender/src/view.c 2007-05-09 07:41:37.000000000 -0700 +++ stereoblender/source/blender/src/view.c 2007-07-07 19:28:42.000000000 -0700 @@ -154,6 +154,16 @@ if (G.vd->zfac < 1.e-6f && G.vd->zfac > -1.e-6f) G.vd->zfac = 1.0f; } +/* For stereo-viz, dir=-1 if offsetting right eye, dir=1 if left */ +void offset_eye(float *vec, float dir) { + float dx; + + dx= dir*G.eyedist; + vec[0]= (G.vd->persinv[0][0]*dx); + vec[1]= (G.vd->persinv[0][1]*dx); + vec[2]= (G.vd->persinv[0][2]*dx); +} + void window_to_3d(float *vec, short mx, short my) { /* always call initgrabz */ @@ -531,9 +541,35 @@ } +void set_stereo_views() { + float temoffset[3]; + + G.rvd->persp = G.avd->persp; + G.rvd->view = G.avd->view; + G.lvd->persp = G.avd->persp; + G.lvd->view = G.avd->view; + if(G.avd->persp != 0) { + offset_eye(temoffset, -0.5f); + VecAddf(G.rvd->ofs, G.avd->ofs, temoffset); + + offset_eye(temoffset, 0.5f); + VecAddf(G.lvd->ofs, G.avd->ofs, temoffset); + } else { + VecCopyf(G.rvd->ofs, G.avd->ofs); + VecCopyf(G.lvd->ofs, G.avd->ofs); + } + + G.rvd->dist = G.avd->dist; + QUATCOPY(G.rvd->viewquat, G.avd->viewquat); + + G.lvd->dist = G.avd->dist; + QUATCOPY(G.lvd->viewquat, G.avd->viewquat); +} + void viewmove(int mode) { Object *ob = OBACT; + View3D *mv3d = G.vd; float firstvec[3], newvec[3], dvec[3]; float reverse, oldquat[4], q1[4], si, phi, dist0; float ofs[3], obofs[3]= {0.0f, 0.0f, 0.0f}; @@ -541,12 +577,14 @@ short mvalball[2], mval[2], mvalo[2]; short use_sel = 0; short preview3d_event= 1; + rcti *tmpwinrct; /* 3D window may not be defined */ if( !G.vd ) { fprintf( stderr, "G.vd == NULL in viewmove()\n" ); return; } + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; /* sometimes this routine is called from headerbuttons */ @@ -603,22 +641,23 @@ /* are we translating, rotating or zooming? */ if(mode==0) { if(G.vd->view!=0) scrarea_queue_headredraw(curarea); /*for button */ - G.vd->view= 0; + tmpwinrct = &curarea->winrct; + mv3d->view= 0; } if(G.vd->persp==2 && mode!=1 && G.vd->camera) { - G.vd->persp= 1; + mv3d->persp= 1; scrarea_do_windraw(curarea); scrarea_queue_headredraw(curarea); } } if(mode==0) { /* view rotate */ - if (U.uiflag & USER_AUTOPERSP) G.vd->persp= 1; + if (U.uiflag & USER_AUTOPERSP) mv3d->persp= 1; if (U.flag & USER_TRACKBALL) mvalball[0]= mval[0]; mvalball[1]= mval[1]; - calctrackballvec(&curarea->winrct, mvalball, newvec); + calctrackballvec(tmpwinrct, mvalball, newvec); VecSubf(dvec, newvec, firstvec); @@ -647,7 +686,7 @@ q1[1]*= si; q1[2]*= si; q1[3]*= si; - QuatMul(G.vd->viewquat, q1, oldquat); + QuatMul(mv3d->viewquat, q1, oldquat); if (use_sel) { /* compute the post multiplication quat, to rotate the offset correctly */ @@ -656,10 +695,10 @@ QuatMul(q1, q1, G.vd->viewquat); QuatConj(q1); /* conj == inv for unit quat */ - VECCOPY(G.vd->ofs, ofs); - VecSubf(G.vd->ofs, G.vd->ofs, obofs); - QuatMulVecf(q1, G.vd->ofs); - VecAddf(G.vd->ofs, G.vd->ofs, obofs); + VECCOPY(mv3d->ofs, ofs); + VecSubf(mv3d->ofs, mv3d->ofs, obofs); + QuatMulVecf(q1, mv3d->ofs); + VecAddf(mv3d->ofs, mv3d->ofs, obofs); } } else { /* New turntable view code by John Aughey */ @@ -688,13 +727,13 @@ q1[1] = si * xvec[0]; q1[2] = si * xvec[1]; q1[3] = si * xvec[2]; - QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + QuatMul(mv3d->viewquat, mv3d->viewquat, q1); if (use_sel) { QuatConj(q1); /* conj == inv for unit quat */ - VecSubf(G.vd->ofs, G.vd->ofs, obofs); - QuatMulVecf(q1, G.vd->ofs); - VecAddf(G.vd->ofs, G.vd->ofs, obofs); + VecSubf(mv3d->ofs, mv3d->ofs, obofs); + QuatMulVecf(q1, mv3d->ofs); + VecAddf(mv3d->ofs, mv3d->ofs, obofs); } /* Perform the orbital rotation */ @@ -702,13 +741,13 @@ q1[0] = cos(phi); q1[1] = q1[2] = 0.0; q1[3] = sin(phi); - QuatMul(G.vd->viewquat, G.vd->viewquat, q1); + QuatMul(mv3d->viewquat, G.vd->viewquat, q1); if (use_sel) { QuatConj(q1); - VecSubf(G.vd->ofs, G.vd->ofs, obofs); + VecSubf(mv3d->ofs, mv3d->ofs, obofs); QuatMulVecf(q1, G.vd->ofs); - VecAddf(G.vd->ofs, G.vd->ofs, obofs); + VecAddf(mv3d->ofs, mv3d->ofs, obofs); } } } @@ -724,13 +763,13 @@ } else { window_to_3d(dvec, mval[0]-mvalo[0], mval[1]-mvalo[1]); - VecAddf(G.vd->ofs, G.vd->ofs, dvec); + VecAddf(mv3d->ofs, mv3d->ofs, dvec); } } else if(mode==2) { if(U.viewzoom==USER_ZOOM_CONT) { // oldstyle zoom - G.vd->dist*= 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/1000.0; + mv3d->dist*= 1.0+(float)(mvalo[0]-mval[0]+mvalo[1]-mval[1])/1000.0; } else if(U.viewzoom==USER_ZOOM_SCALE) { int ctr[2], len1, len2; @@ -742,18 +781,18 @@ len1 = (int)sqrt((ctr[0] - mval[0])*(ctr[0] - mval[0]) + (ctr[1] - mval[1])*(ctr[1] - mval[1])) + 5; len2 = (int)sqrt((ctr[0] - mvalo[0])*(ctr[0] - mvalo[0]) + (ctr[1] - mvalo[1])*(ctr[1] - mvalo[1])) + 5; - G.vd->dist= dist0 * ((float)len2/len1); + mv3d->dist= dist0 * ((float)len2/len1); } else { /* USER_ZOOM_DOLLY */ float len1 = (curarea->winrct.ymax - mval[1]) + 5; float len2 = (curarea->winrct.ymax - mvalo[1]) + 5; - G.vd->dist= dist0 * (2.0*((len2/len1)-1.0) + 1.0); + mv3d->dist= dist0 * (2.0*((len2/len1)-1.0) + 1.0); } /* these limits are in toets.c too */ - if(G.vd->dist<0.001*G.vd->grid) G.vd->dist= 0.001*G.vd->grid; - if(G.vd->dist>10.0*G.vd->far) G.vd->dist=10.0*G.vd->far; + if(mv3d->dist<0.001*G.vd->grid) mv3d->dist= 0.001*G.vd->grid; + if(mv3d->dist>10.0*G.vd->far) mv3d->dist=10.0*G.vd->far; mval[1]= mvalo[1]; /* preserve first value */ mval[0]= mvalo[0]; @@ -773,6 +812,8 @@ retopo_paint_view_update(G.vd); } + /* fix stereo views */ + if(G.lvd != NULL && G.rvd != NULL && mv3d == G.avd) set_stereo_views(); scrarea_do_windraw(curarea); screen_swapbuffers(); } @@ -866,11 +907,11 @@ } if(G.vd->persp==0) { - if(winx>winy) x1= -G.vd->dist; + if(winx>winy && G.lvd != G.vd && G.rvd != G.vd) x1= -G.vd->dist; else x1= -winx*G.vd->dist/winy; x2= -x1; - if(winx>winy) y1= -winy*G.vd->dist/winx; + if(winx>winy && G.lvd != G.vd && G.rvd != G.vd) y1= -winy*G.vd->dist/winx; else y1= -G.vd->dist; y2= -y1; @@ -903,7 +944,7 @@ else { float dfac; - if(winx>winy) dfac= 64.0/(fac*winx*lens); + if(winx>winy && G.lvd != G.vd && G.rvd != G.vd) dfac= 64.0/(fac*winx*lens); else dfac= 64.0/(fac*winy*lens); x1= - *clipsta * winx*dfac; @@ -927,11 +968,11 @@ float viewfac; if(orth) { - viewfac= (winx >= winy)? winx: winy; + viewfac= (winx >= winy && G.lvd != G.vd && G.rvd != G.vd)? winx: winy; *pixsize= 1.0f/viewfac; } else { - viewfac= (((winx >= winy)? winx: winy)*lens)/32.0; + viewfac= (((winx >= winy && G.lvd != G.vd && G.rvd != G.vd)? winx: winy)*lens)/32.0; *pixsize= *clipsta/viewfac; } } @@ -1309,7 +1350,7 @@ } if (G.vd->persp>1) G.vd->persp= 1; - if (G.vd->near> 0.1) G.vd->near= 0.1; + if (G.vd->near> 0.1) G.vd->near= 0.1; G.vd->cursor[0]= -G.vd->ofs[0]; G.vd->cursor[1]= -G.vd->ofs[1]; @@ -1345,10 +1386,13 @@ float size, min[3], max[3], afm[3]; int ok=0; + View3D *mv3d = G.vd; /* SMOOTHVIEW */ float new_ofs[3]; float new_dist; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; + min[0]= min[1]= min[2]= 1.0e10; max[0]= max[1]= max[2]= -1.0e10; @@ -1417,7 +1461,7 @@ afm[2]= (max[2]-min[2]); size= 0.7*MAX3(afm[0], afm[1], afm[2]); - if(size <= G.vd->near*1.5) size= G.vd->near*1.5; + if(size <= mv3d->near*1.5) size= mv3d->near*1.5; new_ofs[0]= -(min[0]+max[0])/2.0; new_ofs[1]= -(min[1]+max[1])/2.0; @@ -1432,9 +1476,9 @@ new_dist*= size; } - G.vd->cursor[0]= -new_ofs[0]; - G.vd->cursor[1]= -new_ofs[1]; - G.vd->cursor[2]= -new_ofs[2]; + mv3d->cursor[0]= -new_ofs[0]; + mv3d->cursor[1]= -new_ofs[1]; + mv3d->cursor[2]= -new_ofs[2]; if (G.vd->persp==2 && G.vd->camera) { float orig_lens= G.vd->lens; @@ -1446,8 +1490,9 @@ } else { if(G.vd->persp>=2) G.vd->persp= 1; - - smooth_view(G.vd, new_ofs, NULL, &new_dist, NULL); + + smooth_view(mv3d, new_ofs, NULL, &new_dist, NULL); + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) set_stereo_views(); } scrarea_queue_winredraw(curarea); BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); @@ -1518,9 +1563,11 @@ void view3d_home(int center) { + View3D *mv3d = G.vd; Base *base; float size, min[3], max[3], afm[3]; int ok= 1, onedone=0; + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) mv3d = G.avd; if(center) { min[0]= min[1]= min[2]= 0.0; @@ -1571,9 +1618,11 @@ smooth_view(G.vd, new_ofs, NULL, &new_dist, &orig_lens); } else { - if(G.vd->persp>=2) G.vd->persp= 1; - smooth_view(G.vd, new_ofs, NULL, &new_dist, NULL); + if(G.vd->persp>=2) mv3d->persp= 1; + smooth_view(mv3d, new_ofs, NULL, &new_dist, NULL); } + + if(G.lvd != NULL && G.rvd != NULL && mv3d == G.avd) set_stereo_views(); scrarea_queue_winredraw(curarea); } BIF_view3d_previewrender_signal(curarea, PR_DBASE|PR_DISPRECT); @@ -1711,6 +1760,8 @@ v3d->lens = ((*lens)*step) + (orig_lens*step_inv); /*redraw the view*/ + if((G.avd != NULL && G.lvd != NULL && G.rvd != NULL) && (G.lvd == G.vd || G.rvd == G.vd)) + set_stereo_views(); scrarea_do_windraw(curarea); screen_swapbuffers();