test/testgesture.c
author David Ludwig <dludwig@pobox.com>
Wed, 25 Dec 2013 21:39:48 -0500
changeset 8563 c0e68f3b6bbb
parent 7900 cc2289c332eb
child 8149 681eb46b8ac4
permissions -rw-r--r--
WinRT: compiled the d3d11 renderer's shaders into SDL itself

Previously, the shaders would get compiled separately, the output of which would need to be packaged into the app. This change should make SDL's dll be the only binary needed to include SDL in a WinRT app.
slouken@5535
     1
/*
slouken@7517
     2
  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
slouken@5535
     3
slouken@5535
     4
  This software is provided 'as-is', without any express or implied
slouken@5535
     5
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     6
  arising from the use of this software.
slouken@5535
     7
slouken@5535
     8
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
     9
  including commercial applications, and to alter it and redistribute it
slouken@5535
    10
  freely.
slouken@5535
    11
*/
jim@4689
    12
/*  Usage:
jim@4689
    13
 *  Spacebar to begin recording a gesture on all touches.
jim@4689
    14
 *  s to save all touches into "./gestureSave"
jim@4689
    15
 *  l to load all touches from "./gestureSave"
jim@4689
    16
 */
jim@4689
    17
jim@4689
    18
#include <stdio.h>
jim@4689
    19
#include <math.h>
slouken@5456
    20
slouken@5456
    21
#include "SDL.h"
slouken@5456
    22
#include "SDL_touch.h"
slouken@5456
    23
#include "SDL_gesture.h"
jim@4689
    24
jim@4689
    25
/* Make sure we have good macros for printing 32 and 64 bit values */
jim@4689
    26
#ifndef PRIs32
jim@4689
    27
#define PRIs32 "d"
jim@4689
    28
#endif
jim@4689
    29
#ifndef PRIu32
jim@4689
    30
#define PRIu32 "u"
jim@4689
    31
#endif
jim@4689
    32
#ifndef PRIs64
slouken@5086
    33
#ifdef __WIN32__
jim@4689
    34
#define PRIs64 "I64"
jim@4689
    35
#else
jim@4689
    36
#define PRIs64 "lld"
jim@4689
    37
#endif
jim@4689
    38
#endif
jim@4689
    39
#ifndef PRIu64
slouken@5086
    40
#ifdef __WIN32__
jim@4689
    41
#define PRIu64 "I64u"
jim@4689
    42
#else
jim@4689
    43
#define PRIu64 "llu"
jim@4689
    44
#endif
jim@4689
    45
#endif
jim@4689
    46
jim@4689
    47
#define WIDTH 640
jim@4689
    48
#define HEIGHT 480
jim@4689
    49
#define BPP 4
jim@4689
    50
#define DEPTH 32
jim@4689
    51
gabomdq@7678
    52
/* MUST BE A POWER OF 2! */
jim@4689
    53
#define EVENT_BUF_SIZE 256
jim@4689
    54
jim@4689
    55
slouken@5458
    56
#define VERBOSE 0
jim@4689
    57
slouken@5457
    58
static SDL_Window *window;
slouken@5457
    59
static SDL_Event events[EVENT_BUF_SIZE];
slouken@5457
    60
static int eventWrite;
jim@4689
    61
slouken@5456
    62
slouken@5457
    63
static int colors[7] = {0xFF,0xFF00,0xFF0000,0xFFFF00,0x00FFFF,0xFF00FF,0xFFFFFF};
jim@4689
    64
jim@4689
    65
typedef struct {
jim@4689
    66
  float x,y;
jim@4689
    67
} Point;
jim@4689
    68
jim@4689
    69
typedef struct {
jim@4689
    70
  float ang,r;
jim@4689
    71
  Point p;
jim@4689
    72
} Knob;
jim@4689
    73
slouken@5457
    74
static Knob knob;
jim@4689
    75
jim@4689
    76
void handler (int sig)
jim@4689
    77
{
slouken@5460
    78
  SDL_Log ("exiting...(%d)", sig);
jim@4689
    79
  exit (0);
jim@4689
    80
}
jim@4689
    81
jim@4689
    82
void perror_exit (char *error)
jim@4689
    83
{
jim@4689
    84
  perror (error);
jim@4689
    85
  handler (9);
jim@4689
    86
}
jim@4689
    87
slouken@4918
    88
void setpix(SDL_Surface *screen, float _x, float _y, unsigned int col)
jim@4689
    89
{
jim@4689
    90
  Uint32 *pixmem32;
jim@4689
    91
  Uint32 colour;
slouken@4918
    92
  Uint8 r,g,b;
slouken@4918
    93
  int x = (int)_x;
slouken@4918
    94
  int y = (int)_y;
slouken@4918
    95
  float a;
slouken@7191
    96
slouken@6790
    97
  if(x < 0 || x >= screen->w) return;
slouken@6790
    98
  if(y < 0 || y >= screen->h) return;
jim@4689
    99
jim@4689
   100
  pixmem32 = (Uint32*) screen->pixels  + y*screen->pitch/BPP + x;
slouken@7191
   101
slouken@4918
   102
  SDL_memcpy(&colour,pixmem32,screen->format->BytesPerPixel);
jim@4689
   103
jim@4689
   104
  SDL_GetRGB(colour,screen->format,&r,&g,&b);
gabomdq@7678
   105
  /* r = 0;g = 0; b = 0; */
slouken@4918
   106
  a = (float)((col>>24)&0xFF);
gabomdq@7678
   107
  if(a == 0) a = 0xFF; /* Hack, to make things easier. */
jim@4689
   108
  a /= 0xFF;
slouken@4918
   109
  r = (Uint8)(r*(1-a) + ((col>>16)&0xFF)*(a));
slouken@4918
   110
  g = (Uint8)(g*(1-a) + ((col>> 8)&0xFF)*(a));
slouken@4918
   111
  b = (Uint8)(b*(1-a) + ((col>> 0)&0xFF)*(a));
jim@4689
   112
  colour = SDL_MapRGB( screen->format,r, g, b);
slouken@7191
   113
jim@4689
   114
jim@4689
   115
  *pixmem32 = colour;
jim@4689
   116
}
jim@4689
   117
slouken@4918
   118
void drawLine(SDL_Surface *screen,float x0,float y0,float x1,float y1,unsigned int col) {
jim@4689
   119
  float t;
slouken@4918
   120
  for(t=0;t<1;t+=(float)(1.f/SDL_max(SDL_fabs(x0-x1),SDL_fabs(y0-y1))))
jim@4689
   121
    setpix(screen,x1+t*(x0-x1),y1+t*(y0-y1),col);
jim@4689
   122
}
jim@4689
   123
slouken@4918
   124
void drawCircle(SDL_Surface* screen,float x,float y,float r,unsigned int c)
jim@4689
   125
{
slouken@4918
   126
  float tx,ty;
jim@4689
   127
  float xr;
slouken@4918
   128
  for(ty = (float)-SDL_fabs(r);ty <= (float)SDL_fabs((int)r);ty++) {
slouken@4918
   129
    xr = (float)sqrt(r*r - ty*ty);
gabomdq@7678
   130
    if(r > 0) { /* r > 0 ==> filled circle */
slouken@4918
   131
      for(tx=-xr+.5f;tx<=xr-.5;tx++) {
slouken@7191
   132
    setpix(screen,x+tx,y+ty,c);
jim@4689
   133
      }
jim@4689
   134
    }
jim@4689
   135
    else {
slouken@4918
   136
      setpix(screen,x-xr+.5f,y+ty,c);
slouken@4918
   137
      setpix(screen,x+xr-.5f,y+ty,c);
jim@4689
   138
    }
jim@4689
   139
  }
jim@4689
   140
}
jim@4689
   141
jim@4689
   142
void drawKnob(SDL_Surface* screen,Knob k) {
slouken@7191
   143
  drawCircle(screen,k.p.x*screen->w,k.p.y*screen->h,k.r*screen->w,0xFFFFFF);
philipp@7451
   144
  drawCircle(screen,(k.p.x+k.r/2*SDL_cosf(k.ang))*screen->w,
philipp@7451
   145
                (k.p.y+k.r/2*SDL_sinf(k.ang))*screen->h,k.r/4*screen->w,0);
jim@4689
   146
}
jim@4689
   147
jim@4689
   148
void DrawScreen(SDL_Surface* screen)
jim@4689
   149
{
slouken@5456
   150
  int i;
slouken@5456
   151
#if 1
slouken@5456
   152
  SDL_FillRect(screen, NULL, 0);
slouken@5456
   153
#else
slouken@5456
   154
  int x, y;
jim@4689
   155
  for(y = 0;y < screen->h;y++)
jim@4689
   156
    for(x = 0;x < screen->w;x++)
slouken@7191
   157
    setpix(screen,(float)x,(float)y,((x%255)<<16) + ((y%255)<<8) + (x+y)%255);
slouken@5456
   158
#endif
jim@4689
   159
gabomdq@7678
   160
  /* draw Touch History */
slouken@5460
   161
  for(i = eventWrite; i < eventWrite+EVENT_BUF_SIZE; ++i) {
slouken@5460
   162
    const SDL_Event *event = &events[i&(EVENT_BUF_SIZE-1)];
slouken@5460
   163
    float age = (float)(i - eventWrite) / EVENT_BUF_SIZE;
slouken@7191
   164
    float x, y;
slouken@7191
   165
    unsigned int c, col;
slouken@4918
   166
slouken@7191
   167
    if(event->type == SDL_FINGERMOTION ||
slouken@5460
   168
       event->type == SDL_FINGERDOWN ||
slouken@5460
   169
       event->type == SDL_FINGERUP) {
slouken@6951
   170
      x = event->tfinger.x;
slouken@6951
   171
      y = event->tfinger.y;
slouken@7191
   172
gabomdq@7678
   173
      /* draw the touch: */
slouken@7191
   174
      c = colors[event->tfinger.fingerId%7];
slouken@5460
   175
      col = ((unsigned int)(c*(.1+.85))) | (unsigned int)(0xFF*age)<<24;
jim@4689
   176
slouken@5460
   177
      if(event->type == SDL_FINGERMOTION)
slouken@7191
   178
    drawCircle(screen,x*screen->w,y*screen->h,5,col);
slouken@5460
   179
      else if(event->type == SDL_FINGERDOWN)
slouken@7191
   180
    drawCircle(screen,x*screen->w,y*screen->h,-10,col);
jim@4689
   181
    }
jim@4689
   182
  }
slouken@7191
   183
jim@4689
   184
  if(knob.p.x > 0)
jim@4689
   185
    drawKnob(screen,knob);
slouken@7191
   186
slouken@5456
   187
  SDL_UpdateWindowSurface(window);
jim@4689
   188
}
jim@4689
   189
jim@4689
   190
SDL_Surface* initScreen(int width,int height)
jim@4689
   191
{
slouken@5456
   192
  if (!window) {
slouken@5456
   193
    window = SDL_CreateWindow("Gesture Test",
slouken@5456
   194
                              SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
slouken@6790
   195
                              width, height, SDL_WINDOW_RESIZABLE);
slouken@5456
   196
  }
slouken@5456
   197
  if (!window) {
slouken@5456
   198
    return NULL;
slouken@5456
   199
  }
slouken@5456
   200
  return SDL_GetWindowSurface(window);
jim@4689
   201
}
jim@4689
   202
jim@4689
   203
int main(int argc, char* argv[])
slouken@7191
   204
{
jim@4689
   205
  SDL_Surface *screen;
jim@4689
   206
  SDL_Event event;
slouken@4918
   207
  SDL_bool quitting = SDL_FALSE;
philipp@7900
   208
  SDL_RWops *stream;
jim@4689
   209
aschiffler@7639
   210
  /* Enable standard application logging */
aschiffler@7639
   211
  SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
aschiffler@7639
   212
gabomdq@7678
   213
  /* gesture variables */
slouken@4918
   214
  knob.r = .1f;
jim@4689
   215
  knob.ang = 0;
jim@4689
   216
jim@4689
   217
  if (SDL_Init(SDL_INIT_VIDEO) < 0 ) return 1;
slouken@7191
   218
jim@4689
   219
  if (!(screen = initScreen(WIDTH,HEIGHT)))
jim@4689
   220
    {
jim@4689
   221
      SDL_Quit();
jim@4689
   222
      return 1;
jim@4689
   223
    }
jim@4689
   224
jim@4689
   225
  while(!quitting) {
slouken@7191
   226
    while(SDL_PollEvent(&event))
jim@4689
   227
      {
gabomdq@7678
   228
    /* Record _all_ events */
slouken@7191
   229
    events[eventWrite & (EVENT_BUF_SIZE-1)] = event;
slouken@7191
   230
    eventWrite++;
slouken@7191
   231
slouken@7191
   232
    switch (event.type)
slouken@7191
   233
      {
slouken@7191
   234
      case SDL_QUIT:
slouken@7191
   235
        quitting = SDL_TRUE;
slouken@7191
   236
        break;
slouken@7191
   237
      case SDL_KEYDOWN:
slouken@7191
   238
        switch (event.key.keysym.sym)
slouken@7191
   239
          {
slouken@7191
   240
          case SDLK_SPACE:
slouken@7191
   241
        SDL_RecordGesture(-1);
slouken@7191
   242
        break;
slouken@7191
   243
          case SDLK_s:
philipp@7900
   244
        stream = SDL_RWFromFile("gestureSave", "w");
philipp@7900
   245
        SDL_Log("Wrote %i templates", SDL_SaveAllDollarTemplates(stream));
philipp@7900
   246
        SDL_RWclose(stream);
slouken@7191
   247
        break;
slouken@7191
   248
          case SDLK_l:
philipp@7900
   249
        stream = SDL_RWFromFile("gestureSave", "r");
philipp@7900
   250
        SDL_Log("Loaded: %i", SDL_LoadDollarTemplates(-1, stream));
philipp@7900
   251
        SDL_RWclose(stream);
slouken@7191
   252
        break;
slouken@7191
   253
          case SDLK_ESCAPE:
slouken@7191
   254
        quitting = SDL_TRUE;
slouken@7191
   255
        break;
slouken@7191
   256
        }
slouken@7191
   257
        break;
slouken@7191
   258
      case SDL_WINDOWEVENT:
slouken@5456
   259
            if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
slouken@7191
   260
          if (!(screen = initScreen(event.window.data1, event.window.data2)))
slouken@7191
   261
          {
slouken@7191
   262
        SDL_Quit();
slouken@7191
   263
        return 1;
slouken@7191
   264
          }
slouken@5456
   265
            }
slouken@7191
   266
        break;
slouken@7191
   267
      case SDL_FINGERMOTION:
jim@4689
   268
#if VERBOSE
slouken@7191
   269
        SDL_Log("Finger: %i,x: %i, y: %i",event.tfinger.fingerId,
slouken@7191
   270
               event.tfinger.x,event.tfinger.y);
jim@4689
   271
#endif
slouken@7191
   272
        break;
slouken@7191
   273
      case SDL_FINGERDOWN:
jim@4689
   274
#if VERBOSE
slouken@7191
   275
        SDL_Log("Finger: %"PRIs64" down - x: %i, y: %i",
slouken@7191
   276
           event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
jim@4689
   277
#endif
slouken@7191
   278
        break;
slouken@7191
   279
      case SDL_FINGERUP:
jim@4689
   280
#if VERBOSE
slouken@7191
   281
        SDL_Log("Finger: %"PRIs64" up - x: %i, y: %i",
slouken@7191
   282
               event.tfinger.fingerId,event.tfinger.x,event.tfinger.y);
jim@4689
   283
#endif
slouken@7191
   284
        break;
slouken@7191
   285
      case SDL_MULTIGESTURE:
slouken@7191
   286
#if VERBOSE
slouken@7191
   287
        SDL_Log("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f",
slouken@7191
   288
           event.mgesture.x,
slouken@7191
   289
           event.mgesture.y,
slouken@7191
   290
           event.mgesture.dTheta,
slouken@7191
   291
           event.mgesture.dDist);
slouken@7191
   292
        SDL_Log("MG: numDownTouch = %i",event.mgesture.numFingers);
jim@4689
   293
#endif
slouken@7191
   294
        knob.p.x = event.mgesture.x;
slouken@7191
   295
        knob.p.y = event.mgesture.y;
slouken@7191
   296
        knob.ang += event.mgesture.dTheta;
slouken@7191
   297
        knob.r += event.mgesture.dDist;
slouken@7191
   298
        break;
slouken@7191
   299
      case SDL_DOLLARGESTURE:
slouken@7191
   300
        SDL_Log("Gesture %"PRIs64" performed, error: %f",
slouken@7191
   301
           event.dgesture.gestureId,
slouken@7191
   302
           event.dgesture.error);
slouken@7191
   303
        break;
slouken@7191
   304
      case SDL_DOLLARRECORD:
slouken@7191
   305
        SDL_Log("Recorded gesture: %"PRIs64"",event.dgesture.gestureId);
slouken@7191
   306
        break;
slouken@7191
   307
      }
jim@4689
   308
      }
jim@4689
   309
    DrawScreen(screen);
slouken@7191
   310
  }
slouken@7191
   311
  SDL_Quit();
jim@4689
   312
  return 0;
jim@4689
   313
}
jim@4689
   314