00001
00044
00045 #include <stdio.h>
00046 #include <time.h>
00047 #include <GLut/glut.h>
00048 #include "CMouseSimple.h"
00049
00050
00051
00061
00062 #pragma warning(This function will be moved to a general purpose collection of (mostly) math functions!)
00063 float ConvertPixelToFloat(int pixel, int halfdimension)
00064 {
00065 return ((float)(pixel - halfdimension) / halfdimension);
00066 }
00067
00068
00069
00079
00080 #pragma warning(This function will be moved to a general purpose collection of (mostly) math functions!)
00081 int ConvertFloatToPixel(float coord, int halfdimension)
00082 {
00083 return (int)((coord * halfdimension) + halfdimension);
00084 }
00085
00086
00087
00088
00089
00090
00095
00096 CMouseSimple *g_pMouseSimple = 0;
00097
00098
00099
00103
00104 CMouseSimple::CMouseSimple()
00105 {
00107
00111 m_NumButtons = glutDeviceGet(GLUT_NUM_MOUSE_BUTTONS) + 1;
00112
00113 m_DragTime = new time_t[m_NumButtons];
00114 m_Buttons = new bool[m_NumButtons];
00115
00117 SetScreenSize(800, 600);
00118 SetLimitRegion(0, 0, 800, 600);
00119 SetMouseXY(0, 0);
00120
00122 for(int i = 0; i < m_NumButtons; i++)
00123 {
00124 m_Buttons[i] = false;
00125 m_DragTime[i] = 0;
00126 }
00127 }
00128
00129
00130
00134
00135 CMouseSimple::~CMouseSimple()
00136 {
00137 delete m_Buttons;
00138 delete m_DragTime;
00139 }
00140
00141
00142
00150
00151 bool CMouseSimple::GetButton(int button)
00152 {
00153 if(button >= 0 && button < m_NumButtons)
00154 return m_Buttons[button];
00155 return false;
00156 }
00157
00158
00159
00168
00169 bool CMouseSimple::SetButton(int button, bool state)
00170 {
00171 if(button>=0 && button < m_NumButtons)
00172 {
00173 time_t tt;
00174 bool oldstate = m_Buttons[button];
00175 m_Buttons[button] = state;
00176 if(state)
00177 {
00178 time(&tt);
00179 m_DragTime[button] = tt;
00180 }
00181 else
00182 m_DragTime[button] = 0;
00183 return oldstate;
00184 }
00185 return false;
00186 }
00187
00188
00189
00196
00197 void CMouseSimple::SetMouseXY(int x, int y)
00198 {
00199 m_fX = ConvertPixelToFloat(x, m_iDisplayWidthHalf);
00200 m_fY = -ConvertPixelToFloat(y, m_iDisplayHeightHalf);
00201 m_X = x;
00202 m_Y = y;
00203 }
00204
00205
00206
00213
00214 void CMouseSimple::SetScreenSize(int w, int h)
00215 {
00216 m_iDisplayWidth = w;
00217 m_iDisplayHeight = h;
00218 m_iDisplayWidthHalf = w / 2;
00219 m_iDisplayHeightHalf = h / 2;
00220 }
00221
00222
00223
00231
00232 int CMouseSimple::GetDragTime(int button)
00233 {
00234 if(button >= 0 && button < m_NumButtons)
00235 {
00236 time_t diff;
00237 time(&diff);
00238 diff -= m_DragTime[button];
00239 return (int)diff;
00240 }
00241 return 0;
00242 }
00243
00244
00245
00253
00254 bool CMouseSimple::ButtonClick(int button)
00255 {
00256 if(button >= 0)
00257 {
00258 time_t diff;
00259 time(&diff);
00260 diff -= m_DragTime[button];
00261 if(diff < MINIMUM_DRAG_TIME)
00262 return true;
00263 }
00264 return false;
00265 }
00266
00267
00268
00274
00275 void CMouseSimple::UnClickButton(int button)
00276 {
00277 if(button >= 0 && button < m_NumButtons)
00278 m_DragTime[button] = 0;
00279 }
00280
00281
00282
00291
00292 void CMouseSimple::SetLimitRegion(int x1, int y1, int x2, int y2)
00293 {
00294 m_Limit[0] = x1;
00295 m_Limit[1] = y1;
00296 m_Limit[2] = x2;
00297 m_Limit[3] = y2;
00298
00299 }
00300
00301
00302
00308
00309 bool CMouseSimple::LimitMouseToRegion(void)
00310 {
00311 bool limited = false;
00312 if(m_X < m_Limit[0])
00313 {
00314 m_X = m_Limit[0];
00315 limited = true;
00316 }
00317 else
00318 {
00319 if(m_X > m_Limit[2])
00320 {
00321 m_X = m_Limit[2];
00322 limited = true;
00323 }
00324 }
00325 if(m_Y < m_Limit[1])
00326 {
00327 m_Y = m_Limit[1];
00328 limited = true;
00329 }
00330 else
00331 {
00332 if(m_Y > m_Limit[3])
00333 {
00334 m_Y = m_Limit[3];
00335 limited = true;
00336 }
00337 }
00338 glutWarpPointer(m_X, m_Y);
00339 SetMouseXY(m_X,m_Y);
00340 return limited;
00341 }
00342
00343
00344