Mercurial > sdl-ios-xcode
diff touchTest/gestureSDLTest.c @ 4688:494f71f57a80
Fixed bugs related to keyboard handling in gestureSDLTest. Fixed gesture code (dynamic memory allocation). Cleaned up gesture and test code.
author | Jim Grandpre <jim.tla@gmail.com> |
---|---|
date | Fri, 13 Aug 2010 23:08:32 -0400 |
parents | 15dfe42edbfd |
children | f9ab8df6d45a |
line wrap: on
line diff
--- a/touchTest/gestureSDLTest.c Fri Aug 13 17:05:06 2010 -0700 +++ b/touchTest/gestureSDLTest.c Fri Aug 13 23:08:32 2010 -0400 @@ -26,83 +26,33 @@ #endif #endif -#define PI 3.1415926535897 -#define PHI ((sqrt(5)-1)/2) #define WIDTH 640 #define HEIGHT 480 #define BPP 4 #define DEPTH 32 -#define MAXFINGERS 5 - -#define DOLLARNPOINTS 64 -#define DOLLARSIZE 256 - //MUST BE A POWER OF 2! #define EVENT_BUF_SIZE 256 + +#define VERBOSE SDL_FALSE + SDL_Event events[EVENT_BUF_SIZE]; int eventWrite; -int mousx,mousy; -int keystat[512]; -int bstatus; - int colors[7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF}; -SDL_FingerID index2fingerid[MAXFINGERS]; -int fingersDown; - typedef struct { float x,y; } Point; typedef struct { - Point p; - float pressure; - SDL_FingerID id; -} Finger; - -typedef struct { - Finger f; - Point cv; - float dtheta,dDist; -} TouchPoint; - - -typedef struct { //dt + s - Point d,s; //direction, start - int points; -} Line; - - -typedef struct { - float length; - - int numPoints; - Point p[EVENT_BUF_SIZE]; //To be safe -} DollarPath; - -typedef struct { float ang,r; Point p; } Knob; Knob knob; -Finger finger[MAXFINGERS]; - - -DollarPath dollarPath[MAXFINGERS]; - -#define MAXTEMPLATES 4 - -Point dollarTemplate[MAXTEMPLATES][DOLLARNPOINTS]; -int numDollarTemplates = 0; -#ifdef DRAW_VECTOR_EST -Line gestureLine[MAXFINGERS]; -#endif - void handler (int sig) { printf ("\exiting...(%d)\n", sig); @@ -115,7 +65,6 @@ handler (9); } - void setpix(SDL_Surface *screen, int x, int y, unsigned int col) { Uint32 *pixmem32; @@ -150,13 +99,10 @@ for(t=0;t<1;t+=1.f/SDL_max(abs(x0-x1),abs(y0-y1))) setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col); } + void drawCircle(SDL_Surface* screen,int x,int y,int r,unsigned int c) { - - float a; - int tx; - - int ty; + int tx,ty; float xr; for(ty = -abs(r);ty <= abs(r);ty++) { xr = sqrt(r*r - ty*ty); @@ -173,50 +119,24 @@ } void drawKnob(SDL_Surface* screen,Knob k) { - //printf("Knob: x = %f, y = %f, r = %f, a = %f\n",k.p.x,k.p.y,k.r,k.ang); - - drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF); - + drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF); drawCircle(screen,(k.p.x+k.r/2*cos(k.ang))*screen->w, (k.p.y+k.r/2*sin(k.ang))*screen->h,k.r/4*screen->w,0); - } -void DrawScreen(SDL_Surface* screen, int h) +void DrawScreen(SDL_Surface* screen) { - int x, y, xm,ym,c; + int x, y; if(SDL_MUSTLOCK(screen)) { if(SDL_LockSurface(screen) < 0) return; } - for(y = 0; y < screen->h; y++ ) - { - for( x = 0; x < screen->w; x++ ) - { - //setpixel(screen, x, y, (x*x)/256+3*y+h, (y*y)/256+x+h, h); - //xm = (x+h)%screen->w; - //ym = (y+h)%screen->w; - //c = sin(h/256*2*PI)*x*y/screen->w/screen->h; - //setpix(screen,x,y,255*sin(xm/screen->w*2*PI),sin(h/255*2*PI)*255*y/screen->h,c); - setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); - //setpix(screen,x,y,0); //Inefficient, but that's okay... - } - } - drawCircle(screen,mousx,mousy,-30,0xFFFFFF); - drawLine(screen,0,0,screen->w,screen->h,0xFFFFFF); + for(y = 0;y < screen->h;y++) + for(x = 0;x < screen->w;x++) + setpix(screen,x,y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255); int i; -//draw Touch History - TouchPoint gestureLast[MAXFINGERS]; - //printf("------------------Start History------------------\n"); - for(i = 0;i < MAXFINGERS;i++) { - gestureLast[i].f.id = -1; - } - int numDownFingers = 0; - Point centroid; - float gdtheta,gdDist; - - + //draw Touch History for(i = SDL_max(0,eventWrite - EVENT_BUF_SIZE);i < eventWrite;i++) { SDL_Event event = events[i&(EVENT_BUF_SIZE-1)]; int age = eventWrite - i - 1; @@ -224,13 +144,12 @@ event.type == SDL_FINGERDOWN || event.type == SDL_FINGERUP) { SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); - //SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); - + if(inTouch == NULL) continue; + float x = ((float)event.tfinger.x)/inTouch->xres; float y = ((float)event.tfinger.y)/inTouch->yres; - //draw the touch: - + //draw the touch: unsigned int c = colors[event.tfinger.touchId%7]; unsigned int col = ((unsigned int)(c*(.1+.85))) | @@ -243,25 +162,10 @@ } } - /* - for(i=0;i<MAXFINGERS;i++) - if(finger[i].p.x >= 0 && finger[i].p.y >= 0) - if(finger[i].pressure > 0) - drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h - ,20,0xFF*finger[i].pressure); - else - drawCircle(screen,finger[i].p.x*screen->w,finger[i].p.y*screen->h - ,20,0xFF); - */ - - - keystat[32] = 0; - if(knob.p.x > 0) drawKnob(screen,knob); if(SDL_MUSTLOCK(screen)) SDL_UnlockSurface(screen); - SDL_Flip(screen); } @@ -275,21 +179,15 @@ { SDL_Surface *screen; SDL_Event event; - - int keypress = 0; - int h=0,s=1,i,j; //gesture variables - int numDownFingers = 0; - float gdtheta = 0,gdDist = 0; - Point centroid; knob.r = .1; knob.ang = 0; - TouchPoint gestureLast[MAXFINGERS]; - + + SDL_bool quitting = SDL_FALSE; + SDL_RWops *src; - memset(keystat,0,512*sizeof(keystat[0])); if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1; if (!(screen = initScreen(WIDTH,HEIGHT))) @@ -298,8 +196,7 @@ return 1; } - while(!keystat[27]) { - //Poll SDL + while(!quitting) { while(SDL_PollEvent(&event)) { //Record _all_ events @@ -309,38 +206,28 @@ switch (event.type) { case SDL_QUIT: - keystat[27] = 1; + quitting = SDL_TRUE; break; case SDL_KEYDOWN: - //printf("%i\n",event.key.keysym.sym); - keystat[event.key.keysym.sym] = 1; - if(event.key.keysym.sym == 32) { - SDL_RecordGesture(-1); - } - else if(event.key.keysym.sym == 115) { - SDL_RWops *src; - //fp = fopen("gestureSave","w"); - src = SDL_RWFromFile("gestureSave","w"); - - printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src)); - //fclose(fp); - SDL_RWclose(src); + switch (event.key.keysym.sym) + { + case SDLK_SPACE: + SDL_RecordGesture(-1); + break; + case SDLK_s: + src = SDL_RWFromFile("gestureSave","w"); + printf("Wrote %i templates\n",SDL_SaveAllDollarTemplates(src)); + SDL_RWclose(src); + break; + case SDLK_l: + src = SDL_RWFromFile("gestureSave","r"); + printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src)); + SDL_RWclose(src); + break; + case SDLK_ESCAPE: + quitting = SDL_TRUE; + break; } - else if(event.key.keysym.sym == 108) { - SDL_RWops *src; - //fp = fopen("gestureSave","r"); - src = SDL_RWFromFile("gestureSave","r"); - printf("Loaded: %i\n",SDL_LoadDollarTemplates(-1,src)); - //fclose(fp); - SDL_RWclose(src); - } - - //keypress = 1; - break; - case SDL_KEYUP: - //printf("%i\n",event.key.keysym.sym); - keystat[event.key.keysym.sym] = 0; - //keypress = 1; break; case SDL_VIDEORESIZE: if (!(screen = initScreen(event.resize.w, @@ -350,78 +237,36 @@ return 1; } break; - case SDL_MOUSEMOTION: - mousx = event.motion.x; - mousy = event.motion.y; - break; - case SDL_MOUSEBUTTONDOWN: - bstatus |= (1<<(event.button.button-1)); - break; - case SDL_MOUSEBUTTONUP: - bstatus &= ~(1<<(event.button.button-1)); - break; case SDL_FINGERMOTION: ; - //printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, - // event.tfinger.x,event.tfinger.y); +#if VERBOSE + printf("Finger: %i,x: %i, y: %i\n",event.tfinger.fingerId, + event.tfinger.x,event.tfinger.y); +#endif SDL_Touch* inTouch = SDL_GetTouch(event.tfinger.touchId); SDL_Finger* inFinger = SDL_GetFinger(inTouch,event.tfinger.fingerId); - /* - for(i = 0;i<MAXFINGERS;i++) - if(index2fingerid[i] == event.tfinger.fingerId) - break; - if(i == MAXFINGERS) break; - if(inTouch > 0) { - finger[i].p.x = ((float)event.tfinger.x)/ - inTouch->xres; - finger[i].p.y = ((float)event.tfinger.y)/ - inTouch->yres; - - finger[i].pressure = - ((float)event.tfinger.pressure)/inTouch->pressureres; - */ - /* - printf("Finger: %i, Pressure: %f Pressureres: %i\n", - event.tfinger.fingerId, - finger[i].pressure, - inTouch->pressureres); - */ - //printf("Finger: %i, pressure: %f\n",event.tfinger.fingerId, - // finger[event.tfinger.fingerId].pressure); - //} - break; case SDL_FINGERDOWN: - //printf("Finger: %"PRIs64" down - x: %i, y: %i\n",event.tfinger.fingerId,event.tfinger.x,event.tfinger.y); - /* - for(i = 0;i<MAXFINGERS;i++) - if(index2fingerid[i] == -1) { - index2fingerid[i] = event.tfinger.fingerId; - break; - } - finger[i].p.x = event.tfinger.x; - finger[i].p.y = event.tfinger.y; +#if VERBOSE + printf("Finger: %"PRIs64" down - x: %i, y: %i\n", + event.tfinger.fingerId,event.tfinger.x,event.tfinger.y); +#endif break; case SDL_FINGERUP: - //printf("Finger: %"PRIs64" up - x: %i, y: %i\n",event.tfinger.fingerId,event.tfinger.x,event.tfinger.y); - for(i = 0;i<MAXFINGERS;i++) - if(index2fingerid[i] == event.tfinger.fingerId) { - index2fingerid[i] = -1; - break; - } - finger[i].p.x = -1; - finger[i].p.y = -1; - */ +#if VERBOSE + printf("Finger: %"PRIs64" up - x: %i, y: %i\n", + event.tfinger.fingerId,event.tfinger.x,event.tfinger.y); +#endif break; case SDL_MULTIGESTURE: - /* +#if VERBOSE printf("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f\n", event.mgesture.x, event.mgesture.y, event.mgesture.dTheta, event.mgesture.dDist); printf("MG: numDownTouch = %i\n",event.mgesture.numFingers); - */ +#endif knob.p.x = event.mgesture.x; knob.p.y = event.mgesture.y; knob.ang += event.mgesture.dTheta; @@ -437,13 +282,9 @@ break; } } - DrawScreen(screen,h); - //for(i = 0; i < 256; i++) - // if(keystat[i]) - // printf("Key %i down\n",i); + DrawScreen(screen); } - SDL_Quit(); - + SDL_Quit(); return 0; }