[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17998] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sun Dec 21 20:58:26 CET 2008


Revision: 17998
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17998
Author:   ton
Date:     2008-12-21 20:58:25 +0100 (Sun, 21 Dec 2008)

Log Message:
-----------
2.5

Animated screen! (unfinished, now only draws, no animation code yet).
Fun though to see it all work. :)

NOTE: Mac ghost has timer bug, the GHOST_ProcessEvents() doesnt wake
up for timers.

NOTE2: Added while loop in wm_window_process_events() to force Ghost
giving all events to Blender. Timers otherwise don't accumulate...
might be needed to fix in ghost too.

I tend to think to code own timer, this ghost stuff is totally different
per platform.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
    branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c

Modified: branches/blender2.5/blender/source/blender/editors/include/ED_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/editors/include/ED_screen.h	2008-12-21 19:58:25 UTC (rev 17998)
@@ -74,6 +74,7 @@
 bScreen *ED_screen_duplicate(struct wmWindow *win, struct bScreen *sc);
 void	ED_screen_set_subwinactive(struct wmWindow *win, struct wmEvent *event);
 void	ED_screen_exit(struct bContext *C, struct wmWindow *window, struct bScreen *screen);
+void	ED_animation_timer(struct wmWindow *win, int enable);
 
 void	ED_operatortypes_screen(void);
 void	ED_keymap_screen(struct wmWindowManager *wm);

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_edit.c	2008-12-21 19:58:25 UTC (rev 17998)
@@ -29,6 +29,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_vec_types.h"
+#include "DNA_scene_types.h"
 
 #include "BLI_blenlib.h"
 
@@ -1263,3 +1264,14 @@
 
 }
 
+void ED_animation_timer(wmWindow *win, int enable)
+{
+	
+	if(win->animtimer)
+		WM_event_remove_window_timer(win, win->animtimer);
+	win->animtimer= NULL;
+	
+	if(enable)
+		win->animtimer= WM_event_add_window_timer(win, (int)(1000/FPS), (int)(1000/FPS));
+}
+

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2008-12-21 19:58:25 UTC (rev 17998)
@@ -1310,7 +1310,6 @@
 
 void ED_SCR_OT_region_flip(wmOperatorType *ot)
 {
-	
 	/* identifiers */
 	ot->name= "Flip Region";
 	ot->idname= "ED_SCR_OT_region_flip";
@@ -1322,7 +1321,39 @@
 	ot->poll= ED_operator_areaactive;
 }
 
+/* ****************** anim player, typically with timer ***************** */
 
+static int screen_animation_play(bContext *C, wmOperator *op, wmEvent *event)
+{
+	wmWindow *win= CTX_wm_window(C);
+	
+	if(win->animtimer==event->customdata) {
+		Scene *scene= CTX_data_scene(C);
+		
+		scene->r.cfra++;
+		if(scene->r.cfra > scene->r.efra)
+			scene->r.cfra= scene->r.sfra;
+
+		WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
+		
+		return OPERATOR_FINISHED;
+	}
+	return OPERATOR_PASS_THROUGH;
+}
+
+void ED_SCR_OT_animation_play(wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name= "Animation player";
+	ot->idname= "ED_SCR_OT_animation_play";
+	
+	/* api callbacks */
+	ot->invoke= screen_animation_play;
+	
+	ot->poll= ED_operator_screenactive;
+	
+}
+
 /* ************** border select operator (template) ***************************** */
 
 /* operator state vars used: (added by default WM callbacks)   
@@ -1402,7 +1433,8 @@
 	
 	/*frame changes*/
 	WM_operatortype_append(ED_SCR_OT_frame_offset);
-
+	WM_operatortype_append(ED_SCR_OT_animation_play);
+	
 	/* tools shared by more space types */
 	ED_marker_operatortypes();	
 	
@@ -1430,6 +1462,7 @@
 	RNA_enum_set(WM_keymap_add_item(keymap, "ED_SCR_OT_region_split", SKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "dir", 'v');
 						  
 	/*frame offsets*/
+	WM_keymap_add_item(keymap, "ED_SCR_OT_animation_play", TIMER, KM_ANY, 0, 0);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", UPARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", 10);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", DOWNARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -10);
 	RNA_int_set(WM_keymap_add_item(keymap, "ED_SCR_OT_frame_offset", LEFTARROWKEY, KM_PRESS, 0, 0)->ptr, "delta", -1);

Modified: branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/editors/space_time/time_header.c	2008-12-21 19:58:25 UTC (rev 17998)
@@ -337,24 +337,7 @@
 	return block;
 }
 
-static void start_animated_screen(SpaceTime *stime)
-{
-	// XXX	add_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM, stime->redraws);
-	
-	//	if(stime->redraws & TIME_WITH_SEQ_AUDIO)
-	//		audiostream_start( CFRA );
-	
-	//	BKE_ptcache_set_continue_physics((stime->redraws & TIME_CONTINUE_PHYSICS));
-}
 
-static void end_animated_screen(SpaceTime *stime)
-{
-	//	rem_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM);
-	
-	//	audiostream_stop();
-	//	BKE_ptcache_set_continue_physics(0);
-}
-
 #define B_REDRAWALL		750
 #define B_TL_REW		751
 #define B_TL_PLAY		752
@@ -374,7 +357,7 @@
 
 void do_time_buttons(bContext *C, void *arg, int event)
 {
-	SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
+//	SpaceTime *stime= (SpaceTime*)CTX_wm_space_data(C);
 	Scene *scene= CTX_data_scene(C);
 	
 	switch(event) {
@@ -386,10 +369,10 @@
 			//update_for_newframe();
 			break;
 		case B_TL_PLAY:
-			start_animated_screen(stime);
+			ED_animation_timer(CTX_wm_window(C), 1);
 			break;
 		case B_TL_STOP:
-			end_animated_screen(stime);
+			ED_animation_timer(CTX_wm_window(C), 0);
 			WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
 			break;
 		case B_TL_FF:
@@ -524,10 +507,10 @@
 				 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Skip to previous keyframe (Ctrl PageDown)");
 	xco+= XIC+4;
 	
-//	if(has_screenhandler(G.curscreen, SCREEN_HANDLER_ANIM))
-//		uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
-//					 xco, 0, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
-//	else 	   
+	if(CTX_wm_window(C)->animtimer)
+		uiDefIconBut(block, BUT, B_TL_STOP, ICON_PAUSE,
+					 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Stop Playing Timeline");
+	else 	   
 		uiDefIconBut(block, BUT, B_TL_PLAY, ICON_PLAY,
 					 xco, yco, XIC, YIC, 0, 0, 0, 0, 0, "Play Timeline ");
 	

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_windowmanager_types.h	2008-12-21 19:58:25 UTC (rev 17998)
@@ -47,6 +47,7 @@
 struct bScreen;
 struct uiBlock;
 struct wmSubWindow;
+struct wmTimerHandle;
 struct StructRNA;
 struct PointerRNA;
 
@@ -93,6 +94,8 @@
 	
 	struct wmSubWindow *curswin;	/* internal for wm_subwindow.c only */
 	
+	struct wmTimerHandle *animtimer;
+	
 	ListBase queue;				/* all events (ghost level events were handled) */
 	ListBase handlers;			/* window+screen handlers, overriding all queues */
 	

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2008-12-21 19:58:25 UTC (rev 17998)
@@ -675,7 +675,7 @@
 			CTX_wm_area_set(C, area_event_inside(C, event));
 			CTX_wm_region_set(C, region_event_inside(C, event));
 			
-			/* MVC demands to not draw in event handlers... for now we leave it */
+			/* MVC demands to not draw in event handlers... but we need to leave it for ogl selecting etc */
 			wm_window_make_drawable(C, win);
 			
 			action= wm_handlers_do(C, event, &win->handlers);

Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c	2008-12-21 19:40:47 UTC (rev 17997)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_window.c	2008-12-21 19:58:25 UTC (rev 17998)
@@ -498,8 +498,21 @@
 
 void wm_window_process_events(int wait_for_event) 
 {
-	GHOST_ProcessEvents(g_system, wait_for_event);
-	GHOST_DispatchEvents(g_system);
+	int handled= 0;
+	
+	/* ghost only processes 1 (timer?) event a time... we want to accumulate all */
+	while(1) {
+		if(GHOST_ProcessEvents(g_system, 0)) {
+			GHOST_DispatchEvents(g_system);
+			handled= 1;
+		}
+		else
+			break;
+	}
+	if(handled==0 && wait_for_event) {
+		GHOST_ProcessEvents(g_system, wait_for_event);
+		GHOST_DispatchEvents(g_system);
+	}
 }
 
 /* **************** init ********************** */





More information about the Bf-blender-cvs mailing list