[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25416] trunk/blender: camera switching via markers

Campbell Barton ideasman42 at gmail.com
Wed Dec 16 20:49:33 CET 2009


Revision: 25416
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25416
Author:   campbellbarton
Date:     2009-12-16 20:49:33 +0100 (Wed, 16 Dec 2009)

Log Message:
-----------
camera switching via markers
Currently access by selecting a marking and binding with the active camera from the view menu.

Note:
after long discussion we decieded there is no nice way to do this.. animate pointers? animate multiple camera visibility?, use sequencer? use NLA?.... have a kind of event system (like framechange scriptlinks)... etc
so this is ifdef'd with DURIAN_CAMERA_SWITCH

Modified Paths:
--------------
    trunk/blender/release/scripts/ui/space_time.py
    trunk/blender/source/blender/blenkernel/BKE_scene.h
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/animation/anim_markers.c
    trunk/blender/source/blender/editors/screen/screen_edit.c
    trunk/blender/source/blender/editors/screen/screen_ops.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/release/scripts/ui/space_time.py
===================================================================
--- trunk/blender/release/scripts/ui/space_time.py	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/release/scripts/ui/space_time.py	2009-12-16 19:49:33 UTC (rev 25416)
@@ -98,7 +98,10 @@
         layout.prop(st, "show_cframe_indicator")
         layout.prop(st, "only_selected")
 
+        layout.separator()
 
+        layout.operator("marker.camera_bind")
+
 class TIME_MT_frame(bpy.types.Menu):
     bl_label = "Frame"
 

Modified: trunk/blender/source/blender/blenkernel/BKE_scene.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_scene.h	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/blenkernel/BKE_scene.h	2009-12-16 19:49:33 UTC (rev 25416)
@@ -66,6 +66,7 @@
 
 int next_object(struct Scene *scene, int val, struct Base **base, struct Object **ob);
 struct Object *scene_find_camera(struct Scene *sc);
+struct Object *scene_find_camera_switch(struct Scene *scene); // DURIAN_CAMERA_SWITCH
 
 struct Base *scene_add_base(struct Scene *sce, struct Object *ob);
 void scene_deselect_all(struct Scene *sce);

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -554,6 +554,17 @@
 		if(sce->id.lib==NULL) {
 			if(sce->camera==ob) sce->camera= NULL;
 			if(sce->toolsettings->skgen_template==ob) sce->toolsettings->skgen_template = NULL;
+
+#ifdef DURIAN_CAMERA_SWITCH
+			{
+				TimeMarker *m;
+
+				for (m= sce->markers.first; m; m= m->next) {
+					if(m->camera==ob)
+						m->camera= NULL;
+				}
+			}
+#endif
 		}
 		sce= sce->id.next;
 	}

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -698,7 +698,48 @@
 	return NULL;
 }
 
+#ifdef DURIAN_CAMERA_SWITCH
+Object *scene_find_camera_switch(Scene *scene)
+{
+	TimeMarker *m;
+	int cfra = scene->r.cfra;
+	int frame = -(MAXFRAME + 1);
+	Object *camera= NULL;
 
+	for (m= scene->markers.first; m; m= m->next) {
+		if(m->camera && (m->frame <= cfra) && (m->frame > frame)) {
+			camera= m->camera;
+			frame= m->frame;
+
+			if(frame == cfra)
+				break;
+
+		}
+	}
+	return camera;
+}
+#endif
+
+static char *get_cfra_marker_name(Scene *scene)
+{
+	ListBase *markers= &scene->markers;
+	TimeMarker *m1, *m2;
+
+	/* search through markers for match */
+	for (m1=markers->first, m2=markers->last; m1 && m2; m1=m1->next, m2=m2->prev) {
+		if (m1->frame==CFRA)
+			return m1->name;
+
+		if (m1 == m2)
+			break;
+
+		if (m2->frame==CFRA)
+			return m2->name;
+	}
+
+	return NULL;
+}
+
 Base *scene_add_base(Scene *sce, Object *ob)
 {
 	Base *b= MEM_callocN(sizeof(*b), "scene_add_base");

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -4174,6 +4174,7 @@
 	Base *base, *next;
 	Sequence *seq;
 	SceneRenderLayer *srl;
+	TimeMarker *marker;
 	
 	sce= main->scene.first;
 	while(sce) {
@@ -4229,6 +4230,14 @@
 			}
 			SEQ_END
 
+#ifdef DURIAN_CAMERA_SWITCH
+			for(marker= sce->markers.first; marker; marker= marker->next) {
+				if(marker->camera) {
+					marker->camera= newlibadr(fd, sce->id.lib, marker->camera);
+				}
+			}
+#endif
+
 			if(sce->ed)
 				seq_update_muting(sce->ed);
 			
@@ -4280,6 +4289,7 @@
 	Editing *ed;
 	Sequence *seq;
 	MetaStack *ms;
+	TimeMarker *marker;
 
 	sce->theDag = NULL;
 	sce->dagisvalid = 0;
@@ -4451,7 +4461,7 @@
 	link_list(fd, &(sce->markers));
 	link_list(fd, &(sce->transform_spaces));
 	link_list(fd, &(sce->r.layers));
-	
+
 	sce->nodetree= newdataadr(fd, sce->nodetree);
 	if(sce->nodetree)
 		direct_link_nodetree(fd, sce->nodetree);
@@ -11255,6 +11265,18 @@
 		
 	if(sce->gpd)
 		expand_doit(fd, mainvar, sce->gpd);
+
+#ifdef DURIAN_CAMERA_SWITCH
+	{
+		TimeMarker *marker;
+
+		for(marker= sce->markers.first; marker; marker= marker->next) {
+			if(marker->camera) {
+				expand_doit(fd, mainvar, marker->camera);
+			}
+		}
+	}
+#endif
 }
 
 static void expand_camera(FileData *fd, Main *mainvar, Camera *ca)

Modified: trunk/blender/source/blender/editors/animation/anim_markers.c
===================================================================
--- trunk/blender/source/blender/editors/animation/anim_markers.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/editors/animation/anim_markers.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -240,15 +240,19 @@
 	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);			
 	
 	/* vertical line - dotted */
-	// NOTE: currently only used for sequencer 
+	// NOTE: currently only used for sequencer
+#ifdef DURIAN_CAMERA_SWITCH
+	if (marker->camera || flag & DRAW_MARKERS_LINES) {
+#else
 	if (flag & DRAW_MARKERS_LINES) {
+#endif
 		setlinestyle(3);
 		
 		if (marker->flag & SELECT)
 			glColor4ub(255, 255, 255, 96);
 		else
 			glColor4ub(0, 0, 0, 96);
-		
+
 		glBegin(GL_LINES);
 			glVertex2f((xpos*xscale)+0.5f, 12.0f);
 			glVertex2f((xpos*xscale)+0.5f, 34.0f*yscale); /* a bit lazy but we know it cant be greater then 34 strips high */
@@ -672,6 +676,10 @@
 			newmarker->frame= marker->frame;
 			BLI_strncpy(newmarker->name, marker->name, sizeof(marker->name));
 			
+#ifdef DURIAN_CAMERA_SWITCH
+			newmarker->camera= marker->camera;
+#endif
+
 			/* new marker is added to the begining of list */
 			BLI_addhead(markers, newmarker);
 		}
@@ -978,6 +986,48 @@
 	
 }
 
+#ifdef DURIAN_CAMERA_SWITCH
+/* ******************************* camera bind marker ***************** */
+
+/* remove selected TimeMarkers */
+static int ed_marker_camera_bind_exec(bContext *C, wmOperator *op)
+{
+	Scene *scene= CTX_data_scene(C);
+	ListBase *markers= context_get_markers(C);
+	TimeMarker *marker;
+	short changed= 0;
+
+	if(markers == NULL)
+		return OPERATOR_CANCELLED;
+
+	for(marker= markers->first; marker; marker= marker->next) {
+		if(marker->flag & SELECT) {
+			marker->camera= scene->camera;
+		}
+	}
+
+	if (changed)
+		WM_event_add_notifier(C, NC_SCENE|ND_MARKERS, NULL);
+
+	return OPERATOR_FINISHED;
+}
+
+static void MARKER_OT_camera_bind(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Bind Camera to Markers";
+	ot->description= "Bind the active camera to selected markers(s).";
+	ot->idname= "MARKER_OT_camera_bind";
+
+	/* api callbacks */
+	ot->exec= ed_marker_camera_bind_exec;
+	ot->poll= ED_operator_areaactive;
+
+	/* flags */
+	ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+#endif
+
 /* ************************** registration **********************************/
 
 /* called in screen_ops.c:ED_operatortypes_screen() */
@@ -990,6 +1040,9 @@
 	WM_operatortype_append(MARKER_OT_select_border);
 	WM_operatortype_append(MARKER_OT_select_all);
 	WM_operatortype_append(MARKER_OT_delete);
+#ifdef DURIAN_CAMERA_SWITCH
+	WM_operatortype_append(MARKER_OT_camera_bind);
+#endif
 }
 
 /* called in screen_ops.c:ED_keymap_screen() */
@@ -1008,5 +1061,8 @@
 	WM_keymap_verify_item(keymap, "MARKER_OT_delete", DELKEY, KM_PRESS, 0, 0);
 	
 	WM_keymap_add_item(keymap, "MARKER_OT_move", GKEY, KM_PRESS, 0, 0);
+#ifdef DURIAN_CAMERA_SWITCH
+	WM_keymap_add_item(keymap, "MARKER_OT_camera_bind", HOMEKEY, KM_PRESS, 0, 0);
+#endif
 	
 }

Modified: trunk/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_edit.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/editors/screen/screen_edit.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -1670,6 +1670,47 @@
 	bScreen *screen= CTX_wm_screen(C);
 	Scene *scene= CTX_data_scene(C);
 	
+#ifdef DURIAN_CAMERA_SWITCH
+	void *camera= scene_find_camera_switch(scene);
+	if(camera && scene->camera != camera) {
+
+		if(camera && scene->camera && (camera != scene->camera)) {
+			bScreen *sc;
+			/* are there cameras in the views that are not in the scene? */
+			for(sc= CTX_data_main(C)->screen.first; sc; sc= sc->id.next) {
+				ScrArea *sa= sc->areabase.first;
+				while(sa) {
+					SpaceLink *sl= sa->spacedata.first;
+					while(sl) {
+						if(sl->spacetype==SPACE_VIEW3D) {
+							View3D *v3d= (View3D*) sl;
+							if (v3d->camera == scene->camera) {
+								v3d->camera= camera;
+								/*
+								ARegion *ar;
+								for(ar=v3d->regionbase.first; ar; ar= ar->next) {
+									if(ar->regiontype == RGN_TYPE_WINDOW) {
+										RegionView3D *rv3d= ar->regiondata;
+
+										if(rv3d->persp==RV3D_CAMOB)
+											rv3d->persp= RV3D_PERSP;
+									}
+								}
+								*/
+							}
+						}
+						sl= sl->next;
+					}
+					sa= sa->next;
+				}
+			}
+		}
+
+		scene->camera= camera;
+
+	}
+#endif
+
 	//extern void audiostream_scrub(unsigned int frame);	/* seqaudio.c */
 	
 	/* this function applies the changes too */

Modified: trunk/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_ops.c	2009-12-16 19:19:08 UTC (rev 25415)
+++ trunk/blender/source/blender/editors/screen/screen_ops.c	2009-12-16 19:49:33 UTC (rev 25416)
@@ -2339,6 +2339,9 @@
 		ScreenAnimData *sad= wt->customdata;
 		ScrArea *sa;
 		int sync;
+#ifdef DURIAN_CAMERA_SWITCH
+		Object *camera_orig= scene->camera;
+#endif
 		
 		/* sync, don't sync, or follow scene setting */
 		if(sad->flag & ANIMPLAY_FLAG_SYNC) sync= 1;
@@ -2397,10 +2400,11 @@
 		}
 		
 		/* since we follow drawflags, we can't send notifier but tag regions ourselves */
+
 		ED_update_for_newframe(C, 1);
 		
 		sound_update_playing(C);
-		
+
 		for(sa= screen->areabase.first; sa; sa= sa->next) {
 			ARegion *ar;
 			for(ar= sa->regionbase.first; ar; ar= ar->next) {

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list