[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