Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

glut_wacom.c

Go to the documentation of this file.
00001 #if defined(_WIN32)
00002 #include <windows.h>
00003 #endif
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <math.h>
00007 #include <assert.h>
00008 #include <GL/glut.h>
00009 #include "glutint.h"
00010 #include "wacom.h"
00011 
00012 /* Button data */
00013 int __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00014 int __glutWacomState = GLUT_WACOM_UP;
00015 
00016 /* Calibrated state */
00017 float __glutWacomX = 0.0, __glutWacomY = 0.0;
00018 float __glutWacomPressure = 0.0;
00019 float __glutWacomXTilt = 0.0, __glutWacomYTilt = 0.0;
00020 
00021 /* Calibration data */
00022 int __glutWacomXCoordRange = 0, __glutWacomYCoordRange = 0;
00023 int __glutWacomPressureMin = 0, __glutWacomPressureRange = 0;
00024 int __glutWacomXTiltHalfRange = 0, __glutWacomYTiltHalfRange = 0;
00025 int __glutWacomScreenWidth = 0, __glutWacomScreenHeight = 0;
00026 
00027 /* Calibration values */
00028 float __glutWacomXScale = 0.0, __glutWacomYScale = 0.0;
00029 float __glutWacomXOffset = 0.0, __glutWacomYOffset = 0.0;
00030 
00031 void
00032 __glutWacomSetOffset(int x, int y) {
00033   __glutWacomXOffset = - (float) x;
00034   __glutWacomYOffset = - (float) y;
00035 #if DEBUG
00036 /*   printf("offset:\tx %f y %f\n", __glutWacomXOffset, __glutWacomYOffset); */
00037 /*   printf("\n"); */
00038 #endif
00039 }
00040 
00041 void
00042 __glutWacomSetButton(int device, int button) {
00043   switch (device) {
00044   case GLUT_WACOM_STYLUS:
00045     switch (button) {
00046     case WACOM_BUTTONS_UP:
00047       if (__glutWacomState == GLUT_WACOM_DOWN) {
00048    __glutWacomState = GLUT_WACOM_UP;
00049       } else {
00050    __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00051       }
00052       break;
00053     case WACOM_BOTTOM_BUTTON_DOWN:
00054       __glutWacomButton = GLUT_WACOM_BOTTOM_BUTTON;
00055       __glutWacomState = GLUT_WACOM_DOWN;
00056       break;
00057     case WACOM_TOP_BUTTON_DOWN:
00058       __glutWacomButton = GLUT_WACOM_TOP_BUTTON;
00059       __glutWacomState = GLUT_WACOM_DOWN;
00060       break;
00061     default:
00062       fprintf(stderr, "Error: Unsupported button type!\n");
00063       assert(button == WACOM_BUTTONS_UP ||
00064         button == WACOM_BOTTOM_BUTTON_DOWN ||
00065         button == WACOM_TOP_BUTTON_DOWN);
00066       break;
00067     }
00068     break;
00069   case GLUT_WACOM_ERASER:
00070     switch (button) {
00071     default:
00072       /* No button available */
00073       __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00074       __glutWacomState = GLUT_WACOM_UP;
00075       break;
00076     }
00077     break;
00078   case GLUT_WACOM_CURSOR:
00079     switch (button) {
00080     case WACOM_BUTTONS_UP:
00081       if (__glutWacomState == GLUT_WACOM_DOWN) {
00082    __glutWacomState = GLUT_WACOM_UP;
00083       } else {
00084    __glutWacomButton = GLUT_WACOM_NO_BUTTON;
00085       }
00086       break;
00087     case WACOM_TOP_LEFT_BUTTON_DOWN:
00088       __glutWacomButton = GLUT_WACOM_TOP_LEFT_BUTTON;
00089       __glutWacomState = GLUT_WACOM_DOWN;
00090       break;
00091     case WACOM_TOP_MIDDLE_BUTTON_DOWN:
00092       __glutWacomButton = GLUT_WACOM_TOP_MIDDLE_BUTTON;
00093       __glutWacomState = GLUT_WACOM_DOWN;
00094       break;
00095     case WACOM_TOP_RIGHT_BUTTON_DOWN:
00096       __glutWacomButton = GLUT_WACOM_TOP_RIGHT_BUTTON;
00097       __glutWacomState = GLUT_WACOM_DOWN;
00098       break;
00099     case WACOM_BOTTOM_RIGHT_BUTTON_DOWN:
00100       __glutWacomButton = GLUT_WACOM_BOTTOM_RIGHT_BUTTON;
00101       __glutWacomState = GLUT_WACOM_DOWN;
00102       break;
00103     case WACOM_BOTTOM_LEFT_BUTTON_DOWN:
00104       __glutWacomButton = GLUT_WACOM_BOTTOM_LEFT_BUTTON;
00105       __glutWacomState = GLUT_WACOM_DOWN;
00106       break;
00107     default:
00108       fprintf(stderr, "Error: Unsupported button type!\n");
00109       assert(button == WACOM_BUTTONS_UP ||
00110         button == WACOM_TOP_LEFT_BUTTON_DOWN ||
00111         button == WACOM_TOP_MIDDLE_BUTTON_DOWN ||
00112         button == WACOM_TOP_RIGHT_BUTTON_DOWN ||
00113         button == WACOM_BOTTOM_RIGHT_BUTTON_DOWN ||
00114         button == WACOM_BOTTOM_LEFT_BUTTON_DOWN);
00115       break;
00116     }
00117     break;
00118   default:
00119     fprintf(stderr, "Error: Unsupported device type!\n");
00120     assert(device == GLUT_WACOM_STYLUS ||
00121       device == GLUT_WACOM_ERASER ||
00122       device == GLUT_WACOM_CURSOR);
00123     break;
00124   }
00125 }
00126 
00127 void
00128 __glutWacomUpdate(int x, int y, int pressure, int xtilt, int ytilt) {
00129   /* Convert to window coordinates */
00130   __glutWacomX = __glutWacomXOffset + __glutWacomXScale * (float) x;
00131   __glutWacomY = __glutWacomYOffset + __glutWacomYScale * (float) y;
00132   
00133   /* Normalize pressure between 0.0 and 1.0 */
00134   __glutWacomPressure = (float) (pressure - __glutWacomPressureMin) /
00135                           (float) __glutWacomPressureRange;
00136   
00137   /* Normalize tilt between -1.0 and 1.0 */
00138   __glutWacomXTilt = (float) xtilt / (float) __glutWacomXTiltHalfRange;
00139   __glutWacomYTilt = (float) ytilt / (float) __glutWacomYTiltHalfRange;
00140 }
00141 
00142 void
00143 __glutWacomCalibrate(void) {
00144   int xtilt_range = 0, ytilt_range = 0;
00145   
00146   __glutWacomScreenWidth  = glutGet(GLUT_SCREEN_WIDTH);
00147   __glutWacomScreenHeight = glutGet(GLUT_SCREEN_HEIGHT);
00148 #if defined(__sgi)
00149   __glutWacomXCoordRange = glutDeviceGet(GLUT_WACOM_TABLET_XCOORD_RANGE);
00150   __glutWacomYCoordRange = glutDeviceGet(GLUT_WACOM_TABLET_YCOORD_RANGE);
00151   __glutWacomPressureMin   = glutDeviceGet(GLUT_WACOM_TABLET_PRESSURE_MIN);
00152   __glutWacomPressureRange = glutDeviceGet(GLUT_WACOM_TABLET_PRESSURE_RANGE);
00153   xtilt_range = glutDeviceGet(GLUT_WACOM_TABLET_XTILT_RANGE);
00154   ytilt_range = glutDeviceGet(GLUT_WACOM_TABLET_YTILT_RANGE);
00155   __glutWacomXTiltHalfRange = (int) ceil(xtilt_range / 2.0);
00156   __glutWacomYTiltHalfRange = (int) ceil(ytilt_range / 2.0);
00157   __glutWacomXScale
00158     = (double) __glutWacomScreenWidth / (double) __glutWacomXCoordRange;
00159   __glutWacomYScale
00160     = (double) __glutWacomScreenHeight / (double) __glutWacomXCoordRange;
00161   /* FIXME: sgi driver gives wrong ycoord_range value! */
00162 #elif defined(__linux__)
00163   __glutWacomXCoordRange = glutDeviceGet(GLUT_WACOM_STYLUS_XCOORD_RANGE);
00164   __glutWacomYCoordRange = glutDeviceGet(GLUT_WACOM_STYLUS_YCOORD_RANGE);
00165   __glutWacomPressureMin   = glutDeviceGet(GLUT_WACOM_STYLUS_PRESSURE_MIN);
00166   __glutWacomPressureRange = glutDeviceGet(GLUT_WACOM_STYLUS_PRESSURE_RANGE);
00167   xtilt_range = glutDeviceGet(GLUT_WACOM_STYLUS_XTILT_RANGE);
00168   ytilt_range = glutDeviceGet(GLUT_WACOM_STYLUS_YTILT_RANGE);
00169   __glutWacomXTiltHalfRange = (int) ceil(xtilt_range / 2.0);
00170   __glutWacomYTiltHalfRange = (int) ceil(ytilt_range / 2.0);
00171   __glutWacomXScale
00172     = (double) __glutWacomScreenWidth / (double) __glutWacomXCoordRange;
00173   __glutWacomYScale
00174     = (double) __glutWacomScreenHeight / (double) __glutWacomYCoordRange;
00175 #endif
00176   
00177 #if DEBUG
00178 /*   printf("screen:\twidth %d height %d\n", */
00179 /*     __glutWacomScreenWidth, __glutWacomScreenHeight); */
00180 /*   printf("xcoord:\t\trange %d\n", __glutWacomXCoordRange); */
00181 /*   printf("ycoord:\t\trange %d\n", __glutWacomYCoordRange); */
00182 /*   printf("pressure:\tmin %d range %d\n", */
00183 /*     __glutWacomPressureMin, __glutWacomPressureRange); */
00184 /*   printf("xtilt:\t\trange %d\n", xtilt_range); */
00185 /*   printf("ytilt:\t\trange %d\n", ytilt_range); */
00186 /*   printf("scale:\tx %f y %f\n", __glutWacomXScale, __glutWacomYScale); */
00187 /*   printf("\n"); */
00188 #endif
00189 }

Generated on Mon Sep 18 11:39:31 2006 for jot by  doxygen 1.4.4