[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38518] branches/soc-2011-tomato: Camera tracking integration
Sergey Sharybin
g.ulairi at gmail.com
Tue Jul 19 22:22:04 CEST 2011
Revision: 38518
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38518
Author: nazgul
Date: 2011-07-19 20:22:03 +0000 (Tue, 19 Jul 2011)
Log Message:
-----------
Camera tracking integration
===========================
- Selected bundles are now highlighted with outline.
It looks more Blender-way of highlighting selected items.
- Added option to show bundles names in 3D viewport.
- Bundles now coudl be selected from 3D viewport.
Modified Paths:
--------------
branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_view3d.py
branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c
branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_draw.c
branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_intern.h
branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_select.c
branches/soc-2011-tomato/source/blender/makesdna/DNA_view3d_types.h
branches/soc-2011-tomato/source/blender/makesrna/intern/rna_space.c
Modified: branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_view3d.py
===================================================================
--- branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_view3d.py 2011-07-19 20:19:45 UTC (rev 38517)
+++ branches/soc-2011-tomato/release/scripts/startup/bl_ui/space_view3d.py 2011-07-19 20:22:03 UTC (rev 38518)
@@ -2184,6 +2184,7 @@
sub = layout.column()
sub.active = view.show_reconstruction
sub.prop(view, "bundle_size")
+ sub.prop(view, "show_bundle_name")
sub.prop(view, "show_camera_path")
layout.separator()
Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-07-19 20:19:45 UTC (rev 38517)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h 2011-07-19 20:22:03 UTC (rev 38518)
@@ -82,6 +82,8 @@
void BKE_tracking_detect(struct MovieTracking *tracking, struct ImBuf *imbuf, int framenr);
+struct MovieTrackingTrack *BKE_tracking_indexed_bundle(struct MovieTracking *tracking, int bundlenr);
+
#define TRACK_SELECTED(track) ((track)->flag&SELECT || (track)->pat_flag&SELECT || (track)->search_flag&SELECT)
#define TRACK_AREA_SELECTED(track, area) ((area)==TRACK_AREA_POINT?(track)->flag&SELECT : ((area)==TRACK_AREA_PAT?(track)->pat_flag&SELECT:(track)->search_flag&SELECT))
#define TRACK_VIEW_SELECTED(track) ((track->flag&TRACK_HIDDEN)==0 && TRACK_SELECTED(track))
Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-07-19 20:19:45 UTC (rev 38517)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c 2011-07-19 20:22:03 UTC (rev 38518)
@@ -1030,3 +1030,22 @@
libmv_destroyCorners(corners);
#endif
}
+
+MovieTrackingTrack *BKE_tracking_indexed_bundle(MovieTracking *tracking, int bundlenr)
+{
+ MovieTrackingTrack *track= tracking->tracks.first;
+ int cur= 1;
+
+ while(track) {
+ if(track->flag&TRACK_HAS_BUNDLE) {
+ if(cur==bundlenr)
+ return track;
+
+ cur++;
+ }
+
+ track= track->next;
+ }
+
+ return NULL;
+}
Modified: branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c 2011-07-19 20:19:45 UTC (rev 38517)
+++ branches/soc-2011-tomato/source/blender/editors/space_view3d/drawobject.c 2011-07-19 20:22:03 UTC (rev 38518)
@@ -74,6 +74,8 @@
#include "BKE_particle.h"
#include "BKE_pointcache.h"
#include "BKE_unit.h"
+#include "BKE_movieclip.h"
+#include "BKE_tracking.h"
#include "smoke_API.h"
@@ -200,6 +202,40 @@
}
}
+/* 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 */
@@ -708,7 +744,12 @@
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++;
}
@@ -1335,11 +1376,193 @@
glEnd();
}
+/* ****************** 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, 16, 16);
+ glShadeModel(GL_FLAT);
+ gluDeleteQuadric(qobj);
+
+ glEndList();
+ }
+
+ glCallList(displist);
+}
+
+static void draw_bundle_outline(void)
+{
+ static GLuint displist=0;
+
+ if (displist == 0) {
+ GLUquadricObj *qobj;
+
+ displist= glGenLists(1);
+ glNewList(displist, GL_COMPILE);
+
+ glPushMatrix();
+
+ qobj= gluNewQuadric();
+ gluQuadricDrawStyle(qobj, GLU_SILHOUETTE);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
+
+ glRotatef(90, 0, 1, 0);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
+
+ glRotatef(90, 1, 0, 0);
+ gluDisk(qobj, 0.0, 0.05, 16, 1);
+
+ gluDeleteQuadric(qobj);
+
+ glPopMatrix();
+ 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, 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) {
+ 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(TRACK_SELECTED(track)) UI_ThemeColor(TH_SELECT);
+ else UI_ThemeColor(TH_WIRE);
+ draw_bundle_outline();
+
+ glDepthMask(1);
+ glEnable(GL_LIGHTING);
+ } else if(v3d->drawtype>OB_WIRE) {
+ /* selection outline */
+ if(TRACK_SELECTED(track)) {
+ 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);
+ }
+
+ UI_ThemeColor(TH_BUNDLE_SOLID);
+ draw_bundle_sphere();
+ }
+
+ glPopMatrix();
+
+ if((flag & DRAW_PICKING)==0 && (v3d->flag2&V3D_SHOW_BUNDLENAME)) {
+ float pos[3];
+ unsigned char tcol[4];
+
+ if(TRACK_SELECTED(track)) 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.camera.reconnr) {
+ int a= 0;
+ MovieTrackingCamera *camera= &clip->tracking.camera;
+ MovieReconstructedCamera *cur= camera->reconstructed;
+
+ glDisable(GL_LIGHTING);
+ UI_ThemeColor(TH_CAMERA_PATH);
+ glLineWidth(2.0f);
+
+ glBegin(GL_LINE_STRIP);
+ for(a= 0; a<camera->reconnr; a++, cur++) {
+ glVertex3f(cur->mat[3][0], cur->mat[3][1], cur->mat[3][2]);
+ }
+ glEnd();
+
+ glLineWidth(1.0f);
+ glEnable(GL_LIGHTING);
+ }
+ }
+
+ glPopMatrix();
+
+ /* restore */
+ glShadeModel(GL_FLAT);
+ glDisable(GL_COLOR_MATERIAL);
+ glDisable(GL_LIGHTING);
+
+ glColor4fv(curcol);
+}
+
/* 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 vec[8][4], facx, facy, depth, aspx, aspy, caspx, caspy, shx, shy;
int i;
float drawsize;
@@ -1410,6 +1633,10 @@
glVertex3fv(vec[4]);
glEnd();
+ /* draw data for movie clip set as active for scene */
+ if(scene->clip)
+ draw_viewport_reconstruction(scene, base, v3d, scene->clip, flag);
+
if(is_view)
return;
@@ -5991,7 +6218,7 @@
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_LATTICE:
if((v3d->flag2 & V3D_RENDER_OVERRIDE)==0) {
Modified: branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_draw.c 2011-07-19 20:19:45 UTC (rev 38517)
+++ branches/soc-2011-tomato/source/blender/editors/space_view3d/view3d_draw.c 2011-07-19 20:22:03 UTC (rev 38518)
@@ -64,7 +64,6 @@
#include "BKE_screen.h"
#include "BKE_unit.h"
#include "BKE_movieclip.h"
-#include "BKE_tracking.h"
#include "RE_pipeline.h" // make_stars
@@ -1535,144 +1534,6 @@
}
}
-/* ****************** 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);
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list