Revision: 48739 http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48739 Author: campbellbarton Date: 2012-07-08 18:20:29 +0000 (Sun, 08 Jul 2012) Log Message: ----------- play animation now works switching between scrubbing and pingpong
Modified Paths: -------------- branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c Modified: branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c =================================================================== --- branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c 2012-07-08 18:10:53 UTC (rev 48738) +++ branches/soc-2011-tomato/source/blender/windowmanager/intern/wm_playanim.c 2012-07-08 18:20:29 UTC (rev 48739) @@ -36,6 +36,7 @@ #include <fcntl.h> #include <stdlib.h> #include <string.h> +#include <math.h> #ifndef WIN32 # include <unistd.h> @@ -48,11 +49,12 @@ #include "PIL_time.h" -#include <math.h> +#include "BLI_listbase.h" +#include "BLI_string.h" +#include "BLI_path_util.h" +#include "BLI_fileops.h" +#include "BLI_rect.h" -#include "BLI_blenlib.h" -#include "BLI_math.h" - #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" @@ -79,13 +81,10 @@ #include "GHOST_C-api.h" #include "BLF_api.h" -#define WINCLOSE -1 -#define REDRAW -3 -#define RESHAPE -2 -#define WINQUIT -4 -/* use */ typedef struct PlayState { + + /* playback state */ short direction; short next; short once; @@ -98,6 +97,7 @@ short stopped; short go; + /* current picture */ struct PlayAnimPict *picture; /* set once at the start */ @@ -108,31 +108,53 @@ struct ImBuf *curframe_ibuf; } PlayState; -/* ***************** gl_util.c ****************** */ +/* for debugging */ +#if 0 +void print_ps(PlayState *ps) +{ + printf("ps:\n"); + printf(" direction=%d,\n", (int)ps->direction); + printf(" next=%d,\n", ps->next); + printf(" once=%d,\n", ps->once); + printf(" turbo=%d,\n", ps->turbo); + printf(" pingpong=%d,\n", ps->pingpong); + printf(" noskip=%d,\n", ps->noskip); + printf(" sstep=%d,\n", ps->sstep); + printf(" pause=%d,\n", ps->pause); + printf(" wait2=%d,\n", ps->wait2); + printf(" stopped=%d,\n", ps->stopped); + printf(" go=%d,\n\n", ps->go); + fflush(stdout); +} +#endif -static GHOST_SystemHandle g_system = NULL; -static void *g_window = NULL; +/* global for window and events */ +typedef enum eWS_Qual { + WS_QUAL_LSHIFT = (1 << 0), + WS_QUAL_RSHIFT = (1 << 1), + WS_QUAL_SHIFT = (WS_QUAL_LSHIFT | WS_QUAL_RSHIFT), + WS_QUAL_LALT = (1 << 2), + WS_QUAL_RALT = (1 << 3), + WS_QUAL_ALT = (WS_QUAL_LALT | WS_QUAL_RALT), + WS_QUAL_LCTRL = (1 << 4), + WS_QUAL_RCTRL = (1 << 5), + WS_QUAL_LMOUSE = (1 << 16), + WS_QUAL_MMOUSE = (1 << 17), + WS_QUAL_RMOUSE = (1 << 18), + WS_QUAL_MOUSE = (WS_QUAL_LMOUSE | WS_QUAL_MMOUSE | WS_QUAL_RMOUSE) +} eWS_Qual; -static int qualN = 0; +static struct WindowStateGlobal { + GHOST_SystemHandle ghost_system; + void *ghost_window; -#define LSHIFT (1 << 0) -#define RSHIFT (1 << 1) -#define SHIFT (LSHIFT | RSHIFT) -#define LALT (1 << 2) -#define RALT (1 << 3) -#define ALT (LALT | RALT) -#define LCTRL (1 << 4) -#define RCTRL (1 << 5) -#define LMOUSE (1 << 16) -#define MMOUSE (1 << 17) -#define RMOUSE (1 << 18) -#define MOUSE (LMOUSE | MMOUSE | RMOUSE) + /* events */ + eWS_Qual qual; +} g_WS = {NULL}; -unsigned short screen_qread(short *val, char *ascii); - void playanim_window_get_size(int *width_r, int *height_r) { - GHOST_RectangleHandle bounds = GHOST_GetClientBounds(g_window); + GHOST_RectangleHandle bounds = GHOST_GetClientBounds(g_WS.ghost_window); *width_r = GHOST_GetWidthRectangle(bounds); *height_r = GHOST_GetHeightRectangle(bounds); GHOST_DisposeRectangle(bounds); @@ -144,46 +166,46 @@ int val; /* Shift */ - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyLeftShift, &val); - if (val) qualN |= LSHIFT; - else qualN &= ~LSHIFT; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyLeftShift, &val); + if (val) g_WS.qual |= WS_QUAL_LSHIFT; + else g_WS.qual &= ~WS_QUAL_LSHIFT; - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyRightShift, &val); - if (val) qualN |= RSHIFT; - else qualN &= ~RSHIFT; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyRightShift, &val); + if (val) g_WS.qual |= WS_QUAL_RSHIFT; + else g_WS.qual &= ~WS_QUAL_RSHIFT; /* Control */ - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyLeftControl, &val); - if (val) qualN |= LCTRL; - else qualN &= ~LCTRL; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyLeftControl, &val); + if (val) g_WS.qual |= WS_QUAL_LCTRL; + else g_WS.qual &= ~WS_QUAL_LCTRL; - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyRightControl, &val); - if (val) qualN |= RCTRL; - else qualN &= ~RCTRL; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyRightControl, &val); + if (val) g_WS.qual |= WS_QUAL_RCTRL; + else g_WS.qual &= ~WS_QUAL_RCTRL; /* Alt */ - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyLeftAlt, &val); - if (val) qualN |= LCTRL; - else qualN &= ~LCTRL; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyLeftAlt, &val); + if (val) g_WS.qual |= WS_QUAL_LCTRL; + else g_WS.qual &= ~WS_QUAL_LCTRL; - GHOST_GetModifierKeyState(g_system, GHOST_kModifierKeyRightAlt, &val); - if (val) qualN |= RCTRL; - else qualN &= ~RCTRL; + GHOST_GetModifierKeyState(g_WS.ghost_system, GHOST_kModifierKeyRightAlt, &val); + if (val) g_WS.qual |= WS_QUAL_RCTRL; + else g_WS.qual &= ~WS_QUAL_RCTRL; /* LMB */ - GHOST_GetButtonState(g_system, GHOST_kButtonMaskLeft, &val); - if (val) qualN |= LMOUSE; - else qualN &= ~LMOUSE; + GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskLeft, &val); + if (val) g_WS.qual |= WS_QUAL_LMOUSE; + else g_WS.qual &= ~WS_QUAL_LMOUSE; /* MMB */ - GHOST_GetButtonState(g_system, GHOST_kButtonMaskMiddle, &val); - if (val) qualN |= MMOUSE; - else qualN &= ~MMOUSE; + GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskMiddle, &val); + if (val) g_WS.qual |= WS_QUAL_MMOUSE; + else g_WS.qual &= ~WS_QUAL_MMOUSE; /* RMB */ - GHOST_GetButtonState(g_system, GHOST_kButtonMaskRight, &val); - if (val) qualN |= RMOUSE; - else qualN &= ~RMOUSE; + GHOST_GetButtonState(g_WS.ghost_system, GHOST_kButtonMaskRight, &val); + if (val) g_WS.qual |= WS_QUAL_RMOUSE; + else g_WS.qual &= ~WS_QUAL_RMOUSE; } typedef struct PlayAnimPict { @@ -197,8 +219,7 @@ int IB_flags; } PlayAnimPict; -static struct ListBase _picsbase = {NULL, NULL}; -static struct ListBase *picsbase = &_picsbase; +static struct ListBase picsbase = {NULL, NULL}; static int fromdisk = FALSE; static int fstep = 1; static float zoomx = 1.0, zoomy = 1.0; @@ -216,7 +237,7 @@ return (ptottime < 0); } -static void toscreen(PlayAnimPict *picture, struct ImBuf *ibuf, int fontid) +static void playanim_toscreen(PlayAnimPict *picture, struct ImBuf *ibuf, int fontid) { if (ibuf == NULL) { @@ -230,7 +251,7 @@ if (ibuf->rect == NULL) return; - GHOST_ActivateWindowDrawingContext(g_window); + GHOST_ActivateWindowDrawingContext(g_WS.ghost_window); glRasterPos2f(0.0f, 0.0f); @@ -238,14 +259,12 @@ pupdate_time(); - if (picture && (qualN & (SHIFT | LMOUSE)) && (fontid != -1)) { + if (picture && (g_WS.qual & (WS_QUAL_SHIFT | WS_QUAL_LMOUSE)) && (fontid != -1)) { int sizex, sizey; float fsizex_inv, fsizey_inv; char str[32 + FILE_MAX]; cpack(-1); -// glRasterPos2f(0.02f, 0.03f); BLI_snprintf(str, sizeof(str), "%s | %.2f frames/s", picture->name, fstep / swaptime); -// BMF_DrawString(font, str); playanim_window_get_size(&sizex, &sizey); fsizex_inv = 1.0f / sizex; @@ -254,11 +273,10 @@ BLF_enable(fontid, BLF_ASPECT); BLF_aspect(fontid, fsizex_inv, fsizey_inv, 1.0f); BLF_position(fontid, 10.0f * fsizex_inv, 10.0f * fsizey_inv, 0.0f); - BLF_draw(fontid, str, 256); // XXX - // printf("Drawing text '%s'\n", str); + BLF_draw(fontid, str, sizeof(str)); } - GHOST_SwapWindowBuffers(g_window); + GHOST_SwapWindowBuffers(g_WS.ghost_window); } static void build_pict_list(char *first, int totframes, int fstep, int fontid) @@ -276,7 +294,7 @@ int pic; ibuf = IMB_anim_absolute(anim, 0, IMB_TC_NONE, IMB_PROXY_NONE); if (ibuf) { - toscreen(NULL, ibuf, fontid); + playanim_toscreen(NULL, ibuf, fontid); IMB_freeImBuf(ibuf); } @@ -287,7 +305,7 @@ picture->IB_flags = IB_rect; BLI_snprintf(str, sizeof(str), "%s : %4.d", first, pic + 1); picture->name = strdup(str); - BLI_addtail(picsbase, picture); + BLI_addtail(&picsbase, picture); } } else { @@ -321,7 +339,7 @@ if (file < 0) return; picture = (PlayAnimPict *)MEM_callocN(sizeof(PlayAnimPict), "picture"); if (picture == NULL) { - printf("Not enough memory for pict struct \n"); + printf("Not enough memory for pict struct '%s'\n", filepath); close(file); return; } @@ -360,7 +378,7 @@ picture->mem = mem; picture->name = strdup(filepath); close(file); - BLI_addtail(picsbase, picture); + BLI_addtail(&picsbase, picture); count++; pupdate_time(); @@ -374,7 +392,7 @@ ibuf = IMB_loadiffname(picture->name, picture->IB_flags); } if (ibuf) { - toscreen(picture, ibuf, fontid); + playanim_toscreen(picture, ibuf, fontid); IMB_freeImBuf(ibuf); } pupdate_time(); @@ -401,10 +419,11 @@ static int ghost_event_proc(GHOST_EventHandle evt, GHOST_TUserDataPtr ps_void) { PlayState *ps = (PlayState *)ps_void; - GHOST_TEventType type = GHOST_GetEventType(evt); int val; + // print_ps(ps); + playanim_event_qual_update(); /* convert ghost event into value keyboard or mouse */ @@ -438,7 +457,7 @@ if (val) swaptime = fstep / 30.0; break; case GHOST_kKeyNumpad4: - if (qualN & SHIFT) + if (g_WS.qual & WS_QUAL_SHIFT) swaptime = fstep / 24.0; else swaptime = fstep / 25.0; @@ -462,8 +481,8 @@ if (val) { ps->sstep = TRUE; ps->wait2 = FALSE; - if (qualN & SHIFT) { - ps->picture = picsbase->first; + if (g_WS.qual & WS_QUAL_SHIFT) { + ps->picture = picsbase.first; ps->next = 0; } else { @@ -474,7 +493,7 @@ case GHOST_kKeyDownArrow: if (val) { ps->wait2 = FALSE; - if (qualN & SHIFT) { + if (g_WS.qual & WS_QUAL_SHIFT) { ps->next = ps->direction = -1; } else { @@ -487,8 +506,8 @@ if (val) { ps->sstep = TRUE; ps->wait2 = FALSE; - if (qualN & SHIFT) { - ps->picture = picsbase->last; + if (g_WS.qual & WS_QUAL_SHIFT) { + ps->picture = picsbase.last; ps->next = 0; } else { @@ -499,7 +518,7 @@ case GHOST_kKeyUpArrow: if (val) { ps->wait2 = FALSE; @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs