diff options
Diffstat (limited to 'source/blender/editors/space_view3d/drawobject.c')
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 234 |
1 files changed, 231 insertions, 3 deletions
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 6ebb7cf4a48..4809e463d75 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -76,6 +76,8 @@ #include "BKE_pointcache.h" #include "BKE_scene.h" #include "BKE_unit.h" +#include "BKE_movieclip.h" +#include "BKE_tracking.h" #include "smoke_API.h" @@ -202,6 +204,40 @@ static void view3d_project_short_noclip(ARegion *ar, const float vec[3], short * } } +/* same as view3d_project_short_clip but use persmat instead of persmatob for projection */ +static void view3d_project_short_clip_persmat(ARegion *ar, float *vec, short *adr, int local) +{ + RegionView3D *rv3d= ar->regiondata; + float fx, fy, vec4[4]; + + adr[0]= IS_CLIPPED; + + /* clipplanes in eye space */ + if(rv3d->rflag & RV3D_CLIPPING) { + if(ED_view3d_test_clipping(rv3d, vec, local)) + return; + } + + copy_v3_v3(vec4, vec); + vec4[3]= 1.0; + + mul_m4_v4(rv3d->persmat, vec4); + + /* clipplanes in window space */ + if( vec4[3] > (float)BL_NEAR_CLIP ) { /* is the NEAR clipping cutoff for picking */ + fx= (ar->winx/2)*(1 + vec4[0]/vec4[3]); + + if( fx>0 && fx<ar->winx) { + + fy= (ar->winy/2)*(1 + vec4[1]/vec4[3]); + + if(fy > 0.0f && fy < (float)ar->winy) { + adr[0]= (short)floorf(fx); + adr[1]= (short)floorf(fy); + } + } + } +} /* ************************ */ /* check for glsl drawing */ @@ -733,7 +769,12 @@ void view3d_cached_text_draw_end(View3D *v3d, ARegion *ar, int depth_write, floa for(vos= strings->first; vos; vos= vos->next) { if(mat && !(vos->flag & V3D_CACHE_TEXT_WORLDSPACE)) mul_m4_v3(mat, vos->vec); - view3d_project_short_clip(ar, vos->vec, vos->sco, 0); + + if(vos->flag&V3D_CACHE_TEXT_GLOBALSPACE) + view3d_project_short_clip_persmat(ar, vos->vec, vos->sco, 0); + else + view3d_project_short_clip(ar, vos->vec, vos->sco, 0); + if(vos->sco[0]!=IS_CLIPPED) tot++; } @@ -1365,16 +1406,203 @@ float view3d_camera_border_hack_col[4]; short view3d_camera_border_hack_test= FALSE; #endif +/* ****************** draw clip data *************** */ + +static void draw_bundle_sphere(void) +{ + static GLuint displist= 0; + + if (displist == 0) { + GLUquadricObj *qobj; + + displist= glGenLists(1); + glNewList(displist, GL_COMPILE); + + qobj= gluNewQuadric(); + gluQuadricDrawStyle(qobj, GLU_FILL); + glShadeModel(GL_SMOOTH); + gluSphere(qobj, 0.05, 8, 8); + glShadeModel(GL_FLAT); + gluDeleteQuadric(qobj); + + glEndList(); + } + + glCallList(displist); +} + +static void draw_viewport_reconstruction(Scene *scene, Base *base, View3D *v3d, MovieClip *clip, int flag) +{ + MovieTracking *tracking= &clip->tracking; + MovieTrackingTrack *track; + float mat[4][4], imat[4][4], curcol[4]; + unsigned char col[4], scol[4]; + int bundlenr= 1; + + if((v3d->flag2&V3D_SHOW_RECONSTRUCTION)==0) + return; + + if(v3d->flag2&V3D_RENDER_OVERRIDE) + return; + + glGetFloatv(GL_CURRENT_COLOR, curcol); + + UI_GetThemeColor4ubv(TH_TEXT, col); + UI_GetThemeColor4ubv(TH_SELECT, scol); + + BKE_get_tracking_mat(scene, base->object, mat); + + glEnable(GL_LIGHTING); + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + glShadeModel(GL_SMOOTH); + + /* current ogl matrix is translated in camera space, bundles should + be rendered in world space, so camera matrix should be "removed" + from current ogl matrix */ + invert_m4_m4(imat, base->object->obmat); + + glPushMatrix(); + glMultMatrixf(imat); + glMultMatrixf(mat); + + for ( track= tracking->tracks.first; track; track= track->next) { + int selected= track->flag&SELECT || track->pat_flag&SELECT || track->search_flag&SELECT; + if((track->flag&TRACK_HAS_BUNDLE)==0) + continue; + + if(flag&DRAW_PICKING) + glLoadName(base->selcol + (bundlenr<<16)); + + glPushMatrix(); + glTranslatef(track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]); + glScalef(v3d->bundle_size/0.05, v3d->bundle_size/0.05, v3d->bundle_size/0.05); + + if(v3d->drawtype==OB_WIRE) { + glDisable(GL_LIGHTING); + glDepthMask(0); + + if(selected) { + if(base==BASACT) UI_ThemeColor(TH_ACTIVE); + else UI_ThemeColor(TH_SELECT); + } else { + if(track->flag&TRACK_CUSTOMCOLOR) glColor3fv(track->color); + else UI_ThemeColor(TH_WIRE); + } + + drawaxes(0.05f, v3d->bundle_drawtype); + + glDepthMask(1); + glEnable(GL_LIGHTING); + } else if(v3d->drawtype>OB_WIRE) { + if(v3d->bundle_drawtype==OB_EMPTY_SPHERE) { + /* selection outline */ + if(selected) { + if(base==BASACT) UI_ThemeColor(TH_ACTIVE); + else UI_ThemeColor(TH_SELECT); + + glDepthMask(0); + glLineWidth(2.f); + glDisable(GL_LIGHTING); + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + draw_bundle_sphere(); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glEnable(GL_LIGHTING); + glLineWidth(1.f); + glDepthMask(1); + } + + if(track->flag&TRACK_CUSTOMCOLOR) glColor3fv(track->color); + else UI_ThemeColor(TH_BUNDLE_SOLID); + + draw_bundle_sphere(); + } else { + glDisable(GL_LIGHTING); + glDepthMask(0); + + if(selected) { + if(base==BASACT) UI_ThemeColor(TH_ACTIVE); + else UI_ThemeColor(TH_SELECT); + } else { + if(track->flag&TRACK_CUSTOMCOLOR) glColor3fv(track->color); + else UI_ThemeColor(TH_WIRE); + } + + drawaxes(0.05f, v3d->bundle_drawtype); + + glDepthMask(1); + glEnable(GL_LIGHTING); + } + } + + glPopMatrix(); + + if((flag & DRAW_PICKING)==0 && (v3d->flag2&V3D_SHOW_BUNDLENAME)) { + float pos[3]; + unsigned char tcol[4]; + + if(selected) memcpy(tcol, scol, sizeof(tcol)); + else memcpy(tcol, col, sizeof(tcol)); + + mul_v3_m4v3(pos, mat, track->bundle_pos); + view3d_cached_text_draw_add(pos, track->name, 10, V3D_CACHE_TEXT_GLOBALSPACE, tcol); + } + + bundlenr++; + } + + if((flag & DRAW_PICKING)==0) { + if(v3d->flag2&V3D_SHOW_CAMERAPATH && clip->tracking.reconstruction.camnr) { + int a= 0; + MovieTrackingReconstruction *reconstruction= &tracking->reconstruction; + MovieReconstructedCamera *camera= tracking->reconstruction.cameras; + + glDisable(GL_LIGHTING); + UI_ThemeColor(TH_CAMERA_PATH); + glLineWidth(2.0f); + + glBegin(GL_LINE_STRIP); + for(a= 0; a<reconstruction->camnr; a++, camera++) { + glVertex3f(camera->mat[3][0], camera->mat[3][1], camera->mat[3][2]); + } + glEnd(); + + glLineWidth(1.0f); + glEnable(GL_LIGHTING); + } + } + + glPopMatrix(); + + /* restore */ + glShadeModel(GL_FLAT); + glDisable(GL_COLOR_MATERIAL); + glDisable(GL_LIGHTING); + + glColor4fv(curcol); + + if(flag&DRAW_PICKING) + glLoadName(base->selcol); +} + /* flag similar to draw_object() */ -static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object *ob, int flag) +static void drawcamera(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base, int flag) { /* a standing up pyramid with (0,0,0) as top */ Camera *cam; + Object *ob= base->object; float tvec[3]; float vec[4][3], asp[2], shift[2], scale[3]; int i; float drawsize; const short is_view= (rv3d->persp==RV3D_CAMOB && ob==v3d->camera); + MovieClip *clip= object_get_movieclip(scene, base->object, 0); + + /* draw data for movie clip set as active for scene */ + if(clip) + draw_viewport_reconstruction(scene, base, v3d, clip, flag); #ifdef VIEW3D_CAMERA_BORDER_HACK if(is_view && !(G.f & G_PICKSEL)) { @@ -6082,7 +6310,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) break; case OB_CAMERA: if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0 || (rv3d->persp==RV3D_CAMOB && v3d->camera==ob)) /* special exception for active camera */ - drawcamera(scene, v3d, rv3d, ob, flag); + drawcamera(scene, v3d, rv3d, base, flag); break; case OB_SPEAKER: if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) |