|
|
/*
* (c) Copyright 1993, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the above * copyright notice appear in all copies and that both the copyright notice * and this permission notice appear in supporting documentation, and that * the name of Silicon Graphics, Inc. not be used in advertising * or publicity pertaining to distribution of the software without specific, * written prior permission. * * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. * * US Government Users Restricted Rights * Use, duplication, or disclosure by the Government is subject to * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph * (c)(1)(ii) of the Rights in Technical Data and Computer Software * clause at DFARS 252.227-7013 and/or in similar or successor * clauses in the FAR or the DOD or NASA FAR Supplement. * Unpublished-- rights reserved under the copyright laws of the * United States. Contractor/manufacturer is Silicon Graphics, * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. * * OpenGL(TM) is a trademark of Silicon Graphics, Inc. */ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <GL/gl.h>
#include <gl/glaux.h>
#include "tk.h"
#define static
#if defined(__cplusplus) || defined(c_plusplus)
#define class c_class
#endif
static struct { int keyField; void (*KeyFunc)(void); } keyTable[200];
static struct { int mouseField; void (*MouseFunc)(AUX_EVENTREC *); } mouseDownTable[20], mouseUpTable[20], mouseLocTable[20];
static int keyTableCount = 0; static int mouseDownTableCount = 0; static int mouseUpTableCount = 0; static int mouseLocTableCount = 0; static GLenum displayModeType = 0; GLenum APIENTRY auxInitWindowAW(LPCSTR title, BOOL bUnicode);
static void DefaultHandleReshape(GLsizei w, GLsizei h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho((GLdouble)0.0, (GLdouble)w, (GLdouble)0.0, (GLdouble)h, (GLdouble)-1.0, (GLdouble)1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); }
static void DefaultHandleExpose(GLsizei w, GLsizei h) { }
static GLenum MouseLoc(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i;
flag = GL_FALSE; for (i = 0; i < mouseLocTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseLocTable[i].mouseField) { info.event = AUX_MOUSELOC; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseLocTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; }
static GLenum MouseUp(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i;
flag = GL_FALSE; for (i = 0; i < mouseUpTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseUpTable[i].mouseField) { info.event = AUX_MOUSEUP; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseUpTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; }
static GLenum MouseDown(int x, int y, GLenum button) { AUX_EVENTREC info; GLenum flag; int i;
flag = GL_FALSE; for (i = 0; i < mouseDownTableCount; i++) { if ((int)(button & AUX_LEFTBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_LEFTBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_RIGHTBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_RIGHTBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } if ((int)(button & AUX_MIDDLEBUTTON) == mouseDownTable[i].mouseField) { info.event = AUX_MOUSEDOWN; info.data[AUX_MOUSEX] = x; info.data[AUX_MOUSEY] = y; info.data[AUX_MOUSESTATUS] = AUX_MIDDLEBUTTON; (*mouseDownTable[i].MouseFunc)(&info); flag |= GL_TRUE; } } return flag; }
static GLenum KeyDown(int key, GLenum status) { GLenum flag; int i;
flag = GL_FALSE; if (keyTableCount) { for (i = 0; i < keyTableCount; i++) { if (key == keyTable[i].keyField) { (*keyTable[i].KeyFunc)(); flag |= GL_TRUE; } } } return flag; }
void auxExposeFunc(AUXEXPOSEPROC Func) { tkExposeFunc(Func); }
void auxReshapeFunc(AUXRESHAPEPROC Func) { tkExposeFunc((void (*)(int, int))Func); tkReshapeFunc((void (*)(int, int))Func); }
void auxIdleFunc(AUXIDLEPROC Func) { tkIdleFunc(Func); }
void auxKeyFunc(int key, AUXKEYPROC Func) { keyTable[keyTableCount].keyField = key; keyTable[keyTableCount++].KeyFunc = Func; }
void auxMouseFunc(int mouse, int mode, AUXMOUSEPROC Func) { if (mode == AUX_MOUSEDOWN) { mouseDownTable[mouseDownTableCount].mouseField = mouse; mouseDownTable[mouseDownTableCount++].MouseFunc = Func; } else if (mode == AUX_MOUSEUP) { mouseUpTable[mouseUpTableCount].mouseField = mouse; mouseUpTable[mouseUpTableCount++].MouseFunc = Func; } else if (mode == AUX_MOUSELOC) { mouseLocTable[mouseLocTableCount].mouseField = mouse; mouseLocTable[mouseLocTableCount++].MouseFunc = Func; } }
void auxMainLoop(AUXMAINPROC Func) { tkDisplayFunc(Func); tkExec(); }
void auxInitPosition(int x, int y, int width, int height) { tkInitPosition(x, y, width, height); }
void auxInitDisplayMode(GLenum type) { displayModeType = type; tkInitDisplayMode(type); }
void auxInitDisplayModePolicy(GLenum type) { tkInitDisplayModePolicy(type); }
GLenum auxInitDisplayModeID(GLint id) { return tkInitDisplayModeID(id); }
GLenum APIENTRY auxInitWindowA(LPCSTR title) { return auxInitWindowAW(title,FALSE); }
GLenum APIENTRY auxInitWindowW(LPCWSTR title) { return auxInitWindowAW((LPCSTR)title,TRUE); }
GLenum APIENTRY auxInitWindowAW(LPCSTR title, BOOL bUnicode) { int useDoubleAsSingle = 0;
if (tkInitWindowAW((char *)title, bUnicode) == GL_FALSE) { if (AUX_WIND_IS_SINGLE(displayModeType)) { tkInitDisplayMode(displayModeType | AUX_DOUBLE); if (tkInitWindowAW((char *)title, bUnicode) == GL_FALSE) { return GL_FALSE; /* curses, foiled again */ } MESSAGEBOX(GetFocus(), "Can't initialize a single buffer visual. " "Will use a double buffer visual instead, " "only drawing into the front buffer.", "Warning", MB_OK); displayModeType = displayModeType | AUX_DOUBLE; useDoubleAsSingle = 1; } } tkReshapeFunc((void (*)(int, int))DefaultHandleReshape); tkExposeFunc((void (*)(int, int))DefaultHandleExpose); tkMouseUpFunc(MouseUp); tkMouseDownFunc(MouseDown); tkMouseMoveFunc(MouseLoc); tkKeyDownFunc(KeyDown); auxKeyFunc(AUX_ESCAPE, auxQuit); glClearColor((GLclampf)0.0, (GLclampf)0.0, (GLclampf)0.0, (GLclampf)1.0); glClearIndex((GLfloat)0.0); glLoadIdentity(); if (useDoubleAsSingle) glDrawBuffer(GL_FRONT); return GL_TRUE; }
void auxCloseWindow(void) { tkCloseWindow(); keyTableCount = 0; mouseDownTableCount = 0; mouseUpTableCount = 0; mouseLocTableCount = 0; }
void auxQuit(void) { tkQuit(); }
void auxSwapBuffers(void) { tkSwapBuffers(); }
HWND auxGetHWND(void) { return tkGetHWND(); }
HDC auxGetHDC(void) { return tkGetHDC(); }
HGLRC auxGetHGLRC(void) { return tkGetHRC(); }
GLenum auxGetDisplayModePolicy(void) { return tkGetDisplayModePolicy(); }
GLint auxGetDisplayModeID(void) { return tkGetDisplayModeID(); }
GLenum auxGetDisplayMode(void) { return tkGetDisplayMode(); }
void auxSetOneColor(int index, float r, float g, float b) { tkSetOneColor(index, r, g, b); }
void auxSetFogRamp(int density, int startIndex) { tkSetFogRamp(density, startIndex); }
void auxSetGreyRamp(void) { tkSetGreyRamp(); }
void auxSetRGBMap(int size, float *rgb) { tkSetRGBMap(size, rgb); }
int auxGetColorMapSize(void) { return tkGetColorMapSize(); }
void auxGetMouseLoc(int *x, int *y) { tkGetMouseLoc(x, y); }
|